Alexandre Julliard : gdi32: Add a helper function that implements GetImage on a bitmap.
Alexandre Julliard
julliard at winehq.org
Tue May 29 13:58:03 CDT 2012
Module: wine
Branch: master
Commit: cf85fb14abcc60188bc77bb8adb4a5740cdf2537
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf85fb14abcc60188bc77bb8adb4a5740cdf2537
Author: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list