Jacek Caban : gdi32: Implement CreateBitmapIndirect on top of CreateBitmap.

Alexandre Julliard julliard at winehq.org
Mon Jul 5 16:24:19 CDT 2021


Module: wine
Branch: master
Commit: 505a6b9cffa5e7081bce4326c15f4f960601760f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=505a6b9cffa5e7081bce4326c15f4f960601760f

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jul  5 13:40:45 2021 +0200

gdi32: Implement CreateBitmapIndirect on top of CreateBitmap.

Instead of the other way around.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/bitmap.c  | 121 +++++++++++++++------------------------------------
 dlls/gdi32/objects.c |  15 +++++++
 2 files changed, 49 insertions(+), 87 deletions(-)

diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index aaad76dce36..cebe2dea644 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -43,38 +43,6 @@ static const struct gdi_obj_funcs bitmap_funcs =
 };
 
 
-/******************************************************************************
- * CreateBitmap [GDI32.@]
- *
- * Creates a bitmap with the specified info.
- *
- * PARAMS
- *    width  [I] bitmap width
- *    height [I] bitmap height
- *    planes [I] Number of color planes
- *    bpp    [I] Number of bits to identify a color
- *    bits   [I] Pointer to array containing color data
- *
- * RETURNS
- *    Success: Handle to bitmap
- *    Failure: 0
- */
-HBITMAP WINAPI CreateBitmap( INT width, INT height, UINT planes,
-                             UINT bpp, LPCVOID bits )
-{
-    BITMAP bm;
-
-    bm.bmType = 0;
-    bm.bmWidth = width;
-    bm.bmHeight = height;
-    bm.bmWidthBytes = get_bitmap_stride( width, bpp );
-    bm.bmPlanes = planes;
-    bm.bmBitsPixel = bpp;
-    bm.bmBits = (LPVOID)bits;
-
-    return CreateBitmapIndirect( &bm );
-}
-
 /******************************************************************************
  * CreateCompatibleBitmap [GDI32.@]
  *
@@ -123,81 +91,57 @@ HBITMAP WINAPI CreateCompatibleBitmap( HDC hdc, INT width, INT height)
 
 
 /******************************************************************************
- * CreateBitmapIndirect [GDI32.@]
+ * CreateBitmap [GDI32.@]
  *
  * Creates a bitmap with the specified info.
- *
- * PARAMS
- *  bmp [I] Pointer to the bitmap info describing the bitmap
- *
- * RETURNS
- *    Success: Handle to bitmap
- *    Failure: NULL. Use GetLastError() to determine the cause.
- *
- * NOTES
- *  If a width or height of 0 is given, a 1x1 monochrome bitmap is returned.
  */
-HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
+HBITMAP WINAPI CreateBitmap( INT width, INT height, UINT planes,
+                             UINT bpp, const void *bits )
 {
-    BITMAP bm;
     BITMAPOBJ *bmpobj;
     HBITMAP hbitmap;
     INT dib_stride;
     SIZE_T size;
 
-    if (!bmp || bmp->bmType)
-    {
-        SetLastError( ERROR_INVALID_PARAMETER );
-        return NULL;
-    }
-
-    if (bmp->bmWidth > 0x7ffffff || bmp->bmHeight > 0x7ffffff)
+    if (width > 0x7ffffff || height > 0x7ffffff)
     {
         SetLastError( ERROR_INVALID_PARAMETER );
         return 0;
     }
 
-    bm = *bmp;
-
-    if (!bm.bmWidth || !bm.bmHeight)
-    {
+    if (!width || !height)
         return GetStockObject( DEFAULT_BITMAP );
-    }
-    else
-    {
-        if (bm.bmHeight < 0)
-            bm.bmHeight = -bm.bmHeight;
-        if (bm.bmWidth < 0)
-            bm.bmWidth = -bm.bmWidth;
-    }
 
-    if (bm.bmPlanes != 1)
+    if (height < 0)
+        height = -height;
+    if (width < 0)
+        width = -width;
+
+    if (planes != 1)
     {
-        FIXME("planes = %d\n", bm.bmPlanes);
+        FIXME("planes = %d\n", planes);
         SetLastError( ERROR_INVALID_PARAMETER );
         return NULL;
     }
 
     /* Windows only uses 1, 4, 8, 16, 24 and 32 bpp */
-    if(bm.bmBitsPixel == 1)         bm.bmBitsPixel = 1;
-    else if(bm.bmBitsPixel <= 4)    bm.bmBitsPixel = 4;
-    else if(bm.bmBitsPixel <= 8)    bm.bmBitsPixel = 8;
-    else if(bm.bmBitsPixel <= 16)   bm.bmBitsPixel = 16;
-    else if(bm.bmBitsPixel <= 24)   bm.bmBitsPixel = 24;
-    else if(bm.bmBitsPixel <= 32)   bm.bmBitsPixel = 32;
-    else {
-        WARN("Invalid bmBitsPixel %d, returning ERROR_INVALID_PARAMETER\n", bm.bmBitsPixel);
+    if(bpp == 1)         bpp = 1;
+    else if(bpp <= 4)    bpp = 4;
+    else if(bpp <= 8)    bpp = 8;
+    else if(bpp <= 16)   bpp = 16;
+    else if(bpp <= 24)   bpp = 24;
+    else if(bpp <= 32)   bpp = 32;
+    else
+    {
+        WARN("Invalid bmBitsPixel %d, returning ERROR_INVALID_PARAMETER\n", bpp);
         SetLastError(ERROR_INVALID_PARAMETER);
         return NULL;
     }
 
-    /* Windows ignores the provided bm.bmWidthBytes */
-    bm.bmWidthBytes = get_bitmap_stride( bm.bmWidth, bm.bmBitsPixel );
-
-    dib_stride = get_dib_stride( bm.bmWidth, bm.bmBitsPixel );
-    size = dib_stride * bm.bmHeight;
+    dib_stride = get_dib_stride( width, bpp );
+    size = dib_stride * height;
     /* Check for overflow (dib_stride itself must be ok because of the constraint on bm.bmWidth above). */
-    if (dib_stride != size / bm.bmHeight)
+    if (dib_stride != size / height)
     {
         SetLastError( ERROR_INVALID_PARAMETER );
         return 0;
@@ -210,8 +154,13 @@ HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
         return 0;
     }
 
-    bmpobj->dib.dsBm = bm;
-    bmpobj->dib.dsBm.bmBits = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
+    bmpobj->dib.dsBm.bmType       = 0;
+    bmpobj->dib.dsBm.bmWidth      = width;
+    bmpobj->dib.dsBm.bmHeight     = height;
+    bmpobj->dib.dsBm.bmWidthBytes = get_bitmap_stride( width, bpp );
+    bmpobj->dib.dsBm.bmPlanes     = planes;
+    bmpobj->dib.dsBm.bmBitsPixel  = bpp;
+    bmpobj->dib.dsBm.bmBits       = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size );
     if (!bmpobj->dib.dsBm.bmBits)
     {
         HeapFree( GetProcessHeap(), 0, bmpobj );
@@ -226,12 +175,10 @@ HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
         return 0;
     }
 
-    if (bm.bmBits)
-        SetBitmapBits( hbitmap, bm.bmHeight * bm.bmWidthBytes, bm.bmBits );
-
-    TRACE("%dx%d, bpp %d planes %d: returning %p\n", bm.bmWidth, bm.bmHeight,
-          bm.bmBitsPixel, bm.bmPlanes, hbitmap);
+    if (bits)
+        SetBitmapBits( hbitmap, height * bmpobj->dib.dsBm.bmWidthBytes, bits );
 
+    TRACE("%dx%d, bpp %d planes %d: returning %p\n", width, height, bpp, planes, hbitmap);
     return hbitmap;
 }
 
diff --git a/dlls/gdi32/objects.c b/dlls/gdi32/objects.c
index 0e8453f4af2..1567a02b128 100644
--- a/dlls/gdi32/objects.c
+++ b/dlls/gdi32/objects.c
@@ -186,3 +186,18 @@ HPEN WINAPI CreatePen( INT style, INT width, COLORREF color )
     if (style < 0 || style > PS_INSIDEFRAME) style = PS_SOLID;
     return NtGdiCreatePen( style, width, color, NULL );
 }
+
+/***********************************************************************
+ *           CreateBitmapIndirect (GDI32.@)
+ */
+HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
+{
+    if (!bmp || bmp->bmType)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return NULL;
+    }
+
+    return CreateBitmap( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
+                         bmp->bmBitsPixel, bmp->bmBits );
+}




More information about the wine-cvs mailing list