Ken Thomases : winemac: Use GetDIBits to retrieve the bitmap header when exporting a bitmap.

Alexandre Julliard julliard at winehq.org
Mon Oct 24 15:57:54 CDT 2016


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

Author: Ken Thomases <ken at codeweavers.com>
Date:   Sun Oct 23 13:03:27 2016 -0500

winemac: Use GetDIBits to retrieve the bitmap header when exporting a bitmap.

Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winemac.drv/clipboard.c | 87 ++++++++++----------------------------------
 1 file changed, 19 insertions(+), 68 deletions(-)

diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index 4c66b9f..75563ad 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -410,77 +410,28 @@ static int bitmap_info_size(const BITMAPINFO *info, WORD coloruse)
  *
  * Allocates a packed DIB and copies the bitmap data into it.
  */
-static HGLOBAL create_dib_from_bitmap(HBITMAP hBmp)
+static HGLOBAL create_dib_from_bitmap(HBITMAP bitmap)
 {
-    BITMAP bmp;
-    HDC hdc;
-    HGLOBAL hPackedDIB;
-    LPBYTE pPackedDIB;
-    LPBITMAPINFOHEADER pbmiHeader;
-    unsigned int cDataSize, cPackedSize, OffsetBits;
-    int nLinesCopied;
-
-    if (!GetObjectW(hBmp, sizeof(bmp), &bmp)) return 0;
-
-    /*
-     * A packed DIB contains a BITMAPINFO structure followed immediately by
-     * an optional color palette and the pixel data.
-     */
-
-    /* Calculate the size of the packed DIB */
-    cDataSize = abs(bmp.bmHeight) * (((bmp.bmWidth * bmp.bmBitsPixel + 31) / 8) & ~3);
-    cPackedSize = sizeof(BITMAPINFOHEADER)
-                  + ((bmp.bmBitsPixel <= 8) ? (sizeof(RGBQUAD) * (1 << bmp.bmBitsPixel)) : 0)
-                  + cDataSize;
-    /* Get the offset to the bits */
-    OffsetBits = cPackedSize - cDataSize;
-
-    /* Allocate the packed DIB */
-    TRACE("\tAllocating packed DIB of size %d\n", cPackedSize);
-    hPackedDIB = GlobalAlloc(GMEM_FIXED, cPackedSize);
-    if (!hPackedDIB)
-    {
-        WARN("Could not allocate packed DIB!\n");
-        return 0;
-    }
+    HANDLE ret = 0;
+    BITMAPINFOHEADER header;
+    HDC hdc = GetDC(0);
+    DWORD header_size;
+    BITMAPINFO *bmi;
 
-    /* A packed DIB starts with a BITMAPINFOHEADER */
-    pPackedDIB = GlobalLock(hPackedDIB);
-    pbmiHeader = (LPBITMAPINFOHEADER)pPackedDIB;
-
-    /* Init the BITMAPINFOHEADER */
-    pbmiHeader->biSize = sizeof(BITMAPINFOHEADER);
-    pbmiHeader->biWidth = bmp.bmWidth;
-    pbmiHeader->biHeight = bmp.bmHeight;
-    pbmiHeader->biPlanes = 1;
-    pbmiHeader->biBitCount = bmp.bmBitsPixel;
-    pbmiHeader->biCompression = BI_RGB;
-    pbmiHeader->biSizeImage = 0;
-    pbmiHeader->biXPelsPerMeter = pbmiHeader->biYPelsPerMeter = 0;
-    pbmiHeader->biClrUsed = 0;
-    pbmiHeader->biClrImportant = 0;
-
-    /* Retrieve the DIB bits from the bitmap and fill in the
-     * DIB color table if present */
-    hdc = GetDC(0);
-    nLinesCopied = GetDIBits(hdc,                       /* Handle to device context */
-                             hBmp,                      /* Handle to bitmap */
-                             0,                         /* First scan line to set in dest bitmap */
-                             bmp.bmHeight,              /* Number of scan lines to copy */
-                             pPackedDIB + OffsetBits,   /* [out] Address of array for bitmap bits */
-                             (LPBITMAPINFO) pbmiHeader, /* [out] Address of BITMAPINFO structure */
-                             0);                        /* RGB or palette index */
-    GlobalUnlock(hPackedDIB);
-    ReleaseDC(0, hdc);
+    memset(&header, 0, sizeof(header));
+    header.biSize = sizeof(header);
+    if (!GetDIBits(hdc, bitmap, 0, 0, NULL, (BITMAPINFO *)&header, DIB_RGB_COLORS)) goto done;
 
-    /* Cleanup if GetDIBits failed */
-    if (nLinesCopied != bmp.bmHeight)
-    {
-        TRACE("\tGetDIBits returned %d. Actual lines=%d\n", nLinesCopied, bmp.bmHeight);
-        GlobalFree(hPackedDIB);
-        hPackedDIB = 0;
-    }
-    return hPackedDIB;
+    header_size = bitmap_info_size((BITMAPINFO *)&header, DIB_RGB_COLORS);
+    if (!(ret = GlobalAlloc(GMEM_FIXED, header_size + header.biSizeImage))) goto done;
+    bmi = (BITMAPINFO *)ret;
+    memset(bmi, 0, header_size);
+    memcpy(bmi, &header, header.biSize);
+    GetDIBits(hdc, bitmap, 0, abs(header.biHeight), (char *)bmi + header_size, bmi, DIB_RGB_COLORS);
+
+done:
+    ReleaseDC(0, hdc);
+    return ret;
 }
 
 




More information about the wine-cvs mailing list