Jacek Caban : gdi32: Use NtGdiBitBlt for BitBlt.

Alexandre Julliard julliard at winehq.org
Thu Aug 12 16:35:20 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Aug 12 12:00:25 2021 +0200

gdi32: Use NtGdiBitBlt for BitBlt.

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          |  9 ++++-----
 dlls/gdi32/enhmfdrv/bitblt.c | 12 ++++++++----
 dlls/gdi32/gdi_private.h     |  4 ++++
 dlls/gdi32/gdidc.c           | 18 ++++++++++++++++++
 dlls/gdi32/mfdrv/bitblt.c    | 42 +++++++++++++++++++++++++++---------------
 include/ntgdi.h              |  2 ++
 6 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index df3c658c53b..fd505b13407 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -569,12 +569,11 @@ BOOL WINAPI NtGdiPatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWOR
 /***********************************************************************
  *           BitBlt    (GDI32.@)
  */
-BOOL WINAPI DECLSPEC_HOTPATCH BitBlt( HDC hdcDst, INT xDst, INT yDst, INT width,
-                                      INT height, HDC hdcSrc, INT xSrc, INT ySrc, DWORD rop )
+BOOL WINAPI NtGdiBitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height,
+                         HDC hdc_src, INT x_src, INT y_src, DWORD rop, DWORD bk_color, FLONG fl )
 {
-    if (!rop_uses_src( rop )) return PatBlt( hdcDst, xDst, yDst, width, height, rop );
-    else return StretchBlt( hdcDst, xDst, yDst, width, height,
-                            hdcSrc, xSrc, ySrc, width, height, rop );
+    return NtGdiStretchBlt( hdc_dst, x_dst, y_dst, width, height,
+                            hdc_src, x_src, y_src, width, height, rop, bk_color );
 }
 
 
diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c
index 8bd30ffb671..9d930d17591 100644
--- a/dlls/gdi32/enhmfdrv/bitblt.c
+++ b/dlls/gdi32/enhmfdrv/bitblt.c
@@ -215,15 +215,19 @@ static inline BOOL rop_uses_src( DWORD rop )
     return ((rop >> 2) & 0x330000) != (rop & 0x330000);
 }
 
+BOOL EMFDC_BitBlt( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width, INT height,
+                   HDC hdc_src, INT x_src, INT y_src, DWORD rop )
+{
+    if (!rop_uses_src( rop )) return EMFDC_PatBlt( dc_attr, x_dst, y_dst, width, height, rop );
+    return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width, height,
+                              hdc_src, x_src, y_src, width, height, rop, EMR_BITBLT );
+}
+
 BOOL EMFDC_StretchBlt( 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,
                        DWORD rop )
 {
     if (!rop_uses_src( rop )) return EMFDC_PatBlt( dc_attr, x_dst, y_dst, width_dst, height_dst, rop );
-    if (width_src == width_dst && height_src == height_dst)
-        return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst,
-                                  hdc_src, x_src, y_src, width_src,
-                                  height_src, rop, EMR_BITBLT );
     return emfdrv_stretchblt( dc_attr->emf, x_dst, y_dst, width_dst, height_dst,
                               hdc_src, x_src, y_src, width_src,
                               height_src, rop, EMR_STRETCHBLT );
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 44542f4ca26..3b99eb49d5d 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -48,6 +48,8 @@ static inline BOOL is_meta_dc( HDC hdc )
 
 extern BOOL METADC_Arc( HDC hdc, INT left, INT top, INT right, INT bottom,
                         INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
+extern BOOL METADC_BitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height,
+                           HDC hdc_src, INT x_src, INT y_src, DWORD rop );
 extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart,
                           INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
 extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
@@ -116,6 +118,8 @@ extern BOOL EMFDC_ArcChordPie( DC_ATTR *dc_attr, INT left, INT top, INT right,
                                INT bottom, INT xstart, INT ystart, INT xend,
                                INT yend, DWORD type ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_BeginPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_BitBlt( DC_ATTR *dc_attr, INT x_dst, INT y_dst, INT width, INT height,
+                          HDC hdc_src, INT x_src, INT y_src, DWORD rop );
 extern BOOL EMFDC_CloseFigure( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right,
                            INT bottom ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index f0b46fda854..685396f6893 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -1195,6 +1195,24 @@ BOOL WINAPI PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop
     return NtGdiPatBlt( hdc, left, top, width, height, rop );
 }
 
+/***********************************************************************
+ *           BitBlt    (GDI32.@)
+ */
+BOOL WINAPI DECLSPEC_HOTPATCH BitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height,
+                                      HDC hdc_src, INT x_src, INT y_src, DWORD rop )
+{
+    DC_ATTR *dc_attr;
+
+    if (is_meta_dc( hdc_dst )) return METADC_BitBlt( hdc_dst, x_dst, y_dst, width, height,
+                                                 hdc_src, x_src, y_src, rop );
+    if (!(dc_attr = get_dc_attr( hdc_dst ))) return FALSE;
+    if (dc_attr->emf && !EMFDC_BitBlt( dc_attr, x_dst, y_dst, width, height,
+                                       hdc_src, x_src, y_src, rop ))
+        return FALSE;
+    return NtGdiBitBlt( hdc_dst, x_dst, y_dst, width, height,
+                        hdc_src, x_src, y_src, rop, 0 /* FIXME */, 0 /* FIXME */ );
+}
+
 /***********************************************************************
  *           StretchBlt    (GDI32.@)
  */
diff --git a/dlls/gdi32/mfdrv/bitblt.c b/dlls/gdi32/mfdrv/bitblt.c
index 9bbecff9283..def8b5f9ee1 100644
--- a/dlls/gdi32/mfdrv/bitblt.c
+++ b/dlls/gdi32/mfdrv/bitblt.c
@@ -37,10 +37,11 @@ BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop
 
 static BOOL metadc_stretchblt( HDC hdc, 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,
-                               DWORD rop )
+                               DWORD rop, WORD type )
 {
     BITMAPINFO src_info = {{ sizeof( src_info.bmiHeader ) }};
     UINT bmi_size, size, bpp;
+    int i = 0, bitmap_offset;
     BITMAPINFO *bmi;
     METARECORD *mr;
     HBITMAP bitmap;
@@ -57,11 +58,12 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT
     else
         bmi_size = sizeof(BITMAPINFOHEADER);
 
-    size = FIELD_OFFSET( METARECORD, rdParm[10] ) + bmi_size +
+    bitmap_offset = type == META_DIBBITBLT ? 8 : 10;
+    size = FIELD_OFFSET( METARECORD, rdParm[bitmap_offset] ) + bmi_size +
         src_info.bmiHeader.biSizeImage;
     if (!(mr = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE;
-    mr->rdFunction = META_DIBSTRETCHBLT;
-    bmi = (BITMAPINFO *)&mr->rdParm[10];
+    mr->rdFunction = type;
+    bmi = (BITMAPINFO *)&mr->rdParm[bitmap_offset];
     bmi->bmiHeader = src_info.bmiHeader;
     TRACE( "size = %u  rop=%x\n", size, rop );
 
@@ -70,16 +72,19 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT
     if (ret)
     {
         mr->rdSize = size / sizeof(WORD);
-        mr->rdParm[0] = LOWORD(rop);
-        mr->rdParm[1] = HIWORD(rop);
-        mr->rdParm[2] = height_src;
-        mr->rdParm[3] = width_src;
-        mr->rdParm[4] = y_src;
-        mr->rdParm[5] = x_src;
-        mr->rdParm[6] = height_dst;
-        mr->rdParm[7] = width_dst;
-        mr->rdParm[8] = y_dst;
-        mr->rdParm[9] = x_dst;
+        mr->rdParm[i++] = LOWORD(rop);
+        mr->rdParm[i++] = HIWORD(rop);
+        if (bitmap_offset > 8)
+        {
+            mr->rdParm[i++] = height_src;
+            mr->rdParm[i++] = width_src;
+        }
+        mr->rdParm[i++] = y_src;
+        mr->rdParm[i++] = x_src;
+        mr->rdParm[i++] = height_dst;
+        mr->rdParm[i++] = width_dst;
+        mr->rdParm[i++] = y_dst;
+        mr->rdParm[i++] = x_dst;
         ret = metadc_record( hdc, mr, size );
     }
 
@@ -88,6 +93,13 @@ static BOOL metadc_stretchblt( HDC hdc, INT x_dst, INT y_dst, INT width_dst, INT
 }
 
 
+BOOL METADC_BitBlt( HDC hdc, INT x_dst, INT y_dst, INT width, INT height,
+                    HDC hdc_src, INT x_src, INT y_src, DWORD rop )
+{
+    return metadc_stretchblt( hdc, x_dst, y_dst, width, height,
+                              hdc_src, x_src, y_src, width, height, rop, META_DIBBITBLT );
+}
+
 /***********************************************************************
  *           METADC_StretchBlt
  */
@@ -96,7 +108,7 @@ BOOL METADC_StretchBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width_dst, INT he
                         DWORD rop )
 {
     return metadc_stretchblt( hdc_dst, x_dst, y_dst, width_dst, height_dst,
-                              hdc_src, x_src, y_src, width_src, height_src, rop );
+                              hdc_src, x_src, y_src, width_src, height_src, rop, META_DIBSTRETCHBLT );
 }
 
 /***********************************************************************
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 37d627d4666..63547f5bd4a 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -150,6 +150,8 @@ BOOL     WINAPI NtGdiAngleArc( HDC hdc, INT x, INT y, DWORD radius, FLOAT start_
 BOOL     WINAPI NtGdiArcInternal( UINT type, HDC hdc, INT left, INT top, INT right, INT bottom,
                                   INT xstart, INT ystart, INT xend, INT yend );
 BOOL     WINAPI NtGdiBeginPath( HDC hdc );
+BOOL     WINAPI NtGdiBitBlt( HDC hdc_dst, INT x_dst, INT y_dst, INT width, INT height, HDC hdc_src,
+                             INT x_src, INT y_src, DWORD rop, DWORD bk_color, FLONG fl );
 BOOL     WINAPI NtGdiCancelDC( HDC hdc );
 BOOL     WINAPI NtGdiCloseFigure( HDC hdc );
 INT      WINAPI NtGdiCombineRgn( HRGN dest, HRGN src1, HRGN src2, INT mode );




More information about the wine-cvs mailing list