Jacek Caban : gdi32: Delay writing metafile file until CloseMetaFile is called.
Module: wine Branch: master Commit: 0c9bc0ed6bc616c50e020552a93233e64e8a9262 URL: https://source.winehq.org/git/wine.git/?a=commit;h=0c9bc0ed6bc616c50e020552a... Author: Jacek Caban <jacek(a)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(a)codeweavers.com> Signed-off-by: Huw Davies <huw(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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);
participants (1)
-
Alexandre Julliard