Module: wine Branch: master Commit: 5a5e0e937d979aefcfdffa2ce7b8121a9d77da26 URL: http://source.winehq.org/git/wine.git/?a=commit;h=5a5e0e937d979aefcfdffa2ce7...
Author: Vincent Povirk madewokherd@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; }