From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/metadataquery.c | 14 ------- dlls/windowscodecs/pngformat.c | 57 +++++++++++++++++--------- dlls/windowscodecs/tests/metadata.c | 17 +++----- dlls/windowscodecs/wincodecs_private.h | 14 +++++++ 4 files changed, 58 insertions(+), 44 deletions(-)
diff --git a/dlls/windowscodecs/metadataquery.c b/dlls/windowscodecs/metadataquery.c index 9794a35214b..39a788e1832 100644 --- a/dlls/windowscodecs/metadataquery.c +++ b/dlls/windowscodecs/metadataquery.c @@ -341,20 +341,6 @@ static bool parser_unescape(struct query_parser *parser) return false; }
-static HRESULT init_propvar_from_string(const WCHAR *str, PROPVARIANT *var) -{ - size_t size = (wcslen(str) + 1) * sizeof(*str); - WCHAR *s; - - if (!(s = CoTaskMemAlloc(size))) - return E_OUTOFMEMORY; - memcpy(s, str, size); - - var->pwszVal = s; - var->vt = VT_LPWSTR; - return S_OK; -} - static void parse_query_name(struct query_parser *parser, PROPVARIANT *item) { size_t len = 0; diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c index 51613f538c3..ebf8e1477d7 100644 --- a/dlls/windowscodecs/pngformat.c +++ b/dlls/windowscodecs/pngformat.c @@ -112,6 +112,26 @@ HRESULT PngTextReader_CreateInstance(REFIID iid, void** ppv) return MetadataReader_Create(&TextReader_Vtbl, iid, ppv); }
+static HRESULT create_gamma_item(ULONG gamma, MetadataItem **item) +{ + HRESULT hr; + + if (!(*item = calloc(1, sizeof(**item)))) + return E_OUTOFMEMORY; + + hr = init_propvar_from_string(L"ImageGamma", &(*item)->id); + if (FAILED(hr)) + { + free(*item); + return hr; + } + + (*item)->value.vt = VT_UI4; + (*item)->value.ulVal = gamma; + + return S_OK; +} + static HRESULT LoadGamaMetadata(MetadataHandler *handler, IStream *stream, const GUID *preferred_vendor, DWORD persist_options) { @@ -120,7 +140,6 @@ static HRESULT LoadGamaMetadata(MetadataHandler *handler, IStream *stream, const BYTE *data; ULONG data_size; ULONG gamma; - LPWSTR name; MetadataItem *result;
hr = read_png_chunk(stream, type, &data, &data_size); @@ -136,23 +155,8 @@ static HRESULT LoadGamaMetadata(MetadataHandler *handler, IStream *stream, const
free(data);
- result = calloc(1, sizeof(MetadataItem)); - SHStrDupW(L"ImageGamma", &name); - if (!result || !name) - { - free(result); - CoTaskMemFree(name); - return E_OUTOFMEMORY; - } - - PropVariantInit(&result[0].schema); - PropVariantInit(&result[0].id); - PropVariantInit(&result[0].value); - - result[0].id.vt = VT_LPWSTR; - result[0].id.pwszVal = name; - result[0].value.vt = VT_UI4; - result[0].value.ulVal = gamma; + if (FAILED(hr = create_gamma_item(gamma, &result))) + return hr;
MetadataHandler_FreeItems(handler); handler->items = result; @@ -161,10 +165,25 @@ static HRESULT LoadGamaMetadata(MetadataHandler *handler, IStream *stream, const return S_OK; }
+static HRESULT CreateGamaHandler(MetadataHandler *handler) +{ + MetadataItem *item; + HRESULT hr; + + if (FAILED(hr = create_gamma_item(45455, &item))) + return hr; + + handler->items = item; + handler->item_count = 1; + + return S_OK; +} + static const MetadataHandlerVtbl GamaReader_Vtbl = { 0, &CLSID_WICPngGamaMetadataReader, - LoadGamaMetadata + LoadGamaMetadata, + CreateGamaHandler, };
HRESULT PngGamaReader_CreateInstance(REFIID iid, void** ppv) diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 022c5b9008f..2037fec17da 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1180,24 +1180,19 @@ static void test_metadata_gAMA(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);
id.vt = value.vt = VT_EMPTY; hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- if (hr == S_OK) - { - ok(id.vt == VT_LPWSTR, "Unexpected vt %d.\n", id.vt); - ok(!lstrcmpW(id.pwszVal, L"ImageGamma"), "unexpected value: %s\n", wine_dbgstr_w(id.pwszVal)); - PropVariantClear(&id); + ok(id.vt == VT_LPWSTR, "Unexpected vt %d.\n", id.vt); + ok(!lstrcmpW(id.pwszVal, L"ImageGamma"), "unexpected value: %s\n", wine_dbgstr_w(id.pwszVal)); + PropVariantClear(&id);
- ok(value.vt == VT_UI4, "Unexpected vt %d.\n", value.vt); - ok(value.ulVal == 45455, "Unexpected value %lu.\n", value.ulVal); - PropVariantClear(&value); - } + ok(value.vt == VT_UI4, "Unexpected vt %d.\n", value.vt); + ok(value.ulVal == 45455, "Unexpected value %lu.\n", value.ulVal); + PropVariantClear(&value);
load_stream(reader, metadata_gAMA, sizeof(metadata_gAMA), WICPersistOptionDefault);
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 690d5e34e58..71c011e4e6f 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -192,6 +192,20 @@ extern HRESULT IcoDibDecoder_CreateInstance(BmpDecoder **ppDecoder); extern void BmpDecoder_GetWICDecoder(BmpDecoder *This, IWICBitmapDecoder **ppDecoder); extern void BmpDecoder_FindIconMask(BmpDecoder *This, ULONG *mask_offset, int *topdown);
+static inline HRESULT init_propvar_from_string(const WCHAR *str, PROPVARIANT *var) +{ + size_t size = (wcslen(str) + 1) * sizeof(*str); + WCHAR *s; + + if (!(s = CoTaskMemAlloc(size))) + return E_OUTOFMEMORY; + memcpy(s, str, size); + + var->pwszVal = s; + var->vt = VT_LPWSTR; + return S_OK; +} + typedef struct _MetadataItem { PROPVARIANT schema;