From c2d648d28446f18e01656392fb23c000c4c6a45d Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 18 Jan 2019 23:03:14 -0500 Subject: [PATCH] bugfixes: TIF loading, sprite display --- testbed.c | 82 ++++++++++++++++++++++++++-------------------------- testbed.exe | Bin 64086 -> 64140 bytes 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/testbed.c b/testbed.c index 5d37102..61cf5a5 100755 --- a/testbed.c +++ b/testbed.c @@ -386,11 +386,12 @@ int tifLoad(FILE *f, TifImageMeta_t meta, unsigned int *planeBuf, int maxY, int unsigned long offset; unsigned char rowData[MAX_WIDTH >> 1]; unsigned int planeStride = (meta.width >> 4) * yRepeat; - unsigned int *b = planeBuf - 1; - unsigned int *g = b + planeStride; - unsigned int *r = g + planeStride; - unsigned int *i = r + planeStride; - unsigned int *m = i + planeStride; + unsigned int *bp = planeBuf; + unsigned int *gp = bp + planeStride; + unsigned int *rp = gp + planeStride; + unsigned int *ip = rp + planeStride; + unsigned int *mp = ip + planeStride; + unsigned char bv, gv, rv, iv; if (meta.width > MAX_WIDTH || (meta.width % 16) != 0 || planes < 4 || planes > 5) { return 0; @@ -402,30 +403,31 @@ int tifLoad(FILE *f, TifImageMeta_t meta, unsigned int *planeBuf, int maxY, int fseek(f, offset, SEEK_SET); for (irow = 0; irow < meta.rowsPerStrip; irow ++) { - fread(rowData, 1, meta.width >> 1, f); - for (ipixelpair = 0; ipixelpair < meta.width >> 1; ipixelpair ++) { + int ipixelpairLim = meta.width >> 1; + fread(rowData, 1, ipixelpairLim, f); + bv = gv = rv = iv = 0; + for (ipixelpair = 0; ipixelpair < ipixelpairLim; ipixelpair ++) { unsigned char pixelpair = rowData[ipixelpair]; int bpair = (pixelpair & 0x01) | (pixelpair & 0x10) >> 3; int gpair = (pixelpair & 0x02) >> 1 | (pixelpair & 0x20) >> 4; int rpair = (pixelpair & 0x04) >> 2 | (pixelpair & 0x40) >> 5; int ipair = (pixelpair & 0x08) >> 3 | (pixelpair & 0x80) >> 6; - int shift = (ipixelpair % 8) << 1; - if (shift == 0) { - *++b = bpair; - *++g = gpair; - *++r = rpair; - *++i = ipair; + int shift = (3 - (ipixelpair % 4)) << 1; + + bv |= bpair << shift; + gv |= gpair << shift; + rv |= rpair << shift; + iv |= ipair << shift; + + if (shift == 0 || ipixelpair == ipixelpairLim - 1) { + *bp++ = bv; + *gp++ = gv; + *rp++ = rv; + *ip++ = iv; if (planes == 5) { - *++m = bpair & gpair & rpair & ipair; - } - } else { - *b |= bpair << shift; - *g |= gpair << shift; - *r |= rpair << shift; - *i |= ipair << shift; - if (planes == 5) { - *m |= (bpair & gpair & rpair & ipair) << shift; + *mp++ = bv & gv & rv & iv; } + bv = gv = rv = iv = 0; } } y++; @@ -433,10 +435,11 @@ int tifLoad(FILE *f, TifImageMeta_t meta, unsigned int *planeBuf, int maxY, int return y; } if (y % yRepeat == 0) { - b += planeStride * (planes - 1); - g += planeStride * (planes - 1); - r += planeStride * (planes - 1); - i += planeStride * (planes - 1); + bp += planeStride * (planes - 1); + gp += planeStride * (planes - 1); + rp += planeStride * (planes - 1); + ip += planeStride * (planes - 1); + mp += planeStride * (planes - 1); } } } @@ -509,11 +512,11 @@ int prepareBuffer(int pageX, int pageY) { unsigned int startY = screen.scrollY >> 4; unsigned char tile = screen.map[startX + pageX + ((startY + pageY) * screen.w)]; unsigned char ibuffer = screen.nextBuffer; - screen.nextBuffer = nextBufferIndex(screen.nextBuffer); + screen.nextBuffer = nextBufferIndex(ibuffer); *dirty = ibuffer; - memcpy(screen.buffer[ibuffer], &screen.memTiles[tile * BUF_WSIZE], BUF_WSIZE); + memcpy(screen.buffer[ibuffer], &screen.memTiles[tile * BUF_WSIZE], BUF_WSIZE << 1); screen.bufferOffset[ibuffer] = screen.pageOffset[screen.currentPage] - + (pageX << 1) + (pageY * PAGE_STRIDE); + + (pageX << 1) + (pageY * PAGE_STRIDE * 16); } return *dirty; } @@ -558,12 +561,10 @@ void drawSpriteToBuf(unsigned int *sprite, int pageX, int pageY, int shift, int } void drawSprite(unsigned int *sprite, int x, int y) { - unsigned int startX = screen.scrollX >> 4; - unsigned int startY = screen.scrollY >> 4; - int pageX = (x - startX) >> 4; - int pageY = (y - startY) >> 4; - int pageOffsetX = x - (pageX << 4); - int pageOffsetY = y - (pageY << 4); + int pageX = (x - (screen.scrollX & 0xfff0)) >> 4; + int pageY = (y - (screen.scrollY & 0xfff0)) >> 4; + int pageOffsetX = x & 0x0f; + int pageOffsetY = y & 0x0f; drawSpriteToBuf(sprite, pageX, pageY, pageOffsetX, pageOffsetY); drawSpriteToBuf(sprite, pageX + 1, pageY, pageOffsetX - 16, pageOffsetY); @@ -572,15 +573,14 @@ void drawSprite(unsigned int *sprite, int x, int y) { } void scroll(int x, int y) { - unsigned int startX = screen.scrollX >> 4; - unsigned int startY = screen.scrollY >> 4; x = min(max(x, 0), (screen.w << 4) - 320); y = min(max(y, 0), (screen.h << 4) - 176); - screen.scrollX = x; - screen.scrollY = y; - if (startX != (x >> 4) || startY != (y >> 4)) { + if ((screen.scrollX & 0xfff0) != (x & 0xfff0) || + (screen.scrollY & 0xfff0) != (y & 0xfff0)) { memset(screen.dirty, D_BGTILE, 2 * PAGE_TILES_COUNT); } + screen.scrollX = x; + screen.scrollY = y; } void drawScreen() { @@ -695,7 +695,7 @@ int main() { if (keyPressed(K_RIGHT)) x += 1; if (keyPressed(K_UP)) y -= 1; if (keyPressed(K_DOWN)) y += 1; - scroll(x + 152, y + 90); + scroll(x - 152, y - 90); drawSprite(sprites[0], 50, 50); drawSprite(sprites[1], x, y); drawScreen(); diff --git a/testbed.exe b/testbed.exe index ffcb4e3e9ad30da4ecd78c0c7836f307d3ad5d84..b39e2c7af6e1ea5aef266039b6789a2210ee8245 100755 GIT binary patch delta 5186 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 NqWL`k(X0E#zX4iseLesH