Vincent Povirk : windowscodecs: Implement PngDecoder_Block_GetReaderByIndex.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Mar 30 10:12:59 CDT 2015
Module: wine
Branch: master
Commit: f2f5cd831bdda21deef1fca67febe78fb174d582
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f2f5cd831bdda21deef1fca67febe78fb174d582
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed Mar 25 14:42:15 2015 -0500
windowscodecs: Implement PngDecoder_Block_GetReaderByIndex.
---
dlls/windowscodecs/pngformat.c | 47 +++++++++++++++++++++++++++++++++++--
dlls/windowscodecs/tests/metadata.c | 6 ++---
2 files changed, 48 insertions(+), 5 deletions(-)
diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c
index 53a2122..679ad3d 100644
--- a/dlls/windowscodecs/pngformat.c
+++ b/dlls/windowscodecs/pngformat.c
@@ -1062,8 +1062,51 @@ static HRESULT WINAPI PngDecoder_Block_GetCount(IWICMetadataBlockReader *iface,
static HRESULT WINAPI PngDecoder_Block_GetReaderByIndex(IWICMetadataBlockReader *iface,
UINT nIndex, IWICMetadataReader **ppIMetadataReader)
{
- FIXME("%p,%d,%p\n", iface, nIndex, ppIMetadataReader);
- return E_NOTIMPL;
+ PngDecoder *This = impl_from_IWICMetadataBlockReader(iface);
+ HRESULT hr;
+ IWICComponentFactory* factory;
+ IWICStream* stream;
+
+ TRACE("%p,%d,%p\n", iface, nIndex, ppIMetadataReader);
+
+ if (nIndex >= This->metadata_count || !ppIMetadataReader)
+ return E_INVALIDARG;
+
+ if (!This->metadata_blocks[nIndex].reader)
+ {
+ hr = StreamImpl_Create(&stream);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICStream_InitializeFromIStreamRegion(stream, This->stream,
+ This->metadata_blocks[nIndex].ofs, This->metadata_blocks[nIndex].len);
+
+ if (SUCCEEDED(hr))
+ hr = ComponentFactory_CreateInstance(&IID_IWICComponentFactory, (void**)&factory);
+
+ if (SUCCEEDED(hr))
+ {
+ hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
+ &GUID_ContainerFormatPng, NULL, WICMetadataCreationAllowUnknown,
+ (IStream*)stream, &This->metadata_blocks[nIndex].reader);
+
+ IWICComponentFactory_Release(factory);
+ }
+
+ IWICStream_Release(stream);
+ }
+
+ if (FAILED(hr))
+ {
+ *ppIMetadataReader = NULL;
+ return hr;
+ }
+ }
+
+ *ppIMetadataReader = This->metadata_blocks[nIndex].reader;
+ IWICMetadataReader_AddRef(*ppIMetadataReader);
+
+ return S_OK;
}
static HRESULT WINAPI PngDecoder_Block_GetEnumerator(IWICMetadataBlockReader *iface,
diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c
index 1a7587f..6e629fb 100644
--- a/dlls/windowscodecs/tests/metadata.c
+++ b/dlls/windowscodecs/tests/metadata.c
@@ -960,19 +960,19 @@ static void test_metadata_png(void)
}
hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 0, &reader);
- todo_wine ok(hr == S_OK, "GetReaderByIndex failed, hr=%x\n", hr);
+ ok(hr == S_OK, "GetReaderByIndex failed, hr=%x\n", hr);
if (SUCCEEDED(hr))
{
hr = IWICMetadataReader_GetMetadataFormat(reader, &containerformat);
ok(hr == S_OK, "GetMetadataFormat failed, hr=%#x\n", hr);
- ok(IsEqualGUID(&containerformat, &GUID_MetadataFormatChunktIME) ||
+ todo_wine ok(IsEqualGUID(&containerformat, &GUID_MetadataFormatChunktIME) ||
broken(IsEqualGUID(&containerformat, &GUID_MetadataFormatUnknown)) /* Windows XP */,
"unexpected container format\n");
hr = IWICMetadataReader_GetCount(reader, &count);
ok(hr == S_OK, "GetCount error %#x\n", hr);
- ok(count == 6 || broken(count == 1) /* XP */, "expected 6, got %u\n", count);
+ todo_wine ok(count == 6 || broken(count == 1) /* XP */, "expected 6, got %u\n", count);
if (count == 6)
compare_metadata(reader, td, count);
More information about the wine-cvs
mailing list