oleaut32: avoid copying the data when loading an image using WIC

Vincent Povirk madewokherd+8cd9 at gmail.com
Sat Aug 22 19:56:43 CDT 2009


IWICStream makes it possible to create a stream on memory directly
without copying the memory to an HGLOBAL handle first. Using it saves
a copy.

-- 
Vincent Povirk
-------------- next part --------------
From b29f7a0884a146592fb46fb779dedf71ed347813 Mon Sep 17 00:00:00 2001
From: Vincent Povirk <madewokherd at gmail.com>
Date: Sat, 22 Aug 2009 19:51:08 -0500
Subject: [PATCH] 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;
 }
-- 
1.6.3.3


More information about the wine-patches mailing list