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