diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 6118e443a6f..1d89d48d9c6 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -379,67 +379,6 @@ void DC_UpdateXforms( DC *dc ) } -/*********************************************************************** - * nulldrv_SaveDC - */ -INT CDECL nulldrv_SaveDC( PHYSDEV dev ) -{ - DC *newdc, *dc = get_nulldrv_dc( dev ); - - if (!(newdc = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*newdc )))) return 0; - if (!(newdc->attr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*newdc->attr) ))) - { - HeapFree( GetProcessHeap(), 0, newdc ); - return 0; - } - *newdc->attr = *dc->attr; - newdc->hPen = dc->hPen; - newdc->hBrush = dc->hBrush; - newdc->hFont = dc->hFont; - newdc->hBitmap = dc->hBitmap; - newdc->hPalette = dc->hPalette; - newdc->brush_org = dc->brush_org; - newdc->mapperFlags = dc->mapperFlags; - newdc->charExtra = dc->charExtra; - newdc->breakExtra = dc->breakExtra; - newdc->breakRem = dc->breakRem; - newdc->xformWorld2Wnd = dc->xformWorld2Wnd; - newdc->xformWorld2Vport = dc->xformWorld2Vport; - newdc->xformVport2World = dc->xformVport2World; - newdc->vport2WorldValid = dc->vport2WorldValid; - newdc->wnd_org = dc->wnd_org; - newdc->wnd_ext = dc->wnd_ext; - newdc->vport_org = dc->vport_org; - newdc->vport_ext = dc->vport_ext; - newdc->virtual_res = dc->virtual_res; - newdc->virtual_size = dc->virtual_size; - - /* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */ - - if (dc->hClipRgn) - { - newdc->hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); - NtGdiCombineRgn( newdc->hClipRgn, dc->hClipRgn, 0, RGN_COPY ); - } - if (dc->hMetaRgn) - { - newdc->hMetaRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); - NtGdiCombineRgn( newdc->hMetaRgn, dc->hMetaRgn, 0, RGN_COPY ); - } - - if (!PATH_SavePath( newdc, dc )) - { - release_dc_ptr( dc ); - free_dc_state( newdc ); - return 0; - } - - newdc->saved_dc = dc->saved_dc; - dc->saved_dc = newdc; - return ++dc->saveLevel; -} - - /*********************************************************************** * nulldrv_RestoreDC */ @@ -581,15 +520,69 @@ static BOOL reset_dc_state( HDC hdc ) */ INT WINAPI NtGdiSaveDC( HDC hdc ) { - DC * dc; - INT ret = 0; + DC *dc, *newdc; + INT ret; - if ((dc = get_dc_ptr( hdc ))) + if (!(dc = get_dc_ptr( hdc ))) return 0; + + if (!(newdc = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*newdc )))) { - PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSaveDC ); - ret = physdev->funcs->pSaveDC( physdev ); release_dc_ptr( dc ); + return 0; } + if (!(newdc->attr = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*newdc->attr) ))) + { + HeapFree( GetProcessHeap(), 0, newdc ); + release_dc_ptr( dc ); + return 0; + } + + *newdc->attr = *dc->attr; + newdc->hPen = dc->hPen; + newdc->hBrush = dc->hBrush; + newdc->hFont = dc->hFont; + newdc->hBitmap = dc->hBitmap; + newdc->hPalette = dc->hPalette; + newdc->brush_org = dc->brush_org; + newdc->mapperFlags = dc->mapperFlags; + newdc->charExtra = dc->charExtra; + newdc->breakExtra = dc->breakExtra; + newdc->breakRem = dc->breakRem; + newdc->xformWorld2Wnd = dc->xformWorld2Wnd; + newdc->xformWorld2Vport = dc->xformWorld2Vport; + newdc->xformVport2World = dc->xformVport2World; + newdc->vport2WorldValid = dc->vport2WorldValid; + newdc->wnd_org = dc->wnd_org; + newdc->wnd_ext = dc->wnd_ext; + newdc->vport_org = dc->vport_org; + newdc->vport_ext = dc->vport_ext; + newdc->virtual_res = dc->virtual_res; + newdc->virtual_size = dc->virtual_size; + + /* Get/SetDCState() don't change hVisRgn field ("Undoc. Windows" p.559). */ + + if (dc->hClipRgn) + { + newdc->hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); + NtGdiCombineRgn( newdc->hClipRgn, dc->hClipRgn, 0, RGN_COPY ); + } + if (dc->hMetaRgn) + { + newdc->hMetaRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); + NtGdiCombineRgn( newdc->hMetaRgn, dc->hMetaRgn, 0, RGN_COPY ); + } + + if (!PATH_SavePath( newdc, dc )) + { + release_dc_ptr( dc ); + free_dc_state( newdc ); + return 0; + } + + newdc->saved_dc = dc->saved_dc; + dc->saved_dc = newdc; + ret = ++dc->saveLevel; + release_dc_ptr( dc ); return ret; } diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index d05c50aab7b..e07e076b76a 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -704,7 +704,6 @@ const struct gdi_dc_funcs dib_driver = NULL, /* pResetDC */ NULL, /* pRestoreDC */ dibdrv_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ dibdrv_SelectBitmap, /* pSelectBitmap */ @@ -1296,7 +1295,6 @@ static const struct gdi_dc_funcs window_driver = NULL, /* pResetDC */ NULL, /* pRestoreDC */ windrv_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index ddc39bd1825..f48c0f33cae 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -951,7 +951,6 @@ const struct gdi_dc_funcs null_driver = nulldrv_ResetDC, /* pResetDC */ nulldrv_RestoreDC, /* pRestoreDC */ nulldrv_RoundRect, /* pRoundRect */ - nulldrv_SaveDC, /* pSaveDC */ nulldrv_ScaleViewportExtEx, /* pScaleViewportExt */ nulldrv_ScaleWindowExtEx, /* pScaleWindowExt */ nulldrv_SelectBitmap, /* pSelectBitmap */ diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 2291e22348f..0caef2a2ec3 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -118,7 +118,6 @@ static const struct gdi_dc_funcs emfdrv_driver = NULL, /* pResetDC */ EMFDRV_RestoreDC, /* pRestoreDC */ EMFDRV_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ EMFDRV_ScaleViewportExtEx, /* pScaleViewportExtEx */ EMFDRV_ScaleWindowExtEx, /* pScaleWindowExtEx */ EMFDRV_SelectBitmap, /* pSelectBitmap */ diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index bbf55724013..16d3bdf26ba 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -3895,7 +3895,6 @@ const struct gdi_dc_funcs font_driver = NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index 70442fac20f..91be4c1ef6c 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -181,7 +181,6 @@ static const struct gdi_dc_funcs MFDRV_Funcs = NULL, /* pResetDC */ MFDRV_RestoreDC, /* pRestoreDC */ NULL, /* pRoundRect */ - NULL, /* pSaveDC */ MFDRV_ScaleViewportExtEx, /* pScaleViewportExtEx */ MFDRV_ScaleWindowExtEx, /* pScaleWindowExtEx */ MFDRV_SelectBitmap, /* pSelectBitmap */ diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h index 773f6aa007d..203ad2181a1 100644 --- a/dlls/gdi32/ntgdi_private.h +++ b/dlls/gdi32/ntgdi_private.h @@ -602,7 +602,6 @@ extern BOOL CDECL nulldrv_PolyBezierTo( PHYSDEV dev, const POINT *points, DWORD extern BOOL CDECL nulldrv_PolyDraw( PHYSDEV dev, const POINT *points, const BYTE *types, DWORD count ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_PolylineTo( PHYSDEV dev, const POINT *points, INT count ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_RestoreDC( PHYSDEV dev, INT level ) DECLSPEC_HIDDEN; -extern INT CDECL nulldrv_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_ScaleViewportExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, INT y_denom, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL nulldrv_SelectClipPath( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c index 634bea9bb89..531a8ae9bbd 100644 --- a/dlls/gdi32/path.c +++ b/dlls/gdi32/path.c @@ -2156,7 +2156,6 @@ const struct gdi_dc_funcs path_driver = NULL, /* pResetDC */ NULL, /* pRestoreDC */ pathdrv_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 94301a016c6..b5eb4443328 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -365,7 +365,6 @@ static const struct gdi_dc_funcs android_drv_funcs = NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c index 7e03c96a256..1bb360a69e4 100644 --- a/dlls/winemac.drv/gdi.c +++ b/dlls/winemac.drv/gdi.c @@ -345,7 +345,6 @@ static const struct gdi_dc_funcs macdrv_funcs = NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index f18a56671cc..49f75805b34 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -859,7 +859,6 @@ static const struct gdi_dc_funcs psdrv_funcs = PSDRV_ResetDC, /* pResetDC */ NULL, /* pRestoreDC */ PSDRV_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 0f0e1849e17..e2931b1690c 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -424,7 +424,6 @@ static const struct gdi_dc_funcs x11drv_funcs = NULL, /* pResetDC */ NULL, /* pRestoreDC */ X11DRV_RoundRect, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 5949588cd24..ff6dcd366be 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -2236,7 +2236,6 @@ static const struct gdi_dc_funcs xrender_funcs = NULL, /* pResetDC */ NULL, /* pRestoreDC */ NULL, /* pRoundRect */ - NULL, /* pSaveDC */ NULL, /* pScaleViewportExt */ NULL, /* pScaleWindowExt */ NULL, /* pSelectBitmap */ diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 2d342903cf9..ed41d6a9f6c 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -149,7 +149,6 @@ struct gdi_dc_funcs HDC (CDECL *pResetDC)(PHYSDEV,const DEVMODEW*); BOOL (CDECL *pRestoreDC)(PHYSDEV,INT); BOOL (CDECL *pRoundRect)(PHYSDEV,INT,INT,INT,INT,INT,INT); - INT (CDECL *pSaveDC)(PHYSDEV); BOOL (CDECL *pScaleViewportExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*); BOOL (CDECL *pScaleWindowExtEx)(PHYSDEV,INT,INT,INT,INT,SIZE*); HBITMAP (CDECL *pSelectBitmap)(PHYSDEV,HBITMAP); @@ -195,7 +194,7 @@ struct gdi_dc_funcs }; /* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 54 +#define WINE_GDI_DRIVER_VERSION 55 #define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */