Alexandre Julliard : gdi32: Add an all-one alpha channel when converting a DIB for blending.

Alexandre Julliard julliard at winehq.org
Wed Oct 12 14:31:18 CDT 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 12 17:57:02 2011 +0200

gdi32: Add an all-one alpha channel when converting a DIB for blending.

---

 dlls/gdi32/bitblt.c      |    8 ++++----
 dlls/gdi32/dib.c         |    6 +++---
 dlls/gdi32/dibdrv/dc.c   |   13 ++++++++++++-
 dlls/gdi32/gdi_private.h |    2 +-
 4 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index a2a7698..e03a5c1 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -160,7 +160,7 @@ void free_heap_bits( struct gdi_image_bits *bits )
 }
 
 static DWORD convert_bits( const BITMAPINFO *src_info, struct bitblt_coords *src,
-                           BITMAPINFO *dst_info, struct gdi_image_bits *bits )
+                           BITMAPINFO *dst_info, struct gdi_image_bits *bits, BOOL add_alpha )
 {
     void *ptr;
     DWORD err;
@@ -169,7 +169,7 @@ static DWORD convert_bits( const BITMAPINFO *src_info, struct bitblt_coords *src
     if (!(ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info ))))
         return ERROR_OUTOFMEMORY;
 
-    err = convert_bitmapinfo( src_info, bits->ptr, src, dst_info, ptr );
+    err = convert_bitmapinfo( src_info, bits->ptr, src, dst_info, ptr, add_alpha );
     if (bits->free) bits->free( bits );
     bits->ptr = ptr;
     bits->is_copy = TRUE;
@@ -252,7 +252,7 @@ BOOL nulldrv_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
             dst_info->bmiHeader.biClrUsed = 1;
         }
 
-        if (!(err = convert_bits( src_info, src, dst_info, &bits )))
+        if (!(err = convert_bits( src_info, src, dst_info, &bits, FALSE )))
         {
             /* get rid of the fake 1-bpp table */
             if (dst_info->bmiHeader.biClrUsed == 1) dst_info->bmiHeader.biClrUsed = 0;
@@ -309,7 +309,7 @@ BOOL nulldrv_AlphaBlend( PHYSDEV dst_dev, struct bitblt_coords *dst,
             src_info->bmiHeader.biClrUsed = 2;
         }
 
-        err = convert_bits( src_info, src, dst_info, &bits );
+        err = convert_bits( src_info, src, dst_info, &bits, TRUE );
         if (!err) err = dst_dev->funcs->pBlendImage( dst_dev, dst_info, &bits, src, dst, func );
     }
 
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 3739cb7..56efda7 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -591,7 +591,7 @@ INT WINAPI SetDIBits( HDC hdc, HBITMAP hbitmap, UINT startscan,
         ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info ));
         if (ptr)
         {
-            err = convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, ptr );
+            err = convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, ptr, FALSE );
             if (src_bits.free) src_bits.free( &src_bits );
             src_bits.ptr = ptr;
             src_bits.is_copy = TRUE;
@@ -721,7 +721,7 @@ INT nulldrv_SetDIBitsToDevice( PHYSDEV dev, INT x_dst, INT y_dst, DWORD cx, DWOR
         ptr = HeapAlloc( GetProcessHeap(), 0, get_dib_image_size( dst_info ));
         if (ptr)
         {
-            err = convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, ptr );
+            err = convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, ptr, FALSE );
             if (src_bits.free) src_bits.free( &src_bits );
             src_bits.ptr = ptr;
             src_bits.is_copy = TRUE;
@@ -1226,7 +1226,7 @@ INT WINAPI GetDIBits(
         else
             dst_info->bmiHeader.biHeight = -src.height;
 
-        convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, bits );
+        convert_bitmapinfo( src_info, src_bits.ptr, &src, dst_info, bits, FALSE );
         if (src_bits.free) src_bits.free( &src_bits );
         ret = lines;
     }
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index f610390..883a60a 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -278,7 +278,7 @@ void copy_dib_color_info(dib_info *dst, const dib_info *src)
 }
 
 DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src,
-                          const BITMAPINFO *dst_info, void *dst_bits )
+                          const BITMAPINFO *dst_info, void *dst_bits, BOOL add_alpha )
 {
     dib_info src_dib, dst_dib;
     DWORD ret;
@@ -306,6 +306,17 @@ DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bit
     src->x -= src->visrect.left;
     src->y -= src->visrect.top;
     offset_rect( &src->visrect, -src->visrect.left, -src->visrect.top );
+
+    if (add_alpha && dst_dib.funcs == &funcs_8888 && src_dib.funcs != &funcs_8888)
+    {
+        DWORD *pixel = dst_dib.bits.ptr;
+        int x, y;
+
+        for (y = src->visrect.top; y < src->visrect.bottom; y++, pixel += dst_dib.stride / 4)
+            for (x = src->visrect.left; x < src->visrect.right; x++)
+                pixel[x] |= 0xff000000;
+    }
+
     return ERROR_SUCCESS;
 }
 
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 6a600a4..76e146b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -252,7 +252,7 @@ extern void DC_UpdateXforms( DC * dc ) DECLSPEC_HIDDEN;
 /* dib.c */
 extern int bitmap_info_size( const BITMAPINFO * info, WORD coloruse ) DECLSPEC_HIDDEN;
 extern DWORD convert_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src,
-                                 const BITMAPINFO *dst_info, void *dst_bits ) DECLSPEC_HIDDEN;
+                                 const BITMAPINFO *dst_info, void *dst_bits, BOOL add_alpha ) DECLSPEC_HIDDEN;
 
 extern DWORD stretch_bitmapinfo( const BITMAPINFO *src_info, void *src_bits, struct bitblt_coords *src,
                                  const BITMAPINFO *dst_info, void *dst_bits, struct bitblt_coords *dst,




More information about the wine-cvs mailing list