Merge branch 'pngpal-compare' into 'next'

Compare PNG palettes with the game's palette, instead of assuming they are the same

See merge request STJr/SRB2!1185
This commit is contained in:
James R 2020-11-08 20:46:07 -05:00
commit b2dc35864e
1 changed files with 31 additions and 12 deletions

View File

@ -887,26 +887,45 @@ static png_bytep *PNG_Read(
// matches the color count of SRB2's palette: 256 colors.
if (png_get_PLTE(png_ptr, png_info_ptr, &palette, &palette_size))
{
if (palette_size == 256)
if (palette_size == 256 && pMasterPalette)
{
png_colorp pal = palette;
INT32 i;
usepal = true;
for (i = 0; i < 256; i++)
{
UINT32 rgb = R_PutRgbaRGBA(pal->red, pal->green, pal->blue, 0xFF);
if (rgb != pMasterPalette[i].rgba)
{
usepal = false;
break;
}
pal++;
}
}
}
// If any of the tRNS colors have an alpha lower than 0xFF, and that
// color is present on the image, the palette flag is disabled.
png_get_tRNS(png_ptr, png_info_ptr, &trans, &trans_num, &trans_values);
if (trans && trans_num == 256)
if (usepal)
{
int i;
for (i = 0; i < trans_num; i++)
png_get_tRNS(png_ptr, png_info_ptr, &trans, &trans_num, &trans_values);
if (trans && trans_num == 256)
{
// libpng will transform this image into RGB even if
// the transparent index does not exist in the image,
// and there is no way around that.
if (trans[i] < 0xFF)
INT32 i;
for (i = 0; i < trans_num; i++)
{
usepal = false;
break;
// libpng will transform this image into RGB even if
// the transparent index does not exist in the image,
// and there is no way around that.
if (trans[i] < 0xFF)
{
usepal = false;
break;
}
}
}
}