Huw Davies : ole32: Make the synthesize helpers return a STGMEDIUM.

Alexandre Julliard julliard at winehq.org
Wed Nov 29 15:12:31 CST 2017


Module: wine
Branch: master
Commit: 251e6edae5ddc5b998b0855f507d4e8e3a125349
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=251e6edae5ddc5b998b0855f507d4e8e3a125349

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Nov 29 09:28:45 2017 +0000

ole32: Make the synthesize helpers return a STGMEDIUM.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ole32/datacache.c | 61 +++++++++++++++++++++++++++-----------------------
 1 file changed, 33 insertions(+), 28 deletions(-)

diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index da7a536..c550c75 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -958,12 +958,12 @@ static HRESULT copy_stg_medium(CLIPFORMAT cf, STGMEDIUM *dest_stgm,
     return S_OK;
 }
 
-static HGLOBAL synthesize_dib( HBITMAP bm )
+static HRESULT synthesize_dib( HBITMAP bm, STGMEDIUM *med )
 {
     HDC hdc = GetDC( 0 );
     BITMAPINFOHEADER header;
     BITMAPINFO *bmi;
-    HGLOBAL ret = 0;
+    HRESULT hr = E_FAIL;
     DWORD header_size;
 
     memset( &header, 0, sizeof(header) );
@@ -971,55 +971,64 @@ static HGLOBAL synthesize_dib( HBITMAP bm )
     if (!GetDIBits( hdc, bm, 0, 0, NULL, (BITMAPINFO *)&header, DIB_RGB_COLORS )) goto done;
 
     header_size = bitmap_info_size( (BITMAPINFO *)&header, DIB_RGB_COLORS );
-    if (!(ret = GlobalAlloc( GMEM_MOVEABLE, header_size + header.biSizeImage ))) goto done;
-    bmi = GlobalLock( ret );
+    if (!(med->u.hGlobal = GlobalAlloc( GMEM_MOVEABLE, header_size + header.biSizeImage ))) goto done;
+    bmi = GlobalLock( med->u.hGlobal );
     memset( bmi, 0, header_size );
     memcpy( bmi, &header, header.biSize );
     GetDIBits( hdc, bm, 0, abs(header.biHeight), (char *)bmi + header_size, bmi, DIB_RGB_COLORS );
-    GlobalUnlock( ret );
+    GlobalUnlock( med->u.hGlobal );
+    med->tymed = TYMED_HGLOBAL;
+    med->pUnkForRelease = NULL;
+    hr = S_OK;
 
 done:
     ReleaseDC( 0, hdc );
-    return ret;
+    return hr;
 }
 
-static HBITMAP synthesize_bitmap( HGLOBAL dib )
+static HRESULT synthesize_bitmap( HGLOBAL dib, STGMEDIUM *med )
 {
-    HBITMAP ret = 0;
+    HRESULT hr = E_FAIL;
     BITMAPINFO *bmi;
     HDC hdc = GetDC( 0 );
 
     if ((bmi = GlobalLock( dib )))
     {
         /* FIXME: validate data size */
-        ret = CreateDIBitmap( hdc, &bmi->bmiHeader, CBM_INIT,
-                              (char *)bmi + bitmap_info_size( bmi, DIB_RGB_COLORS ),
-                              bmi, DIB_RGB_COLORS );
+        med->u.hBitmap = CreateDIBitmap( hdc, &bmi->bmiHeader, CBM_INIT,
+                                         (char *)bmi + bitmap_info_size( bmi, DIB_RGB_COLORS ),
+                                         bmi, DIB_RGB_COLORS );
         GlobalUnlock( dib );
+        med->tymed = TYMED_GDI;
+        med->pUnkForRelease = NULL;
+        hr = S_OK;
     }
     ReleaseDC( 0, hdc );
-    return ret;
+    return hr;
 }
 
-static HENHMETAFILE synthesize_emf( HMETAFILEPICT data )
+static HRESULT synthesize_emf( HMETAFILEPICT data, STGMEDIUM *med )
 {
     METAFILEPICT *pict;
-    HENHMETAFILE emf = 0;
+    HRESULT hr = E_FAIL;
     UINT size;
     void *bits;
 
-    if (!(pict = GlobalLock( data ))) return 0;
+    if (!(pict = GlobalLock( data ))) return hr;
 
     size = GetMetaFileBitsEx( pict->hMF, 0, NULL );
     if ((bits = HeapAlloc( GetProcessHeap(), 0, size )))
     {
         GetMetaFileBitsEx( pict->hMF, size, bits );
-        emf = SetWinMetaFileBits( size, bits, NULL, pict );
+        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 emf;
+    return hr;
 }
 
 static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
@@ -1028,6 +1037,7 @@ static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
                                       BOOL fRelease)
 {
     STGMEDIUM copy;
+    HRESULT hr;
 
     if ((!cache_entry->fmtetc.cfFormat && !formatetc->cfFormat) ||
         (cache_entry->fmtetc.tymed == TYMED_NULL && formatetc->tymed == TYMED_NULL) ||
@@ -1042,17 +1052,16 @@ static HRESULT DataCacheEntry_SetData(DataCacheEntry *cache_entry,
 
     if (formatetc->cfFormat == CF_BITMAP)
     {
-        copy.tymed = TYMED_HGLOBAL;
-        copy.u.hGlobal = synthesize_dib( stgmedium->u.hBitmap );
-        copy.pUnkForRelease = NULL;
+        hr = synthesize_dib( stgmedium->u.hBitmap, &copy );
+        if (FAILED(hr)) return hr;
         if (fRelease) ReleaseStgMedium(stgmedium);
         stgmedium = ©
         fRelease = TRUE;
     }
     else if (formatetc->cfFormat == CF_METAFILEPICT && cache_entry->fmtetc.cfFormat == CF_ENHMETAFILE)
     {
-        copy.tymed = TYMED_ENHMF;
-        copy.u.hEnhMetaFile = synthesize_emf( stgmedium->u.hMetaFilePict );
+        hr = synthesize_emf( stgmedium->u.hMetaFilePict, &copy );
+        if (FAILED(hr)) return hr;
         if (fRelease) ReleaseStgMedium(stgmedium);
         stgmedium = ©
         fRelease = TRUE;
@@ -1079,12 +1088,8 @@ static HRESULT DataCacheEntry_GetData(DataCacheEntry *cache_entry, FORMATETC *fm
         return OLE_E_BLANK;
 
     if (fmt->cfFormat == CF_BITMAP)
-    {
-        stgmedium->tymed = TYMED_GDI;
-        stgmedium->u.hBitmap = synthesize_bitmap( cache_entry->stgmedium.u.hGlobal );
-        stgmedium->pUnkForRelease = NULL;
-        return S_OK;
-    }
+        return synthesize_bitmap( cache_entry->stgmedium.u.hGlobal, stgmedium );
+
     return copy_stg_medium(cache_entry->fmtetc.cfFormat, stgmedium, &cache_entry->stgmedium);
 }
 




More information about the wine-cvs mailing list