Jacek Caban : gdi32: Use NtGdiPatBlt for PatBlt implementation.

Alexandre Julliard julliard at winehq.org
Tue Aug 3 16:52:23 CDT 2021


Module: wine
Branch: master
Commit: 6f095cea53787f03a159f0464b9881ace3724e6b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6f095cea53787f03a159f0464b9881ace3724e6b

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Aug  3 12:56:49 2021 +0200

gdi32: Use NtGdiPatBlt for PatBlt 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/bitblt.c            |  4 ++--
 dlls/gdi32/enhmfdrv/bitblt.c   | 27 +++++++++++++++++----------
 dlls/gdi32/font.c              |  2 +-
 dlls/gdi32/gdi_private.h       |  2 ++
 dlls/gdi32/gdidc.c             | 14 ++++++++++++++
 dlls/gdi32/mfdrv/bitblt.c      |  9 ++++-----
 dlls/gdi32/mfdrv/init.c        |  2 +-
 dlls/gdi32/mfdrv/metafiledrv.h |  1 -
 include/ntgdi.h                |  1 +
 9 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index 865f44704b0..af9b0cc91f1 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -525,9 +525,9 @@ COLORREF CDECL nulldrv_GetPixel( PHYSDEV dev, INT x, INT y )
 
 
 /***********************************************************************
- *           PatBlt    (GDI32.@)
+ *           NtGdiPatBlt    (win32u.@)
  */
-BOOL WINAPI PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop)
+BOOL WINAPI NtGdiPatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop )
 {
     DC * dc;
     BOOL ret = FALSE;
diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c
index f15acaa1f14..2ef2081be71 100644
--- a/dlls/gdi32/enhmfdrv/bitblt.c
+++ b/dlls/gdi32/enhmfdrv/bitblt.c
@@ -130,19 +130,26 @@ BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
 
 BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
 {
+    /* FIXME: update bound rect */
+    return TRUE;
+}
+
+BOOL EMFDC_PatBlt( DC_ATTR *dc_attr, INT left, INT top, INT width, INT height, DWORD rop )
+{
+    EMFDRV_PDEVICE *emf = dc_attr->emf;
     EMRBITBLT emr;
     BOOL ret;
 
     emr.emr.iType = EMR_BITBLT;
     emr.emr.nSize = sizeof(emr);
-    emr.rclBounds.left = dst->log_x;
-    emr.rclBounds.top = dst->log_y;
-    emr.rclBounds.right = dst->log_x + dst->log_width - 1;
-    emr.rclBounds.bottom = dst->log_y + dst->log_height - 1;
-    emr.xDest = dst->log_x;
-    emr.yDest = dst->log_y;
-    emr.cxDest = dst->log_width;
-    emr.cyDest = dst->log_height;
+    emr.rclBounds.left = left;
+    emr.rclBounds.top = top;
+    emr.rclBounds.right = left + width - 1;
+    emr.rclBounds.bottom = top + height - 1;
+    emr.xDest = left;
+    emr.yDest = top;
+    emr.cxDest = width;
+    emr.cyDest = height;
     emr.dwRop = rop;
     emr.xSrc = 0;
     emr.ySrc = 0;
@@ -159,9 +166,9 @@ BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
     emr.offBitsSrc = 0;
     emr.cbBitsSrc = 0;
 
-    ret = EMFDRV_WriteRecord( dev, &emr.emr );
+    ret = EMFDRV_WriteRecord( &emf->dev, &emr.emr );
     if(ret)
-        EMFDRV_UpdateBBox( dev, &emr.rclBounds );
+        EMFDRV_UpdateBBox( &emf->dev, &emr.rclBounds );
     return ret;
 }
 
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index f72759f4514..77e8e3ca1d6 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -5693,7 +5693,7 @@ BOOL CDECL nulldrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT
         {
             orig = NtGdiSelectBrush( dev->hdc, brush );
             dp_to_lp( dc, (POINT *)&rc, 2 );
-            PatBlt( dev->hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY );
+            NtGdiPatBlt( dev->hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY );
             NtGdiSelectBrush( dev->hdc, orig );
             DeleteObject( brush );
         }
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 68d692fbab3..f4be6e151e1 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -58,6 +58,7 @@ extern BOOL METADC_InvertRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN;
 extern BOOL METADC_LineTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL METADC_MoveTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL METADC_PaintRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN;
+extern BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop );
 extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom,
                         INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
 extern BOOL METADC_PolyPolygon( HDC hdc, const POINT *points, const INT *counts,
@@ -101,6 +102,7 @@ extern BOOL EMFDC_InvertRgn( DC_ATTR *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_LineTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_MoveTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_PaintRgn( DC_ATTR *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_PatBlt( DC_ATTR *dc_attr, INT left, INT top, INT width, INT height, DWORD rop );
 extern BOOL EMFDC_PolyBezier( DC_ATTR *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_PolyBezierTo( DC_ATTR *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_PolyDraw( DC_ATTR *dc_attr, const POINT *points, const BYTE *types,
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index bc02beea429..7b6f1f39883 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -984,6 +984,20 @@ BOOL WINAPI ExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *rect,
     return NtGdiExtTextOutW( hdc, x, y, flags, rect, str, count, dx, 0 );
 }
 
+/***********************************************************************
+ *           PatBlt    (GDI32.@)
+ */
+BOOL WINAPI PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop )
+{
+    DC_ATTR *dc_attr;
+
+    if (is_meta_dc( hdc )) return METADC_PatBlt( hdc, left, top, width, height, rop );
+    if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+    if (dc_attr->emf && !EMFDC_PatBlt( dc_attr, left, top, width, height, rop ))
+        return FALSE;
+    return NtGdiPatBlt( hdc, left, top, width, height, rop );
+}
+
 /***********************************************************************
  *           BeginPath    (GDI32.@)
  */
diff --git a/dlls/gdi32/mfdrv/bitblt.c b/dlls/gdi32/mfdrv/bitblt.c
index 1379ea94c6f..a08d6ef6608 100644
--- a/dlls/gdi32/mfdrv/bitblt.c
+++ b/dlls/gdi32/mfdrv/bitblt.c
@@ -26,13 +26,12 @@
 WINE_DEFAULT_DEBUG_CHANNEL(metafile);
 
 /***********************************************************************
- *           MFDRV_PatBlt
+ *           METADC_PatBlt
  */
-BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
+BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop )
 {
-    MFDRV_MetaParam6( dev, META_PATBLT, dst->log_x, dst->log_y, dst->log_width, dst->log_height,
-                      HIWORD(rop), LOWORD(rop) );
-    return TRUE;
+    return metadc_param6( hdc, META_PATBLT, left, top, width, height,
+                          HIWORD(rop), LOWORD(rop) );
 }
 
 
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 73b3ce7365b..f6448b19a25 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -168,7 +168,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
     MFDRV_OffsetViewportOrgEx,       /* pOffsetViewportOrgEx */
     MFDRV_OffsetWindowOrgEx,         /* pOffsetWindowOrgEx */
     NULL,                            /* pPaintRgn */
-    MFDRV_PatBlt,                    /* pPatBlt */
+    NULL,                            /* pPatBlt */
     NULL,                            /* pPie */
     MFDRV_PolyBezier,                /* pPolyBezier */
     MFDRV_PolyBezierTo,              /* pPolyBezierTo */
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index b3104318223..9d00f4c5c69 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -92,7 +92,6 @@ extern INT  CDECL MFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT r
 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;
 extern BOOL CDECL MFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
-extern BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) 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;
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 1698aa17054..c2f61fca6df 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -209,6 +209,7 @@ BOOL     WINAPI NtGdiLineTo( HDC hdc, INT x, INT y );
 BOOL     WINAPI NtGdiMoveTo( HDC hdc, INT x, INT y, POINT *pt );
 INT      WINAPI NtGdiOffsetClipRgn( HDC hdc, INT x, INT y );
 INT      WINAPI NtGdiOffsetRgn( HRGN hrgn, INT x, INT y );
+BOOL     WINAPI NtGdiPatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop );
 HRGN     WINAPI NtGdiPathToRegion( HDC hdc );
 BOOL     WINAPI NtGdiPolyDraw(HDC hdc, const POINT *points, const BYTE *types, DWORD count );
 ULONG    WINAPI NtGdiPolyPolyDraw( HDC hdc, const POINT *points, const UINT *counts,




More information about the wine-cvs mailing list