DS Video: Fix 128 pixel-wide bitmap OBJs
Vicki Pfau vi@endrift.com
Wed, 26 Apr 2017 10:01:59 -0700
4 files changed,
9 insertions(+),
6 deletions(-)
M
include/mgba/internal/gba/renderers/video-software.h
→
include/mgba/internal/gba/renderers/video-software.h
@@ -164,6 +164,7 @@ int oamDirty;
int oamMax; struct GBAVideoSoftwareSprite sprites[128]; int tileStride; + int bitmapStride; bool combinedObjSort; int start;
M
src/ds/renderers/software.c
→
src/ds/renderers/software.c
@@ -217,6 +217,7 @@ } else {
eng->tileStride = 0x20 << DSRegisterDISPCNTGetTileBoundary(dispcnt); fakeDispcnt = GBARegisterDISPCNTFillObjCharacterMapping(fakeDispcnt); } + eng->bitmapStride = 0x10 << DSRegisterDISPCNTGetBitmapObj2D(dispcnt); eng->d.writeVideoRegister(&eng->d, DS9_REG_A_DISPCNT_LO, fakeDispcnt); eng->dispcnt |= dispcnt & 0xFFFF0000; if (DSRegisterDISPCNTIsBgExtPalette(dispcnt)) {
M
src/gba/renderers/software-obj.c
→
src/gba/renderers/software-obj.c
@@ -233,8 +233,8 @@ }
int32_t x = (uint32_t) GBAObjAttributesBGetX(sprite->b) << 23; x >>= 23; unsigned charBase = GBAObjAttributesCGetTile(sprite->c); - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { - charBase = (charBase & 0x1F) * 0x10 + (charBase & ~0x1F) * 0x80; + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { + charBase = (charBase & (renderer->bitmapStride - 1)) * 0x10 + (charBase & ~(renderer->bitmapStride - 1)) * 0x80; } else { charBase *= renderer->tileStride; }@@ -281,8 +281,8 @@ }
int inY = y - (int) GBAObjAttributesAGetY(sprite->a); int stride = GBARegisterDISPCNTIsObjCharacterMapping(renderer->dispcnt) ? (width >> !GBAObjAttributesAIs256Color(sprite->a)) : 0x80; - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { - stride = 0x100; // TODO: Param + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { + stride = renderer->bitmapStride << 3; } uint32_t current;@@ -350,7 +350,7 @@ if (outX < start || outX >= condition) {
return 0; } - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { int alpha = GBAObjAttributesCGetPalette(sprite->c); if (flags & FLAG_OBJWIN) { SPRITE_TRANSFORMED_LOOP(BITMAP, OBJWIN);@@ -416,7 +416,7 @@ if (GBAObjAttributesBIsHFlip(sprite->b)) {
inX = width - inX - 1; xOffset = -1; } - if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP) { + if (GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_BITMAP && renderer->bitmapStride) { int alpha = GBAObjAttributesCGetPalette(sprite->c); if (flags & FLAG_OBJWIN) { SPRITE_NORMAL_LOOP(BITMAP, OBJWIN);
M
src/gba/renderers/video-software.c
→
src/gba/renderers/video-software.c
@@ -62,6 +62,7 @@ renderer->d.disableBG[2] = false;
renderer->d.disableBG[3] = false; renderer->d.disableOBJ = false; renderer->tileStride = 0x20; + renderer->bitmapStride = 0; renderer->combinedObjSort = false; renderer->masterEnd = VIDEO_HORIZONTAL_PIXELS; renderer->masterHeight = VIDEO_VERTICAL_PIXELS;