From 6079fbd141a2f87a37fe9cbdaf5467c17d606f31 Mon Sep 17 00:00:00 2001 From: ketmar Date: Tue, 9 Apr 2024 04:36:10 +0000 Subject: [PATCH] zxemut: better masked sprite rendering in sprview FossilOrigin-Name: 2f88ba57fe53f386dd74cc868a62b0895fad6acc594f0e1ae2b9c75fbdb90133 --- src/ZXEmuT/sprview.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/src/ZXEmuT/sprview.c b/src/ZXEmuT/sprview.c index 582fce4..352dfef 100644 --- a/src/ZXEmuT/sprview.c +++ b/src/ZXEmuT/sprview.c @@ -185,9 +185,12 @@ void sprviewSetActive (int st) { // // drawSpriteAt // +// `orflags`: `SFLAG_GET_NORMAL` or `SFLAG_GET_MASK` +// //========================================================================== static void drawSpriteAt (uint32_t addr, int x, int y, uint32_t orflags) { if (!(spr_wdt|spr_hgt)) return; + const uint8_t clrset = (orflags & SFLAG_GET_MASK ? 5 : 7); for (uint16_t dy = 0; dy < (uint16_t)spr_hgt; ++dy) { for (uint16_t dx = 0; dx < (uint16_t)spr_wdt; ++dx) { for (uint8_t xofs = 0; xofs < 8; ++xofs) { @@ -196,7 +199,39 @@ static void drawSpriteAt (uint32_t addr, int x, int y, uint32_t orflags) { uint8_t pix = getSpritePixel(addr, spx, spy, (uint16_t)spr_wdt, (uint16_t)spr_hgt, spr_type|orflags); - putPixel(x+spx, y+spy, (pix ? 7 : 0)); + putPixel(x+spx, y+spy, (pix ? clrset : 0)); + } + } + } +} + + +//========================================================================== +// +// drawMaskedSpriteAt +// +//========================================================================== +static void drawMaskedSpriteAt (uint32_t addr, int x, int y) { + if (!(spr_wdt|spr_hgt)) return; + for (uint16_t dy = 0; dy < (uint16_t)spr_hgt; ++dy) { + for (uint16_t dx = 0; dx < (uint16_t)spr_wdt; ++dx) { + for (uint8_t xofs = 0; xofs < 8; ++xofs) { + int spx = (int)(dx*8)+(int)xofs; + int spy = (int)dy; + uint8_t pix = getSpritePixel(addr, spx, spy, + (uint16_t)spr_wdt, (uint16_t)spr_hgt, + spr_type|SFLAG_GET_NORMAL); + uint8_t msk = getSpritePixel(addr, spx, spy, + (uint16_t)spr_wdt, (uint16_t)spr_hgt, + spr_type|SFLAG_GET_MASK); + uint8_t clr = 3; + switch ((pix ? 1 : 0) | (msk ? 2 : 0)) { + case 0: clr = 0; break; // pixel:0, mask:0 + case 1: clr = 7; break; // pixel:1, mask:0 + case 2: clr = 1; break; // pixel:0, mask:1 + case 3: clr = 5; break; // pixel:1, mask:1 + } + putPixel(x+spx, y+spy, clr); } } } @@ -248,10 +283,12 @@ static void drawScreenPhase0 (void) { for (int spx = 2; !wasOneX || spx < SCREEN_WIDTH-spw; spx += spw+6) { wasOneX = 1; // draw sprite - drawSpriteAt(addr, spx, spy, SFLAG_GET_NORMAL); - // draw mask - if (spr_type&SFLAG_MASK_PRESENT) { + if (spr_type & SFLAG_MASK_PRESENT) { + drawMaskedSpriteAt(addr, spx, spy); + // draw mask drawSpriteAt(addr, spx+spr_wdt*8+4, spy, SFLAG_GET_MASK); + } else { + drawSpriteAt(addr, spx, spy, SFLAG_GET_NORMAL); } addr += spr_wdt*(spr_type&SFLAG_MASK_PRESENT ? 2 : 1)*spr_hgt; } @@ -574,9 +611,9 @@ static void write_urf (void) { uint8_t msk = getSpritePixel(spr_staddr, spx, spy, (uint16_t)spr_wdt, (uint16_t)spr_hgt, spr_type|SFLAG_GET_MASK); if (msk) { - fprintf(fo, "%c", (bmp ? '#' : ':')); - } else { fprintf(fo, "%c", (bmp ? '!' : '.')); + } else { + fprintf(fo, "%c", (bmp ? '#' : ':')); } } else { fprintf(fo, "%c", (bmp ? '#' : '.')); -- 2.11.4.GIT