Jacek Caban : gdi32: Delay writing metafile file until CloseMetaFile is called.

Alexandre Julliard julliard at winehq.org
Tue Jun 29 15:58:27 CDT 2021


Module: wine
Branch: master
Commit: 0c9bc0ed6bc616c50e020552a93233e64e8a9262
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0c9bc0ed6bc616c50e020552a93233e64e8a9262

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun 29 13:41:41 2021 +0200

gdi32: Delay writing metafile file until CloseMetaFile is called.

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

---

 dlls/gdi32/mfdrv/init.c     | 50 +++++++++++----------------------------------
 dlls/gdi32/tests/metafile.c |  2 --
 2 files changed, 12 insertions(+), 40 deletions(-)

diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index fe7aae631d7..d64e754da84 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -325,7 +325,6 @@ HDC WINAPI CreateMetaFileW( LPCWSTR filename )
     DC *dc;
     METAFILEDRV_PDEVICE *physDev;
     HANDLE hFile;
-    DWORD bytes_written;
 
     TRACE("%s\n", debugstr_w(filename) );
 
@@ -340,12 +339,6 @@ HDC WINAPI CreateMetaFileW( LPCWSTR filename )
             free_dc_ptr( dc );
             return 0;
         }
-        if (!WriteFile( hFile, physDev->mh, sizeof(*physDev->mh),
-                        &bytes_written, NULL )) {
-            free_dc_ptr( dc );
-            CloseHandle (hFile );
-            return 0;
-	}
 	physDev->hFile = hFile;
 
 	/* Grow METAHEADER to include filename */
@@ -422,19 +415,13 @@ static DC *MFDRV_CloseMetaFile( HDC hdc )
 
     if (physDev->mh->mtType == METAFILE_DISK)  /* disk based metafile */
     {
-        if (SetFilePointer(physDev->hFile, 0, NULL, FILE_BEGIN) != 0) {
-            free_dc_ptr( dc );
-            return 0;
-        }
-
 	physDev->mh->mtType = METAFILE_MEMORY; /* This is what windows does */
-        if (!WriteFile(physDev->hFile, physDev->mh, sizeof(*physDev->mh),
+        if (!WriteFile(physDev->hFile, physDev->mh, physDev->mh->mtSize * 2,
                        &bytes_written, NULL)) {
             free_dc_ptr( dc );
             return 0;
         }
         CloseHandle(physDev->hFile);
-	physDev->mh->mtType = METAFILE_DISK;
     }
 
     return dc;
@@ -481,32 +468,19 @@ BOOL MFDRV_WriteRecord( PHYSDEV dev, METARECORD *mr, DWORD rlen)
     METAHEADER *mh;
     METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dev;
 
-    switch(physDev->mh->mtType)
+    len = physDev->mh->mtSize * 2 + rlen;
+    /* reallocate memory if needed */
+    size = HeapSize( GetProcessHeap(), 0, physDev->mh );
+    if (len > size)
     {
-    case METAFILE_MEMORY:
-	len = physDev->mh->mtSize * 2 + rlen;
-	/* reallocate memory if needed */
-        size = HeapSize( GetProcessHeap(), 0, physDev->mh );
-        if (len > size)
-        {
-            /*expand size*/
-            size += size / 2 + rlen;
-            mh = HeapReAlloc( GetProcessHeap(), 0, physDev->mh, size);
-            if (!mh) return FALSE;
-            physDev->mh = mh;
-            TRACE("Reallocated metafile: new size is %d\n",size);
-        }
-	memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen);
-        break;
-    case METAFILE_DISK:
-        TRACE("Writing record to disk\n");
-        if (!WriteFile(physDev->hFile, mr, rlen, NULL, NULL))
-	    return FALSE;
-        break;
-    default:
-        ERR("Unknown metafile type %d\n", physDev->mh->mtType );
-        return FALSE;
+        /*expand size*/
+        size += size / 2 + rlen;
+        mh = HeapReAlloc( GetProcessHeap(), 0, physDev->mh, size);
+        if (!mh) return FALSE;
+        physDev->mh = mh;
+        TRACE("Reallocated metafile: new size is %d\n",size);
     }
+    memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen);
 
     physDev->mh->mtSize += rlen / 2;
     physDev->mh->mtMaxRecord = max(physDev->mh->mtMaxRecord, rlen / 2);
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index dcd6cea0c2b..a3b51418ab7 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -3043,7 +3043,6 @@ static void test_metafile_file(void)
     ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError());
 
     size = GetFileSize(file, NULL);
-    todo_wine
     ok(!size, "size = %u\n", size);
 
     ret = MoveToEx(dc, 1, 1, NULL);
@@ -3056,7 +3055,6 @@ static void test_metafile_file(void)
     ok( ret, "Ellipse error %d.\n", GetLastError());
 
     size = GetFileSize(file, NULL);
-    todo_wine
     ok(!size, "size = %u\n", size);
 
     metafile = CloseMetaFile(dc);




More information about the wine-cvs mailing list