Alexandre Julliard : gdi32: Get rid of the METAFILEOBJ type, instead store a pointer to the metafile data.

Alexandre Julliard julliard at winehq.org
Wed Oct 17 14:32:28 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 17 13:46:32 2012 +0200

gdi32: Get rid of the METAFILEOBJ type, instead store a pointer to the metafile data.

---

 dlls/gdi32/metafile.c |  158 ++++++++++++++++++-------------------------------
 1 files changed, 58 insertions(+), 100 deletions(-)

diff --git a/dlls/gdi32/metafile.c b/dlls/gdi32/metafile.c
index fbc88d1..dbbffee 100644
--- a/dlls/gdi32/metafile.c
+++ b/dlls/gdi32/metafile.c
@@ -71,12 +71,6 @@ typedef struct
 } METAHEADERDISK;
 #include "poppack.h"
 
-typedef struct
-{
-    GDIOBJHDR   header;
-    METAHEADER  *mh;
-} METAFILEOBJ;
-
 
 /******************************************************************
  *         MF_AddHandle
@@ -108,31 +102,7 @@ static int MF_AddHandle(HANDLETABLE *ht, UINT htlen, HGDIOBJ hobj)
  */
 HMETAFILE MF_Create_HMETAFILE(METAHEADER *mh)
 {
-    HMETAFILE hmf;
-    METAFILEOBJ *metaObj;
-
-    if (!(metaObj = HeapAlloc( GetProcessHeap(), 0, sizeof(*metaObj) ))) return 0;
-    metaObj->mh = mh;
-    if (!(hmf = alloc_gdi_handle( &metaObj->header, OBJ_METAFILE, NULL )))
-        HeapFree( GetProcessHeap(), 0, metaObj );
-    return hmf;
-}
-
-/******************************************************************
- *         MF_GetMetaHeader
- *
- * Returns ptr to METAHEADER associated with HMETAFILE
- */
-static METAHEADER *MF_GetMetaHeader( HMETAFILE hmf )
-{
-    METAHEADER *ret = NULL;
-    METAFILEOBJ * metaObj = GDI_GetObjPtr( hmf, OBJ_METAFILE );
-    if (metaObj)
-    {
-        ret = metaObj->mh;
-        GDI_ReleaseObj( hmf );
-    }
-    return ret;
+    return alloc_gdi_handle( mh, OBJ_METAFILE, NULL );
 }
 
 /******************************************************************
@@ -164,10 +134,9 @@ static POINT *convert_points( UINT count, const POINTS *pts )
 
 BOOL WINAPI DeleteMetaFile( HMETAFILE hmf )
 {
-    METAFILEOBJ * metaObj = free_gdi_handle( hmf );
-    if (!metaObj) return FALSE;
-    HeapFree( GetProcessHeap(), 0, metaObj->mh );
-    return HeapFree( GetProcessHeap(), 0, metaObj );
+    METAHEADER *mh = free_gdi_handle( hmf );
+    if (!mh) return FALSE;
+    return HeapFree( GetProcessHeap(), 0, mh );
 }
 
 /******************************************************************
@@ -312,6 +281,24 @@ METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mh, LPCVOID filename, BOOL uni )
     return mh;
 }
 
+/* return a copy of the metafile bits, to be freed with HeapFree */
+static METAHEADER *get_metafile_bits( HMETAFILE hmf )
+{
+    METAHEADER *ret, *mh = GDI_GetObjPtr( hmf, OBJ_METAFILE );
+
+    if (!mh) return NULL;
+
+    if (mh->mtType != METAFILE_DISK)
+    {
+        ret = HeapAlloc( GetProcessHeap(), 0, mh->mtSize * 2 );
+        if (ret) memcpy( ret, mh, mh->mtSize * 2 );
+    }
+    else ret = MF_LoadDiskBasedMetaFile( mh );
+
+    GDI_ReleaseObj( hmf );
+    return ret;
+}
+
 /******************************************************************
  *         CopyMetaFileW   (GDI32.@)
  *
@@ -331,33 +318,25 @@ METAHEADER *MF_CreateMetaHeaderDisk(METAHEADER *mh, LPCVOID filename, BOOL uni )
  */
 HMETAFILE WINAPI CopyMetaFileW( HMETAFILE hSrcMetaFile, LPCWSTR lpFilename )
 {
-    METAHEADER *mh = MF_GetMetaHeader( hSrcMetaFile );
-    METAHEADER *mh2 = NULL;
+    METAHEADER *mh = get_metafile_bits( hSrcMetaFile );
     HANDLE hFile;
 
     TRACE("(%p,%s)\n", hSrcMetaFile, debugstr_w(lpFilename));
 
     if(!mh) return 0;
 
-    if(mh->mtType == METAFILE_DISK)
-        mh2 = MF_LoadDiskBasedMetaFile(mh);
-    else {
-        mh2 = HeapAlloc( GetProcessHeap(), 0, mh->mtSize * 2 );
-        memcpy( mh2, mh, mh->mtSize * 2 );
-    }
-
     if(lpFilename) {         /* disk based metafile */
         DWORD w;
         if((hFile = CreateFileW(lpFilename, GENERIC_WRITE, 0, NULL,
 				CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE) {
-	    HeapFree( GetProcessHeap(), 0, mh2 );
+	    HeapFree( GetProcessHeap(), 0, mh );
 	    return 0;
 	}
-	WriteFile(hFile, mh2, mh2->mtSize * 2, &w, NULL);
+	WriteFile(hFile, mh, mh->mtSize * 2, &w, NULL);
 	CloseHandle(hFile);
     }
 
-    return MF_Create_HMETAFILE( mh2 );
+    return MF_Create_HMETAFILE( mh );
 }
 
 
@@ -380,14 +359,23 @@ HMETAFILE WINAPI CopyMetaFileA( HMETAFILE hSrcMetaFile, LPCSTR lpFilename )
     return ret;
 }
 
-/*******************************************************************
- *         MF_PlayMetaFile
+/******************************************************************
+ *         PlayMetaFile   (GDI32.@)
+ *
+ *  Renders the metafile specified by hmf in the DC specified by
+ *  hdc. Returns FALSE on failure, TRUE on success.
+ *
+ * PARAMS
+ *  hdc [I] handle of DC to render in
+ *  hmf [I] handle of metafile to render
  *
- * Helper for PlayMetaFile
+ * RETURNS
+ *  Success: TRUE
+ *  Failure: FALSE
  */
-static BOOL MF_PlayMetaFile( HDC hdc, METAHEADER *mh)
+BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf )
 {
-
+    METAHEADER *mh = get_metafile_bits( hmf );
     METARECORD *mr;
     HANDLETABLE *ht;
     unsigned int offset = 0;
@@ -396,14 +384,8 @@ static BOOL MF_PlayMetaFile( HDC hdc, METAHEADER *mh)
     HBRUSH hBrush;
     HPALETTE hPal;
     HRGN hRgn;
-    BOOL loaded = FALSE;
 
     if (!mh) return FALSE;
-    if(mh->mtType == METAFILE_DISK) { /* Create a memory-based copy */
-        mh = MF_LoadDiskBasedMetaFile(mh);
-	if(!mh) return FALSE;
-	loaded = TRUE;
-    }
 
     /* save DC */
     hPen = GetCurrentObject(hdc, OBJ_PEN);
@@ -420,7 +402,11 @@ static BOOL MF_PlayMetaFile( HDC hdc, METAHEADER *mh)
     /* create the handle table */
     ht = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
 		    sizeof(HANDLETABLE) * mh->mtNoObjects);
-    if(!ht) return FALSE;
+    if(!ht)
+    {
+        HeapFree( GetProcessHeap(), 0, mh );
+        return FALSE;
+    }
 
     /* loop through metafile playing records */
     offset = mh->mtHeaderSize * 2;
@@ -455,34 +441,12 @@ static BOOL MF_PlayMetaFile( HDC hdc, METAHEADER *mh)
       if(*(ht->objectHandle + i) != 0)
         DeleteObject(*(ht->objectHandle + i));
 
-    /* free handle table */
     HeapFree( GetProcessHeap(), 0, ht );
-    if(loaded)
-        HeapFree( GetProcessHeap(), 0, mh );
+    HeapFree( GetProcessHeap(), 0, mh );
     return TRUE;
 }
 
 /******************************************************************
- *         PlayMetaFile   (GDI32.@)
- *
- *  Renders the metafile specified by hmf in the DC specified by
- *  hdc. Returns FALSE on failure, TRUE on success.
- *
- * PARAMS
- *  hdc [I] handle of DC to render in
- *  hmf [I] handle of metafile to render
- *
- * RETURNS
- *  Success: TRUE
- *  Failure: FALSE
- */
-BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf )
-{
-    METAHEADER *mh = MF_GetMetaHeader( hmf );
-    return MF_PlayMetaFile( hdc, mh );
-}
-
-/******************************************************************
  *            EnumMetaFile   (GDI32.@)
  *
  *  Loop through the metafile records in hmf, calling the user-specified
@@ -495,7 +459,7 @@ BOOL WINAPI PlayMetaFile( HDC hdc, HMETAFILE hmf )
  */
 BOOL WINAPI EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc, LPARAM lpData)
 {
-    METAHEADER *mhTemp = NULL, *mh = MF_GetMetaHeader(hmf);
+    METAHEADER *mh = get_metafile_bits( hmf );
     METARECORD *mr;
     HANDLETABLE *ht;
     BOOL result = TRUE;
@@ -505,14 +469,9 @@ BOOL WINAPI EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc, LPARAM l
     HBRUSH hBrush;
     HFONT hFont;
 
-    TRACE("(%p,%p,%p,%p)\n", hdc, hmf, lpEnumFunc, (void*)lpData);
+    TRACE("(%p,%p,%p,%lx)\n", hdc, hmf, lpEnumFunc, lpData);
+
     if (!mh) return 0;
-    if(mh->mtType == METAFILE_DISK)
-    {
-        /* Create a memory-based copy */
-        if (!(mhTemp = MF_LoadDiskBasedMetaFile(mh))) return FALSE;
-	mh = mhTemp;
-    }
 
     /* save the current pen, brush and font */
     hPen = GetCurrentObject(hdc, OBJ_PEN);
@@ -534,7 +493,7 @@ BOOL WINAPI EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc, LPARAM l
 	}
 	TRACE("Calling EnumFunc with record type %x\n",
 	      mr->rdFunction);
-        if (!lpEnumFunc( hdc, ht, mr, mh->mtNoObjects, (LONG)lpData ))
+        if (!lpEnumFunc( hdc, ht, mr, mh->mtNoObjects, lpData ))
 	{
 	    result = FALSE;
 	    break;
@@ -553,10 +512,8 @@ BOOL WINAPI EnumMetaFile(HDC hdc, HMETAFILE hmf, MFENUMPROC lpEnumFunc, LPARAM l
       if(*(ht->objectHandle + i) != 0)
         DeleteObject(*(ht->objectHandle + i));
 
-    /* free handle table */
     HeapFree( GetProcessHeap(), 0, ht);
-    /* free a copy of metafile */
-    HeapFree( GetProcessHeap(), 0, mhTemp );
+    HeapFree( GetProcessHeap(), 0, mh);
     return result;
 }
 
@@ -1129,7 +1086,7 @@ HMETAFILE WINAPI SetMetaFileBitsEx( UINT size, const BYTE *lpData )
  */
 UINT WINAPI GetMetaFileBitsEx( HMETAFILE hmf, UINT nSize, LPVOID buf )
 {
-    METAHEADER *mh = MF_GetMetaHeader(hmf);
+    METAHEADER *mh = GDI_GetObjPtr( hmf, OBJ_METAFILE );
     UINT mfSize;
 
     TRACE("(%p,%d,%p)\n", hmf, nSize, buf);
@@ -1137,12 +1094,13 @@ UINT WINAPI GetMetaFileBitsEx( HMETAFILE hmf, UINT nSize, LPVOID buf )
     if(mh->mtType == METAFILE_DISK)
         FIXME("Disk-based metafile?\n");
     mfSize = mh->mtSize * 2;
-    if (!buf) {
-	TRACE("returning size %d\n", mfSize);
-	return mfSize;
+    if (buf)
+    {
+        if(mfSize > nSize) mfSize = nSize;
+        memmove(buf, mh, mfSize);
     }
-    if(mfSize > nSize) mfSize = nSize;
-    memmove(buf, mh, mfSize);
+    GDI_ReleaseObj( hmf );
+    TRACE("returning size %d\n", mfSize);
     return mfSize;
 }
 




More information about the wine-cvs mailing list