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