diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c index c0d6810be5f..a8e4b2b4f98 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 16440dcbf40..0516a0ffafa 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 2cd68bef2b1..5eaa48ce7d9 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 5abfd75d85f..a20bed52233 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 687209346c7..029937e0d7f 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;