DS Video: Fix non-zero sprite extended palettes
Vicki Pfau vi@endrift.com
Fri, 03 Mar 2017 18:49:37 -0800
2 files changed,
38 insertions(+),
2 deletions(-)
M
src/ds/renderers/software.c
→
src/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.c
→
src/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;