Module: wine Branch: master Commit: c359b4a0e96d06defef6c880cfbd4336739a4be2 URL: https://source.winehq.org/git/wine.git/?a=commit;h=c359b4a0e96d06defef6c880c...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jun 29 13:42:09 2021 +0200
gdi32: Delay writing to enhanced metafile file until CreateEnhMetaFile is called.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/enhmfdrv/init.c | 41 +++++++++++------------------------------ dlls/gdi32/tests/metafile.c | 2 -- 2 files changed, 11 insertions(+), 32 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 6c41aa88feb..ca50792fb57 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -196,8 +196,7 @@ static BOOL CDECL EMFDRV_DeleteDC( PHYSDEV dev ) */ BOOL EMFDRV_WriteRecord( PHYSDEV dev, EMR *emr ) { - DWORD len; - DWORD bytes_written; + DWORD len, size; ENHMETAHEADER *emh; EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
@@ -209,21 +208,16 @@ BOOL EMFDRV_WriteRecord( PHYSDEV dev, EMR *emr ) physDev->emh->nBytes += emr->nSize; physDev->emh->nRecords++;
- if(physDev->hFile) { - if (!WriteFile(physDev->hFile, emr, emr->nSize, &bytes_written, NULL)) - return FALSE; - } else { - DWORD nEmfSize = HeapSize(GetProcessHeap(), 0, physDev->emh); - len = physDev->emh->nBytes; - if (len > nEmfSize) { - nEmfSize += (nEmfSize / 2) + emr->nSize; - emh = HeapReAlloc(GetProcessHeap(), 0, physDev->emh, nEmfSize); - if (!emh) return FALSE; - physDev->emh = emh; - } - memcpy((CHAR *)physDev->emh + physDev->emh->nBytes - emr->nSize, emr, - emr->nSize); + size = HeapSize(GetProcessHeap(), 0, physDev->emh); + len = physDev->emh->nBytes; + if (len > size) { + size += (size / 2) + emr->nSize; + emh = HeapReAlloc(GetProcessHeap(), 0, physDev->emh, size); + if (!emh) return FALSE; + physDev->emh = emh; } + memcpy((CHAR *)physDev->emh + physDev->emh->nBytes - emr->nSize, emr, + emr->nSize); return TRUE; }
@@ -337,7 +331,6 @@ HDC WINAPI CreateEnhMetaFileW( EMFDRV_PDEVICE *physDev; HANDLE hFile; DWORD size = 0, length = 0; - DWORD bytes_written; int cap;
TRACE("(%p %s %s %s)\n", hdc, debugstr_w(filename), wine_dbgstr_rect(rect), debugstr_w(description) ); @@ -439,11 +432,6 @@ HDC WINAPI CreateEnhMetaFileW( free_dc_ptr( dc ); return 0; } - if (!WriteFile( hFile, physDev->emh, size, &bytes_written, NULL )) { - free_dc_ptr( dc ); - CloseHandle( hFile ); - return 0; - } physDev->hFile = hFile; }
@@ -508,14 +496,7 @@ HENHMETAFILE WINAPI CloseEnhMetaFile(HDC hdc) /* [in] metafile DC */
if (physDev->hFile) /* disk based metafile */ { - if (SetFilePointer(physDev->hFile, 0, NULL, FILE_BEGIN) != 0) - { - CloseHandle( physDev->hFile ); - free_dc_ptr( dc ); - return 0; - } - - if (!WriteFile(physDev->hFile, physDev->emh, sizeof(*physDev->emh), + if (!WriteFile(physDev->hFile, physDev->emh, physDev->emh->nBytes, NULL, NULL)) { CloseHandle( physDev->hFile ); diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c index a3b51418ab7..fa00438ddfe 100644 --- a/dlls/gdi32/tests/metafile.c +++ b/dlls/gdi32/tests/metafile.c @@ -3123,7 +3123,6 @@ static void test_enhmetafile_file(void) ok(file != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError());
size = GetFileSize(file, NULL); - todo_wine ok(!size, "size = %u\n", size);
pts[0].x = pts[0].y = 10; @@ -3142,7 +3141,6 @@ static void test_enhmetafile_file(void) ok( ret, "PolyBezierTo failed\n" );
size = GetFileSize(file, NULL); - todo_wine ok(!size, "size = %u\n", size);
metafile = CloseEnhMetaFile(dc);