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