From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 119 ++++++++++++++++------------ 1 file changed, 67 insertions(+), 52 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 14d24c1d0f9..ae197864768 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -379,19 +379,21 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data
for (i = 0; i < count; i++) { + winetest_push_context("%lu", i); + hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned); ok(hr == S_OK, "Next error %#lx\n", hr); ok(items_returned == 1, "unexpected item count %lu\n", items_returned);
- ok(schema.vt == VT_EMPTY, "%lu: unexpected vt: %u\n", i, schema.vt); - ok(id.vt == VT_UI2 || id.vt == VT_LPWSTR || id.vt == VT_EMPTY, "%lu: unexpected vt: %u\n", i, id.vt); + ok(schema.vt == VT_EMPTY, "Unexpected vt: %u\n", schema.vt); + ok(id.vt == VT_UI2 || id.vt == VT_LPWSTR || id.vt == VT_EMPTY, "Unexpected vt: %u\n", id.vt); if (id.vt == VT_UI2) - ok(id.uiVal == td[i].id, "%lu: expected id %#lx, got %#x\n", i, td[i].id, id.uiVal); + ok(id.uiVal == td[i].id, "Expected id %#lx, got %#x\n", td[i].id, id.uiVal); else if (id.vt == VT_LPWSTR) ok(!lstrcmpW(td[i].id_string, id.pwszVal), - "%lu: expected %s, got %s\n", i, wine_dbgstr_w(td[i].id_string), wine_dbgstr_w(id.pwszVal)); + "Expected %s, got %s\n", wine_dbgstr_w(td[i].id_string), wine_dbgstr_w(id.pwszVal));
- ok(value.vt == td[i].type, "%lu: expected vt %#lx, got %#x\n", i, td[i].type, value.vt); + ok(value.vt == td[i].type, "Expected vt %#lx, got %#x\n", td[i].type, value.vt); if (value.vt & VT_VECTOR) { ULONG j; @@ -399,37 +401,37 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data { case VT_I1: case VT_UI1: - ok(td[i].count == value.caub.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, value.caub.cElems); + ok(td[i].count == value.caub.cElems, "Expected cElems %d, got %ld\n", td[i].count, value.caub.cElems); for (j = 0; j < value.caub.cElems; j++) - ok(td[i].value[j] == value.caub.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], value.caub.pElems[j]); + ok(td[i].value[j] == value.caub.pElems[j], "Expected value[%ld] %#I64x, got %#x\n", j, td[i].value[j], value.caub.pElems[j]); break; case VT_I2: case VT_UI2: - ok(td[i].count == value.caui.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, value.caui.cElems); + ok(td[i].count == value.caui.cElems, "Expected cElems %d, got %ld\n", td[i].count, value.caui.cElems); for (j = 0; j < value.caui.cElems; j++) - ok(td[i].value[j] == value.caui.pElems[j], "%lu: expected value[%ld] %#I64x, got %#x\n", i, j, td[i].value[j], value.caui.pElems[j]); + ok(td[i].value[j] == value.caui.pElems[j], "Expected value[%ld] %#I64x, got %#x\n", j, td[i].value[j], value.caui.pElems[j]); break; case VT_I4: case VT_UI4: case VT_R4: - ok(td[i].count == value.caul.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, value.caul.cElems); + ok(td[i].count == value.caul.cElems, "Expected cElems %d, got %ld\n", td[i].count, value.caul.cElems); for (j = 0; j < value.caul.cElems; j++) - ok(td[i].value[j] == value.caul.pElems[j], "%lu: expected value[%ld] %#I64x, got %#lx\n", i, j, td[i].value[j], value.caul.pElems[j]); + ok(td[i].value[j] == value.caul.pElems[j], "Expected value[%ld] %#I64x, got %#lx\n", j, td[i].value[j], value.caul.pElems[j]); break; case VT_I8: case VT_UI8: case VT_R8: - ok(td[i].count == value.cauh.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, value.cauh.cElems); + ok(td[i].count == value.cauh.cElems, "Expected cElems %d, got %ld\n", td[i].count, value.cauh.cElems); for (j = 0; j < value.cauh.cElems; j++) - ok(td[i].value[j] == value.cauh.pElems[j].QuadPart, "%lu: expected value[%ld] %I64x, got %08lx/%08lx\n", i, j, td[i].value[j], value.cauh.pElems[j].u.LowPart, value.cauh.pElems[j].u.HighPart); + ok(td[i].value[j] == value.cauh.pElems[j].QuadPart, "Expected value[%ld] %I64x, got %08lx/%08lx\n", j, td[i].value[j], value.cauh.pElems[j].u.LowPart, value.cauh.pElems[j].u.HighPart); break; case VT_LPSTR: - ok(td[i].count == value.calpstr.cElems, "%lu: expected cElems %d, got %ld\n", i, td[i].count, value.caub.cElems); + ok(td[i].count == value.calpstr.cElems, "Expected cElems %d, got %ld\n", td[i].count, value.caub.cElems); for (j = 0; j < value.calpstr.cElems; j++) trace("%lu: %s\n", j, value.calpstr.pElems[j]); /* fall through to not handled message */ default: - ok(0, "%lu: array of type %d is not handled\n", i, value.vt & ~VT_VECTOR); + ok(0, "vector of type %d is not handled\n", value.vt & ~VT_VECTOR); break; } } @@ -437,23 +439,25 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data { ok(td[i].count == strlen(value.pszVal) || broken(td[i].count == strlen(value.pszVal) + 1), /* before Win7 */ - "%lu: expected count %d, got %d\n", i, td[i].count, lstrlenA(value.pszVal)); + "Expected count %d, got %d\n", td[i].count, lstrlenA(value.pszVal)); if (td[i].count == strlen(value.pszVal)) ok(!strcmp(td[i].string, value.pszVal), - "%lu: expected %s, got %s\n", i, td[i].string, value.pszVal); + "Expected %s, got %s\n", td[i].string, value.pszVal); } else if (value.vt == VT_BLOB) { - ok(td[i].count == value.blob.cbSize, "%lu: expected count %d, got %ld\n", i, td[i].count, value.blob.cbSize); - ok(!memcmp(td[i].string, value.blob.pBlobData, td[i].count), "%lu: expected %s, got %s\n", i, td[i].string, value.blob.pBlobData); + ok(td[i].count == value.blob.cbSize, "Expected count %d, got %ld\n", td[i].count, value.blob.cbSize); + ok(!memcmp(td[i].string, value.blob.pBlobData, td[i].count), "Expected %s, got %s\n", td[i].string, value.blob.pBlobData); } else - ok(value.uhVal.QuadPart == td[i].value[0], "%lu: expected value %#I64x got %#lx/%#lx\n", - i, td[i].value[0], value.uhVal.u.LowPart, value.uhVal.u.HighPart); + ok(value.uhVal.QuadPart == td[i].value[0], "Eexpected value %#I64x got %#lx/%#lx\n", + td[i].value[0], value.uhVal.u.LowPart, value.uhVal.u.HighPart);
PropVariantClear(&schema); PropVariantClear(&id); PropVariantClear(&value); + + winetest_pop_context(); }
hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned); @@ -3408,20 +3412,22 @@ static void test_queryreader(void)
for (i = 0; i < ARRAY_SIZE(test_data); i++) { + winetest_push_context("%u", i); + current_metadata = test_data[i].data;
hr = IWICMetadataQueryReader_GetContainerFormat(reader, &format); - ok(hr == S_OK, "%u: GetContainerFormat error %#lx\n", i, hr); - ok(IsEqualGUID(&format, test_data[i].data->container_format), "%u: expected %s, got %s\n", - i, wine_dbgstr_guid(test_data[i].data->container_format), wine_dbgstr_guid(&format)); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, test_data[i].data->container_format), "Expected %s, got %s.\n", + wine_dbgstr_guid(test_data[i].data->container_format), wine_dbgstr_guid(&format));
PropVariantInit(&value); hr = IWICMetadataQueryReader_GetMetadataByName(reader, test_data[i].query, &value); todo_wine_if(test_data[i].todo) - ok(hr == test_data[i].hr, "%u: expected %#lx, got %#lx\n", i, test_data[i].hr, hr); + ok(hr == test_data[i].hr, "Expected %#lx, got %#lx.\n", test_data[i].hr, hr); if (hr == S_OK) { - ok(value.vt == test_data[i].vt, "%u: expected %u, got %u\n", i, test_data[i].vt, value.vt); + ok(value.vt == test_data[i].vt, "Expected %u, got %u.\n", test_data[i].vt, value.vt); if (test_data[i].vt == value.vt) { if (value.vt == VT_UNKNOWN) @@ -3474,17 +3480,19 @@ static void test_queryreader(void) PropVariantClear(&value); } else if (value.vt == VT_LPSTR) - ok(!lstrcmpA(value.pszVal, test_data[i].str_value), "%u: expected %s, got %s\n", - i, test_data[i].str_value, value.pszVal); + ok(!lstrcmpA(value.pszVal, test_data[i].str_value), "Expected %s, got %s.\n", + test_data[i].str_value, value.pszVal); else - ok(value.uiVal == test_data[i].value, "%u: expected %u, got %u\n", - i, test_data[i].value, value.uiVal); + ok(value.uiVal == test_data[i].value, "Expected %u, got %u\n", + test_data[i].value, value.uiVal); }
/* * Do NOT call PropVariantClear(&value) for fake value types. */ } + + winetest_pop_context(); }
IWICMetadataQueryReader_Release(reader); @@ -3524,78 +3532,83 @@ static void test_metadata_writer(void)
for (i = 0; i < ARRAY_SIZE(tests); ++i) { + winetest_push_context("%u", i); + hr = CoCreateInstance(tests[i].rclsid, NULL, CLSCTX_INPROC_SERVER, &IID_IWICBitmapEncoder, (void **)&encoder); - todo_wine_if(!tests[i].wine_supports_encoder) ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + todo_wine_if(!tests[i].wine_supports_encoder) ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); if (FAILED(hr)) + { + winetest_pop_context(); continue; + }
blockwriter = NULL; querywriter = querywriter2 = NULL;
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IWICBitmapEncoder_Initialize(encoder, stream, WICBitmapEncoderNoCache); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); hr = IWICBitmapEncoder_CreateNewFrame(encoder, &frameencode, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IWICBitmapFrameEncode_QueryInterface(frameencode, &IID_IWICMetadataBlockWriter, (void**)&blockwriter); - ok(hr == (tests[i].metadata_supported ? S_OK : E_NOINTERFACE), "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == (tests[i].metadata_supported ? S_OK : E_NOINTERFACE), "Got unexpected hr %#lx.\n", hr);
hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, &IID_IWICComponentFactory, (void**)&factory); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IWICComponentFactory_CreateQueryWriterFromBlockWriter(factory, blockwriter, &querywriter); - ok(hr == (tests[i].metadata_supported ? S_OK : E_INVALIDARG), "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == (tests[i].metadata_supported ? S_OK : E_INVALIDARG), "Got unexpected hr %#lx.\n", hr);
hr = IWICBitmapFrameEncode_GetMetadataQueryWriter(frameencode, &querywriter2); ok(hr == (tests[i].succeeds_uninitialized ? S_OK : WINCODEC_ERR_NOTINITIALIZED), - "Got unexpected hr %#lx, i %u.\n", hr, i); + "Got unexpected hr %#lx.\n", hr); if (hr == S_OK) IWICMetadataQueryWriter_Release(querywriter2);
hr = IWICBitmapFrameEncode_Initialize(frameencode, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IWICBitmapFrameEncode_GetMetadataQueryWriter(frameencode, &querywriter2); ok(hr == (tests[i].metadata_supported ? S_OK : WINCODEC_ERR_UNSUPPORTEDOPERATION), - "Got unexpected hr %#lx, i %u.\n", hr, i); + "Got unexpected hr %#lx.\n", hr);
if (tests[i].metadata_supported) - ok(querywriter2 != querywriter, "Got unexpected interfaces %p, %p, i %u.\n", querywriter, querywriter2, i); + ok(querywriter2 != querywriter, "Got unexpected interfaces %p, %p.\n", querywriter, querywriter2);
IWICComponentFactory_Release(factory); if (querywriter) { ref = get_refcount(querywriter); - ok(ref == 1, "Got unexpected ref %lu, i %u.\n", ref, i); + ok(ref == 1, "Got unexpected ref %lu.\n", ref);
hr = IWICMetadataQueryWriter_QueryInterface(querywriter, &IID_IEnumString, (void **)&enumstring); - ok(hr == E_NOINTERFACE, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == E_NOINTERFACE, "Got unexpected hr %#lx.\n", hr);
hr = IWICMetadataQueryWriter_GetEnumerator(querywriter, &enumstring); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
ref = get_refcount(querywriter); - ok(ref == 1, "Got unexpected ref %lu, i %u.\n", ref, i); + ok(ref == 1, "Got unexpected ref %lu.\n", ref);
hr = IEnumString_Skip(enumstring, 0); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
count = 0xdeadbeef; hr = IEnumString_Next(enumstring, 0, NULL, &count); - ok(hr == E_INVALIDARG, "Got unexpected hr %#lx, i %u.\n", hr, i); - ok(count == 0xdeadbeef, "Got unexpected count %lu, i %u.\n", count, i); + ok(hr == E_INVALIDARG, "Got unexpected hr %#lx.\n", hr); + ok(count == 0xdeadbeef, "Got unexpected count %lu.\n", count);
hr = IEnumString_Next(enumstring, 0, &olestring, &count); - ok(hr == S_OK || hr == WINCODEC_ERR_VALUEOUTOFRANGE, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK || hr == WINCODEC_ERR_VALUEOUTOFRANGE, "Got unexpected hr %#lx.\n", hr);
count = 0xdeadbeef; hr = IEnumString_Next(enumstring, 1, &olestring, &count); ok(hr == S_OK || hr == S_FALSE, "Got unexpected hr %#lx, i %u.\n", hr, i); - ok((hr && !count) || (!hr && count == 1), "Got unexpected hr %#lx, count %lu, i %u.\n", hr, count, i); + ok((hr && !count) || (!hr && count == 1), "Got unexpected hr %#lx, count %lu.\n", hr, count); if (count) { CoTaskMemFree(olestring); @@ -3603,10 +3616,10 @@ static void test_metadata_writer(void) /* IEnumString_Skip() crashes at least on Win7 when * trying to skip past the string count. */ hr = IEnumString_Reset(enumstring); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
hr = IEnumString_Skip(enumstring, 1); - ok(hr == S_OK, "Got unexpected hr %#lx, i %u.\n", hr, i); + ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); } IEnumString_Release(enumstring);
@@ -3617,6 +3630,8 @@ static void test_metadata_writer(void) IWICBitmapFrameEncode_Release(frameencode); IStream_Release(stream); IWICBitmapEncoder_Release(encoder); + + winetest_pop_context(); } }
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 68 +++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index ae197864768..606fde0b848 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -467,6 +467,42 @@ static void compare_metadata(IWICMetadataReader *reader, const struct test_data IWICEnumMetadataItem_Release(enumerator); }
+#define test_reader_container_format(a, b) _test_reader_container_format(a, b, __LINE__) +static void _test_reader_container_format(IWICMetadataReader *reader, const GUID *format, unsigned int line) +{ + IWICMetadataHandlerInfo *info; + BOOL found = FALSE; + GUID formats[8]; + UINT count; + HRESULT hr; + + hr = IWICMetadataReader_GetMetadataHandlerInfo(reader, &info); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + hr = IWICMetadataHandlerInfo_GetContainerFormats(info, ARRAY_SIZE(formats), formats, &count); + ok_(__FILE__, line)(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok_(__FILE__, line)(count > 0, "Unexpected count.\n"); + + for (unsigned i = 0; i < count; ++i) + { + if (IsEqualGUID(&formats[i], format)) + { + found = TRUE; + break; + } + } + ok_(__FILE__, line)(found, "Container format %s was not found.\n", wine_dbgstr_guid(format)); + + if (!found) + { + for (unsigned i = 0; i < count; ++i) + ok_(__FILE__, line)(0, "Available format %s.\n", wine_dbgstr_guid(&formats[i])); + } + + IWICMetadataHandlerInfo_Release(info); +} + + static void test_metadata_unknown(void) { HRESULT hr; @@ -556,6 +592,7 @@ static void test_metadata_unknown(void)
static void test_metadata_tEXt(void) { + IWICMetadataHandlerInfo *info; HRESULT hr; IWICMetadataReader *reader; IWICEnumMetadataItem *enumerator; @@ -589,6 +626,12 @@ static void test_metadata_tEXt(void)
load_stream(reader, metadata_tEXt, sizeof(metadata_tEXt), WICPersistOptionDefault);
+ hr = IWICMetadataReader_GetMetadataHandlerInfo(reader, &info); + todo_wine + ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + IWICMetadataHandlerInfo_Release(info); + hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount failed, hr=%lx\n", hr); ok(count == 1, "unexpected count %i\n", count); @@ -697,6 +740,7 @@ static void test_metadata_tEXt(void)
static void test_metadata_gAMA(void) { + IWICMetadataHandlerInfo *info; HRESULT hr; IWICMetadataReader *reader; PROPVARIANT schema, id, value; @@ -721,6 +765,12 @@ static void test_metadata_gAMA(void)
load_stream(reader, metadata_gAMA, sizeof(metadata_gAMA), WICPersistOptionDefault);
+ hr = IWICMetadataReader_GetMetadataHandlerInfo(reader, &info); + todo_wine + ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND, "Unexpected hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + IWICMetadataHandlerInfo_Release(info); + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); ok(hr == S_OK, "GetMetadataFormat failed, hr=%lx\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatChunkgAMA), "unexpected format %s\n", wine_dbgstr_guid(&format)); @@ -1148,6 +1198,8 @@ static void test_metadata_IFD(void)
load_stream(reader, (const char *)&IFD_data, sizeof(IFD_data), persist_options);
+ test_reader_container_format(reader, &GUID_ContainerFormatTiff); + hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count); @@ -1293,6 +1345,8 @@ static void test_metadata_Exif(void) ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == 0, "unexpected count %u\n", count);
+ test_reader_container_format(reader, &GUID_MetadataFormatIfd); + IWICMetadataReader_Release(reader);
hr = CoCreateInstance(&CLSID_WICExifMetadataWriter, NULL, CLSCTX_INPROC_SERVER, @@ -1568,6 +1622,8 @@ static void test_metadata_png(void) broken(IsEqualGUID(&containerformat, &GUID_MetadataFormatUnknown)) /* Windows XP */, "unexpected container format\n");
+ test_reader_container_format(reader, &GUID_ContainerFormatPng); + hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == 6 || broken(count == 1) /* XP */, "expected 6, got %u\n", count); @@ -1738,6 +1794,8 @@ static void test_metadata_gif(void) ok(IsEqualGUID(&format, &GUID_MetadataFormatLSD), /* Logical Screen Descriptor */ "wrong metadata format %s\n", wine_dbgstr_guid(&format));
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == ARRAY_SIZE(gif_LSD), "unexpected count %u\n", count); @@ -2269,6 +2327,8 @@ static void test_metadata_LSD(void)
stream = create_stream(LSD_data, sizeof(LSD_data));
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + pos.QuadPart = 6; hr = IStream_Seek(stream, pos, SEEK_SET, NULL); ok(hr == S_OK, "IStream_Seek error %#lx\n", hr); @@ -2361,6 +2421,8 @@ static void test_metadata_IMD(void) check_interface(reader, &IID_IWICPersistStream, TRUE); check_interface(reader, &IID_IWICStreamProvider, TRUE);
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + stream = create_stream(IMD_data, sizeof(IMD_data));
pos.QuadPart = 12; @@ -2452,6 +2514,8 @@ static void test_metadata_GCE(void) check_interface(reader, &IID_IWICPersistStream, TRUE); check_interface(reader, &IID_IWICStreamProvider, TRUE);
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + stream = create_stream(GCE_data, sizeof(GCE_data));
pos.QuadPart = 12; @@ -2545,6 +2609,8 @@ static void test_metadata_APE(void) check_interface(reader, &IID_IWICPersistStream, TRUE); check_interface(reader, &IID_IWICStreamProvider, TRUE);
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + stream = create_stream(APE_data, sizeof(APE_data));
hr = IUnknown_QueryInterface(reader, &IID_IWICPersistStream, (void **)&persist); @@ -2645,6 +2711,8 @@ static void test_metadata_GIF_comment(void) check_interface(reader, &IID_IWICPersistStream, TRUE); check_interface(reader, &IID_IWICStreamProvider, TRUE);
+ test_reader_container_format(reader, &GUID_ContainerFormatGif); + stream = create_stream(GIF_comment_data, sizeof(GIF_comment_data));
hr = IUnknown_QueryInterface(reader, &IID_IWICPersistStream, (void **)&persist);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 53 ++++++++++++++++------------- 1 file changed, 29 insertions(+), 24 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 606fde0b848..3bc7f87c8ee 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -49,29 +49,34 @@ static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOO IUnknown_Release(unk); }
-#define expect_blob(propvar, data, length) do { \ - ok((propvar).vt == VT_BLOB, "unexpected vt: %i\n", (propvar).vt); \ - if ((propvar).vt == VT_BLOB) { \ - ok(propvar.blob.cbSize == (length), "expected size %lu, got %lu\n", (ULONG)(length), propvar.blob.cbSize); \ - if (propvar.blob.cbSize == (length)) { \ - ok(!memcmp(propvar.blob.pBlobData, (data), (length)), "unexpected data\n"); \ - } \ - } \ -} while (0) - -#define IFD_BYTE 1 -#define IFD_ASCII 2 -#define IFD_SHORT 3 -#define IFD_LONG 4 -#define IFD_RATIONAL 5 -#define IFD_SBYTE 6 -#define IFD_UNDEFINED 7 -#define IFD_SSHORT 8 -#define IFD_SLONG 9 -#define IFD_SRATIONAL 10 -#define IFD_FLOAT 11 -#define IFD_DOUBLE 12 -#define IFD_IFD 13 +#define compare_blob(a,b,c) compare_blob_(__LINE__,a,b,c) +static void compare_blob_(unsigned int line, const PROPVARIANT *propvar, const char *data, ULONG length) +{ + ok_(__FILE__, line)(propvar->vt == VT_BLOB, "Unexpected vt: %i\n", propvar->vt); + if (propvar->vt == VT_BLOB) + { + ok_(__FILE__, line)(propvar->blob.cbSize == length, "Expected size %lu, got %lu.\n", length, propvar->blob.cbSize); + if (propvar->blob.cbSize == length) + ok_(__FILE__, line)(!memcmp(propvar->blob.pBlobData, data, length), "Unexpected data.\n"); + } +} + +enum ifd_entry_type +{ + IFD_BYTE = 1, + IFD_ASCII = 2, + IFD_SHORT = 3, + IFD_LONG = 4, + IFD_RATIONAL = 5, + IFD_SBYTE = 6, + IFD_UNDEFINED = 7, + IFD_SSHORT = 8, + IFD_SLONG = 9, + IFD_SRATIONAL = 10, + IFD_FLOAT = 11, + IFD_DOUBLE = 12, + IFD_IFD = 13, +};
#include "pshpack2.h" struct IFD_entry @@ -543,7 +548,7 @@ static void test_metadata_unknown(void) { ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt); ok(id.vt == VT_EMPTY, "unexpected vt: %i\n", id.vt); - expect_blob(value, metadata_unknown, sizeof(metadata_unknown)); + compare_blob(&value, metadata_unknown, sizeof(metadata_unknown));
PropVariantClear(&schema); PropVariantClear(&id);
-#define IFD_BYTE 1 -#define IFD_ASCII 2 -#define IFD_SHORT 3 -#define IFD_LONG 4 -#define IFD_RATIONAL 5 -#define IFD_SBYTE 6 -#define IFD_UNDEFINED 7 -#define IFD_SSHORT 8 -#define IFD_SLONG 9 -#define IFD_SRATIONAL 10 -#define IFD_FLOAT 11 -#define IFD_DOUBLE 12 -#define IFD_IFD 13
Please leave the tag ids defined, this matches both the implementation and the Adobe TIFF specification. Also this would avoid a change that doesn't match the declared subject.
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/converter.c | 7 +------ dlls/windowscodecs/tests/metadata.c | 16 +++------------ dlls/windowscodecs/tests/tiffformat.c | 28 --------------------------- 3 files changed, 4 insertions(+), 47 deletions(-)
diff --git a/dlls/windowscodecs/tests/converter.c b/dlls/windowscodecs/tests/converter.c index fd617a1feb7..f6cef841d56 100644 --- a/dlls/windowscodecs/tests/converter.c +++ b/dlls/windowscodecs/tests/converter.c @@ -962,16 +962,11 @@ static void load_stream(IUnknown *reader, IStream *stream) { HRESULT hr; IWICPersistStream *persist; -#ifdef WORDS_BIGENDIAN - DWORD persist_options = WICPersistOptionBigEndian; -#else - DWORD persist_options = WICPersistOptionLittleEndian; -#endif
hr = IUnknown_QueryInterface(reader, &IID_IWICPersistStream, (void **)&persist); ok(hr == S_OK, "QueryInterface failed, hr=%lx\n", hr);
- hr = IWICPersistStream_LoadEx(persist, stream, NULL, persist_options); + hr = IWICPersistStream_LoadEx(persist, stream, NULL, 0); ok(hr == S_OK, "LoadEx failed, hr=%lx\n", hr);
IWICPersistStream_Release(persist); diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 3bc7f87c8ee..83fb5b64877 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1177,11 +1177,6 @@ static void test_metadata_IFD(void) UINT count; GUID format; char *IFD_data_swapped; -#ifdef WORDS_BIGENDIAN - DWORD persist_options = WICPersistOptionBigEndian; -#else - DWORD persist_options = WICPersistOptionLittleEndian; -#endif
hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataReader, (void**)&reader); @@ -1201,7 +1196,7 @@ static void test_metadata_IFD(void) ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == 0, "unexpected count %u\n", count);
- load_stream(reader, (const char *)&IFD_data, sizeof(IFD_data), persist_options); + load_stream(reader, (const char *)&IFD_data, sizeof(IFD_data), WICPersistOptionLittleEndian);
test_reader_container_format(reader, &GUID_ContainerFormatTiff);
@@ -1211,16 +1206,11 @@ static void test_metadata_IFD(void)
compare_metadata(reader, td, count);
- /* test IFD data with different endianness */ - if (persist_options == WICPersistOptionLittleEndian) - persist_options = WICPersistOptionBigEndian; - else - persist_options = WICPersistOptionLittleEndian; - + /* Test big-endian IFD data */ IFD_data_swapped = HeapAlloc(GetProcessHeap(), 0, sizeof(IFD_data)); memcpy(IFD_data_swapped, &IFD_data, sizeof(IFD_data)); byte_swap_ifd_data(IFD_data_swapped); - load_stream(reader, IFD_data_swapped, sizeof(IFD_data), persist_options); + load_stream(reader, IFD_data_swapped, sizeof(IFD_data), WICPersistOptionBigEndian); hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count); diff --git a/dlls/windowscodecs/tests/tiffformat.c b/dlls/windowscodecs/tests/tiffformat.c index 86365fb7b92..9fb2ab6216c 100644 --- a/dlls/windowscodecs/tests/tiffformat.c +++ b/dlls/windowscodecs/tests/tiffformat.c @@ -75,11 +75,7 @@ static const struct tiff_1bpp_data BYTE pixel_data[4]; } tiff_1bpp_data = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_1bpp_data, number_of_entries), 13, @@ -115,11 +111,7 @@ static const struct tiff_8bpp_alpha BYTE pixel_data[8]; } tiff_8bpp_alpha = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_8bpp_alpha, number_of_entries), 15, @@ -158,11 +150,7 @@ static const struct tiff_8bpp_data BYTE pixel_data[4]; } tiff_8bpp_data = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_8bpp_data, number_of_entries), 14, @@ -234,11 +222,7 @@ static struct tiff_resolution_image_data BYTE pixel_data[4]; } tiff_resolution_image_data = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_resolution_image_data, number_of_entries), 13, @@ -275,11 +259,7 @@ static const struct tiff_24bpp_data BYTE pixel_data[3]; } tiff_24bpp_data = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_1bpp_data, number_of_entries), 13, @@ -315,11 +295,7 @@ static const struct tiff_4bps_bgra BYTE pixel_data[4]; } tiff_4bps_bgra = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_4bps_bgra, number_of_entries), 14, @@ -853,11 +829,7 @@ static const struct tiff_1x1_data BYTE pixel_data[32]; } tiff_1x1_data = { -#ifdef WORDS_BIGENDIAN - 'M' | 'M' << 8, -#else 'I' | 'I' << 8, -#endif 42, FIELD_OFFSET(struct tiff_1x1_data, number_of_entries), 13,
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 72 +++++++++++++++++------------ 1 file changed, 42 insertions(+), 30 deletions(-)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 83fb5b64877..06b1f813043 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1134,7 +1134,7 @@ static void byte_swap_ifd_data(char *data) } }
-static void test_metadata_IFD(void) +static void test_ifd_content(IWICMetadataReader *reader) { static const struct test_data td[28] = { @@ -1170,27 +1170,10 @@ static void test_metadata_IFD(void) ((LONGLONG)0x50607080 << 32) | 0x10203040, ((LONGLONG)0x55667788 << 32) | 0x11223344 } }, }; - HRESULT hr; - IWICMetadataReader *reader; - IWICMetadataWriter *writer; PROPVARIANT schema, id, value; - UINT count; - GUID format; char *IFD_data_swapped; - - hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER, - &IID_IWICMetadataReader, (void**)&reader); - ok(hr == S_OK, "CoCreateInstance error %#lx\n", hr); - - check_interface(reader, &IID_IWICMetadataReader, TRUE); - check_interface(reader, &IID_IPersist, TRUE); - check_interface(reader, &IID_IPersistStream, TRUE); - check_interface(reader, &IID_IWICPersistStream, TRUE); - check_interface(reader, &IID_IWICStreamProvider, TRUE); - check_interface(reader, &IID_IWICMetadataBlockReader, FALSE); - - hr = IWICMetadataReader_GetCount(reader, NULL); - ok(hr == E_INVALIDARG, "GetCount error %#lx\n", hr); + UINT count; + HRESULT hr;
hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); @@ -1198,8 +1181,6 @@ static void test_metadata_IFD(void)
load_stream(reader, (const char *)&IFD_data, sizeof(IFD_data), WICPersistOptionLittleEndian);
- test_reader_container_format(reader, &GUID_ContainerFormatTiff); - hr = IWICMetadataReader_GetCount(reader, &count); ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == ARRAY_SIZE(td), "unexpected count %u\n", count); @@ -1217,13 +1198,6 @@ static void test_metadata_IFD(void) compare_metadata(reader, td, count); HeapFree(GetProcessHeap(), 0, IFD_data_swapped);
- hr = IWICMetadataReader_GetMetadataFormat(reader, &format); - ok(hr == S_OK, "GetMetadataFormat error %#lx\n", hr); - ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", wine_dbgstr_guid(&format)); - - hr = IWICMetadataReader_GetMetadataFormat(reader, NULL); - ok(hr == E_INVALIDARG, "GetMetadataFormat should fail\n"); - hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, NULL); ok(hr == S_OK, "GetValueByIndex error %#lx\n", hr);
@@ -1295,6 +1269,44 @@ static void test_metadata_IFD(void) ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt); ok(!strcmp(value.pszVal, "Hello World!"), "unexpected value: %s\n", value.pszVal); PropVariantClear(&value); +} + +static void test_metadata_Ifd(void) +{ + IWICMetadataReader *reader; + IWICMetadataWriter *writer; + GUID format; + UINT count; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICMetadataReader, (void**)&reader); + ok(hr == S_OK, "CoCreateInstance error %#lx\n", hr); + + check_interface(reader, &IID_IWICMetadataReader, TRUE); + check_interface(reader, &IID_IPersist, TRUE); + check_interface(reader, &IID_IPersistStream, TRUE); + check_interface(reader, &IID_IWICPersistStream, TRUE); + check_interface(reader, &IID_IWICStreamProvider, TRUE); + check_interface(reader, &IID_IWICMetadataBlockReader, FALSE); + + hr = IWICMetadataReader_GetCount(reader, NULL); + ok(hr == E_INVALIDARG, "GetCount error %#lx\n", hr); + + hr = IWICMetadataReader_GetCount(reader, &count); + ok(hr == S_OK, "GetCount error %#lx\n", hr); + ok(count == 0, "unexpected count %u\n", count); + + test_ifd_content(reader); + + test_reader_container_format(reader, &GUID_ContainerFormatTiff); + + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); + ok(hr == S_OK, "GetMetadataFormat error %#lx\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", wine_dbgstr_guid(&format)); + + hr = IWICMetadataReader_GetMetadataFormat(reader, NULL); + ok(hr == E_INVALIDARG, "GetMetadataFormat should fail\n");
IWICMetadataReader_Release(reader);
@@ -3712,7 +3724,7 @@ START_TEST(metadata) test_metadata_cHRM(); test_metadata_hIST(); test_metadata_tIME(); - test_metadata_IFD(); + test_metadata_Ifd(); test_metadata_Exif(); test_create_reader_from_container(); test_create_reader();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 06b1f813043..eaad8b926bf 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1332,6 +1332,7 @@ static void test_metadata_Exif(void) IWICMetadataReader *reader; IWICMetadataWriter *writer; UINT count=0; + GUID format;
hr = CoCreateInstance(&CLSID_WICExifMetadataReader, NULL, CLSCTX_INPROC_SERVER, &IID_IWICMetadataReader, (void**)&reader); @@ -1352,7 +1353,12 @@ static void test_metadata_Exif(void) ok(hr == S_OK, "GetCount error %#lx\n", hr); ok(count == 0, "unexpected count %u\n", count);
+ hr = IWICMetadataReader_GetMetadataFormat(reader, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatExif), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + test_reader_container_format(reader, &GUID_MetadataFormatIfd); + test_ifd_content(reader);
IWICMetadataReader_Release(reader);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index eaad8b926bf..66e79ea0e9c 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -1378,6 +1378,57 @@ static void test_metadata_Exif(void) IWICMetadataWriter_Release(writer); }
+static void test_metadata_Gps(void) +{ + IWICMetadataReader *reader; + IWICMetadataWriter *writer; + UINT count=0; + GUID format; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_WICGpsMetadataReader, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICMetadataReader, (void **)&reader); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (FAILED(hr)) return; + + check_interface(reader, &IID_IWICMetadataReader, TRUE); + check_interface(reader, &IID_IPersist, TRUE); + check_interface(reader, &IID_IPersistStream, TRUE); + check_interface(reader, &IID_IWICPersistStream, TRUE); + check_interface(reader, &IID_IWICStreamProvider, TRUE); + check_interface(reader, &IID_IWICMetadataBlockReader, FALSE); + + hr = IWICMetadataReader_GetCount(reader, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + hr = IWICMetadataReader_GetCount(reader, &count); + ok(hr == S_OK, "GetCount error %#lx\n", hr); + ok(!count, "Unexpected count %u.\n", count); + + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatGps), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + + test_reader_container_format(reader, &GUID_MetadataFormatIfd); + test_ifd_content(reader); + + IWICMetadataReader_Release(reader); + + hr = CoCreateInstance(&CLSID_WICGpsMetadataWriter, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICMetadataWriter, (void **)&writer); + 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); + check_interface(writer, &IID_IPersist, TRUE); + check_interface(writer, &IID_IPersistStream, TRUE); + check_interface(writer, &IID_IWICPersistStream, TRUE); + check_interface(writer, &IID_IWICStreamProvider, TRUE); + + IWICMetadataWriter_Release(writer); +} + static void test_create_reader_from_container(void) { HRESULT hr; @@ -3732,6 +3783,7 @@ START_TEST(metadata) test_metadata_tIME(); test_metadata_Ifd(); test_metadata_Exif(); + test_metadata_Gps(); test_create_reader_from_container(); test_create_reader(); test_metadata_png();
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/tests/metadata.c | 135 ++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+)
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 66e79ea0e9c..81d45b69593 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -3767,6 +3767,140 @@ static void test_metadata_writer(void) } }
+#include "pshpack2.h" +static const struct app1_data +{ + BYTE exif_header[6]; + BYTE bom[2]; + USHORT marker; + ULONG ifd0_offset; + + USHORT ifd0_count; + struct IFD_entry ifd0[2]; + ULONG next_IFD; +} +app1_data = +{ + { 'E','x','i','f',0,0 }, + { 'I','I' }, + 0x002a, + 0x8, + + /* IFD 0 */ + 2, + { + { 0x100, IFD_LONG, 1, 222 }, /* IMAGEWIDTH */ + { 0x101, IFD_LONG, 1, 333 }, /* IMAGELENGTH */ + }, + 0 +}; +#include "poppack.h" + +static void test_metadata_App1(void) +{ + IWICMetadataReader *reader, *reader2; + IWICMetadataWriter *writer; + PROPVARIANT id, value; + GUID format; + HRESULT hr; + UINT count; + + hr = CoCreateInstance(&CLSID_WICApp1MetadataReader, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICMetadataReader, (void **)&reader); + todo_wine + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + if (FAILED(hr)) return; + + check_interface(reader, &IID_IWICMetadataReader, TRUE); + check_interface(reader, &IID_IPersist, TRUE); + check_interface(reader, &IID_IPersistStream, TRUE); + check_interface(reader, &IID_IWICPersistStream, TRUE); + check_interface(reader, &IID_IWICStreamProvider, TRUE); + check_interface(reader, &IID_IWICMetadataBlockReader, FALSE); + + hr = IWICMetadataReader_GetCount(reader, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); + + count = 1; + hr = IWICMetadataReader_GetCount(reader, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(!count, "Unexpected count %u.\n", count); + + hr = IWICMetadataReader_GetMetadataFormat(reader, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatApp1), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + + test_reader_container_format(reader, &GUID_ContainerFormatJpeg); + + load_stream(reader, (const char *)&app1_data, sizeof(app1_data), 0); + + hr = IWICMetadataReader_GetCount(reader, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 1, "Unexpected count %u.\n", count); + + PropVariantInit(&id); + PropVariantInit(&value); + hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + /* Top level IFD reader. */ + ok(id.vt == VT_UI2, "Unexpected id type: %u.\n", id.vt); + ok(id.uiVal == 0, "Unexpected id %u.\n", id.uiVal); + + ok(value.vt == VT_UNKNOWN, "Unexpected value type: %u.\n", value.vt); + ok(!!value.punkVal, "Unexpected value.\n"); + + hr = IUnknown_QueryInterface(value.punkVal, &IID_IWICMetadataReader, (void **)&reader2); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + PropVariantClear(&value); + + hr = IWICMetadataReader_GetMetadataFormat(reader2, &format); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); + + hr = IWICMetadataReader_GetCount(reader2, &count); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(count == 2, "Unexpected count %u.\n", count); + + PropVariantInit(&id); + PropVariantInit(&value); + hr = IWICMetadataReader_GetValueByIndex(reader2, 0, NULL, &id, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + ok(id.vt == VT_UI2, "Unexpected id type: %u.\n", id.vt); + ok(id.uiVal == 0x100, "Unexpected id %u.\n", id.uiVal); + ok(value.vt == VT_UI4, "Unexpected value type: %u.\n", value.vt); + ok(value.ulVal == 222, "Unexpected value %lu.\n", value.ulVal); + + PropVariantInit(&id); + PropVariantInit(&value); + hr = IWICMetadataReader_GetValueByIndex(reader2, 1, NULL, &id, &value); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + + ok(id.vt == VT_UI2, "Unexpected id type: %u.\n", id.vt); + ok(id.uiVal == 0x101, "Unexpected id %u.\n", id.uiVal); + ok(value.vt == VT_UI4, "Unexpected value type: %u.\n", value.vt); + ok(value.ulVal == 333, "Unexpected value %lu.\n", value.ulVal); + + IWICMetadataReader_Release(reader2); + + IWICMetadataReader_Release(reader); + + hr = CoCreateInstance(&CLSID_WICApp1MetadataWriter, NULL, CLSCTX_INPROC_SERVER, + &IID_IWICMetadataWriter, (void **)&writer); + 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); + check_interface(writer, &IID_IPersist, TRUE); + check_interface(writer, &IID_IPersistStream, TRUE); + check_interface(writer, &IID_IWICPersistStream, TRUE); + check_interface(writer, &IID_IWICStreamProvider, TRUE); + + IWICMetadataWriter_Release(writer); +} + START_TEST(metadata) { CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); @@ -3794,6 +3928,7 @@ START_TEST(metadata) test_metadata_APE(); test_metadata_GIF_comment(); test_metadata_writer(); + test_metadata_App1();
CoUninitialize(); }
This merge request was approved by Esme Povirk.