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: ...@@ -1319,48 +1319,50 @@ end:
static HRESULT OLEPictureImpl_LoadWICDecoder(OLEPictureImpl *This, REFCLSID decoder_clsid, BYTE *xbuf, ULONG xread) static HRESULT OLEPictureImpl_LoadWICDecoder(OLEPictureImpl *This, REFCLSID decoder_clsid, BYTE *xbuf, ULONG xread)
{ {
HRESULT hr; HRESULT hr;
IWICImagingFactory *factory;
IWICBitmapDecoder *decoder; IWICBitmapDecoder *decoder;
IWICBitmapFrameDecode *framedecode; IWICBitmapFrameDecode *framedecode;
HRESULT initresult; HRESULT initresult;
HGLOBAL hdata; IWICStream *stream;
BYTE *data;
IStream *stream;
hdata = GlobalAlloc(GMEM_MOVEABLE, xread); initresult = CoInitialize(NULL);
if (!hdata) return E_OUTOFMEMORY;
data = GlobalLock(hdata);
memcpy(data, xbuf, xread);
GlobalUnlock(hdata);
hr = CreateStreamOnHGlobal(hdata, TRUE, &stream); hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
if (FAILED(hr)) &IID_IWICImagingFactory, (void**)&factory);
if (SUCCEEDED(hr)) /* created factory */
{ {
GlobalFree(hdata); hr = IWICImagingFactory_CreateStream(factory, &stream);
return hr; IWICImagingFactory_Release(factory);
} }
initresult = CoInitialize(NULL); if (SUCCEEDED(hr)) /* created stream */
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))
{ {
hr = IWICBitmapDecoder_GetFrame(decoder, 0, &framedecode); hr = IWICStream_InitializeFromMemory(stream, xbuf, xread);
if (SUCCEEDED(hr))
if (SUCCEEDED(hr)) /* initialized stream */
{ {
hr = OLEPictureImpl_LoadWICSource(This, (IWICBitmapSource*)framedecode); hr = CoCreateInstance(decoder_clsid, NULL, CLSCTX_INPROC_SERVER,
IWICBitmapFrameDecode_Release(framedecode); &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(); if (SUCCEEDED(initresult)) CoUninitialize();
return hr; 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