DS Video: Fix 128 pixel-wide bitmap OBJs

This commit is contained in:
Vicki Pfau 2017-04-26 10:01:59 -07:00
parent cbc805b194
commit fe2f67e2aa
4 changed files with 9 additions and 6 deletions

View File

@ -164,6 +164,7 @@ struct GBAVideoSoftwareRenderer {
int oamMax;
struct GBAVideoSoftwareSprite sprites[128];
int tileStride;
int bitmapStride;
bool combinedObjSort;
int start;

View File

@ -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)) {

View File

@ -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);

View File

@ -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;