Jacek Caban : gdi32: Use NtGdiGradientFill for GdiGradientFill implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jul 26 15:30:27 CDT 2021
Module: wine
Branch: master
Commit: 1ca8064c886dfb618e805e53df182aabc9fbee8b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1ca8064c886dfb618e805e53df182aabc9fbee8b
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Jul 25 10:58:49 2021 +0200
gdi32: Use NtGdiGradientFill for GdiGradientFill 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/enhmfdrv/graphics.c | 14 ++++++++++++--
dlls/gdi32/gdi_private.h | 2 ++
dlls/gdi32/gdidc.c | 22 ++++++++++++++++++++++
dlls/gdi32/painting.c | 14 ++++----------
4 files changed, 40 insertions(+), 12 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index bcf1b499342..eacf596c92b 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -1116,6 +1116,16 @@ no_bounds:
*/
BOOL CDECL EMFDRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert,
void *grad_array, ULONG ngrad, ULONG mode )
+{
+ /* FIXME: update bounding rect */
+ return TRUE;
+}
+
+/**********************************************************************
+ * EMFDC_GradientFill
+ */
+BOOL EMFDC_GradientFill( DC_ATTR *dc_attr, TRIVERTEX *vert_array, ULONG nvert,
+ void *grad_array, ULONG ngrad, ULONG mode )
{
EMRGRADIENTFILL *emr;
ULONG i, pt, size, num_pts = ngrad * (mode == GRADIENT_FILL_TRIANGLE ? 3 : 2);
@@ -1159,8 +1169,8 @@ BOOL CDECL EMFDRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert,
memcpy( emr->Ver, vert_array, nvert * sizeof(vert_array[0]) );
memcpy( emr->Ver + nvert, pts, num_pts * sizeof(pts[0]) );
- EMFDRV_UpdateBBox( dev, &emr->rclBounds );
- ret = EMFDRV_WriteRecord( dev, &emr->emr );
+ EMFDRV_UpdateBBox( dc_attr->emf, &emr->rclBounds );
+ ret = EMFDRV_WriteRecord( dc_attr->emf, &emr->emr );
HeapFree( GetProcessHeap(), 0, emr );
return ret;
}
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 8f0cb29a8d4..d9784c31aac 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -87,6 +87,8 @@ extern BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const
extern BOOL EMFDC_FillRgn( DC_ATTR *dc_attr, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_FrameRgn( DC_ATTR *dc_attr, HRGN hrgn, HBRUSH hbrush, INT width,
INT height ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_GradientFill( DC_ATTR *dc_attr, TRIVERTEX *vert_array, ULONG nvert,
+ void *grad_array, ULONG ngrad, ULONG mode ) DECLSPEC_HIDDEN;
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;
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 605294cc6b8..3cd0b4c26c1 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -466,6 +466,28 @@ BOOL WINAPI FloodFill( HDC hdc, INT x, INT y, COLORREF color )
return ExtFloodFill( hdc, x, y, color, FLOODFILLBORDER );
}
+/******************************************************************************
+ * GdiGradientFill (GDI32.@)
+ */
+BOOL WINAPI GdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
+ void *grad_array, ULONG ngrad, ULONG mode )
+{
+ DC_ATTR *dc_attr;
+
+ TRACE( "%p vert_array:%p nvert:%d grad_array:%p ngrad:%d\n", hdc, vert_array,
+ nvert, grad_array, ngrad );
+
+ if (!(dc_attr = get_dc_attr( hdc )))
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return FALSE;
+ }
+ if (dc_attr->emf &&
+ !EMFDC_GradientFill( dc_attr, vert_array, nvert, grad_array, ngrad, mode ))
+ return FALSE;
+ return NtGdiGradientFill( hdc, vert_array, nvert, grad_array, ngrad, mode );
+}
+
/***********************************************************************
* ExtTextOutW (GDI32.@)
*/
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 992f2cfb2b0..9fecce61bd2 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -918,18 +918,16 @@ POINT *GDI_Bezier( const POINT *Points, INT count, INT *nPtsOut )
}
/******************************************************************************
- * GdiGradientFill (GDI32.@)
+ * NtGdiGdiGradientFill (win32u.@)
*/
-BOOL WINAPI GdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
- void *grad_array, ULONG ngrad, ULONG mode )
+BOOL WINAPI NtGdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
+ void *grad_array, ULONG ngrad, ULONG mode )
{
DC *dc;
PHYSDEV physdev;
BOOL ret;
ULONG i;
- TRACE("%p vert_array:%p nvert:%d grad_array:%p ngrad:%d\n", hdc, vert_array, nvert, grad_array, ngrad);
-
if (!vert_array || !nvert || !grad_array || !ngrad || mode > GRADIENT_FILL_TRIANGLE)
{
SetLastError( ERROR_INVALID_PARAMETER );
@@ -938,11 +936,7 @@ BOOL WINAPI GdiGradientFill( HDC hdc, TRIVERTEX *vert_array, ULONG nvert,
for (i = 0; i < ngrad * (mode == GRADIENT_FILL_TRIANGLE ? 3 : 2); i++)
if (((ULONG *)grad_array)[i] >= nvert) return FALSE;
- if (!(dc = get_dc_ptr( hdc )))
- {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
+ if (!(dc = get_dc_ptr( hdc ))) return FALSE;
update_dc( dc );
physdev = GET_DC_PHYSDEV( dc, pGradientFill );
ret = physdev->funcs->pGradientFill( physdev, vert_array, nvert, grad_array, ngrad, mode );
More information about the wine-cvs
mailing list