Vincent Povirk : oleaut32: Avoid copying the data when loading an image using WIC.
Alexandre Julliard
julliard at winehq.org
Mon Aug 24 10:09:06 CDT 2009
Module: wine
Branch: master
Commit: 5a5e0e937d979aefcfdffa2ce7b8121a9d77da26
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a5e0e937d979aefcfdffa2ce7b8121a9d77da26
Author: Vincent Povirk <madewokherd at gmail.com>
Date: Sat Aug 22 19:51:08 2009 -0500
oleaut32: Avoid copying the data when loading an image using WIC.
---
dlls/oleaut32/olepicture.c | 58 ++++++++++++++++++++++---------------------
1 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index 83e5349..b4def3a 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -1319,48 +1319,50 @@ end:
static HRESULT OLEPictureImpl_LoadWICDecoder(OLEPictureImpl *This, REFCLSID decoder_clsid, BYTE *xbuf, ULONG xread)
{
HRESULT hr;
+ IWICImagingFactory *factory;
IWICBitmapDecoder *decoder;
IWICBitmapFrameDecode *framedecode;
HRESULT initresult;
- HGLOBAL hdata;
- BYTE *data;
- IStream *stream;
+ IWICStream *stream;
- hdata = GlobalAlloc(GMEM_MOVEABLE, xread);
- if (!hdata) return E_OUTOFMEMORY;
-
- data = GlobalLock(hdata);
- memcpy(data, xbuf, xread);
- GlobalUnlock(hdata);
+ initresult = CoInitialize(NULL);
- hr = CreateStreamOnHGlobal(hdata, TRUE, &stream);
- if (FAILED(hr))
+ hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICImagingFactory, (void**)&factory);
+ if (SUCCEEDED(hr)) /* created factory */
{
- GlobalFree(hdata);
- return hr;
+ hr = IWICImagingFactory_CreateStream(factory, &stream);
+ IWICImagingFactory_Release(factory);
}
- initresult = CoInitialize(NULL);
-
- hr = CoCreateInstance(decoder_clsid, NULL, CLSCTX_INPROC_SERVER,
- &IID_IWICBitmapDecoder, (void**)&decoder);
- if (FAILED(hr)) goto end;
-
- hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnLoad);
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(hr)) /* created stream */
{
- hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
- if (SUCCEEDED(hr))
+ hr = IWICStream_InitializeFromMemory(stream, xbuf, xread);
+
+ if (SUCCEEDED(hr)) /* initialized stream */
{
- hr = OLEPictureImpl_LoadWICSource(This, (IWICBitmapSource*)framedecode);
- IWICBitmapFrameDecode_Release(framedecode);
+ hr = CoCreateInstance(decoder_clsid, NULL, CLSCTX_INPROC_SERVER,
+ &IID_IWICBitmapDecoder, (void**)&decoder);
+ if (SUCCEEDED(hr)) /* created decoder */
+ {
+ hr = IWICBitmapDecoder_Initialize(decoder, (IStream*)stream, WICDecodeMetadataCacheOnLoad);
+
+ if (SUCCEEDED(hr)) /* initialized decoder */
+ hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode);
+
+ IWICBitmapDecoder_Release(decoder);
+ }
}
+
+ IWICStream_Release(stream);
}
- IWICBitmapDecoder_Release(decoder);
+ if (SUCCEEDED(hr)) /* got framedecode */
+ {
+ hr = OLEPictureImpl_LoadWICSource(This, (IWICBitmapSource*)framedecode);
+ IWICBitmapFrameDecode_Release(framedecode);
+ }
-end:
- IStream_Release(stream);
if (SUCCEEDED(initresult)) CoUninitialize();
return hr;
}
More information about the wine-cvs
mailing list