From: Jeff Smith whydoubt@gmail.com
--- dlls/gdiplus/image.c | 30 +++++++++++++++++++++++++++++- dlls/gdiplus/tests/image.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 4837b4b1a3f..67a7fdfab13 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -3620,6 +3620,26 @@ static HRESULT png_read_time(IWICMetadataReader *reader, GpBitmap *bitmap) return S_OK; }
+static HRESULT png_read_histogram(IWICMetadataReader *reader, GpBitmap *bitmap) +{ + HRESULT hr; + PropertyItem* item; + PROPVARIANT value; + + hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value); + if (FAILED(hr)) + return hr; + + item = create_prop(PropertyTagPaletteHistogram, &value); + if (item) + add_property(bitmap, item); + heap_free(item); + + PropVariantClear(&value); + + return S_OK; +} + static HRESULT png_add_unit_properties(IWICBitmapFrameDecode *frame, GpBitmap *bitmap) { HRESULT hr; @@ -3675,7 +3695,7 @@ static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI IWICBitmapFrameDecode *frame; IWICMetadataBlockReader *block_reader; UINT block_count, i; - BOOL seen_gamma=FALSE, seen_whitepoint=FALSE, seen_chrm=FALSE, seen_time=FALSE; + BOOL seen_gamma=FALSE, seen_whitepoint=FALSE, seen_chrm=FALSE, seen_time=FALSE, seen_histogram=FALSE; BOOL *seen_text = NULL;
hr = IWICBitmapDecoder_GetFrame(decoder, active_frame, &frame); @@ -3744,6 +3764,14 @@ static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI seen_time = SUCCEEDED(hr); } } + else if (IsEqualGUID(&GUID_MetadataFormatChunkhIST, &format)) + { + if (!seen_histogram) + { + hr = png_read_histogram(reader, bitmap); + seen_histogram = SUCCEEDED(hr); + } + }
IWICMetadataReader_Release(reader); } diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index b240e58ba43..22a7786ed1d 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -5810,6 +5810,14 @@ static const BYTE png_time[] = { 0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82 };
+static const BYTE png_hist[] = { + 0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a, + 0x00,0x00,0x00,0x0d,'I','H','D','R',0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53,0xde, + 0x00,0x00,0x00,0x08,'h','I','S','T',0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x0c,'I','D','A','T',0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,0xe7, + 0x00,0x00,0x00,0x00,'I','E','N','D',0xae,0x42,0x60,0x82 +}; + static void test_png_unit_properties(void) { GpImage *image; @@ -5910,6 +5918,30 @@ static void test_png_datetime_property(void) GdipDisposeImage(image); }
+static void test_png_histogram_property(void) +{ + struct property_test_data td[] = + { + { PropertyTagTypeShort, PropertyTagPaletteHistogram, 8, { 1,0,2,0,3,0,4,0 } }, + { PropertyTagTypeByte, PropertyTagPixelUnit, 1, { 1 } }, + { PropertyTagTypeLong, PropertyTagPixelPerUnitX, 4, { 0,0,0,0 } }, + { PropertyTagTypeLong, PropertyTagPixelPerUnitY, 4, { 0,0,0,0 } }, + }; + + GpImage *image = load_image(png_hist, sizeof(png_hist), TRUE, FALSE); + if (!image) + { + win_skip("broken PNG histogram support\n"); + return; + } + + winetest_push_context("%s", __FUNCTION__); + check_properties_get_all(image, td, ARRAY_SIZE(td), NULL, 0, ~0); + winetest_pop_context(); + + GdipDisposeImage(image); +} + static void test_GdipLoadImageFromStream(void) { IStream *stream; @@ -6156,6 +6188,7 @@ START_TEST(image) test_png_save_palette(); test_png_unit_properties(); test_png_datetime_property(); + test_png_histogram_property(); test_supported_encoders(); test_CloneBitmapArea(); test_ARGB_conversion();