Jacek Caban : gdi32: Delay writing to enhanced metafile file until CreateEnhMetaFile is called.
Alexandre Julliard
julliard at winehq.org
Tue Jun 29 15:58:27 CDT 2021
Module: wine
Branch: master
Commit: c359b4a0e96d06defef6c880cfbd4336739a4be2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c359b4a0e96d06defef6c880cfbd4336739a4be2
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list