summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gfx.c1118
1 files changed, 573 insertions, 545 deletions
diff --git a/gfx.c b/gfx.c
index fdb49353b..61b3c0a26 100644
--- a/gfx.c
+++ b/gfx.c
@@ -675,126 +675,129 @@ static void GfxBlitTileZoomIn(BlitterParams *bp)
Pixel *dst;
const byte *ctab;
- if (bp->mode & 1) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
-
- do {
+ src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
+ switch (bp->mode) {
+ case 1:
do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
-
- ctab = _color_remap_ptr;
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+
+ for (; num >= 4; num -=4) {
+ dst[3] = ctab[src[3]];
+ dst[2] = ctab[src[2]];
+ dst[1] = ctab[src[1]];
+ dst[0] = ctab[src[0]];
+ dst += 4;
+ src += 4;
+ }
+ for (; num != 0; num--) *dst++ = ctab[*src++];
+ } while (!(done & 0x80));
- for (; num >= 4; num -=4) {
- dst[3] = ctab[src[3]];
- dst[2] = ctab[src[2]];
- dst[1] = ctab[src[1]];
- dst[0] = ctab[src[0]];
- dst += 4;
- src += 4;
- }
- for (; num != 0; num--) *dst++ = ctab[*src++];
- } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ } while (--bp->height != 0);
+ break;
- bp->dst += bp->pitch;
- } while (--bp->height != 0);
- } else if (bp->mode & 2) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- do {
+ case 2:
do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src_o += num + 2;
-
- dst = bp->dst;
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip;
- } else {
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip;
+ } else {
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+ for (; num != 0; num--) {
+ *dst = ctab[*dst];
+ dst++;
+ }
+ } while (!(done & 0x80));
- ctab = _color_remap_ptr;
- for (; num != 0; num--) {
- *dst = ctab[*dst];
- dst++;
- }
- } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ } while (--bp->height != 0);
+ break;
- bp->dst += bp->pitch;
- } while (--bp->height != 0);
- } else {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- do {
+ default:
do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
#if defined(_WIN32)
- if (num & 1) *dst++ = *src++;
- if (num & 2) { *(uint16*)dst = *(uint16*)src; dst += 2; src += 2; }
- if (num >>= 2) {
- do {
- *(uint32*)dst = *(uint32*)src;
- dst += 4;
- src += 4;
- } while (--num != 0);
- }
+ if (num & 1) *dst++ = *src++;
+ if (num & 2) { *(uint16*)dst = *(uint16*)src; dst += 2; src += 2; }
+ if (num >>= 2) {
+ do {
+ *(uint32*)dst = *(uint32*)src;
+ dst += 4;
+ src += 4;
+ } while (--num != 0);
+ }
#else
- memcpy(dst, src, num);
+ memcpy(dst, src, num);
#endif
- } while (!(done & 0x80));
+ } while (!(done & 0x80));
- bp->dst += bp->pitch;
- } while (--bp->height != 0);
+ bp->dst += bp->pitch;
+ } while (--bp->height != 0);
+ break;
}
}
@@ -809,62 +812,68 @@ static void GfxBlitZoomInUncomp(BlitterParams *bp)
assert(height > 0);
assert(width > 0);
- if (bp->mode & 1) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
+ switch (bp->mode) {
+ case 1:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
- do {
- for (i = 0; i != width; i++) {
- byte b = ctab[src[i]];
+ do {
+ for (i = 0; i != width; i++) {
+ byte b = ctab[src[i]];
+
+ if (b != 0) dst[i] = b;
+ }
+ src += bp->width_org;
+ dst += bp->pitch;
+ } while (--height != 0);
+ }
+ break;
- if (b != 0) dst[i] = b;
- }
- src += bp->width_org;
- dst += bp->pitch;
- } while (--height != 0);
- }
- } else if (bp->mode & 2) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
+ case 2:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
- do {
- for (i = 0; i != width; i++)
- if (src[i] != 0) dst[i] = ctab[dst[i]];
- src += bp->width_org;
- dst += bp->pitch;
- } while (--height != 0);
- }
- } else {
- if (!(bp->info & 1)) {
- do {
- memcpy(dst, src, width);
- src += bp->width_org;
- dst += bp->pitch;
- } while (--height != 0);
- } else {
- do {
- int n = width;
+ do {
+ for (i = 0; i != width; i++)
+ if (src[i] != 0) dst[i] = ctab[dst[i]];
+ src += bp->width_org;
+ dst += bp->pitch;
+ } while (--height != 0);
+ }
+ break;
- for (; n >= 4; n -= 4) {
- if (src[0] != 0) dst[0] = src[0];
- if (src[1] != 0) dst[1] = src[1];
- if (src[2] != 0) dst[2] = src[2];
- if (src[3] != 0) dst[3] = src[3];
+ default:
+ if (!(bp->info & 1)) {
+ do {
+ memcpy(dst, src, width);
+ src += bp->width_org;
+ dst += bp->pitch;
+ } while (--height != 0);
+ } else {
+ do {
+ int n = width;
- dst += 4;
- src += 4;
- }
+ for (; n >= 4; n -= 4) {
+ if (src[0] != 0) dst[0] = src[0];
+ if (src[1] != 0) dst[1] = src[1];
+ if (src[2] != 0) dst[2] = src[2];
+ if (src[3] != 0) dst[3] = src[3];
- for (; n != 0; n--) {
- if (src[0] != 0) dst[0] = src[0];
- src++;
- dst++;
- }
+ dst += 4;
+ src += 4;
+ }
- src += bp->width_org - width;
- dst += bp->pitch - width;
- } while (--height != 0);
- }
+ for (; n != 0; n--) {
+ if (src[0] != 0) dst[0] = src[0];
+ src++;
+ dst++;
+ }
+
+ src += bp->width_org - width;
+ dst += bp->pitch - width;
+ } while (--height != 0);
+ }
+ break;
}
}
@@ -877,151 +886,155 @@ static void GfxBlitTileZoomMedium(BlitterParams *bp)
Pixel *dst;
const byte *ctab;
- if (bp->mode & 1) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- do {
+ src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
+ switch (bp->mode) {
+ case 1:
do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- src++;
- if (--num == 0) continue;
- }
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 1;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ src++;
+ if (--num == 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 1;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+ num = (num + 1) >> 1;
+ for (; num != 0; num--) {
+ *dst = ctab[*src];
+ dst++;
+ src += 2;
+ }
+ } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- ctab = _color_remap_ptr;
- num = (num + 1) >> 1;
- for (; num != 0; num--) {
- *dst = ctab[*src];
- dst++;
- src += 2;
- }
- } while (!(done & 0x80));
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ } while (--bp->height != 0);
+ break;
+ case 2:
do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- } while (--bp->height != 0);
- } else if (bp->mode & 2) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- do {
- do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- if (--num == 0) continue;
- }
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 1;
- } else {
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ if (--num == 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 1;
+ } else {
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+ num = (num + 1) >> 1;
+ for (; num != 0; num--) {
+ *dst = ctab[*dst];
+ dst++;
+ }
+ } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- ctab = _color_remap_ptr;
- num = (num + 1) >> 1;
- for (; num != 0; num--) {
- *dst = ctab[*dst];
- dst++;
- }
- } while (!(done & 0x80));
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ } while (--bp->height != 0);
+ break;
+ default:
do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- } while (--bp->height != 0);
- } else {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- do {
- do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- src++;
- if (--num == 0) continue;
- }
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 1;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
-
- num = (num + 1) >> 1;
-
- for (; num != 0; num--) {
- *dst = *src;
- dst++;
- src += 2;
- }
-
- } while (!(done & 0x80));
-
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ src++;
+ if (--num == 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 1;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ num = (num + 1) >> 1;
+
+ for (; num != 0; num--) {
+ *dst = *src;
+ dst++;
+ src += 2;
+ }
+
+ } while (!(done & 0x80));
+
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- } while (--bp->height != 0);
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ } while (--bp->height != 0);
+ break;
}
}
@@ -1036,40 +1049,46 @@ static void GfxBlitZoomMediumUncomp(BlitterParams *bp)
assert(height > 0);
assert(width > 0);
- if (bp->mode & 1) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
+ switch (bp->mode) {
+ case 1:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
- for (height >>= 1; height != 0; height--) {
- for (i = 0; i != width >> 1; i++) {
- byte b = ctab[src[i * 2]];
+ for (height >>= 1; height != 0; height--) {
+ for (i = 0; i != width >> 1; i++) {
+ byte b = ctab[src[i * 2]];
- if (b != 0) dst[i] = b;
+ if (b != 0) dst[i] = b;
+ }
+ src += bp->width_org * 2;
+ dst += bp->pitch;
}
- src += bp->width_org * 2;
- dst += bp->pitch;
}
- }
- } else if (bp->mode & 2) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
-
- for (height >>= 1; height != 0; height--) {
- for (i = 0; i != width >> 1; i++)
- if (src[i * 2] != 0) dst[i] = ctab[dst[i]];
- src += bp->width_org * 2;
- dst += bp->pitch;
+ break;
+
+ case 2:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
+
+ for (height >>= 1; height != 0; height--) {
+ for (i = 0; i != width >> 1; i++)
+ if (src[i * 2] != 0) dst[i] = ctab[dst[i]];
+ src += bp->width_org * 2;
+ dst += bp->pitch;
+ }
}
- }
- } else {
- if (bp->info & 1) {
- for (height >>= 1; height != 0; height--) {
- for (i = 0; i != width >> 1; i++)
- if (src[i * 2] != 0) dst[i] = src[i * 2];
- src += bp->width_org * 2;
- dst += bp->pitch;
+ break;
+
+ default:
+ if (bp->info & 1) {
+ for (height >>= 1; height != 0; height--) {
+ for (i = 0; i != width >> 1; i++)
+ if (src[i * 2] != 0) dst[i] = src[i * 2];
+ src += bp->width_org * 2;
+ dst += bp->pitch;
+ }
}
- }
+ break;
}
}
@@ -1082,210 +1101,214 @@ static void GfxBlitTileZoomOut(BlitterParams *bp)
Pixel *dst;
const byte *ctab;
- if (bp->mode & 1) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- for (;;) {
- do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- src++;
- if (--num == 0) continue;
- }
-
- if (skip & 2) {
- skip += 2;
- src += 2;
- num -= 2;
- if (num <= 0) continue;
- }
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 2;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
-
- ctab = _color_remap_ptr;
- num = (num + 3) >> 2;
- for (; num != 0; num--) {
- *dst = ctab[*src];
- dst++;
- src += 4;
- }
- } while (!(done & 0x80));
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
-
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
-
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
-
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
- }
- } else if (bp->mode & 2) {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- for (;;) {
- do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- if (--num == 0) continue;
- }
-
- if (skip & 2) {
- skip += 2;
- num -= 2;
- if (num <= 0) continue;
- }
-
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 2;
- } else {
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
-
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
-
- ctab = _color_remap_ptr;
- num = (num + 3) >> 2;
- for (; num != 0; num--) {
- *dst = ctab[*dst];
- dst++;
- }
-
- } while (!(done & 0x80));
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
-
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
+ src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
+ switch (bp->mode) {
+ case 1:
+ for (;;) {
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ src++;
+ if (--num == 0) continue;
+ }
+
+ if (skip & 2) {
+ skip += 2;
+ src += 2;
+ num -= 2;
+ if (num <= 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 2;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+ num = (num + 3) >> 2;
+ for (; num != 0; num--) {
+ *dst = ctab[*src];
+ dst++;
+ src += 4;
+ }
+ } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
- }
- } else {
- src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
- for (;;) {
- do {
- done = src_o[0];
- num = done & 0x7F;
- skip = src_o[1];
- src = src_o + 2;
- src_o += num + 2;
-
- dst = bp->dst;
-
- if (skip & 1) {
- skip++;
- src++;
- if (--num == 0) continue;
- }
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- if (skip & 2) {
- skip += 2;
- src += 2;
- num -= 2;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
+ }
+ break;
- if ( (skip -= bp->start_x) > 0) {
- dst += skip >> 2;
- } else {
- src -= skip;
- num += skip;
- if (num <= 0) continue;
- skip = 0;
- }
+ case 2:
+ for (;;) {
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ if (--num == 0) continue;
+ }
+
+ if (skip & 2) {
+ skip += 2;
+ num -= 2;
+ if (num <= 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 2;
+ } else {
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ ctab = _color_remap_ptr;
+ num = (num + 3) >> 2;
+ for (; num != 0; num--) {
+ *dst = ctab[*dst];
+ dst++;
+ }
+
+ } while (!(done & 0x80));
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- skip = skip + num - bp->width;
- if (skip > 0) {
- num -= skip;
- if (num <= 0) continue;
- }
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- num = (num + 3) >> 2;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- for (; num != 0; num--) {
- *dst = *src;
- dst++;
- src += 4;
- }
- } while (!(done & 0x80));
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
+ }
+ break;
- bp->dst += bp->pitch;
- if (--bp->height == 0) return;
+ default:
+ for (;;) {
+ do {
+ done = src_o[0];
+ num = done & 0x7F;
+ skip = src_o[1];
+ src = src_o + 2;
+ src_o += num + 2;
+
+ dst = bp->dst;
+
+ if (skip & 1) {
+ skip++;
+ src++;
+ if (--num == 0) continue;
+ }
+
+ if (skip & 2) {
+ skip += 2;
+ src += 2;
+ num -= 2;
+ if (num <= 0) continue;
+ }
+
+ if ( (skip -= bp->start_x) > 0) {
+ dst += skip >> 2;
+ } else {
+ src -= skip;
+ num += skip;
+ if (num <= 0) continue;
+ skip = 0;
+ }
+
+ skip = skip + num - bp->width;
+ if (skip > 0) {
+ num -= skip;
+ if (num <= 0) continue;
+ }
+
+ num = (num + 3) >> 2;
+
+ for (; num != 0; num--) {
+ *dst = *src;
+ dst++;
+ src += 4;
+ }
+ } while (!(done & 0x80));
+
+ bp->dst += bp->pitch;
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
- do {
- done = src_o[0];
- src_o += (done & 0x7F) + 2;
- } while (!(done & 0x80));
- if (--bp->height == 0) return;
- }
+ do {
+ done = src_o[0];
+ src_o += (done & 0x7F) + 2;
+ } while (!(done & 0x80));
+ if (--bp->height == 0) return;
+ }
+ break;
}
}
@@ -1300,44 +1323,49 @@ static void GfxBlitZoomOutUncomp(BlitterParams *bp)
assert(height > 0);
assert(width > 0);
- if (bp->mode & 1) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
+ switch (bp->mode) {
+ case 1:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
- for (height >>= 2; height != 0; height--) {
- for (i = 0; i != width >> 2; i++) {
- byte b = ctab[src[i * 4]];
+ for (height >>= 2; height != 0; height--) {
+ for (i = 0; i != width >> 2; i++) {
+ byte b = ctab[src[i * 4]];
- if (b != 0) dst[i] = b;
+ if (b != 0) dst[i] = b;
+ }
+ src += bp->width_org * 4;
+ dst += bp->pitch;
}
- src += bp->width_org * 4;
- dst += bp->pitch;
}
- }
- } else if (bp->mode & 2) {
- if (bp->info & 1) {
- const byte *ctab = _color_remap_ptr;
-
- for (height >>= 2; height != 0; height--) {
- for (i = 0; i != width >> 2; i++)
- if (src[i * 4] != 0) dst[i] = ctab[dst[i]];
- src += bp->width_org * 4;
- dst += bp->pitch;
+ break;
+
+ case 2:
+ if (bp->info & 1) {
+ const byte *ctab = _color_remap_ptr;
+
+ for (height >>= 2; height != 0; height--) {
+ for (i = 0; i != width >> 2; i++)
+ if (src[i * 4] != 0) dst[i] = ctab[dst[i]];
+ src += bp->width_org * 4;
+ dst += bp->pitch;
+ }
}
- }
- } else {
- if (bp->info & 1) {
- for (height >>= 2; height != 0; height--) {
- for (i = 0; i != width >> 2; i++)
- if (src[i * 4] != 0) dst[i] = src[i * 4];
- src += bp->width_org * 4;
- dst += bp->pitch;
+ break;
+
+ default:
+ if (bp->info & 1) {
+ for (height >>= 2; height != 0; height--) {
+ for (i = 0; i != width >> 2; i++)
+ if (src[i * 4] != 0) dst[i] = src[i * 4];
+ src += bp->width_org * 4;
+ dst += bp->pitch;
+ }
}
- }
+ break;
}
}
-typedef void (*BlitZoomFunc)(BlitterParams *bp);
static void GfxMainBlitter(const Sprite *sprite, int x, int y, int mode)
{