From: Huw Davies Subject: [PATCH 06/10] ole32: Add support for loading dibs. Message-Id: <1427272662-10261-6-git-send-email-huw@codeweavers.com> Date: Wed, 25 Mar 2015 08:37:38 +0000 --- dlls/ole32/datacache.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c index a2b7e57..36c02dd 100644 --- a/dlls/ole32/datacache.c +++ b/dlls/ole32/datacache.c @@ -581,6 +581,43 @@ static HRESULT load_mf_pict( DataCacheEntry *cache_entry, IStream *stm ) return hr; } +static HRESULT load_dib( DataCacheEntry *cache_entry, IStream *stm ) +{ + HRESULT hr; + STATSTG stat; + void *dib; + HGLOBAL hglobal; + ULONG read; + + if (cache_entry->stream_type != contents_stream) + { + FIXME( "Unimplemented for stream type %d\n", cache_entry->stream_type ); + return E_FAIL; + } + + hr = IStream_Stat( stm, &stat, STATFLAG_NONAME ); + if (FAILED( hr )) return hr; + + hglobal = GlobalAlloc( GMEM_MOVEABLE, stat.cbSize.u.LowPart ); + if (!hglobal) return E_OUTOFMEMORY; + dib = GlobalLock( hglobal ); + + hr = IStream_Read( stm, dib, stat.cbSize.u.LowPart, &read ); + GlobalUnlock( hglobal ); + + if (hr != S_OK || read != stat.cbSize.u.LowPart) + { + GlobalFree( hglobal ); + return E_FAIL; + } + + cache_entry->data_cf = cache_entry->fmtetc.cfFormat; + cache_entry->stgmedium.tymed = TYMED_HGLOBAL; + cache_entry->stgmedium.u.hGlobal = hglobal; + + return S_OK; +} + /************************************************************************ * DataCacheEntry_LoadData * @@ -608,6 +645,10 @@ static HRESULT DataCacheEntry_LoadData(DataCacheEntry *cache_entry) hr = load_mf_pict( cache_entry, stm ); break; + case CF_DIB: + hr = load_dib( cache_entry, stm ); + break; + default: FIXME( "Unimplemented clip format %x\n", cache_entry->fmtetc.cfFormat ); hr = E_NOTIMPL; -- 1.8.0