Huw Davies : gdi32: Forward StretchBlt calls from the dib driver to the null driver.

Alexandre Julliard julliard at winehq.org
Tue Sep 27 13:00:09 CDT 2011


Module: wine
Branch: master
Commit: 9b7ea6f417a68517745203123d9df0516ebc60b1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9b7ea6f417a68517745203123d9df0516ebc60b1

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Sep 27 16:13:39 2011 +0100

gdi32: Forward StretchBlt calls from the dib driver to the null driver.

---

 dlls/gdi32/dibdrv/bitblt.c |   20 ++++++++++++++++++++
 dlls/gdi32/dibdrv/dc.c     |    2 +-
 dlls/gdi32/dibdrv/dibdrv.h |    2 ++
 dlls/gdi32/tests/bitmap.c  |    5 -----
 4 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/dlls/gdi32/dibdrv/bitblt.c b/dlls/gdi32/dibdrv/bitblt.c
index 7014fcf..48afa8e 100644
--- a/dlls/gdi32/dibdrv/bitblt.c
+++ b/dlls/gdi32/dibdrv/bitblt.c
@@ -1113,3 +1113,23 @@ DWORD stretch_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bit
     offset_rect( &src->visrect, -src->visrect.left, -src->visrect.top );
     return ERROR_SUCCESS;
 }
+
+/***********************************************************************
+ *           dibdrv_StretchBlt
+ */
+BOOL dibdrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
+                        PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop )
+{
+    BOOL ret;
+    DC *dc_dst = get_dc_ptr( dst_dev->hdc );
+
+    if (!dc_dst) return FALSE;
+
+    if (dst->width == 1 && src->width > 1) src->width--;
+    if (dst->height == 1 && src->height > 1) src->height--;
+
+    ret = dc_dst->nulldrv.funcs->pStretchBlt( &dc_dst->nulldrv, dst,
+                                              src_dev, src, rop );
+    release_dc_ptr( dc_dst );
+    return ret;
+}
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index b02ae8a..9d8391a 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -611,7 +611,7 @@ const DC_FUNCTIONS dib_driver =
     NULL,                               /* pSetWorldTransform */
     NULL,                               /* pStartDoc */
     NULL,                               /* pStartPage */
-    NULL,                               /* pStretchBlt */
+    dibdrv_StretchBlt,                  /* pStretchBlt */
     NULL,                               /* pStretchDIBits */
     NULL,                               /* pStrokeAndFillPath */
     NULL,                               /* pStrokePath */
diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h
index 155f1e9..21549f8 100644
--- a/dlls/gdi32/dibdrv/dibdrv.h
+++ b/dlls/gdi32/dibdrv/dibdrv.h
@@ -116,6 +116,8 @@ extern HBRUSH   dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) DECLSPEC_HIDDEN
 extern HPEN     dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) DECLSPEC_HIDDEN;
 extern COLORREF dibdrv_SetDCBrushColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
 extern COLORREF dibdrv_SetDCPenColor( PHYSDEV dev, COLORREF color ) DECLSPEC_HIDDEN;
+extern BOOL     dibdrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
+                                   PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
 
 static inline dibdrv_physdev *get_dibdrv_pdev( PHYSDEV dev )
 {
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index ccca315..bb4d43f 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -2866,24 +2866,20 @@ static void test_StretchBlt(void)
                              0, 0, 1, 1, 0, 0, 2, 1, expected, __LINE__);
 
     expected[0] = srcBuffer[0] & srcBuffer[1];
-todo_wine
     check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
                              0, 0, 1, 1, 0, 0, 3, 1, expected, __LINE__);
 
     expected[0] = srcBuffer[0] & srcBuffer[1] & srcBuffer[2];
-todo_wine
     check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
                              0, 0, 1, 1, 0, 0, 4, 1, expected, __LINE__);
 
     /* this doesn't happen if the src width is -ve */
     expected[0] = srcBuffer[1] & srcBuffer[2];
-todo_wine
     check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
                              0, 0, 1, 1, 2, 0, -2, 1, expected, __LINE__);
 
     /* when dst width > 1 behaviour reverts to what one would expect */
     expected[0] = srcBuffer[0] & srcBuffer[1], expected[1] = srcBuffer[2] & srcBuffer[3];
-todo_wine
     check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
                              0, 0, 2, 1, 0, 0, 4, 1, expected, __LINE__);
 
@@ -2899,7 +2895,6 @@ todo_wine
     SetViewportExtEx( hdcDst, 100, 100, NULL );
 
     expected[0] = srcBuffer[0] & srcBuffer[1] & srcBuffer[2];
-todo_wine
     check_StretchBlt_stretch(hdcDst, hdcSrc, &biDst, dstBuffer, srcBuffer,
                              0, 0, 2, 2, 0, 0, 4, 1, expected, __LINE__);
     SetMapMode( hdcDst, MM_TEXT );




More information about the wine-cvs mailing list