gdi32: Add a helper function that implements GetImage on a bitmap.

This commit is contained in:
Alexandre Julliard 2012-05-29 14:24:11 +02:00
parent b6f25e5250
commit cf85fb14ab
5 changed files with 43 additions and 39 deletions

View File

@ -265,7 +265,7 @@ LONG WINAPI GetBitmapBits(
src.width = src.visrect.right - src.visrect.left; src.width = src.visrect.right - src.visrect.left;
src.height = src.visrect.bottom - src.visrect.top; 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; const char *src_ptr = src_bits.ptr;
int src_stride = get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ); int src_stride = get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount );

View File

@ -69,7 +69,7 @@ static BOOL copy_bitmap( struct brush_pattern *brush, HBITMAP bitmap )
src.visrect.top = src.y = 0; src.visrect.top = src.y = 0;
src.visrect.right = src.width = bmp->dib.dsBm.bmWidth; src.visrect.right = src.width = bmp->dib.dsBm.bmWidth;
src.visrect.bottom = src.height = bmp->dib.dsBm.bmHeight; 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; brush->bits = bits;
if (!bits.free) if (!bits.free)

View File

@ -1334,7 +1334,7 @@ INT WINAPI GetDIBits(
lines = src.height; 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; if (err) goto done;

View File

@ -808,46 +808,19 @@ static void set_color_info( const dib_info *dib, BITMAPINFO *info )
} }
} }
/*********************************************************************** static DWORD get_image_dib_info( dib_info *dib, BITMAPINFO *info,
* dibdrv_GetImage struct gdi_image_bits *bits, struct bitblt_coords *src )
*/
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 = NULL, stand_alone;
TRACE( "%p %p %p\n", dev, hbitmap, info );
info->bmiHeader.biSize = sizeof(info->bmiHeader); info->bmiHeader.biSize = sizeof(info->bmiHeader);
info->bmiHeader.biPlanes = 1; info->bmiHeader.biPlanes = 1;
info->bmiHeader.biCompression = BI_RGB; info->bmiHeader.biCompression = BI_RGB;
info->bmiHeader.biXPelsPerMeter = 0; info->bmiHeader.biXPelsPerMeter = 0;
info->bmiHeader.biYPelsPerMeter = 0; info->bmiHeader.biYPelsPerMeter = 0;
info->bmiHeader.biClrImportant = 0; info->bmiHeader.biClrImportant = 0;
info->bmiHeader.biWidth = dib->width;
if (hbitmap) info->bmiHeader.biHeight = dib->rect.bottom - dib->rect.top;
{ info->bmiHeader.biBitCount = dib->bit_count;
BITMAPOBJ *bmp = GDI_GetObjPtr( hbitmap, OBJ_BITMAP ); info->bmiHeader.biSizeImage = info->bmiHeader.biHeight * abs( dib->stride );
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 );
if (dib->stride > 0) info->bmiHeader.biHeight = -info->bmiHeader.biHeight; if (dib->stride > 0) info->bmiHeader.biHeight = -info->bmiHeader.biHeight;
set_color_info( dib, info ); set_color_info( dib, info );
@ -863,10 +836,39 @@ DWORD dibdrv_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
src->x += dib->rect.left; src->x += dib->rect.left;
offset_rect( &src->visrect, dib->rect.left, 0 ); offset_rect( &src->visrect, dib->rect.left, 0 );
} }
return ERROR_SUCCESS;
}
done: DWORD get_image_from_bitmap( BITMAPOBJ *bmp, BITMAPINFO *info,
if (hbitmap) GDI_ReleaseObj( hbitmap ); struct gdi_image_bits *bits, struct bitblt_coords *src )
return ret; {
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 ) static BOOL matching_color_info( const dib_info *dib, const BITMAPINFO *info )

View File

@ -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, 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, struct bitblt_coords *src, INT x, INT y, UINT flags,
UINT aa_flags, LPCWSTR str, UINT count, const INT *dx ) DECLSPEC_HIDDEN; 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 */ /* driver.c */
extern const struct gdi_dc_funcs null_driver DECLSPEC_HIDDEN; extern const struct gdi_dc_funcs null_driver DECLSPEC_HIDDEN;