all repos — mgba @ 7b8fc0dbaaa93ebe3abbedd1e1d523088b0d4c53

mGBA Game Boy Advance Emulator

DS Video: Fix non-zero sprite extended palettes
Vicki Pfau vi@endrift.com
Fri, 03 Mar 2017 18:49:37 -0800
commit

7b8fc0dbaaa93ebe3abbedd1e1d523088b0d4c53

parent

9b5bda237a75d6d82fafe5a8406811bd6b017b9d

2 files changed, 38 insertions(+), 2 deletions(-)

jump to
M src/ds/renderers/software.csrc/ds/renderers/software.c

@@ -85,6 +85,7 @@ }

} if (obj) { softwareRenderer->objExtPalette = palette; + softwareRenderer->objExtVariantPalette = variantPalette; } else { if (slot >= 2) { if (GBARegisterBGCNTIsExtPaletteSlot(softwareRenderer->bg[slot - 2].control)) {
M src/gba/renderers/software-obj.csrc/gba/renderers/software-obj.c

@@ -203,7 +203,15 @@ color_t* objwinPalette = palette;

int objwinSlowPath = GBARegisterDISPCNTIsObjwinEnable(renderer->dispcnt) && GBAWindowControlGetBlendEnable(renderer->objwin.packed) != GBAWindowControlIsBlendEnable(renderer->currentWindow.packed); if (GBAObjAttributesAIs256Color(sprite->a) && renderer->objExtPalette) { - palette = renderer->objExtPalette; + if (!variant) { + palette = renderer->objExtPalette; + objwinPalette = palette; + } else { + palette = renderer->objExtVariantPalette; + if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) { + objwinPalette = palette; + } + } } else if (variant) { palette = &renderer->variantPalette[0x100]; if (GBAWindowControlIsBlendEnable(renderer->objwin.packed)) {

@@ -289,10 +297,20 @@ SPRITE_TRANSFORMED_LOOP(16, NORMAL_OBJWIN);

} else { SPRITE_TRANSFORMED_LOOP(16, NORMAL); } + } else if (!renderer->objExtPalette) { + if (flags & FLAG_OBJWIN) { + SPRITE_TRANSFORMED_LOOP(256, OBJWIN); + } else if (objwinSlowPath) { + SPRITE_TRANSFORMED_LOOP(256, NORMAL_OBJWIN); + } else { + SPRITE_TRANSFORMED_LOOP(256, NORMAL); + } } else { + palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 8]; if (flags & FLAG_OBJWIN) { SPRITE_TRANSFORMED_LOOP(256, OBJWIN); } else if (objwinSlowPath) { + objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8]; SPRITE_TRANSFORMED_LOOP(256, NORMAL_OBJWIN); } else { SPRITE_TRANSFORMED_LOOP(256, NORMAL);

@@ -343,21 +361,38 @@ SPRITE_NORMAL_LOOP(16, NORMAL_OBJWIN);

} else { SPRITE_NORMAL_LOOP(16, NORMAL); } + } else if (!renderer->objExtPalette) { + if (flags & FLAG_OBJWIN) { + SPRITE_NORMAL_LOOP(256, OBJWIN); + } else if (mosaicH > 1) { + if (objwinSlowPath) { + SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN); + } else { + SPRITE_MOSAIC_LOOP(256, NORMAL); + } + } else if (objwinSlowPath) { + SPRITE_NORMAL_LOOP(256, NORMAL_OBJWIN); + } else { + SPRITE_NORMAL_LOOP(256, NORMAL); + } } else { + palette = &palette[GBAObjAttributesCGetPalette(sprite->c) << 8]; if (flags & FLAG_OBJWIN) { SPRITE_NORMAL_LOOP(256, OBJWIN); } else if (mosaicH > 1) { if (objwinSlowPath) { - objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 4]; + objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8]; SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN); } else { SPRITE_MOSAIC_LOOP(256, NORMAL); } } else if (objwinSlowPath) { + objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8]; SPRITE_NORMAL_LOOP(256, NORMAL_OBJWIN); } else { SPRITE_NORMAL_LOOP(256, NORMAL); } + } if (x + width > renderer->masterEnd) { renderer->spriteCyclesRemaining -= x + width - renderer->masterEnd;