Jacek Caban : gdi32: Use NtGdiSaveDC for SaveDC implementation.
Alexandre Julliard
julliard at winehq.org
Fri Jul 30 14:21:08 CDT 2021
Module: wine
Branch: master
Commit: d423244c1befbe41073d19e77032505a0acade31
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d423244c1befbe41073d19e77032505a0acade31
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jul 30 13:01:56 2021 +0200
gdi32: Use NtGdiSaveDC for SaveDC implementation.
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/dc.c | 4 ++--
dlls/gdi32/enhmfdrv/dc.c | 17 +++++------------
dlls/gdi32/enhmfdrv/enhmetafiledrv.h | 1 -
dlls/gdi32/enhmfdrv/init.c | 2 +-
dlls/gdi32/gdi_private.h | 2 ++
dlls/gdi32/gdidc.c | 13 +++++++++++++
dlls/gdi32/mfdrv/dc.c | 4 ++--
dlls/gdi32/mfdrv/init.c | 10 +++++++++-
dlls/gdi32/mfdrv/metafiledrv.h | 2 +-
dlls/gdi32/tests/dc.c | 5 +++++
10 files changed, 40 insertions(+), 20 deletions(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index 130a1ac99e1..6118e443a6f 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -577,9 +577,9 @@ static BOOL reset_dc_state( HDC hdc )
/***********************************************************************
- * SaveDC (GDI32.@)
+ * NtGdiSaveDC (win32u.@)
*/
-INT WINAPI SaveDC( HDC hdc )
+INT WINAPI NtGdiSaveDC( HDC hdc )
{
DC * dc;
INT ret = 0;
diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 1faf777c47e..5148e03a231 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -22,19 +22,12 @@
#include <assert.h>
#include "enhmfdrv/enhmetafiledrv.h"
-INT CDECL EMFDRV_SaveDC( PHYSDEV dev )
+BOOL EMFDC_SaveDC( DC_ATTR *dc_attr )
{
- PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSaveDC );
- INT ret = next->funcs->pSaveDC( next );
-
- if (ret)
- {
- EMRSAVEDC emr;
- emr.emr.iType = EMR_SAVEDC;
- emr.emr.nSize = sizeof(emr);
- EMFDRV_WriteRecord( dev, &emr.emr );
- }
- return ret;
+ EMRSAVEDC emr;
+ emr.emr.iType = EMR_SAVEDC;
+ emr.emr.nSize = sizeof(emr);
+ return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
}
BOOL CDECL EMFDRV_RestoreDC( PHYSDEV dev, INT level )
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index 981cdea7887..35ff9af0e90 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -102,7 +102,6 @@ extern BOOL CDECL EMFDRV_Rectangle( PHYSDEV dev, INT left, INT top, INT righ
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 INT CDECL EMFDRV_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_ScaleViewportExtEx( PHYSDEV dev, INT xNum, INT xDenom,
INT yNum, INT yDenom, SIZE *size ) 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 516c6c4e884..2291e22348f 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -118,7 +118,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
NULL, /* pResetDC */
EMFDRV_RestoreDC, /* pRestoreDC */
EMFDRV_RoundRect, /* pRoundRect */
- EMFDRV_SaveDC, /* pSaveDC */
+ NULL, /* pSaveDC */
EMFDRV_ScaleViewportExtEx, /* pScaleViewportExtEx */
EMFDRV_ScaleWindowExtEx, /* pScaleWindowExtEx */
EMFDRV_SelectBitmap, /* pSelectBitmap */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 105d72b23f0..197ee8942c5 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -66,6 +66,7 @@ extern BOOL METADC_Polyline( HDC hdc, const POINT *points,INT count) DECLSPEC_HI
extern BOOL METADC_Rectangle( HDC hdc, INT left, INT top, INT right, INT bottom) 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;
extern BOOL METADC_SetBkMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
extern BOOL METADC_SetPixel( HDC hdc, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
extern BOOL METADC_SetPolyFillMode( HDC hdc, INT mode ) DECLSPEC_HIDDEN;
@@ -114,6 +115,7 @@ extern BOOL EMFDC_Rectangle( DC_ATTR *dc_attr, INT left, INT top, INT right,
INT bottom) 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;
extern BOOL EMFDC_SetArcDirection( DC_ATTR *dc_attr, INT dir ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_SetBkMode( DC_ATTR *dc_attr, INT mode ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_SetPixel( DC_ATTR *dc_attr, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 42df880f718..6dd5940d45a 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -112,6 +112,19 @@ HDC WINAPI ResetDCA( HDC hdc, const DEVMODEA *devmode )
return ret;
}
+/***********************************************************************
+ * SaveDC (GDI32.@)
+ */
+INT WINAPI SaveDC( HDC hdc )
+{
+ DC_ATTR *dc_attr;
+
+ if (is_meta_dc( hdc )) return METADC_SaveDC( hdc );
+ if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+ if (dc_attr->emf && !EMFDC_SaveDC( dc_attr )) return FALSE;
+ return NtGdiSaveDC( hdc );
+}
+
/***********************************************************************
* GetTextAlign (GDI32.@)
*/
diff --git a/dlls/gdi32/mfdrv/dc.c b/dlls/gdi32/mfdrv/dc.c
index 044e228b2bf..9513da7160c 100644
--- a/dlls/gdi32/mfdrv/dc.c
+++ b/dlls/gdi32/mfdrv/dc.c
@@ -20,9 +20,9 @@
#include "mfdrv/metafiledrv.h"
-INT CDECL MFDRV_SaveDC( PHYSDEV dev )
+BOOL METADC_SaveDC( HDC hdc )
{
- return MFDRV_MetaParam0( dev, META_SAVEDC );
+ return metadc_param0( hdc, META_SAVEDC );
}
BOOL CDECL MFDRV_RestoreDC( PHYSDEV dev, INT level )
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 31a0297c9e3..70442fac20f 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -181,7 +181,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
NULL, /* pResetDC */
MFDRV_RestoreDC, /* pRestoreDC */
NULL, /* pRoundRect */
- MFDRV_SaveDC, /* pSaveDC */
+ NULL, /* pSaveDC */
MFDRV_ScaleViewportExtEx, /* pScaleViewportExtEx */
MFDRV_ScaleWindowExtEx, /* pScaleWindowExtEx */
MFDRV_SelectBitmap, /* pSelectBitmap */
@@ -613,6 +613,14 @@ BOOL metadc_param1( HDC hdc, short func, short param )
return MFDRV_MetaParam1( &dev->dev, func, param );
}
+BOOL metadc_param0( HDC hdc, short func )
+{
+ METAFILEDRV_PDEVICE *dev;
+
+ if (!(dev = get_metadc_ptr( hdc ))) return FALSE;
+ return MFDRV_MetaParam0( &dev->dev, func );
+}
+
BOOL metadc_param2( HDC hdc, short func, short param1, short param2 )
{
METAFILEDRV_PDEVICE *dev;
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 567b60158b2..b3104318223 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -60,6 +60,7 @@ extern BOOL MFDRV_RemoveHandle( PHYSDEV dev, UINT index ) DECLSPEC_HIDDEN;
extern INT16 MFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) DECLSPEC_HIDDEN;
extern METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc ) DECLSPEC_HIDDEN;
+extern BOOL metadc_param0( HDC hdc, short func ) DECLSPEC_HIDDEN;
extern BOOL metadc_param1( HDC hdc, short func, short param ) DECLSPEC_HIDDEN;
extern BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) DECLSPEC_HIDDEN;
extern BOOL metadc_param4( HDC hdc, short func, short param1, short param2,
@@ -95,7 +96,6 @@ extern BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD ro
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 INT CDECL MFDRV_SaveDC( PHYSDEV dev ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_ScaleViewportExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum, INT yDenom, SIZE *size ) DECLSPEC_HIDDEN;
extern HBITMAP CDECL MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP handle ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 054279bf46c..bdc8186bf76 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -234,6 +234,11 @@ static void test_savedc(void)
"ret = %d\n", ret);
DeleteDC(hdc);
+
+ SetLastError(0xdeadbeef);
+ ret = SaveDC(ULongToHandle(0xdeadbeef));
+ ok(!ret, "SaveDC returned %u\n", ret);
+ ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError() = %u\n", GetLastError());
}
static void test_GdiConvertToDevmodeW(void)
More information about the wine-cvs
mailing list