Vincent Povirk : gdiplus: Fix GdipCreateBitmapFromHBITMAP flipping images vertically.

Alexandre Julliard julliard at winehq.org
Wed Feb 18 10:15:26 CST 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue Feb 17 14:39:17 2009 -0600

gdiplus: Fix GdipCreateBitmapFromHBITMAP flipping images vertically.

GdipCreateBitmapFromHBITMAP currently assumes that all bitmaps are
top-down, even though a positive height (which it also assumes)
signals a bottom-up DIB. The net result is that
GdipCreateBitmapFromHBITMAP flips images vertically.

---

 dlls/gdiplus/image.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index ab70354..a229f8b 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1499,6 +1499,7 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
     BITMAP bm;
     GpStatus retval;
     PixelFormat format;
+    BYTE* bits;
 
     TRACE("%p %p %p\n", hbm, hpal, bitmap);
 
@@ -1539,8 +1540,16 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi
             return InvalidParameter;
     }
 
-    retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, bm.bmWidthBytes,
-        format, bm.bmBits, bitmap);
+    if (bm.bmBits)
+        bits = (BYTE*)bm.bmBits + (bm.bmHeight - 1) * bm.bmWidthBytes;
+    else
+    {
+        FIXME("can only get image data from DIB sections\n");
+        bits = NULL;
+    }
+
+    retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, -bm.bmWidthBytes,
+        format, bits, bitmap);
 
     return retval;
 }




More information about the wine-cvs mailing list