10 #include "../stdafx.h"
11 #include "../zoom_func.h"
12 #include "../settings_type.h"
15 #include "../safeguards.h"
27 template <BlitterMode mode>
38 const uint16 *src_n = (
const uint16 *)(src->
data + src->
offset[zoom][1]);
41 for (uint i = bp->
skip_top; i != 0; i--) {
42 src_px = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
43 src_n = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
50 const byte *remap = bp->
remap;
52 for (
int y = 0; y < bp->
height; y++) {
57 const Colour *src_px_ln = (
const Colour *)((
const byte *)src_px + *(
const uint32 *)src_px);
61 const uint16 *src_n_ln = (
const uint16 *)((
const byte *)src_n + *(
const uint32 *)src_n);
70 while (dst < dst_end) {
78 if (dst + n > dst_end) {
79 uint d = dst_end - dst;
84 dst_end = dst + bp->
width;
86 n = std::min(n - d, (uint)bp->
width);
100 while (dst < dst_end) {
101 n = std::min<uint>(*src_n++, dst_end - dst);
103 if (src_px->a == 0) {
114 if (src_px->a == 255) {
121 uint r = remap[
GB(m, 0, 8)];
134 uint r = remap[
GB(m, 0, 8)];
145 if (src_px->a == 255) {
149 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
152 uint r = remap[
GB(m, 0, 8)];
163 if (src_px->a != 0) {
164 uint8 g =
MakeDark(src_px->r, src_px->g, src_px->b);
168 uint r = remap[
GB(m, 0, 8)];
194 if (src_px->a == 255) {
210 if (src_px->a == 255) {
246 default: NOT_REACHED();
247 case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom);
return;
255 template <
bool Tpal_to_rgb>
Sprite *Blitter_32bppOptimized::EncodeInternal(
const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
285 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
290 dst_px_orig[z] = CallocT<Colour>(size + src_orig->
height * 2);
291 dst_n_orig[z] = CallocT<uint16>(size * 2 + src_orig->
height * 4 * 2);
293 uint32 *dst_px_ln = (uint32 *)dst_px_orig[z];
294 uint32 *dst_n_ln = (uint32 *)dst_n_orig[z];
298 for (uint y = src_orig->
height; y > 0; y--) {
300 uint16 *dst_n = (uint16 *)(dst_n_ln + 1);
302 uint16 *dst_len = dst_n++;
307 for (uint x = src_orig->
width; x > 0; x--) {
309 uint t = a > 0 && a < 255 ? 1 : a;
311 if (last != t || len == 65535) {
325 if (Tpal_to_rgb && src->
m != 0) {
327 uint8 rgb_max = std::max({src->
r, src->
g, src->
b});
330 if (rgb_max == 0) rgb_max = DEFAULT_BRIGHTNESS;
331 *dst_n |= rgb_max << 8;
335 dst_px->r = colour.r;
336 dst_px->g = colour.g;
337 dst_px->b = colour.b;
345 }
else if (len == 1) {
359 dst_n = (uint16 *)
AlignPtr(dst_n, 4);
361 *dst_px_ln = (uint8 *)dst_px - (uint8 *)dst_px_ln;
362 *dst_n_ln = (uint8 *)dst_n - (uint8 *)dst_n_ln;
364 dst_px_ln = (uint32 *)dst_px;
365 dst_n_ln = (uint32 *)dst_n;
368 lengths[z][0] = (
byte *)dst_px_ln - (
byte *)dst_px_orig[z];
369 lengths[z][1] = (
byte *)dst_n_ln - (
byte *)dst_n_orig[z];
373 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
374 len += lengths[z][0] + lengths[z][1];
377 Sprite *dest_sprite = (
Sprite *)allocator(
sizeof(*dest_sprite) +
sizeof(SpriteData) + len);
384 SpriteData *dst = (SpriteData *)dest_sprite->
data;
385 memset(dst, 0,
sizeof(*dst));
387 for (
ZoomLevel z = zoom_min; z <= zoom_max; z++) {
388 dst->offset[z][0] = z == zoom_min ? 0 : lengths[z - 1][1] + dst->offset[z - 1][1];
389 dst->offset[z][1] = lengths[z][0] + dst->offset[z][0];
391 memcpy(dst->data + dst->offset[z][0], dst_px_orig[z], lengths[z][0]);
392 memcpy(dst->data + dst->offset[z][1], dst_n_orig[z], lengths[z][1]);
394 free(dst_px_orig[z]);
406 return this->EncodeInternal<true>(sprite, allocator);