From 26f5e2c6e74832bcbdcf9fc0e0718b73be204201 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 7 Nov 2011 22:14:50 +0100 Subject: [PATCH] gdi32: Implement the CopyBitmap entry point in the null driver. --- dlls/gdi32/bitmap.c | 21 +++++++++++++++++++++ dlls/gdi32/dibdrv/dc.c | 10 +++++++++- dlls/gdi32/driver.c | 5 ----- dlls/gdi32/gdi_private.h | 1 + 4 files changed, 31 insertions(+), 6 deletions(-) diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c index 7407906a0a5..9042b88e337 100644 --- a/dlls/gdi32/bitmap.c +++ b/dlls/gdi32/bitmap.c @@ -65,6 +65,27 @@ DWORD nulldrv_PutImage( PHYSDEV dev, HBITMAP hbitmap, HRGN clip, BITMAPINFO *inf return dib_driver.pPutImage( NULL, hbitmap, clip, info, bits, src, dst, rop ); } +BOOL nulldrv_CopyBitmap( HBITMAP src, HBITMAP dst ) +{ + BOOL ret = TRUE; + BITMAPOBJ *src_bmp = GDI_GetObjPtr( src, OBJ_BITMAP ); + + if (!src_bmp) return FALSE; + if (src_bmp->bitmap.bmBits) + { + BITMAPOBJ *dst_bmp = GDI_GetObjPtr( dst, OBJ_BITMAP ); + int stride = get_dib_stride( dst_bmp->bitmap.bmWidth, dst_bmp->bitmap.bmBitsPixel ); + dst_bmp->bitmap.bmBits = HeapAlloc( GetProcessHeap(), 0, dst_bmp->bitmap.bmHeight * stride ); + if (dst_bmp->bitmap.bmBits) + memcpy( dst_bmp->bitmap.bmBits, src_bmp->bitmap.bmBits, dst_bmp->bitmap.bmHeight * stride ); + else + ret = FALSE; + GDI_ReleaseObj( dst ); + } + GDI_ReleaseObj( src ); + return ret; +} + /****************************************************************************** * CreateBitmap [GDI32.@] diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 3adf2466940..a91de78e946 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -390,6 +390,14 @@ static BOOL dibdrv_DeleteDC( PHYSDEV dev ) return TRUE; } +/*********************************************************************** + * dibdrv_CopyBitmap + */ +static BOOL dibdrv_CopyBitmap( HBITMAP src, HBITMAP dst ) +{ + return nulldrv_CopyBitmap( src, dst ); +} + /*********************************************************************** * dibdrv_DeleteBitmap */ @@ -523,7 +531,7 @@ const struct gdi_dc_funcs dib_driver = NULL, /* pChoosePixelFormat */ NULL, /* pChord */ NULL, /* pCloseFigure */ - NULL, /* pCopyBitmap */ + dibdrv_CopyBitmap, /* pCopyBitmap */ NULL, /* pCreateBitmap */ NULL, /* pCreateCompatibleDC */ dibdrv_CreateDC, /* pCreateDC */ diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index b72d6d78801..9b951d08fc9 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -209,11 +209,6 @@ static BOOL nulldrv_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom return TRUE; } -static BOOL nulldrv_CopyBitmap( HBITMAP src, HBITMAP dst ) -{ - return TRUE; -} - static BOOL nulldrv_CreateBitmap( PHYSDEV dev, HBITMAP bitmap ) { return TRUE; diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 9e40fc52625..ab5cf251d7c 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -357,6 +357,7 @@ extern BOOL nulldrv_BeginPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern DWORD nulldrv_BlendImage( PHYSDEV dev, BITMAPINFO *info, const struct gdi_image_bits *bits, struct bitblt_coords *src, struct bitblt_coords *dst, BLENDFUNCTION func ) DECLSPEC_HIDDEN; extern BOOL nulldrv_CloseFigure( PHYSDEV dev ) DECLSPEC_HIDDEN; +extern BOOL nulldrv_CopyBitmap( HBITMAP src, HBITMAP dst ) DECLSPEC_HIDDEN; extern BOOL nulldrv_EndPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern INT nulldrv_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern INT nulldrv_ExtSelectClipRgn( PHYSDEV dev, HRGN rgn, INT mode ) DECLSPEC_HIDDEN;