Module: wine Branch: master Commit: bbb1626bf8629e20778b514c2aed26a7a341f553 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbb1626bf8629e20778b514c2a...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Apr 7 20:32:58 2009 +0200
gdi32: Completely implement SaveDC in the driver, having it call save_dc_state if necessary.
---
dlls/gdi32/dc.c | 12 +++--------- dlls/gdi32/enhmfdrv/dc.c | 13 ++++++++++--- dlls/gdi32/tests/metafile.c | 26 ++++++++++++++++++++------ 3 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index ae58479..4694c3e 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -578,19 +578,13 @@ INT WINAPI SaveDC( HDC hdc ) DC * dc; INT ret;
- dc = get_dc_ptr( hdc ); - if (!dc) return 0; + if (!(dc = get_dc_ptr( hdc ))) return 0;
if(dc->funcs->pSaveDC) - { ret = dc->funcs->pSaveDC( dc->physDev ); - if(ret) - ret = ++dc->saveLevel; - release_dc_ptr( dc ); - return ret; - } + else + ret = save_dc_state( hdc );
- ret = save_dc_state( hdc ); release_dc_ptr( dc ); return ret; } diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index f08b17d..bd5dbd5 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -25,10 +25,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(enhmetafile);
INT CDECL EMFDRV_SaveDC( PHYSDEV dev ) { + EMFDRV_PDEVICE* physDev = (EMFDRV_PDEVICE*)dev; + INT ret = save_dc_state( physDev->hdc ); EMRSAVEDC emr; - emr.emr.iType = EMR_SAVEDC; - emr.emr.nSize = sizeof(emr); - return EMFDRV_WriteRecord( dev, &emr.emr ); + + if (ret) + { + emr.emr.iType = EMR_SAVEDC; + emr.emr.nSize = sizeof(emr); + EMFDRV_WriteRecord( dev, &emr.emr ); + } + return ret; }
BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level ) diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c index 63c2cc4..2524af1 100644 --- a/dlls/gdi32/tests/metafile.c +++ b/dlls/gdi32/tests/metafile.c @@ -643,6 +643,11 @@ static void test_SaveDC(void) todo_wine ok(hFontOld == hFontCheck && hFontCheck != hFont && hFontCheck != hFont2, "Font not reverted with DC Restore\n");
+ ret = RestoreDC(hdcMetafile, -20); + ok(!ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 20); + ok(!ret, "ret = %d\n", ret); + hMetafile = CloseEnhMetaFile(hdcMetafile); ok(hMetafile != 0, "CloseEnhMetaFile error %d\n", GetLastError());
@@ -702,7 +707,7 @@ static void test_mf_SaveDC(void) SetPixelV(hdcMetafile, 50, 50, 0);
ret = SaveDC(hdcMetafile); - todo_wine ok(ret == 1, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret);
SetWindowOrgEx(hdcMetafile, -2, -2, NULL); SetViewportOrgEx(hdcMetafile, 20, 20, NULL); @@ -715,7 +720,7 @@ static void test_mf_SaveDC(void) SetBkColor( hdcMetafile, 0 );
ret = SaveDC(hdcMetafile); - todo_wine ok(ret == 1, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret);
SetWindowOrgEx(hdcMetafile, -3, -3, NULL); SetViewportOrgEx(hdcMetafile, 30, 30, NULL); @@ -731,10 +736,10 @@ static void test_mf_SaveDC(void) SetPixelV(hdcMetafile, 50, 50, 0);
ret = RestoreDC(hdcMetafile, -1); - ok(ret, "ret = %d\n", ret); + todo_wine ok(ret, "ret = %d\n", ret);
ret = SaveDC(hdcMetafile); - todo_wine ok(ret == 1, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret);
ret = RestoreDC(hdcMetafile, 1); todo_wine ok(ret, "ret = %d\n", ret); @@ -748,10 +753,10 @@ static void test_mf_SaveDC(void) SetPixelV(hdcMetafile, 50, 50, 0);
ret = SaveDC(hdcMetafile); - todo_wine ok(ret == 1, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret);
ret = SaveDC(hdcMetafile); - todo_wine ok(ret == 1, "ret = %d\n", ret); + ok(ret == 1, "ret = %d\n", ret);
memset(&orig_lf, 0, sizeof(orig_lf)); orig_lf.lfCharSet = ANSI_CHARSET; @@ -774,10 +779,19 @@ static void test_mf_SaveDC(void) SetPixelV(hdcMetafile, 50, 50, 0);
ret = RestoreDC(hdcMetafile, 1); + todo_wine ok(ret, "ret = %d\n", ret);
hFontCheck = SelectObject(hdcMetafile, hFontOld); ok(hFontOld != hFontCheck && hFontCheck == hFont2, "Font incorrectly reverted with DC Restore\n");
+ /* restore level is ignored */ + ret = RestoreDC(hdcMetafile, -20); + todo_wine ok(ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 20); + todo_wine ok(ret, "ret = %d\n", ret); + ret = RestoreDC(hdcMetafile, 0); + todo_wine ok(ret, "ret = %d\n", ret); + hMetafile = CloseMetaFile(hdcMetafile); ok(hMetafile != 0, "CloseEnhMetaFile error %d\n", GetLastError());