From 561b25c4de1b721f18288133a89bf0318c7e61ae Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 17 Aug 2021 11:37:39 +0200 Subject: [PATCH] gdi32: Use NtGdiRestoreDC for RestoreDC. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/dc.c | 200 ++++++++++++++------------- dlls/gdi32/enhmfdrv/dc.c | 19 +-- dlls/gdi32/enhmfdrv/enhmetafiledrv.h | 2 - dlls/gdi32/enhmfdrv/init.c | 3 +- dlls/gdi32/gdi_private.h | 2 + dlls/gdi32/gdidc.c | 13 ++ dlls/gdi32/mfdrv/dc.c | 4 +- dlls/gdi32/mfdrv/init.c | 2 +- dlls/gdi32/mfdrv/metafiledrv.h | 1 - 9 files changed, 125 insertions(+), 121 deletions(-) diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index c8e1e63e274..5a90f393a46 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -399,95 +399,6 @@ void DC_UpdateXforms( DC *dc ) */ BOOL CDECL nulldrv_RestoreDC( PHYSDEV dev, INT level ) { - DC *dcs, *first_dcs, *dc = get_nulldrv_dc( dev ); - INT save_level; - - /* find the state level to restore */ - - if (abs(level) > dc->attr->save_level || level == 0) return FALSE; - if (level < 0) level = dc->attr->save_level + level + 1; - first_dcs = dc->saved_dc; - for (dcs = first_dcs, save_level = dc->attr->save_level; save_level > level; save_level--) - dcs = dcs->saved_dc; - - /* restore the state */ - - if (!PATH_RestorePath( dc, dcs )) return FALSE; - - dc->attr->layout = dcs->attr->layout; - dc->attr->rop_mode = dcs->attr->rop_mode; - dc->attr->poly_fill_mode = dcs->attr->poly_fill_mode; - dc->attr->stretch_blt_mode = dcs->attr->stretch_blt_mode; - dc->attr->rel_abs_mode = dcs->attr->rel_abs_mode; - dc->attr->background_mode = dcs->attr->background_mode; - dc->attr->background_color = dcs->attr->background_color; - dc->attr->text_color = dcs->attr->text_color; - dc->attr->brush_color = dcs->attr->brush_color; - dc->attr->pen_color = dcs->attr->pen_color; - dc->attr->brush_org = dcs->attr->brush_org; - dc->attr->mapper_flags = dcs->attr->mapper_flags; - dc->attr->text_align = dcs->attr->text_align; - dc->attr->char_extra = dcs->attr->char_extra; - dc->breakExtra = dcs->breakExtra; - dc->breakRem = dcs->breakRem; - dc->attr->map_mode = dcs->attr->map_mode; - dc->attr->graphics_mode = dcs->attr->graphics_mode; - dc->attr->cur_pos = dcs->attr->cur_pos; - dc->attr->arc_direction = dcs->attr->arc_direction; - dc->xformWorld2Wnd = dcs->xformWorld2Wnd; - dc->xformWorld2Vport = dcs->xformWorld2Vport; - dc->xformVport2World = dcs->xformVport2World; - dc->vport2WorldValid = dcs->vport2WorldValid; - dc->attr->wnd_org = dcs->attr->wnd_org; - dc->attr->wnd_ext = dcs->attr->wnd_ext; - dc->attr->vport_org = dcs->attr->vport_org; - dc->attr->vport_ext = dcs->attr->vport_ext; - dc->attr->virtual_res = dcs->attr->virtual_res; - dc->attr->virtual_size = dcs->attr->virtual_size; - - if (dcs->hClipRgn) - { - if (!dc->hClipRgn) dc->hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); - NtGdiCombineRgn( dc->hClipRgn, dcs->hClipRgn, 0, RGN_COPY ); - } - else - { - if (dc->hClipRgn) DeleteObject( dc->hClipRgn ); - dc->hClipRgn = 0; - } - if (dcs->hMetaRgn) - { - if (!dc->hMetaRgn) dc->hMetaRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); - NtGdiCombineRgn( dc->hMetaRgn, dcs->hMetaRgn, 0, RGN_COPY ); - } - else - { - if (dc->hMetaRgn) DeleteObject( dc->hMetaRgn ); - dc->hMetaRgn = 0; - } - DC_UpdateXforms( dc ); - update_dc_clipping( dc ); - - NtGdiSelectBitmap( dev->hdc, dcs->hBitmap ); - NtGdiSelectBrush( dev->hdc, dcs->hBrush ); - NtGdiSelectFont( dev->hdc, dcs->hFont ); - NtGdiSelectPen( dev->hdc, dcs->hPen ); - set_bk_color( dc, dcs->attr->background_color); - set_text_color( dc, dcs->attr->text_color); - GDISelectPalette( dev->hdc, dcs->hPalette, FALSE ); - - dc->saved_dc = dcs->saved_dc; - dcs->saved_dc = 0; - dc->attr->save_level = save_level - 1; - - /* now destroy all the saved DCs */ - - while (first_dcs) - { - DC *next = first_dcs->saved_dc; - free_dc_state( first_dcs ); - first_dcs = next; - } return TRUE; } @@ -594,23 +505,114 @@ INT WINAPI NtGdiSaveDC( HDC hdc ) /*********************************************************************** - * RestoreDC (GDI32.@) + * NtGdiRestoreDC (win32u.@) */ -BOOL WINAPI RestoreDC( HDC hdc, INT level ) +BOOL WINAPI NtGdiRestoreDC( HDC hdc, INT level ) { - PHYSDEV physdev; - DC *dc; - BOOL success = FALSE; + DC *dc, *dcs, *first_dcs; + INT save_level; TRACE("%p %d\n", hdc, level ); - if ((dc = get_dc_ptr( hdc ))) + if (!(dc = get_dc_ptr( hdc ))) return FALSE; + update_dc( dc ); + + /* find the state level to restore */ + if (abs(level) > dc->attr->save_level || level == 0) { - update_dc( dc ); - physdev = GET_DC_PHYSDEV( dc, pRestoreDC ); - success = physdev->funcs->pRestoreDC( physdev, level ); release_dc_ptr( dc ); + return FALSE; } - return success; + + if (level < 0) level = dc->attr->save_level + level + 1; + first_dcs = dc->saved_dc; + for (dcs = first_dcs, save_level = dc->attr->save_level; save_level > level; save_level--) + dcs = dcs->saved_dc; + + /* restore the state */ + + if (!PATH_RestorePath( dc, dcs )) + { + release_dc_ptr( dc ); + return FALSE; + } + + dc->attr->layout = dcs->attr->layout; + dc->attr->rop_mode = dcs->attr->rop_mode; + dc->attr->poly_fill_mode = dcs->attr->poly_fill_mode; + dc->attr->stretch_blt_mode = dcs->attr->stretch_blt_mode; + dc->attr->rel_abs_mode = dcs->attr->rel_abs_mode; + dc->attr->background_mode = dcs->attr->background_mode; + dc->attr->background_color = dcs->attr->background_color; + dc->attr->text_color = dcs->attr->text_color; + dc->attr->brush_color = dcs->attr->brush_color; + dc->attr->pen_color = dcs->attr->pen_color; + dc->attr->brush_org = dcs->attr->brush_org; + dc->attr->mapper_flags = dcs->attr->mapper_flags; + dc->attr->text_align = dcs->attr->text_align; + dc->attr->char_extra = dcs->attr->char_extra; + dc->attr->map_mode = dcs->attr->map_mode; + dc->attr->graphics_mode = dcs->attr->graphics_mode; + dc->attr->cur_pos = dcs->attr->cur_pos; + dc->attr->arc_direction = dcs->attr->arc_direction; + dc->attr->wnd_org = dcs->attr->wnd_org; + dc->attr->wnd_ext = dcs->attr->wnd_ext; + dc->attr->vport_org = dcs->attr->vport_org; + dc->attr->vport_ext = dcs->attr->vport_ext; + dc->attr->virtual_res = dcs->attr->virtual_res; + dc->attr->virtual_size = dcs->attr->virtual_size; + + dc->breakExtra = dcs->breakExtra; + dc->breakRem = dcs->breakRem; + dc->xformWorld2Wnd = dcs->xformWorld2Wnd; + dc->xformWorld2Vport = dcs->xformWorld2Vport; + dc->xformVport2World = dcs->xformVport2World; + dc->vport2WorldValid = dcs->vport2WorldValid; + + if (dcs->hClipRgn) + { + if (!dc->hClipRgn) dc->hClipRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); + NtGdiCombineRgn( dc->hClipRgn, dcs->hClipRgn, 0, RGN_COPY ); + } + else + { + if (dc->hClipRgn) NtGdiDeleteObjectApp( dc->hClipRgn ); + dc->hClipRgn = 0; + } + if (dcs->hMetaRgn) + { + if (!dc->hMetaRgn) dc->hMetaRgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ); + NtGdiCombineRgn( dc->hMetaRgn, dcs->hMetaRgn, 0, RGN_COPY ); + } + else + { + if (dc->hMetaRgn) NtGdiDeleteObjectApp( dc->hMetaRgn ); + dc->hMetaRgn = 0; + } + DC_UpdateXforms( dc ); + update_dc_clipping( dc ); + + NtGdiSelectBitmap( hdc, dcs->hBitmap ); + NtGdiSelectBrush( hdc, dcs->hBrush ); + NtGdiSelectFont( hdc, dcs->hFont ); + NtGdiSelectPen( hdc, dcs->hPen ); + set_bk_color( dc, dcs->attr->background_color); + set_text_color( dc, dcs->attr->text_color); + GDISelectPalette( hdc, dcs->hPalette, FALSE ); + + dc->saved_dc = dcs->saved_dc; + dcs->saved_dc = 0; + dc->attr->save_level = save_level - 1; + + /* now destroy all the saved DCs */ + + while (first_dcs) + { + DC *next = first_dcs->saved_dc; + free_dc_state( first_dcs ); + first_dcs = next; + } + release_dc_ptr( dc ); + return TRUE; } diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index 867fb3e1380..f424b459fb3 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -30,28 +30,19 @@ BOOL EMFDC_SaveDC( DC_ATTR *dc_attr ) return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr ); } -BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level ) +BOOL EMFDC_RestoreDC( DC_ATTR *dc_attr, INT level ) { - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pRestoreDC ); - EMFDRV_PDEVICE* physDev = get_emf_physdev( dev ); - DC *dc = get_physdev_dc( dev ); EMRRESTOREDC emr; - BOOL ret; + + if (abs(level) > dc_attr->save_level || level == 0) return FALSE; emr.emr.iType = EMR_RESTOREDC; emr.emr.nSize = sizeof(emr); - if (level < 0) emr.iRelative = level; else - emr.iRelative = level - dc->attr->save_level - 1; - - physDev->restoring++; - ret = next->funcs->pRestoreDC( next, level ); - physDev->restoring--; - - if (ret) EMFDRV_WriteRecord( dev, &emr.emr ); - return ret; + emr.iRelative = level - dc_attr->save_level - 1; + return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr ); } BOOL EMFDC_SetTextAlign( DC_ATTR *dc_attr, UINT align ) diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h index f732f5b1d1d..3e24af9f0da 100644 --- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h +++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h @@ -40,7 +40,6 @@ typedef struct HANDLE hFile; /* Handle for disk based MetaFile */ HBRUSH dc_brush; HPEN dc_pen; - INT restoring; /* RestoreDC counter */ BOOL path; INT dev_caps[COLORMGMTCAPS + 1]; } EMFDRV_PDEVICE; @@ -90,7 +89,6 @@ extern BOOL CDECL EMFDRV_PolyPolygon( PHYSDEV dev, const POINT* pt, const IN extern BOOL CDECL EMFDRV_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, DWORD polys) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_PolylineTo( PHYSDEV dev, const POINT* pt,INT count) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN; -extern BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 5db96df4f16..bdae8005e90 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -109,7 +109,7 @@ static const struct gdi_dc_funcs emfdrv_driver = NULL, /* pRealizePalette */ EMFDRV_Rectangle, /* pRectangle */ NULL, /* pResetDC */ - EMFDRV_RestoreDC, /* pRestoreDC */ + NULL, /* pRestoreDC */ EMFDRV_RoundRect, /* pRoundRect */ EMFDRV_SelectBitmap, /* pSelectBitmap */ NULL, /* pSelectBrush */ @@ -335,7 +335,6 @@ HDC WINAPI CreateEnhMetaFileW( physDev->hFile = 0; physDev->dc_brush = 0; physDev->dc_pen = 0; - physDev->restoring = 0; physDev->path = FALSE; if (hdc) /* if no ref, use current display */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 0d0a7bdbd76..5d5e7cc11d3 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -83,6 +83,7 @@ extern BOOL METADC_Polygon( HDC hdc, const POINT *points, INT count ) DECLSPEC_H extern BOOL METADC_Polyline( HDC hdc, const POINT *points,INT count) DECLSPEC_HIDDEN; extern BOOL METADC_RealizePalette( HDC hdc ) DECLSPEC_HIDDEN; extern BOOL METADC_Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN; +extern BOOL METADC_RestoreDC( HDC hdc, INT level ) DECLSPEC_HIDDEN; extern BOOL METADC_RoundRect( HDC hdc, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height ) DECLSPEC_HIDDEN; extern BOOL METADC_SaveDC( HDC hdc ) DECLSPEC_HIDDEN; @@ -173,6 +174,7 @@ extern BOOL EMFDC_Polyline( DC_ATTR *dc_attr, const POINT *points, INT count) DE extern BOOL EMFDC_PolylineTo( DC_ATTR *dc_attr, const POINT *points, INT count ) DECLSPEC_HIDDEN; extern BOOL EMFDC_Rectangle( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN; +extern BOOL EMFDC_RestoreDC( DC_ATTR *dc_attr, INT level ) DECLSPEC_HIDDEN; extern BOOL EMFDC_RoundRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height ) DECLSPEC_HIDDEN; extern BOOL EMFDC_SaveDC( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index d9ca36bd213..041cba83581 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -125,6 +125,19 @@ INT WINAPI SaveDC( HDC hdc ) return NtGdiSaveDC( hdc ); } +/*********************************************************************** + * RestoreDC (GDI32.@) + */ +BOOL WINAPI RestoreDC( HDC hdc, INT level ) +{ + DC_ATTR *dc_attr; + + if (is_meta_dc( hdc )) return METADC_RestoreDC( hdc, level ); + if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; + if (dc_attr->emf && !EMFDC_RestoreDC( dc_attr, level )) return FALSE; + return NtGdiRestoreDC( hdc, level ); +} + /*********************************************************************** * GetDeviceCaps (GDI32.@) */ diff --git a/dlls/gdi32/mfdrv/dc.c b/dlls/gdi32/mfdrv/dc.c index ed98ee892d8..c9746b3050c 100644 --- a/dlls/gdi32/mfdrv/dc.c +++ b/dlls/gdi32/mfdrv/dc.c @@ -25,9 +25,9 @@ BOOL METADC_SaveDC( HDC hdc ) return metadc_param0( hdc, META_SAVEDC ); } -BOOL CDECL MFDRV_RestoreDC( PHYSDEV dev, INT level ) +BOOL METADC_RestoreDC( HDC hdc, INT level ) { - return MFDRV_MetaParam1( dev, META_RESTOREDC, level ); + return metadc_param1( hdc, META_RESTOREDC, level ); } BOOL METADC_SetTextAlign( HDC hdc, UINT align ) diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index b7d4d68ee93..c9fe51706f1 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -174,7 +174,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = NULL, /* pRealizePalette */ NULL, /* pRectangle */ NULL, /* pResetDC */ - MFDRV_RestoreDC, /* pRestoreDC */ + NULL, /* pRestoreDC */ NULL, /* pRoundRect */ NULL, /* pSelectBitmap */ NULL, /* pSelectBrush */ diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h index 91f390f2f13..a8de68f9a50 100644 --- a/dlls/gdi32/mfdrv/metafiledrv.h +++ b/dlls/gdi32/mfdrv/metafiledrv.h @@ -90,7 +90,6 @@ extern BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush ) DECLSPE extern BOOL CDECL MFDRV_FlattenPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_PolyBezier( PHYSDEV dev, const POINT* pt, DWORD count ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_PolyBezierTo( PHYSDEV dev, const POINT* pt, DWORD count ) DECLSPEC_HIDDEN; -extern BOOL CDECL MFDRV_RestoreDC( PHYSDEV dev, INT level ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_SelectClipPath( PHYSDEV dev, INT iMode ) DECLSPEC_HIDDEN; extern COLORREF CDECL MFDRV_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;