Alexandre Julliard : comctl32: Use GetDIBits to retrieve the default color map for an imagelist DIB section .

Alexandre Julliard julliard at winehq.org
Fri Dec 16 11:22:54 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Dec 16 14:20:05 2011 +0100

comctl32: Use GetDIBits to retrieve the default color map for an imagelist DIB section.

---

 dlls/comctl32/imagelist.c |   48 ++++++++++----------------------------------
 1 files changed, 11 insertions(+), 37 deletions(-)

diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c
index 4e71795..c1edbdf 100644
--- a/dlls/comctl32/imagelist.c
+++ b/dlls/comctl32/imagelist.c
@@ -3093,54 +3093,28 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count)
 
     if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR)
     {
-        VOID* bits;
-        BITMAPINFO *bmi;
+        char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+        BITMAPINFO *bmi = (BITMAPINFO *)buffer;
 
         TRACE("Creating DIBSection %d x %d, %d Bits per Pixel\n",
               sz.cx, sz.cy, himl->uBitsPixel);
 
-	if (himl->uBitsPixel <= ILC_COLOR8)
-	{
-	    LPPALETTEENTRY pal;
-	    ULONG i, colors;
-	    BYTE temp;
-
-	    colors = 1 << himl->uBitsPixel;
-	    bmi = Alloc(sizeof(BITMAPINFOHEADER) +
-	                    sizeof(PALETTEENTRY) * colors);
-
-	    pal = (LPPALETTEENTRY)bmi->bmiColors;
-	    GetPaletteEntries(GetStockObject(DEFAULT_PALETTE), 0, colors, pal);
-
-	    /* Swap colors returned by GetPaletteEntries so we can use them for
-	     * CreateDIBSection call. */
-	    for (i = 0; i < colors; i++)
-	    {
-	        temp = pal[i].peBlue;
-	        bmi->bmiColors[i].rgbRed = pal[i].peRed;
-	        bmi->bmiColors[i].rgbBlue = temp;
-	    }
-	}
-	else
-	{
-	    bmi = Alloc(sizeof(BITMAPINFOHEADER));
-	}
-
+        memset( buffer, 0, sizeof(buffer) );
 	bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 	bmi->bmiHeader.biWidth = sz.cx;
 	bmi->bmiHeader.biHeight = sz.cy;
 	bmi->bmiHeader.biPlanes = 1;
 	bmi->bmiHeader.biBitCount = himl->uBitsPixel;
 	bmi->bmiHeader.biCompression = BI_RGB;
-	bmi->bmiHeader.biSizeImage = 0;
-	bmi->bmiHeader.biXPelsPerMeter = 0;
-	bmi->bmiHeader.biYPelsPerMeter = 0;
-	bmi->bmiHeader.biClrUsed = 0;
-	bmi->bmiHeader.biClrImportant = 0;
-
-	hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, 0, 0);
 
-	Free (bmi);
+	if (himl->uBitsPixel <= ILC_COLOR8)
+	{
+            /* retrieve the default color map */
+            HBITMAP tmp = CreateBitmap( 1, 1, 1, 1, NULL );
+            GetDIBits( hdc, tmp, 0, 0, NULL, bmi, DIB_RGB_COLORS );
+            DeleteObject( tmp );
+	}
+	hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, 0, 0);
     }
     else /*if (ilc == ILC_COLORDDB)*/
     {




More information about the wine-cvs mailing list