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