Commit 5a5e0e93 authored by Vincent Povirk's avatar Vincent Povirk Committed by Alexandre Julliard

oleaut32: Avoid copying the data when loading an image using WIC.

parent 616b2727
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment