Alexandre Julliard : gdi32: Simplify the CreateCompatibleBitmap implementation.
Alexandre Julliard
julliard at winehq.org
Thu Jan 12 13:19:23 CST 2012
Module: wine
Branch: master
Commit: 9ecc1e070212f5218bfe743c665010f35c31c217
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ecc1e070212f5218bfe743c665010f35c31c217
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 10 21:28:19 2012 +0100
gdi32: Simplify the CreateCompatibleBitmap implementation.
---
dlls/gdi32/bitmap.c | 90 +++++++++++++--------------------------------------
1 files changed, 23 insertions(+), 67 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index a539b9d..cee9204 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -135,78 +135,34 @@ HBITMAP WINAPI CreateBitmap( INT width, INT height, UINT planes,
*/
HBITMAP WINAPI CreateCompatibleBitmap( HDC hdc, INT width, INT height)
{
- HBITMAP hbmpRet = 0;
+ char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+ BITMAPINFO *bi = (BITMAPINFO *)buffer;
+ DIBSECTION dib;
- TRACE("(%p,%d,%d) =\n", hdc, width, height);
+ TRACE("(%p,%d,%d)\n", hdc, width, height);
if (GetObjectType( hdc ) != OBJ_MEMDC)
- {
- hbmpRet = CreateBitmap(width, height,
- GetDeviceCaps(hdc, PLANES),
- GetDeviceCaps(hdc, BITSPIXEL),
- NULL);
- }
- else /* Memory DC */
- {
- DIBSECTION dib;
- HBITMAP bitmap = GetCurrentObject( hdc, OBJ_BITMAP );
- INT size = GetObjectW( bitmap, sizeof(dib), &dib );
-
- if (!size) return 0;
-
- if (size == sizeof(BITMAP))
- {
- /* A device-dependent bitmap is selected in the DC */
- hbmpRet = CreateBitmap(width, height,
- dib.dsBm.bmPlanes,
- dib.dsBm.bmBitsPixel,
- NULL);
- }
- else
- {
- /* A DIB section is selected in the DC */
- BITMAPINFO *bi;
- void *bits;
-
- /* Allocate memory for a BITMAPINFOHEADER structure and a
- color table. The maximum number of colors in a color table
- is 256 which corresponds to a bitmap with depth 8.
- Bitmaps with higher depths don't have color tables. */
- bi = HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
+ return CreateBitmap( width, height,
+ GetDeviceCaps(hdc, PLANES), GetDeviceCaps(hdc, BITSPIXEL), NULL );
- if (bi)
- {
- bi->bmiHeader.biSize = sizeof(bi->bmiHeader);
- bi->bmiHeader.biWidth = width;
- bi->bmiHeader.biHeight = height;
- bi->bmiHeader.biPlanes = dib.dsBmih.biPlanes;
- bi->bmiHeader.biBitCount = dib.dsBmih.biBitCount;
- bi->bmiHeader.biCompression = dib.dsBmih.biCompression;
- bi->bmiHeader.biSizeImage = 0;
- bi->bmiHeader.biXPelsPerMeter = dib.dsBmih.biXPelsPerMeter;
- bi->bmiHeader.biYPelsPerMeter = dib.dsBmih.biYPelsPerMeter;
- bi->bmiHeader.biClrUsed = dib.dsBmih.biClrUsed;
- bi->bmiHeader.biClrImportant = dib.dsBmih.biClrImportant;
-
- if (bi->bmiHeader.biCompression == BI_BITFIELDS)
- {
- /* Copy the color masks */
- CopyMemory(bi->bmiColors, dib.dsBitfields, 3 * sizeof(DWORD));
- }
- else if (bi->bmiHeader.biBitCount <= 8)
- {
- /* Copy the color table */
- GetDIBColorTable(hdc, 0, 256, bi->bmiColors);
- }
-
- hbmpRet = CreateDIBSection(hdc, bi, DIB_RGB_COLORS, &bits, NULL, 0);
- HeapFree(GetProcessHeap(), 0, bi);
- }
- }
+ switch (GetObjectW( GetCurrentObject( hdc, OBJ_BITMAP ), sizeof(dib), &dib ))
+ {
+ case sizeof(BITMAP): /* A device-dependent bitmap is selected in the DC */
+ return CreateBitmap( width, height, dib.dsBm.bmPlanes, dib.dsBm.bmBitsPixel, NULL );
+
+ case sizeof(DIBSECTION): /* A DIB section is selected in the DC */
+ bi->bmiHeader = dib.dsBmih;
+ bi->bmiHeader.biWidth = width;
+ bi->bmiHeader.biHeight = height;
+ if (dib.dsBmih.biCompression == BI_BITFIELDS) /* copy the color masks */
+ memcpy(bi->bmiColors, dib.dsBitfields, sizeof(dib.dsBitfields));
+ else if (dib.dsBmih.biBitCount <= 8) /* copy the color table */
+ GetDIBColorTable(hdc, 0, 256, bi->bmiColors);
+ return CreateDIBSection( hdc, bi, DIB_RGB_COLORS, NULL, NULL, 0 );
+
+ default:
+ return 0;
}
-
- TRACE("\t\t%p\n", hbmpRet);
- return hbmpRet;
}
More information about the wine-cvs
mailing list