From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/pngformat.c | 55 ++++++++++++++++++++--------- dlls/windowscodecs/tests/metadata.c | 9 ++++- 2 files changed, 46 insertions(+), 18 deletions(-)
diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c index 7a1c72b231f..91a9ee0de22 100644 --- a/dlls/windowscodecs/pngformat.c +++ b/dlls/windowscodecs/pngformat.c @@ -294,6 +294,27 @@ HRESULT PngChrmReader_CreateInstance(REFIID iid, void** ppv) return MetadataReader_Create(&ChrmReader_Vtbl, iid, ppv); }
+static HRESULT create_hist_item(USHORT *data, ULONG count, MetadataItem **item) +{ + HRESULT hr; + + if (!(*item = calloc(1, sizeof(**item)))) + return E_OUTOFMEMORY; + + hr = init_propvar_from_string(L"Frequencies", &(*item)->id); + if (FAILED(hr)) + { + free(*item); + return hr; + } + + (*item)->value.vt = VT_UI2 | VT_VECTOR; + (*item)->value.caui.cElems = count; + (*item)->value.caui.pElems = data; + + return S_OK; +} + static HRESULT LoadHistMetadata(MetadataHandler *handler, IStream *stream, const GUID *preferred_vendor, DWORD persist_options) { @@ -301,7 +322,6 @@ static HRESULT LoadHistMetadata(MetadataHandler *handler, IStream *stream, const BYTE type[4]; BYTE *data; ULONG data_size, element_count, i; - LPWSTR name; MetadataItem *result; USHORT *elements;
@@ -320,28 +340,28 @@ static HRESULT LoadHistMetadata(MetadataHandler *handler, IStream *stream, const
free(data);
- result = calloc(1, sizeof(MetadataItem)); - SHStrDupW(L"Frequencies", &name); - if (!result || !name) { - free(result); - CoTaskMemFree(name); + if (FAILED(hr = create_hist_item(elements, element_count, &result))) + { CoTaskMemFree(elements); return E_OUTOFMEMORY; }
- PropVariantInit(&result[0].schema); - PropVariantInit(&result[0].id); - PropVariantInit(&result[0].value); + MetadataHandler_FreeItems(handler); + handler->items = result; + handler->item_count = 1; + + return S_OK; +}
- result[0].id.vt = VT_LPWSTR; - result[0].id.pwszVal = name; +static HRESULT CreateHistHandler(MetadataHandler *handler) +{ + MetadataItem *item; + HRESULT hr;
- result[0].value.vt = VT_UI2|VT_VECTOR; - result[0].value.caui.cElems = element_count; - result[0].value.caui.pElems = elements; + if (FAILED(hr = create_hist_item(NULL, 0, &item))) + return hr;
- MetadataHandler_FreeItems(handler); - handler->items = result; + handler->items = item; handler->item_count = 1;
return S_OK; @@ -350,7 +370,8 @@ static HRESULT LoadHistMetadata(MetadataHandler *handler, IStream *stream, const static const MetadataHandlerVtbl HistReader_Vtbl = { 0, &CLSID_WICPngHistMetadataReader, - LoadHistMetadata + LoadHistMetadata, + CreateHistHandler, };
HRESULT PngHistReader_CreateInstance(REFIID iid, void** ppv) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 54fe37345b7..f8f440ea658 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1484,9 +1484,15 @@ static void test_metadata_hIST(void)
hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(count == 1, "Unexpected count %u.\n", count);
+ PropVariantInit(&value); + hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value.vt == (VT_UI2|VT_VECTOR), "Unexpected value type %u.\n", value.vt); + ok(!value.caui.cElems, "Unexpected cElems %lu.\n", value.caub.cElems); + ok(!value.caui.pElems, "Unexpected value %p.\n", value.caui.pElems); + load_stream(reader, metadata_hIST, sizeof(metadata_hIST), WICPersistOptionDefault);
hr = IWICMetadataReader_GetMetadataFormat(reader, &format); @@ -1497,6 +1503,7 @@ static void test_metadata_hIST(void) ok(hr == S_OK, "GetCount failed, hr=%lx\n", hr); ok(count == 1, "unexpected count %i\n", count);
+ PropVariantInit(&value); hr = IWICMetadataReader_GetValueByIndex(reader, 0, &schema, &id, &value); ok(hr == S_OK, "GetValue failed, hr=%lx\n", hr);