Module: wine Branch: master Commit: cf85fb14abcc60188bc77bb8adb4a5740cdf2537 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf85fb14abcc60188bc77bb8ad...
Author: Alexandre Julliard julliard@winehq.org Date: Tue May 29 14:24:11 2012 +0200
gdi32: Add a helper function that implements GetImage on a bitmap.
---
dlls/gdi32/bitmap.c | 2 +- dlls/gdi32/brush.c | 2 +- dlls/gdi32/dib.c | 2 +- dlls/gdi32/dibdrv/bitblt.c | 74 ++++++++++++++++++++++--------------------- dlls/gdi32/gdi_private.h | 2 + 5 files changed, 43 insertions(+), 39 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c index c0d6810..a8e4b2b 100644 --- a/dlls/gdi32/bitmap.c +++ b/dlls/gdi32/bitmap.c @@ -265,7 +265,7 @@ LONG WINAPI GetBitmapBits( src.width = src.visrect.right - src.visrect.left; src.height = src.visrect.bottom - src.visrect.top;
- if (!bmp->funcs->pGetImage( NULL, hbitmap, info, &src_bits, &src )) + if (!get_image_from_bitmap( bmp, info, &src_bits, &src )) { const char *src_ptr = src_bits.ptr; int src_stride = get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ); diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c index 16440dc..0516a0f 100644 --- a/dlls/gdi32/brush.c +++ b/dlls/gdi32/brush.c @@ -69,7 +69,7 @@ static BOOL copy_bitmap( struct brush_pattern *brush, HBITMAP bitmap ) src.visrect.top = src.y = 0; src.visrect.right = src.width = bmp->dib.dsBm.bmWidth; src.visrect.bottom = src.height = bmp->dib.dsBm.bmHeight; - if (bmp->funcs->pGetImage( NULL, bitmap, info, &bits, &src )) goto done; + if (get_image_from_bitmap( bmp, info, &bits, &src )) goto done;
brush->bits = bits; if (!bits.free) diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index 2cd68be..5eaa48c 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -1334,7 +1334,7 @@ INT WINAPI GetDIBits( lines = src.height; }
- err = bmp->funcs->pGetImage( NULL, hbitmap, src_info, bits ? &src_bits : NULL, bits ? &src : NULL ); + err = get_image_from_bitmap( bmp, src_info, bits ? &src_bits : NULL, bits ? &src : NULL );
if (err) goto done;
diff --git a/dlls/gdi32/dibdrv/bitblt.c b/dlls/gdi32/dibdrv/bitblt.c index 5abfd75..a20bed5 100644 --- a/dlls/gdi32/dibdrv/bitblt.c +++ b/dlls/gdi32/dibdrv/bitblt.c @@ -808,46 +808,19 @@ static void set_color_info( const dib_info *dib, BITMAPINFO *info ) } }
-/*********************************************************************** - * dibdrv_GetImage - */ -DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info, - struct gdi_image_bits *bits, struct bitblt_coords *src ) +static DWORD get_image_dib_info( dib_info *dib, BITMAPINFO *info, + struct gdi_image_bits *bits, struct bitblt_coords *src ) { - DWORD ret = ERROR_SUCCESS; - dib_info *dib = NULL, stand_alone; - - TRACE( "%p %p %p\n", dev, hbitmap, info ); - info->bmiHeader.biSize = sizeof(info->bmiHeader); info->bmiHeader.biPlanes = 1; info->bmiHeader.biCompression = BI_RGB; info->bmiHeader.biXPelsPerMeter = 0; info->bmiHeader.biYPelsPerMeter = 0; info->bmiHeader.biClrImportant = 0; - - if (hbitmap) - { - BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, OBJ_BITMAP ); - - if (!bmp) return ERROR_INVALID_HANDLE; - if (!init_dib_info_from_bitmapobj( &stand_alone, bmp )) - { - ret = ERROR_OUTOFMEMORY; - goto done; - } - dib = &stand_alone; - } - else - { - dibdrv_physdev *pdev = get_dibdrv_pdev(dev); - dib = &pdev->dib; - } - - info->bmiHeader.biWidth = dib->width; - info->bmiHeader.biHeight = dib->rect.bottom - dib->rect.top; - info->bmiHeader.biBitCount = dib->bit_count; - info->bmiHeader.biSizeImage = info->bmiHeader.biHeight * abs( dib->stride ); + info->bmiHeader.biWidth = dib->width; + info->bmiHeader.biHeight = dib->rect.bottom - dib->rect.top; + info->bmiHeader.biBitCount = dib->bit_count; + info->bmiHeader.biSizeImage = info->bmiHeader.biHeight * abs( dib->stride ); if (dib->stride > 0) info->bmiHeader.biHeight = -info->bmiHeader.biHeight;
set_color_info( dib, info ); @@ -863,10 +836,39 @@ DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info, src->x += dib->rect.left; offset_rect( &src->visrect, dib->rect.left, 0 ); } + return ERROR_SUCCESS; +}
-done: - if (hbitmap) GDI_ReleaseObj( hbitmap ); - return ret; +DWORD get_image_from_bitmap( BITMAPOBJ *bmp, BITMAPINFO *info, + struct gdi_image_bits *bits, struct bitblt_coords *src ) +{ + dib_info dib; + + if (!init_dib_info_from_bitmapobj( &dib, bmp )) return ERROR_OUTOFMEMORY; + return get_image_dib_info( &dib, info, bits, src ); +} + +/*********************************************************************** + * dibdrv_GetImage + */ +DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info, + struct gdi_image_bits *bits, struct bitblt_coords *src ) +{ + dibdrv_physdev *pdev = get_dibdrv_pdev(dev); + + TRACE( "%p %p %p\n", dev, hbitmap, info ); + + if (hbitmap) + { + DWORD ret; + BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, OBJ_BITMAP ); + if (!bmp) return ERROR_INVALID_HANDLE; + ret = get_image_from_bitmap( bmp, info, bits, src ); + GDI_ReleaseObj( hbitmap ); + return ret; + } + + return get_image_dib_info( &pdev->dib, info, bits, src ); }
static BOOL matching_color_info( const dib_info *dib, const BITMAPINFO *info ) diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 6872093..029937e 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -269,6 +269,8 @@ extern COLORREF get_pixel_bitmapinfo( const BITMAPINFO *info, void *bits, struct extern BOOL render_aa_text_bitmapinfo( HDC hdc, BITMAPINFO *info, struct gdi_image_bits *bits, struct bitblt_coords *src, INT x, INT y, UINT flags, UINT aa_flags, LPCWSTR str, UINT count, const INT *dx ) DECLSPEC_HIDDEN; +extern DWORD get_image_from_bitmap( BITMAPOBJ *bmp, BITMAPINFO *info, + struct gdi_image_bits *bits, struct bitblt_coords *src ) DECLSPEC_HIDDEN;
/* driver.c */ extern const struct gdi_dc_funcs null_driver DECLSPEC_HIDDEN;