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