14 #include "../stdafx.h"
15 #include "../zoom_func.h"
16 #include "../settings_type.h"
20 #include "../safeguards.h"
23 static FBlitter_32bppSSE2 iFBlitter_32bppSSE2;
41 memset(&sd, 0,
sizeof(sd));
42 uint all_sprites_size = 0;
43 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
45 sd.infos[z].sprite_width = src_sprite->
width;
46 sd.infos[z].sprite_offset = all_sprites_size;
47 sd.infos[z].sprite_line_size =
sizeof(
Colour) * src_sprite->
width +
sizeof(uint32) * META_LENGTH;
49 const uint rgba_size = sd.infos[z].sprite_line_size * src_sprite->
height;
50 sd.infos[z].mv_offset = all_sprites_size + rgba_size;
52 const uint mv_size =
sizeof(MapValue) * src_sprite->
width * src_sprite->
height;
53 all_sprites_size += rgba_size + mv_size;
56 Sprite *dst_sprite = (
Sprite *) allocator(
sizeof(
Sprite) +
sizeof(SpriteData) + all_sprites_size);
61 memcpy(dst_sprite->
data, &sd,
sizeof(SpriteData));
64 bool has_remap =
false;
65 bool has_anim =
false;
66 bool has_translucency =
false;
67 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
70 Colour *dst_rgba_line = (
Colour *) &dst_sprite->
data[
sizeof(SpriteData) + sd.infos[z].sprite_offset];
71 MapValue *dst_mv = (MapValue *) &dst_sprite->
data[
sizeof(SpriteData) + sd.infos[z].mv_offset];
72 for (uint y = src_sprite->
height; y != 0; y--) {
73 Colour *dst_rgba = dst_rgba_line + META_LENGTH;
74 for (uint x = src_sprite->
width; x != 0; x--) {
77 if (src->
a != 0 && src->
a != 255) has_translucency =
true;
85 const uint8 rgb_max =
max(src->
r,
max(src->
g, src->
b));
86 dst_mv->v = (rgb_max == 0) ? Blitter_32bppBase::DEFAULT_BRIGHTNESS : rgb_max;
90 dst_rgba->r = colour.r;
91 dst_rgba->g = colour.g;
92 dst_rgba->b = colour.b;
97 dst_mv->v = Blitter_32bppBase::DEFAULT_BRIGHTNESS;
101 *(uint16*) dst_mv = 0;
109 dst_rgba = dst_rgba_line + META_LENGTH;
110 uint32 nb_pix_transp = 0;
111 for (uint x = src_sprite->
width; x != 0; x--) {
112 if (dst_rgba->
a == 0) nb_pix_transp++;
116 (*dst_rgba_line).
data = nb_pix_transp;
118 Colour *nb_right = dst_rgba_line + 1;
119 dst_rgba_line = (
Colour*) ((byte*) dst_rgba_line + sd.infos[z].sprite_line_size);
122 dst_rgba = dst_rgba_line - 1;
124 for (uint x = src_sprite->
width; x != 0; x--) {
125 if (dst_rgba->
a == 0) nb_pix_transp++;
129 (*nb_right).
data = nb_pix_transp;
135 if (has_translucency) sd.flags |= SF_TRANSLUCENT;
136 if (!has_remap) sd.flags |= SF_NO_REMAP;
137 if (!has_anim) sd.flags |= SF_NO_ANIM;
138 memcpy(dst_sprite->
data, &sd,
sizeof(SpriteData));