From: Vincent Povirk Subject: [1/3] gdiplus: Add support for reading PNG tEXt metadata. Message-Id: Date: Wed, 25 Mar 2015 16:50:58 -0500 From a68b9f548b5b668896daeffbb36b125f900cd99b Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Wed, 25 Mar 2015 16:34:35 -0500 Subject: [PATCH 1/3] gdiplus: Add support for reading PNG tEXt metadata. --- dlls/gdiplus/image.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 77b9305..de03096 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -3417,6 +3417,101 @@ static void gif_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UI IWICBitmapFrameDecode_Release(frame); } +static PropertyItem* create_prop(PROPID propid, PROPVARIANT* value) +{ + PropertyItem *item = NULL; + UINT item_size = propvariant_size(value); + + if (item_size) + { + item_size += sizeof(*item); + item = GdipAlloc(item_size); + if (propvariant_to_item(value, item, item_size, propid) != Ok) + { + GdipFree(item); + item = NULL; + } + } + + return item; +} + +static void png_metadata_reader(GpBitmap *bitmap, IWICBitmapDecoder *decoder, UINT active_frame) +{ + HRESULT hr; + IWICBitmapFrameDecode *frame; + IWICMetadataBlockReader *block_reader; + IWICMetadataReader *reader; + UINT block_count, i, j; + struct keyword_info { + const char* name; + PROPID propid; + BOOL seen; + } keywords[] = { + { "Title", PropertyTagImageTitle }, + { "Author", PropertyTagArtist }, + { "Description", PropertyTagImageDescription }, + { "Copyright", PropertyTagCopyright }, + { "Software", PropertyTagSoftwareUsed }, + { "Source", PropertyTagEquipModel }, + { "Comment", PropertyTagExifUserComment }, + }; + + hr = IWICBitmapDecoder_GetFrame(decoder, active_frame, &frame); + if (hr != S_OK) return; + + hr = IWICBitmapFrameDecode_QueryInterface(frame, &IID_IWICMetadataBlockReader, (void **)&block_reader); + if (hr == S_OK) + { + hr = IWICMetadataBlockReader_GetCount(block_reader, &block_count); + if (hr == S_OK) + { + for (i = 0; i < block_count; i++) + { + hr = IWICMetadataBlockReader_GetReaderByIndex(block_reader, i, &reader); + if (hr == S_OK) + { + GUID format; + + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); + if (SUCCEEDED(hr) && IsEqualGUID(&GUID_MetadataFormatChunktEXt, &format)) + { + PROPVARIANT name, value; + PropertyItem* item; + + hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &name, &value); + + if (SUCCEEDED(hr)) + { + if (name.vt == VT_LPSTR) + { + for (j=0; j