12 #include "../stdafx.h"
13 #include "../zoom_func.h"
14 #include "../settings_type.h"
15 #include "../core/math_func.hpp"
16 #include "../core/mem_func.hpp"
19 #include "../safeguards.h"
28 uint offset = sprite_src->
offset[zoom];
31 const uint8 *src = sprite_src->
data + offset;
35 for (
int y = 0; y < bp->
skip_top; y++) {
39 if (trans == 0 && pixels == 0)
break;
44 const uint8 *src_next = src;
46 for (
int y = 0; y < bp->
height; y++) {
47 uint8 *dst = dst_line;
48 dst_line += bp->
pitch;
51 int width = bp->
width;
57 src_next = src + pixels;
58 if (trans == 0 && pixels == 0)
break;
59 if (width <= 0)
continue;
62 if (skip_left < trans) {
69 if (skip_left < pixels) {
79 if (skip_left != 0)
continue;
84 if (width <= 0 || pixels == 0)
continue;
85 pixels = min<uint>(pixels, (uint)width);
91 const uint8 *remap = bp->
remap;
96 }
while (--pixels != 0);
106 const uint8 *remap = bp->
remap;
111 }
while (--pixels != 0);
117 dst += pixels; src += pixels;
141 for (
ZoomLevel i = zoom_min; i <= zoom_max; i++) {
153 memset(temp_dst, 0,
sizeof(*temp_dst));
154 byte *dst = temp_dst->
data;
157 for (
ZoomLevel i = zoom_min; i <= zoom_max; i++) {
159 uint offset = dst - temp_dst->
data;
160 temp_dst->
offset[i] = offset;
163 int scaled_height = sprite[i].
height;
164 int scaled_width = sprite[i].
width;
166 for (
int y = 0; y < scaled_height; y++) {
169 uint last_colour = 0;
170 byte *count_dst = NULL;
175 for (
int x = 0; x < scaled_width; x++) {
176 uint colour = src++->
m;
178 if (last_colour == 0 || colour == 0 || pixels == 255) {
179 if (count_dst != NULL) {
186 if (colour == 0 && trans != 255) {
199 last_colour = colour;
209 if (count_dst != NULL) *count_dst = pixels;
217 uint size = dst - (byte *)temp_dst;
220 assert(size < memory);
223 Sprite *dest_sprite = (
Sprite *)allocator(
sizeof(*dest_sprite) + size);
229 memcpy(dest_sprite->
data, temp_dst, size);