[PATCH v5 1/5] ole32: Add support for loading enhmetafiles from presentation and contents streams to data cache.
Huw Davies
huw at codeweavers.com
Mon Apr 9 03:01:41 CDT 2018
On Fri, Apr 06, 2018 at 08:54:38AM -0500, Sergio Gómez Del Real wrote:
> Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
> ---
> dlls/ole32/datacache.c | 106 ++++++++++++++++++++++++++++++++++++++-----------
> 1 file changed, 82 insertions(+), 24 deletions(-)
>
> diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
> index 325a98b33b..b51cf02708 100644
> --- a/dlls/ole32/datacache.c
> +++ b/dlls/ole32/datacache.c
> @@ -704,6 +728,60 @@ fail:
>
> }
>
> +static HRESULT load_emf( DataCacheEntry *cache_entry, IStream *stm )
> +{
> + HRESULT hr;
> +
> + if (cache_entry->load_stream_num != STREAM_NUMBER_CONTENTS)
> + {
> + STGMEDIUM stgmed;
> +
> + hr = load_mf_pict( cache_entry, stm );
> + if (SUCCEEDED( hr ))
> + {
> + hr = synthesize_emf( cache_entry->stgmedium.u.hMetaFilePict, &stgmed );
> + ReleaseStgMedium( &cache_entry->stgmedium );
> + }
> + if (SUCCEEDED( hr ))
> + cache_entry->stgmedium = stgmed;
> + }
> + else
> + {
> + STATSTG stat;
> + BYTE *data;
> + ULONG read, size_bits;
> +
> + hr = IStream_Stat( stm, &stat, STATFLAG_NONAME );
> +
> + if (SUCCEEDED( hr ))
> + {
> + data = HeapAlloc( GetProcessHeap(), 0, stat.cbSize.u.LowPart );
> + if (!data) return E_OUTOFMEMORY;
> +
> + hr = IStream_Read( stm, data, stat.cbSize.u.LowPart, &read );
> + if (hr != S_OK)
> + {
> + HeapFree( GetProcessHeap(), 0, data );
> + return E_FAIL;
In general, you should propagate errors, so you should return hr here.
> + }
> +
> + if (read <= sizeof(DWORD) + sizeof(ENHMETAHEADER))
> + {
> + HeapFree( GetProcessHeap(), 0, data );
> + return E_FAIL;
> + }
> + size_bits = read - sizeof(DWORD) - sizeof(ENHMETAHEADER);
> + cache_entry->stgmedium.u.hEnhMetaFile = SetEnhMetaFileBits( size_bits, data + (read - size_bits) );
> + cache_entry->stgmedium.tymed = TYMED_ENHMF;
> + cache_entry->stgmedium.pUnkForRelease = NULL;
> +
> + HeapFree( GetProcessHeap(), 0, data );
> + }
> + }
> +
> + return hr;
> +}
> +
> /************************************************************************
> * DataCacheEntry_LoadData
> *
> @@ -736,6 +814,10 @@ static HRESULT DataCacheEntry_LoadData(DataCacheEntry *cache_entry, IStorage *st
> hr = load_dib( cache_entry, stm );
> break;
>
> + case CF_ENHMETAFILE:
> + hr = load_emf( cache_entry, stm );
> + break;
> +
> default:
> FIXME( "Unimplemented clip format %x\n", cache_entry->fmtetc.cfFormat );
> hr = E_NOTIMPL;
> @@ -1118,30 +1200,6 @@ static HRESULT synthesize_bitmap( HGLOBAL dib, STGMEDIUM *med )
> return hr;
> }
>
> -static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
> -{
> - METAFILEPICT *pict;
> - HRESULT hr = E_FAIL;
> - UINT size;
> - void *bits;
> -
> - if (!(pict = GlobalLock( data ))) return hr;
> -
> - size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
> - if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
> - {
> - GetMetaFileBitsEx( pict->hMF, size, bits );
> - med->u.hEnhMetaFile = SetWinMetaFileBits( size, bits, NULL, pict );
> - HeapFree( GetProcessHeap(), 0, bits );
> - med->tymed = TYMED_ENHMF;
> - med->pUnkForRelease = NULL;
> - hr = S_OK;
> - }
> -
> - GlobalUnlock( data );
> - return hr;
> -}
> -
> static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
> const FORMATETC *formatetc,
> STGMEDIUM *stgmedium,
> --
> 2.14.1
>
>
>
More information about the wine-devel
mailing list