[4/4] gdiplus: Add support for reading png gAMA chunks.

Vincent Povirk madewokherd at gmail.com
Mon Apr 6 17:01:08 CDT 2015


-------------- next part --------------
From ba98cda5f3b6c3c625abfc34f63ad6ca489ccb5f Mon Sep 17 00:00:00 2001
From: Vincent Povirk <vincent at codeweavers.com>
Date: Wed, 1 Apr 2015 15:26:00 -0500
Subject: [PATCH 04/14] gdiplus: Add support for reading png gAMA chunks.

---
 dlls/gdiplus/image.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 643cf6c..86802a5 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -3436,6 +3436,29 @@ static PropertyItem* create_prop(PROPID propid, PROPVARIANT* value)
     return item;
 }
 
+static ULONG get_ulong_by_index(IWICMetadataReader* reader, ULONG index)
+{
+    PROPVARIANT value;
+    HRESULT hr;
+    ULONG result=0;
+
+    hr = IWICMetadataReader_GetValueByIndex(reader, index, NULL, NULL, &value);
+    if (SUCCEEDED(hr))
+    {
+        switch (value.vt)
+        {
+        case VT_UI4:
+            result = value.u.ulVal;
+            break;
+        default:
+            ERR("unhandled case %u\n", value.vt);
+            break;
+        }
+        PropVariantClear(&value);
+    }
+    return result;
+}
+
 static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UINT active_frame)
 {
     HRESULT hr;
@@ -3456,6 +3479,7 @@ static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI
         { "Source", PropertyTagEquipModel },
         { "Comment", PropertyTagExifUserComment },
     };
+    BOOL seen_gamma=FALSE;
 
     hr = IWICBitmapDecoder_GetFrame(decoder, active_frame, &frame);
     if (hr != S_OK) return;
@@ -3502,6 +3526,28 @@ static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI
                             PropVariantClear(&value);
                         }
                     }
+                    else if (SUCCEEDED(hr) && IsEqualGUID(&GUID_MetadataFormatChunkgAMA, &format))
+                    {
+                        PropertyItem* item;
+
+                        if (!seen_gamma)
+                        {
+                            item = GdipAlloc(sizeof(PropertyItem) + sizeof(ULONG) * 2);
+                            if (item)
+                            {
+                                ULONG *rational;
+                                item->length = sizeof(ULONG) * 2;
+                                item->type = PropertyTagTypeRational;
+                                item->id = PropertyTagGamma;
+                                rational = item->value = item + 1;
+                                rational[0] = 100000;
+                                rational[1] = get_ulong_by_index(reader, 0);
+                                add_property(bitmap, item);
+                                seen_gamma = TRUE;
+                                GdipFree(item);
+                            }
+                        }
+                    }
 
                     IWICMetadataReader_Release(reader);
                 }
-- 
2.1.0



More information about the wine-patches mailing list