Alexandre Julliard : gdi32: Add format conversion to the null driver StretchBlt implementation.

Alexandre Julliard julliard at winehq.org
Tue Jul 19 12:42:54 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jul 19 14:10:30 2011 +0200

gdi32: Add format conversion to the null driver StretchBlt implementation.

---

 dlls/gdi32/bitblt.c |   24 ++++++++++++------------
 1 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index 8bd404c..e87ecfd 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -149,15 +149,9 @@ static void get_vis_rectangles( DC *dc_dst, struct bitblt_coords *dst,
     }
 }
 
-static DWORD convert_bits( const BITMAPINFO *src_info, struct gdi_image_bits *src_bits,
-                           const RECT *src_rect, BITMAPINFO *dst_info, struct gdi_image_bits *dst_bits )
+static void free_heap_bits( struct gdi_image_bits *bits )
 {
-    FIXME( "%u -> %u not implemented\n", src_info->bmiHeader.biBitCount, dst_info->bmiHeader.biBitCount );
-    dst_bits->ptr = src_bits->ptr;
-    dst_bits->offset = src_bits->offset;
-    dst_bits->is_copy = src_bits->is_copy;
-    dst_bits->free = NULL;
-    return ERROR_SUCCESS;
+    HeapFree( GetProcessHeap(), 0, bits->ptr );
 }
 
 /* nulldrv fallback implementation using StretchDIBits */
@@ -229,14 +223,20 @@ try_get_image:
     if (err == ERROR_BAD_FORMAT)
     {
         RECT src_rect = src->visrect;
-        offset_rect( &src_rect, src_bits.offset - src->visrect.left, -src->visrect.top );
 
-        err = convert_bits( src_info, &src_bits, &src_rect, dst_info, &dst_bits );
-        if (!err)
+        offset_rect( &src_rect, src_bits.offset - src->visrect.left, -src->visrect.top );
+        dst_info->bmiHeader.biWidth = src_rect.right - src_rect.left;
+        dst_bits.ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info ));
+        if (dst_bits.ptr)
         {
-            err = dst_dev->funcs->pPutImage( dst_dev, 0, dst_info, &dst_bits, &dst->visrect, rop );
+            dst_bits.is_copy = TRUE;
+            dst_bits.offset = 0;
+            dst_bits.free = free_heap_bits;
+            if (!(err = convert_bitmapinfo( src_info, src_bits.ptr, &src_rect, dst_info, dst_bits.ptr )))
+                err = dst_dev->funcs->pPutImage( dst_dev, 0, dst_info, &dst_bits, &dst->visrect, rop );
             if (dst_bits.free) dst_bits.free( &dst_bits );
         }
+        else err = ERROR_OUTOFMEMORY;
     }
     if (src_bits.free) src_bits.free( &src_bits );
     return !err;




More information about the wine-cvs mailing list