From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/windowscodecs/imgfactory.c | 17 ++++++++++++++++- dlls/windowscodecs/tests/metadata.c | 24 +++++++++++------------- 2 files changed, 27 insertions(+), 14 deletions(-)
diff --git a/dlls/windowscodecs/imgfactory.c b/dlls/windowscodecs/imgfactory.c index 29f91e6cbbd..b128a1ad13e 100644 --- a/dlls/windowscodecs/imgfactory.c +++ b/dlls/windowscodecs/imgfactory.c @@ -1712,7 +1712,22 @@ HRESULT create_metadata_writer_from_reader(IWICMetadataReader *reader, const GUI
if (cached_stream) { - hr = create_stream_wrapper(cached_stream, 0, &stream); + LARGE_INTEGER move; + ULARGE_INTEGER pos; + + /* Move wrapper stream to match original stream position. */ + move.QuadPart = 0; + hr = IStream_Seek(cached_stream, move, STREAM_SEEK_CUR, &pos); + + if (SUCCEEDED(hr)) + hr = create_stream_wrapper(cached_stream, 0, &stream); + + if (SUCCEEDED(hr)) + { + move.QuadPart = pos.QuadPart; + hr = IStream_Seek(stream, move, STREAM_SEEK_SET, NULL); + } + IStream_Release(cached_stream); } } diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index edec2eb85c8..01bc0a6ac12 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -5161,11 +5161,8 @@ static void test_metadata_App1(void) ok(pos.QuadPart == 8, "Unexpected position %s.\n", wine_dbgstr_longlong(pos.QuadPart));
hr = IWICComponentFactory_CreateMetadataWriterFromReader(factory, reader2, NULL, &writer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-if (hr == S_OK) -{ hr = IWICMetadataWriter_GetMetadataFormat(writer, &format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); @@ -5180,7 +5177,6 @@ if (hr == S_OK)
IStream_Release(stream); IWICMetadataWriter_Release(writer); -}
IWICMetadataReader_Release(reader2); IStream_Release(ifd_stream); @@ -5538,10 +5534,10 @@ if (hr == S_OK)
static void test_CreateMetadataWriterFromReader(void) { + IStream *stream, *stream2, *ifd_stream, *writer_stream; IWICMetadataReader *reader, *ifd_reader; IWICComponentFactory *factory; IWICMetadataWriter *writer; - IStream *stream, *stream2; PROPVARIANT id, value; GUID format; HRESULT hr; @@ -5712,11 +5708,16 @@ static void test_CreateMetadataWriterFromReader(void) ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "Unexpected format %s.\n", wine_dbgstr_guid(&format));
hr = IWICComponentFactory_CreateMetadataWriterFromReader(factory, ifd_reader, NULL, &writer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-if (hr == S_OK) -{ + hr = get_persist_stream(ifd_reader, &ifd_stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = get_persist_stream(writer, &writer_stream); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + ok(ifd_stream != writer_stream, "Unexpected stream.\n"); + IStream_Release(ifd_stream); + IStream_Release(writer_stream); + hr = IWICMetadataWriter_GetMetadataFormat(writer, &format); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "Unexpected format %s.\n", wine_dbgstr_guid(&format)); @@ -5724,7 +5725,7 @@ if (hr == S_OK) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(count == 4, "Unexpected count %u.\n", count); IWICMetadataWriter_Release(writer); -} + IWICMetadataReader_Release(ifd_reader); IWICMetadataReader_Release(reader); IStream_Release(stream); @@ -6117,10 +6118,8 @@ static void test_CreateQueryWriterFromReader(void) ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
hr = IWICComponentFactory_CreateQueryWriterFromReader(factory, query_reader2, NULL, &query_writer); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); -if (hr == S_OK) -{ + hr = IWICMetadataQueryWriter_GetLocation(query_writer, ARRAY_SIZE(buff), buff, &len); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(!wcscmp(buff, L"/ifd"), "Unexpected location %s.\n", wine_dbgstr_w(buff)); @@ -6150,7 +6149,6 @@ if (hr == S_OK) IEnumString_Release(enum_string);
IWICMetadataQueryWriter_Release(query_writer); -}
IWICMetadataQueryReader_Release(query_reader); IWICMetadataQueryReader_Release(query_reader2);