Huw Davies : gdi32: Simplify dibdrv_GetImage by merging the stand-alone and selected bitmap cases .
Alexandre Julliard
julliard at winehq.org
Fri Aug 5 10:20:50 CDT 2011
Module: wine
Branch: master
Commit: c5f484597f4660b5b71c3a84122d9baf69236127
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5f484597f4660b5b71c3a84122d9baf69236127
Author: Huw Davies <huw at codeweavers.com>
Date: Fri Aug 5 13:20:32 2011 +0100
gdi32: Simplify dibdrv_GetImage by merging the stand-alone and selected bitmap cases.
---
dlls/gdi32/dibdrv/dc.c | 74 +++++++++++++++++-------------------------------
1 files changed, 26 insertions(+), 48 deletions(-)
diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c
index b0fe47f..6ffb554 100644
--- a/dlls/gdi32/dibdrv/dc.c
+++ b/dlls/gdi32/dibdrv/dc.c
@@ -380,6 +380,9 @@ static void set_color_info( const dib_info *dib, BITMAPINFO *info )
static DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
struct gdi_image_bits *bits, struct bitblt_coords *src )
{
+ DWORD ret = ERROR_SUCCESS;
+ dib_info *dib, stand_alone;
+
TRACE( "%p %p %p\n", dev, hbitmap, info );
info->bmiHeader.biSize = sizeof(info->bmiHeader);
@@ -397,64 +400,39 @@ static DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
if (!bmp) return ERROR_INVALID_HANDLE;
assert(bmp->dib);
- info->bmiHeader.biWidth = bmp->dib->dsBmih.biWidth;
- info->bmiHeader.biHeight = bmp->dib->dsBmih.biHeight;
- info->bmiHeader.biBitCount = bmp->dib->dsBmih.biBitCount;
- info->bmiHeader.biSizeImage = get_dib_image_size( (BITMAPINFO *)&bmp->dib->dsBmih );
-
- switch (info->bmiHeader.biBitCount)
- {
- case 1:
- case 4:
- case 8:
- if (bmp->color_table)
- {
- info->bmiHeader.biClrUsed = min( bmp->nb_colors, 1 << info->bmiHeader.biBitCount );
- memcpy( info->bmiColors, bmp->color_table, info->bmiHeader.biClrUsed * sizeof(RGBQUAD) );
- }
- break;
- case 16:
- info->bmiHeader.biCompression = BI_BITFIELDS;
- memcpy( info->bmiColors, bmp->dib->dsBitfields, sizeof(bmp->dib->dsBitfields) );
- break;
- case 32:
- if (bmp->dib->dsBmih.biCompression == BI_BITFIELDS &&
- memcmp( bmp->dib->dsBitfields, bit_fields_888, sizeof(bmp->dib->dsBitfields) ))
- {
- info->bmiHeader.biCompression = BI_BITFIELDS;
- memcpy( info->bmiColors, bmp->dib->dsBitfields, sizeof(bmp->dib->dsBitfields) );
- }
- break;
- }
- if (bits)
+ if (!init_dib_info( &stand_alone, &bmp->dib->dsBmih, bmp->dib->dsBitfields,
+ bmp->color_table, bmp->nb_colors, bmp->dib->dsBm.bmBits, 0 ))
{
- bits->ptr = bmp->dib->dsBm.bmBits;
- bits->is_copy = FALSE;
- bits->free = NULL;
+ ret = ERROR_BAD_FORMAT;
+ goto done;
}
- GDI_ReleaseObj( hbitmap );
+ dib = &stand_alone;
}
else
{
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
+ dib = &pdev->dib;
+ }
- info->bmiHeader.biWidth = pdev->dib.width;
- info->bmiHeader.biHeight = pdev->dib.stride > 0 ? -pdev->dib.height : pdev->dib.height;
- info->bmiHeader.biBitCount = pdev->dib.bit_count;
- info->bmiHeader.biSizeImage = pdev->dib.height * abs(pdev->dib.stride);
+ info->bmiHeader.biWidth = dib->width;
+ info->bmiHeader.biHeight = dib->stride > 0 ? -dib->height : dib->height;
+ info->bmiHeader.biBitCount = dib->bit_count;
+ info->bmiHeader.biSizeImage = dib->height * abs( dib->stride );
- set_color_info( &pdev->dib, info );
+ set_color_info( dib, info );
- if (bits)
- {
- bits->ptr = pdev->dib.bits;
- if (pdev->dib.stride < 0)
- bits->ptr = (char *)bits->ptr + (pdev->dib.height - 1) * pdev->dib.stride;
- bits->is_copy = FALSE;
- bits->free = NULL;
- }
+ if (bits)
+ {
+ bits->ptr = dib->bits;
+ if (dib->stride < 0)
+ bits->ptr = (char *)bits->ptr + (dib->height - 1) * dib->stride;
+ bits->is_copy = FALSE;
+ bits->free = NULL;
}
- return ERROR_SUCCESS;
+
+done:
+ if (hbitmap) GDI_ReleaseObj( hbitmap );
+ return ret;
}
static BOOL matching_color_info( const dib_info *dib, const BITMAPINFO *info )
More information about the wine-cvs
mailing list