From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/clsfactory.c | 1 + dlls/windowscodecs/metadatahandler.c | 12 ++++++++++++ dlls/windowscodecs/regsvr.c | 18 ++++++++++++++++++ dlls/windowscodecs/tests/metadata.c | 4 ++-- dlls/windowscodecs/wincodecs_private.h | 1 + dlls/windowscodecs/windowscodecs_wincodec.idl | 7 +++++++ 6 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/dlls/windowscodecs/clsfactory.c b/dlls/windowscodecs/clsfactory.c index bbc21ce154b..1deb6d722d5 100644 --- a/dlls/windowscodecs/clsfactory.c +++ b/dlls/windowscodecs/clsfactory.c @@ -64,6 +64,7 @@ static const classinfo wic_classes[] = { {&CLSID_WICUnknownMetadataReader, UnknownMetadataReader_CreateInstance}, {&CLSID_WICIfdMetadataReader, IfdMetadataReader_CreateInstance}, {&CLSID_WICGpsMetadataReader, GpsMetadataReader_CreateInstance}, + {&CLSID_WICExifMetadataReader, ExifMetadataReader_CreateInstance}, {&CLSID_WICPngChrmMetadataReader, PngChrmReader_CreateInstance}, {&CLSID_WICPngGamaMetadataReader, PngGamaReader_CreateInstance}, {&CLSID_WICPngHistMetadataReader, PngHistReader_CreateInstance}, diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index 2f4fa70b0c3..20c9e168e45 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -1227,3 +1227,15 @@ HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv) { return MetadataReader_Create(&GpsMetadataReader_Vtbl, iid, ppv); } + +static const MetadataHandlerVtbl ExifMetadataReader_Vtbl = +{ + 0, + &CLSID_WICExifMetadataReader, + LoadIfdMetadata +}; + +HRESULT ExifMetadataReader_CreateInstance(REFIID iid, void **ppv) +{ + return MetadataReader_Create(&ExifMetadataReader_Vtbl, iid, ppv); +} diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index b86e0d42396..d8886c3c888 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -1583,6 +1583,14 @@ static const struct reader_containers gps_containers[] = { { NULL } /* list terminator */ };
+static const struct reader_containers exif_containers[] = { + { + &GUID_MetadataFormatIfd, + ifd_metadata_pattern + }, + { NULL } /* list terminator */ +}; + static const BYTE tEXt[] = "tEXt";
static const struct metadata_pattern pngtext_metadata_pattern[] = { @@ -1763,6 +1771,16 @@ static struct regsvr_metadatareader const metadatareader_list[] = { 1, 1, 0, gps_containers }, + { &CLSID_WICExifMetadataReader, + "The Wine Project", + "Exif Reader", + "1.0.0.0", + "1.0.0.0", + &GUID_VendorMicrosoft, + &GUID_MetadataFormatExif, + 1, 1, 0, + exif_containers + }, { &CLSID_WICPngChrmMetadataReader, "The Wine Project", "Chunk cHRM Reader", diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 902b4359585..065347ebc60 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1435,8 +1435,7 @@ static void test_metadata_Exif(void)
hr = CoCreateInstance(&CLSID_WICExifMetadataReader, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataReader, (void**)&reader); - todo_wine ok(hr == S_OK, "CoCreateInstance error %#lx\n", hr); - if (FAILED(hr)) return; + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
check_interface(reader, &IID_IWICMetadataReader, TRUE); check_interface(reader, &IID_IPersist, TRUE); @@ -1463,6 +1462,7 @@ static void test_metadata_Exif(void)
hr = CoCreateInstance(&CLSID_WICExifMetadataWriter, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataWriter, (void **)&writer); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); if (FAILED(hr)) return;
diff --git a/dlls/windowscodecs/wincodecs_private.h b/dlls/windowscodecs/wincodecs_private.h index e4a56b5ec93..541ea13923e 100644 --- a/dlls/windowscodecs/wincodecs_private.h +++ b/dlls/windowscodecs/wincodecs_private.h @@ -218,6 +218,7 @@ extern HRESULT MetadataReader_Create(const MetadataHandlerVtbl *vtable, REFIID i extern HRESULT UnknownMetadataReader_CreateInstance(REFIID iid, void** ppv); extern HRESULT IfdMetadataReader_CreateInstance(REFIID iid, void **ppv); extern HRESULT GpsMetadataReader_CreateInstance(REFIID iid, void **ppv); +extern HRESULT ExifMetadataReader_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 2ffc883fc2e..1e119c132f2 100644 --- a/dlls/windowscodecs/windowscodecs_wincodec.idl +++ b/dlls/windowscodecs/windowscodecs_wincodec.idl @@ -167,6 +167,13 @@ coclass WICIfdMetadataReader { interface IWICMetadataReader; } ] coclass WICGpsMetadataReader { interface IWICMetadataReader; }
+[ + helpstring("WIC Exif Metadata Reader"), + threading(both), + uuid(d9403860-297f-4a49-bf9b-77898150a442) +] +coclass WICExifMetadataReader { interface IWICMetadataReader; } + [ helpstring("WIC Png cHRM Metadata Reader"), threading(both),