From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/pngformat.c | 13 +++++ dlls/windowscodecs/regsvr.c | 9 ++++ dlls/windowscodecs/tests/metadata.c | 49 +++++++++---------- dlls/windowscodecs/wincodecs_private.h | 1 + dlls/windowscodecs/windowscodecs_wincodec.idl | 7 +++ 6 files changed, 53 insertions(+), 27 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index b84021ddabe..e6c106d888f 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -71,6 +71,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICApp1MetadataReader, App1MetadataReader_CreateInstance}, {&CLSID_WICApp1MetadataWriter, App1MetadataWriter_CreateInstance}, {&CLSID_WICPngBkgdMetadataReader, PngBkgdReader_CreateInstance}, + {&CLSID_WICPngBkgdMetadataWriter, PngBkgdWriter_CreateInstance}, {&CLSID_WICPngChrmMetadataReader, PngChrmReader_CreateInstance}, {&CLSID_WICPngGamaMetadataReader, PngGamaReader_CreateInstance}, {&CLSID_WICPngHistMetadataReader, PngHistReader_CreateInstance}, diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c index b66dd7acf09..47d3d08cafd 100644 --- a/dlls/windowscodecs/pngformat.c +++ b/dlls/windowscodecs/pngformat.c @@ -617,6 +617,19 @@ HRESULT PngBkgdReader_CreateInstance(REFIID iid, void** ppv) return MetadataReader_Create(&BkgdReader_Vtbl, iid, ppv); }
+static const MetadataHandlerVtbl BkgdWriter_Vtbl = +{ + METADATAHANDLER_FIXED_ITEMS | METADATAHANDLER_IS_WRITER, + &CLSID_WICPngBkgdMetadataWriter, + LoadBkgdMetadata, + CreateBkgdHandler, +}; + +HRESULT PngBkgdWriter_CreateInstance(REFIID iid, void** ppv) +{ + return MetadataReader_Create(&BkgdWriter_Vtbl, iid, ppv); +} + HRESULT PngDecoder_CreateInstance(REFIID iid, void** ppv) { HRESULT hr; diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index 4e34b2cfd95..f93c65f1d3f 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -2113,6 +2113,15 @@ static struct regsvr_metadatawriter const metadatawriters_list[] = &GUID_VendorMicrosoft, &GUID_MetadataFormatApp1, }, + { + &CLSID_WICPngBkgdMetadataWriter, + "The Wine Project", + "Png bKGD Metadata Writer", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatChunkbKGD, + }, { NULL } /* list terminator */ };
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index e3386b7b0da..44f83e387ea 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1821,44 +1821,40 @@ static void test_metadata_bKGD(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); hr = IEnumString_Next(enum_string, 1, &str, NULL); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(!wcscmp(str, L"/bKGD"), "Unexpected query %s.\n", wine_dbgstr_w(str)); CoTaskMemFree(str); IEnumString_Release(enum_string);
PropVariantInit(&value); hr = IWICMetadataQueryReader_GetMetadataByName(query_reader, L"/bKGD", &value); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - ok(value.vt == VT_UNKNOWN, "Unexpected value type %d.\n", value.vt); - hr = IUnknown_QueryInterface(value.punkVal, &IID_IWICMetadataQueryReader, (void **)&query_reader2); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - PropVariantClear(&value);
- hr = IWICMetadataQueryReader_GetEnumerator(query_reader2, &enum_string); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value.vt == VT_UNKNOWN, "Unexpected value type %d.\n", value.vt); + hr = IUnknown_QueryInterface(value.punkVal, &IID_IWICMetadataQueryReader, (void **)&query_reader2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + PropVariantClear(&value);
- str = NULL; - hr = IEnumString_Next(enum_string, 1, &str, &fetched); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(fetched == 1, "Unexpected count %lu.\n", fetched); + hr = IWICMetadataQueryReader_GetEnumerator(query_reader2, &enum_string); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
- ok(!wcscmp(str, L"/BackgroundColor"), "Unexpected query %s.\n", wine_dbgstr_w(str)); - CoTaskMemFree(str); + str = NULL; + hr = IEnumString_Next(enum_string, 1, &str, &fetched); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(fetched == 1, "Unexpected count %lu.\n", fetched);
- IEnumString_Release(enum_string); + ok(!wcscmp(str, L"/BackgroundColor"), "Unexpected query %s.\n", wine_dbgstr_w(str)); + CoTaskMemFree(str);
- PropVariantInit(&value); - hr = IWICMetadataQueryReader_GetMetadataByName(query_reader2, L"/backgroundcolor", &value); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - ok(value.vt == VT_UI1, "Unexpected type %d.\n", value.vt); - ok(value.bVal == 0x12, "Unexpected value %u.\n", value.bVal); - PropVariantClear(&value); + IEnumString_Release(enum_string);
- IWICMetadataQueryReader_Release(query_reader2); - } + PropVariantInit(&value); + hr = IWICMetadataQueryReader_GetMetadataByName(query_reader2, L"/backgroundcolor", &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(value.vt == VT_UI1, "Unexpected type %d.\n", value.vt); + ok(value.bVal == 0x12, "Unexpected value %u.\n", value.bVal); + PropVariantClear(&value); + + IWICMetadataQueryReader_Release(query_reader2);
IWICMetadataQueryReader_Release(query_reader);
@@ -1882,9 +1878,7 @@ static void test_metadata_bKGD(void)
hr = CoCreateInstance(&CLSID_WICPngBkgdMetadataWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataWriter, (void **)&writer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - if (FAILED(hr)) return;
check_interface(writer, &IID_IWICMetadataWriter, TRUE); check_interface(writer, &IID_IWICMetadataReader, TRUE); @@ -1919,6 +1913,7 @@ static void test_metadata_bKGD(void)
value.vt = VT_UI4; hr = IWICMetadataWriter_SetValue(writer, NULL, &id, &value); + todo_wine ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
IWICMetadataWriter_Release(writer); diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index 46be6f31751..a156e926997 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -260,6 +260,7 @@ extern HRESULT ExifMetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT App1MetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT App1MetadataWriter_CreateInstance(REFIID iid, void **ppv); extern HRESULT PngBkgdReader_CreateInstance(REFIID iid, void** ppv); +extern HRESULT PngBkgdWriter_CreateInstance(REFIID iid, void** ppv); extern HRESULT PngChrmReader_CreateInstance(REFIID iid, void** ppv); extern HRESULT PngGamaReader_CreateInstance(REFIID iid, void** ppv); extern HRESULT PngHistReader_CreateInstance(REFIID iid, void** ppv); diff --git a/dlls/windowscodecs/windowscodecs_wincodec.idl b/dlls/windowscodecs/windowscodecs_wincodec.idl index f182de84b0c..b788a716844 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -252,6 +252,13 @@ coclass WICPngTimeMetadataReader { interface IWICMetadataReader; } ] coclass WICPngBkgdMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Png bKGD Metadata Writer"), + threading(both), + uuid(68e3f2fd-31ae-4441-bb6a-fd7047525f90) +] +coclass WICPngBkgdMetadataWriter { interface IWICMetadataWriter; } + [ helpstring("WIC LSD Metadata Reader"), threading(both),