gdiplus: Convert to 32bppARGB when PNG image with transparency chunk is loaded. (rebased).
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=44409 Signed-off-by: Akihiro Sagawa <sagawa.aki@gmail.com> Signed-off-by: Vincent Povirk <vincent@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
5855ff7846
commit
748a246a8d
|
@ -3949,6 +3949,39 @@ static GpStatus decode_image_jpeg(IStream* stream, GpImage **image)
|
||||||
return decode_image_wic(stream, &GUID_ContainerFormatJpeg, NULL, image);
|
return decode_image_wic(stream, &GUID_ContainerFormatJpeg, NULL, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL has_png_transparency_chunk(IStream *pIStream)
|
||||||
|
{
|
||||||
|
LARGE_INTEGER seek;
|
||||||
|
BOOL has_tRNS = FALSE;
|
||||||
|
HRESULT hr;
|
||||||
|
BYTE header[8];
|
||||||
|
|
||||||
|
seek.QuadPart = 8;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
ULARGE_INTEGER chunk_start;
|
||||||
|
ULONG bytesread, chunk_size;
|
||||||
|
|
||||||
|
hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, &chunk_start);
|
||||||
|
if (FAILED(hr)) break;
|
||||||
|
|
||||||
|
hr = IStream_Read(pIStream, header, 8, &bytesread);
|
||||||
|
if (FAILED(hr) || bytesread < 8) break;
|
||||||
|
|
||||||
|
chunk_size = (header[0] << 24) | (header[1] << 16) | (header[2] << 8) | header[3];
|
||||||
|
if (!memcmp(&header[4], "tRNS", 4))
|
||||||
|
{
|
||||||
|
has_tRNS = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
seek.QuadPart = chunk_start.QuadPart + chunk_size + 12; /* skip data and CRC */
|
||||||
|
} while (memcmp(&header[4], "IDAT", 4) && memcmp(&header[4], "IEND", 4));
|
||||||
|
|
||||||
|
TRACE("has_tRNS = %d\n", has_tRNS);
|
||||||
|
return has_tRNS;
|
||||||
|
}
|
||||||
|
|
||||||
static GpStatus decode_image_png(IStream* stream, GpImage **image)
|
static GpStatus decode_image_png(IStream* stream, GpImage **image)
|
||||||
{
|
{
|
||||||
IWICBitmapDecoder *decoder;
|
IWICBitmapDecoder *decoder;
|
||||||
|
@ -3970,6 +4003,14 @@ static GpStatus decode_image_png(IStream* stream, GpImage **image)
|
||||||
{
|
{
|
||||||
if (IsEqualGUID(&format, &GUID_WICPixelFormat8bppGray))
|
if (IsEqualGUID(&format, &GUID_WICPixelFormat8bppGray))
|
||||||
force_conversion = TRUE;
|
force_conversion = TRUE;
|
||||||
|
else if ((IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed) ||
|
||||||
|
IsEqualGUID(&format, &GUID_WICPixelFormat4bppIndexed) ||
|
||||||
|
IsEqualGUID(&format, &GUID_WICPixelFormat2bppIndexed) ||
|
||||||
|
IsEqualGUID(&format, &GUID_WICPixelFormat1bppIndexed) ||
|
||||||
|
IsEqualGUID(&format, &GUID_WICPixelFormat24bppBGR)) &&
|
||||||
|
has_png_transparency_chunk(stream))
|
||||||
|
force_conversion = TRUE;
|
||||||
|
|
||||||
status = decode_frame_wic(decoder, force_conversion, 0, png_metadata_reader, image);
|
status = decode_frame_wic(decoder, force_conversion, 0, png_metadata_reader, image);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -5168,7 +5168,7 @@ static void test_png_color_formats(void)
|
||||||
{ 2, PNG_COLOR_TYPE_RGB },
|
{ 2, PNG_COLOR_TYPE_RGB },
|
||||||
{ 4, PNG_COLOR_TYPE_RGB },
|
{ 4, PNG_COLOR_TYPE_RGB },
|
||||||
{ 8, PNG_COLOR_TYPE_RGB,
|
{ 8, PNG_COLOR_TYPE_RGB,
|
||||||
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB, TRUE },
|
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat24bppRGB, ImageFlagsColorSpaceRGB },
|
{ PixelFormat24bppRGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat24bppRGB, ImageFlagsColorSpaceRGB }}},
|
{ PixelFormat24bppRGB, ImageFlagsColorSpaceRGB }}},
|
||||||
/* libpng refuses to load our test image complaining about extra compressed data,
|
/* libpng refuses to load our test image complaining about extra compressed data,
|
||||||
|
@ -5182,7 +5182,7 @@ static void test_png_color_formats(void)
|
||||||
|
|
||||||
/* 5 */
|
/* 5 */
|
||||||
{ 1, PNG_COLOR_TYPE_GRAY,
|
{ 1, PNG_COLOR_TYPE_GRAY,
|
||||||
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB, TRUE },
|
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB },
|
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB }}},
|
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB }}},
|
||||||
{ 2, PNG_COLOR_TYPE_GRAY,
|
{ 2, PNG_COLOR_TYPE_GRAY,
|
||||||
|
@ -5194,7 +5194,7 @@ static void test_png_color_formats(void)
|
||||||
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY },
|
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY },
|
||||||
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY }}},
|
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY }}},
|
||||||
{ 8, PNG_COLOR_TYPE_GRAY,
|
{ 8, PNG_COLOR_TYPE_GRAY,
|
||||||
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB, TRUE },
|
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY },
|
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY },
|
||||||
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY }}},
|
{ PixelFormat32bppARGB, ImageFlagsColorSpaceGRAY }}},
|
||||||
{ 16, PNG_COLOR_TYPE_GRAY,
|
{ 16, PNG_COLOR_TYPE_GRAY,
|
||||||
|
@ -5204,7 +5204,7 @@ static void test_png_color_formats(void)
|
||||||
|
|
||||||
/* 10 */
|
/* 10 */
|
||||||
{ 1, PNG_COLOR_TYPE_PALETTE,
|
{ 1, PNG_COLOR_TYPE_PALETTE,
|
||||||
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB, TRUE },
|
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB },
|
{ PixelFormat1bppIndexed, ImageFlagsColorSpaceRGB },
|
||||||
{ 0, 0 }}},
|
{ 0, 0 }}},
|
||||||
{ 2, PNG_COLOR_TYPE_PALETTE,
|
{ 2, PNG_COLOR_TYPE_PALETTE,
|
||||||
|
@ -5216,7 +5216,7 @@ static void test_png_color_formats(void)
|
||||||
{ PixelFormat4bppIndexed, ImageFlagsColorSpaceRGB, TRUE },
|
{ PixelFormat4bppIndexed, ImageFlagsColorSpaceRGB, TRUE },
|
||||||
{ 0, 0 }}},
|
{ 0, 0 }}},
|
||||||
{ 8, PNG_COLOR_TYPE_PALETTE,
|
{ 8, PNG_COLOR_TYPE_PALETTE,
|
||||||
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB, TRUE },
|
{{ PixelFormat32bppARGB, ImageFlagsColorSpaceRGB },
|
||||||
{ PixelFormat8bppIndexed, ImageFlagsColorSpaceRGB },
|
{ PixelFormat8bppIndexed, ImageFlagsColorSpaceRGB },
|
||||||
{ 0, 0 }}},
|
{ 0, 0 }}},
|
||||||
{ 16, PNG_COLOR_TYPE_PALETTE },
|
{ 16, PNG_COLOR_TYPE_PALETTE },
|
||||||
|
|
Loading…
Reference in New Issue