Jacek Caban : gdi32: Use NtGdiAlphaBlend for GdiAlphaBlend.
Alexandre Julliard
julliard at winehq.org
Thu Aug 12 16:35:20 CDT 2021
Module: wine
Branch: master
Commit: 2f7b9e29e475a3f2e8572439104afe4badd90d8c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2f7b9e29e475a3f2e8572439104afe4badd90d8c
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Aug 12 12:00:31 2021 +0200
gdi32: Use NtGdiAlphaBlend for GdiAlphaBlend.
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 | 8 ++++----
dlls/gdi32/enhmfdrv/bitblt.c | 13 ++++++++++---
dlls/gdi32/gdi_private.h | 3 +++
dlls/gdi32/gdidc.c | 19 +++++++++++++++++++
include/ntgdi.h | 3 +++
5 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index fd505b13407..0024234ac2d 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -935,11 +935,11 @@ error:
}
/******************************************************************************
- * GdiAlphaBlend [GDI32.@]
+ * NtGdiAlphaBlend (win32u.@)
*/
-BOOL WINAPI GdiAlphaBlend(HDC hdcDst, int xDst, int yDst, int widthDst, int heightDst,
- HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc,
- BLENDFUNCTION blendFunction)
+BOOL WINAPI NtGdiAlphaBlend( HDC hdcDst, int xDst, int yDst, int widthDst, int heightDst,
+ HDC hdcSrc, int xSrc, int ySrc, int widthSrc, int heightSrc,
+ BLENDFUNCTION blendFunction, HANDLE xform )
{
BOOL ret = FALSE;
DC *dcDst, *dcSrc;
diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c
index 9d930d17591..73959da2ec4 100644
--- a/dlls/gdi32/enhmfdrv/bitblt.c
+++ b/dlls/gdi32/enhmfdrv/bitblt.c
@@ -158,12 +158,19 @@ err:
return ret;
}
+BOOL EMFDC_AlphaBlend( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
+ HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src,
+ BLENDFUNCTION blend_function )
+{
+ return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst, hdc_src, x_src, y_src,
+ width_src, height_src, *(DWORD *)&blend_function, EMR_ALPHABLEND );
+}
+
BOOL CDECL EMFDRV_AlphaBlend( PHYSDEV dev_dst, struct bitblt_coords *dst,
PHYSDEV dev_src, struct bitblt_coords *src, BLENDFUNCTION func )
{
- return emfdrv_stretchblt( dev_dst, dst->log_x, dst->log_y, dst->log_width, dst->log_height,
- dev_src->hdc, src->log_x, src->log_y, src->log_width, src->log_height,
- *(DWORD *)&func, EMR_ALPHABLEND );
+ /* FIXME: update bound rect */
+ return TRUE;
}
BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop )
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 3b99eb49d5d..305dec43c7f 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -112,6 +112,9 @@ extern BOOL METADC_StretchBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width_dst,
/* enhanced metafiles */
extern BOOL EMFDC_AbortPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_AlphaBlend( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width_dst, INT height_dst,
+ HDC hdc_src, INT x_src, INT y_src, INT width_src, INT height_src,
+ BLENDFUNCTION blend_function );
extern BOOL EMFDC_AngleArc( DC_ATTR *dc_attr, INT x, INT y, DWORD radius, FLOAT start,
FLOAT sweep ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_ArcChordPie( DC_ATTR *dc_attr, INT left, INT top, INT right,
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 685396f6893..b8faf9fb58c 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -1235,6 +1235,25 @@ BOOL WINAPI StretchBlt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT height
height_src, rop, 0 /* FIXME */ );
}
+/******************************************************************************
+ * GdiAlphaBlend (GDI32.@)
+ */
+BOOL WINAPI GdiAlphaBlend( HDC hdc_dst, int x_dst, int y_dst, int width_dst, int height_dst,
+ HDC hdc_src, int x_src, int y_src, int width_src, int height_src,
+ BLENDFUNCTION blend_function)
+{
+ DC_ATTR *dc_attr;
+
+ if (!(dc_attr = get_dc_attr( hdc_dst ))) return FALSE;
+ if (dc_attr->emf && !EMFDC_AlphaBlend( dc_attr, x_dst, y_dst, width_dst, height_dst,
+ hdc_src, x_src, y_src, width_src,
+ height_src, blend_function ))
+ return FALSE;
+ return NtGdiAlphaBlend( hdc_dst, x_dst, y_dst, width_dst, height_dst,
+ hdc_src, x_src, y_src, width_src, height_src,
+ blend_function, 0 /* FIXME */ );
+}
+
/***********************************************************************
* BeginPath (GDI32.@)
*/
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 63547f5bd4a..5d67798052a 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -145,6 +145,9 @@ typedef struct DC_ATTR
INT WINAPI NtGdiAbortDoc( HDC hdc );
BOOL WINAPI NtGdiAbortPath( HDC hdc );
+BOOL WINAPI NtGdiAlphaBlend( HDC hdc_dst, int x_dst, int y_dst, int width_dst, int height_dst,
+ HDC hdc_src, int x_src, int y_src, int width_src, int height_src,
+ BLENDFUNCTION blend_function, HANDLE xform );
BOOL WINAPI NtGdiAngleArc( HDC hdc, INT x, INT y, DWORD radius, FLOAT start_angle,
FLOAT sweep_angle );
BOOL WINAPI NtGdiArcInternal( UINT type, HDC hdc, INT left, INT top, INT right, INT bottom,
More information about the wine-cvs
mailing list