From fe2f67e2aa2246e8ec2c2599a480d6ff7557f3f7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 26 Apr 2017 10:01:59 -0700 Subject: [PATCH] DS Video: Fix 128 pixel-wide bitmap OBJs --- include/mgba/internal/gba/renderers/video-software.h | 1 + src/ds/renderers/software.c | 1 + src/gba/renderers/software-obj.c | 12 ++++++------ src/gba/renderers/video-software.c | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/mgba/internal/gba/renderers/video-software.h b/include/mgba/internal/gba/renderers/video-software.h index 50ef17a2f..02298ee79 100644 --- a/include/mgba/internal/gba/renderers/video-software.h +++ b/include/mgba/internal/gba/renderers/video-software.h @@ -164,6 +164,7 @@ struct GBAVideoSoftwareRenderer { int oamMax; struct GBAVideoSoftwareSprite sprites[128]; int tileStride; + int bitmapStride; bool combinedObjSort; int start; diff --git a/src/ds/renderers/software.c b/src/ds/renderers/software.c index 41df1eadd..8df24a25e 100644 --- a/src/ds/renderers/software.c +++ b/src/ds/renderers/software.c @@ -217,6 +217,7 @@ static void DSVideoSoftwareRendererUpdateDISPCNT(struct DSVideoSoftwareRenderer* 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)) { diff --git a/src/gba/renderers/software-obj.c b/src/gba/renderers/software-obj.c index a8af89a81..9d1ab3871 100644 --- a/src/gba/renderers/software-obj.c +++ b/src/gba/renderers/software-obj.c @@ -233,8 +233,8 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re 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 GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re 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 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re 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 @@ int GBAVideoSoftwareRendererPreprocessSprite(struct GBAVideoSoftwareRenderer* re 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); diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 2d0876a71..d633d61a0 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -62,6 +62,7 @@ void GBAVideoSoftwareRendererCreate(struct GBAVideoSoftwareRenderer* renderer) { 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;