Jacek Caban : gdi32: Handle metafiles directly in LineTo implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jul 19 15:59:15 CDT 2021
Module: wine
Branch: master
Commit: 68b6cca258b6db8179446cff06c54cb2198185ff
URL: https://source.winehq.org/git/wine.git/?a=commit;h=68b6cca258b6db8179446cff06c54cb2198185ff
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sat Jul 17 17:00:55 2021 +0200
gdi32: Handle metafiles directly in LineTo 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/gdi_private.h | 8 ++++++++
dlls/gdi32/gdidc.c | 2 ++
dlls/gdi32/mfdrv/graphics.c | 6 +++---
dlls/gdi32/mfdrv/init.c | 18 +++++++++++++++++-
dlls/gdi32/mfdrv/metafiledrv.h | 4 +++-
include/ntgdi.h | 3 +++
6 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 8db78190d5f..830c2707e29 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -31,4 +31,12 @@
void set_gdi_client_ptr( HGDIOBJ handle, void *ptr ) DECLSPEC_HIDDEN;
void *get_gdi_client_ptr( HGDIOBJ handle, WORD type ) DECLSPEC_HIDDEN;
+static inline BOOL is_meta_dc( HDC hdc )
+{
+ unsigned int handle = HandleToULong( hdc );
+ return (handle & NTGDI_HANDLE_TYPE_MASK) >> NTGDI_HANDLE_TYPE_SHIFT == NTGDI_OBJ_METADC;
+}
+
+extern BOOL METADC_LineTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
+
#endif /* __WINE_GDI_PRIVATE_H */
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index b2bddc717ae..eecd1b69ad6 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -31,6 +31,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdi);
BOOL WINAPI LineTo( HDC hdc, INT x, INT y )
{
TRACE( "%p, (%d, %d)\n", hdc, x, y );
+
+ if (is_meta_dc( hdc )) return METADC_LineTo( hdc, x, y );
return NtGdiLineTo( hdc, x, y );
}
diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c
index 616980d1204..95c25d1e709 100644
--- a/dlls/gdi32/mfdrv/graphics.c
+++ b/dlls/gdi32/mfdrv/graphics.c
@@ -39,11 +39,11 @@ BOOL CDECL MFDRV_MoveTo(PHYSDEV dev, INT x, INT y)
}
/***********************************************************************
- * MFDRV_LineTo
+ * METADC_LineTo
*/
-BOOL CDECL MFDRV_LineTo( PHYSDEV dev, INT x, INT y )
+BOOL METADC_LineTo( HDC hdc, INT x, INT y )
{
- return MFDRV_MetaParam2(dev, META_LINETO, x, y);
+ return metadc_param2( hdc, META_LINETO, x, y );
}
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index f337d4ec559..36b523e52cc 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -159,7 +159,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
NULL, /* pGradientFill */
MFDRV_IntersectClipRect, /* pIntersectClipRect */
MFDRV_InvertRgn, /* pInvertRgn */
- MFDRV_LineTo, /* pLineTo */
+ NULL, /* pLineTo */
NULL, /* pModifyWorldTransform */
MFDRV_MoveTo, /* pMoveTo */
MFDRV_OffsetClipRgn, /* pOffsetClipRgn */
@@ -259,6 +259,7 @@ static DC *MFDRV_AllocMetaFile(void)
}
push_dc_driver( &dc->physDev, &physDev->dev, &MFDRV_Funcs );
+ set_gdi_client_ptr( dc->hSelf, physDev );
physDev->handles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, HANDLE_LIST_INC * sizeof(physDev->handles[0]));
physDev->handles_size = HANDLE_LIST_INC;
@@ -597,3 +598,18 @@ BOOL MFDRV_MetaParam8(PHYSDEV dev, short func, short param1, short param2,
params[7] = param1;
return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);
}
+
+static METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc )
+{
+ METAFILEDRV_PDEVICE *metafile = get_gdi_client_ptr( hdc, NTGDI_OBJ_METADC );
+ if (!metafile) SetLastError( ERROR_INVALID_HANDLE );
+ return metafile;
+}
+
+BOOL metadc_param2( HDC hdc, short func, short param1, short param2 )
+{
+ METAFILEDRV_PDEVICE *dev;
+
+ if (!(dev = get_metadc_ptr( hdc ))) return FALSE;
+ return MFDRV_MetaParam2( &dev->dev, func, param1, param2 );
+}
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 6f1f9587d58..88c149e0523 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -27,6 +27,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "ntgdi_private.h"
+#include "gdi_private.h"
/* Metafile driver physical DC */
@@ -58,6 +59,8 @@ extern UINT MFDRV_AddHandle( PHYSDEV dev, HGDIOBJ obj ) DECLSPEC_HIDDEN;
extern BOOL MFDRV_RemoveHandle( PHYSDEV dev, UINT index ) DECLSPEC_HIDDEN;
extern INT16 MFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) DECLSPEC_HIDDEN;
+extern BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) DECLSPEC_HIDDEN;
+
/* Metafile driver functions */
extern BOOL CDECL MFDRV_AbortPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
@@ -81,7 +84,6 @@ extern BOOL CDECL MFDRV_FlattenPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_FrameRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush, INT x, INT y ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
-extern BOOL CDECL MFDRV_LineTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_MoveTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
diff --git a/include/ntgdi.h b/include/ntgdi.h
index d90529392d5..9b37810f7a3 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -67,6 +67,9 @@ typedef struct _GDI_HANDLE_ENTRY
/* Wine extension, native uses NTGDI_OBJ_DC */
#define NTGDI_OBJ_MEMDC 0x41
+#define NTGDI_HANDLE_TYPE_SHIFT 16
+#define NTGDI_HANDLE_TYPE_MASK 0x007f0000
+
typedef struct _GDI_SHARED_MEMORY
{
GDI_HANDLE_ENTRY Handles[GDI_MAX_HANDLE_COUNT];
More information about the wine-cvs
mailing list