Colorspace Handler: Fix RGBA8888 to RGBA5551 color conversions in AltiVec.

This commit is contained in:
rogerman 2025-07-19 18:53:07 -07:00
parent f03f8943a0
commit 6bcf70dc6d
1 changed files with 23 additions and 2 deletions

View File

@ -207,7 +207,19 @@ FORCEINLINE v128u16 _ConvertColorBaseTo5551_AltiVec(const v128u32 &srcLo, const
// Convert alpha
dstAlpha = vec_packsu( vec_and(srcLo, ((v128u32){0x000000FF,0x000000FF,0x000000FF,0x000000FF})), vec_and(srcHi, ((v128u32){0x000000FF,0x000000FF,0x000000FF,0x000000FF})) );
dstAlpha = vec_cmpgt( dstAlpha, vec_splat_u16(0) );
dstAlpha = vec_and( dstAlpha, ((v128u16){0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000}) );
if (COLORFORMAT == NDSColorFormat_BGR666_Rev)
{
dstAlpha = vec_and( dstAlpha, ((v128u16){0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000}) );
}
else if (COLORFORMAT == NDSColorFormat_BGR888_Rev)
{
// TODO: Don't know why RGBA8888 colors need to swap bytes for the final 16-bit color
// when RGBA6665 colors don't need to, but real-world testing shows that RGBA8888 colors
// need to do this. Further testing is needed to find out why this byte swap is necessary.
// - rogerman, 2025/07/19
dstAlpha = vec_and( dstAlpha, ((v128u16){0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080,0x0080}) );
}
// Convert RGB
if (SWAP_RB)
@ -221,8 +233,17 @@ FORCEINLINE v128u16 _ConvertColorBaseTo5551_AltiVec(const v128u32 &srcLo, const
rgbHi = vec_perm( (v128u8)rgbHi, (v128u8)rgbHi, ((v128u8){3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12}) );
}
// Convert from 32-bit color to 16-bit color using the built-in AltiVec instruction vpkpx.
dstColor = (v128u16)vec_packpx(rgbLo, rgbHi);
dstColor = vec_and( dstColor, ((v128u16){0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF}) );
if (COLORFORMAT == NDSColorFormat_BGR666_Rev)
{
dstColor = vec_and( dstColor, ((v128u16){0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF,0x7FFF}) );
}
else if (COLORFORMAT == NDSColorFormat_BGR888_Rev)
{
dstColor = vec_and( dstColor, ((v128u16){0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F,0xFF7F}) );
}
return (v128u16)vec_or( (v128u8)dstColor, (v128u8)dstAlpha );
}