mirror of https://github.com/mgba-emu/mgba.git
DS Video: Fix 128 pixel-wide bitmap OBJs
This commit is contained in:
parent
cbc805b194
commit
fe2f67e2aa
|
@ -164,6 +164,7 @@ struct GBAVideoSoftwareRenderer {
|
|||
int oamMax;
|
||||
struct GBAVideoSoftwareSprite sprites[128];
|
||||
int tileStride;
|
||||
int bitmapStride;
|
||||
bool combinedObjSort;
|
||||
|
||||
int start;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue