Michael Kaufmann : gdi: Fix GetObject for bitmaps.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 17 04:47:17 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: f6097f5b5199e15544be7d2861d6461e6081ac18
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f6097f5b5199e15544be7d2861d6461e6081ac18
Author: Michael Kaufmann <hallo at michael-kaufmann.ch>
Date: Tue May 9 15:51:12 2006 +0200
gdi: Fix GetObject for bitmaps.
- GetObject(): Set the bmBits member of the BITMAP structure to NULL
for device-dependent bitmaps.
- New test case.
---
dlls/gdi/bitmap.c | 4 +++-
dlls/gdi/gdi_private.h | 2 +-
dlls/gdi/tests/bitmap.c | 20 ++++++++++++++++++++
dlls/x11drv/bitmap.c | 6 +++---
dlls/x11drv/winex11.drv.spec | 2 +-
5 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi/bitmap.c b/dlls/gdi/bitmap.c
index 3186443..4d5cd71 100644
--- a/dlls/gdi/bitmap.c
+++ b/dlls/gdi/bitmap.c
@@ -528,7 +528,8 @@ BOOL BITMAP_SetOwnerDC( HBITMAP hbitmap,
ret = TRUE;
if (!bitmap->funcs) /* not owned by a DC yet */
{
- if (dc->funcs->pCreateBitmap) ret = dc->funcs->pCreateBitmap( dc->physDev, hbitmap );
+ if (dc->funcs->pCreateBitmap) ret = dc->funcs->pCreateBitmap( dc->physDev, hbitmap,
+ bitmap->bitmap.bmBits );
if (ret) bitmap->funcs = dc->funcs;
}
else if (bitmap->funcs != dc->funcs)
@@ -705,6 +706,7 @@ static INT BITMAP_GetObject( HGDIOBJ han
else
{
memcpy( buffer, &bmp->bitmap, sizeof(BITMAP) );
+ ((BITMAP *) buffer)->bmBits = NULL;
return sizeof(BITMAP);
}
}
diff --git a/dlls/gdi/gdi_private.h b/dlls/gdi/gdi_private.h
index dfdb008..fd06263 100644
--- a/dlls/gdi/gdi_private.h
+++ b/dlls/gdi/gdi_private.h
@@ -72,7 +72,7 @@ typedef struct tagDC_FUNCS
INT (*pChoosePixelFormat)(PHYSDEV,const PIXELFORMATDESCRIPTOR *);
BOOL (*pChord)(PHYSDEV,INT,INT,INT,INT,INT,INT,INT,INT);
BOOL (*pCloseFigure)(PHYSDEV);
- BOOL (*pCreateBitmap)(PHYSDEV,HBITMAP);
+ BOOL (*pCreateBitmap)(PHYSDEV,HBITMAP,LPVOID);
BOOL (*pCreateDC)(HDC,PHYSDEV *,LPCWSTR,LPCWSTR,LPCWSTR,const DEVMODEW*);
HBITMAP (*pCreateDIBSection)(PHYSDEV,HBITMAP,const BITMAPINFO *,UINT);
BOOL (*pDeleteBitmap)(HBITMAP);
diff --git a/dlls/gdi/tests/bitmap.c b/dlls/gdi/tests/bitmap.c
index ff16f8d..af7a0d2 100644
--- a/dlls/gdi/tests/bitmap.c
+++ b/dlls/gdi/tests/bitmap.c
@@ -1001,6 +1001,25 @@ static void test_bitmap(void)
DeleteDC(hdc);
}
+static void test_bmBits(void)
+{
+ BYTE bits[4];
+ HBITMAP hbmp;
+ BITMAP bmp;
+
+ memset(bits, 0, sizeof(bits));
+ hbmp = CreateBitmap(2, 2, 1, 4, bits);
+ ok(hbmp != NULL, "CreateBitmap failed\n");
+
+ memset(&bmp, 0xFF, sizeof(bmp));
+ ok(GetObject(hbmp, sizeof(bmp), &bmp) == sizeof(bmp),
+ "GetObject failed or returned a wrong structure size\n");
+ ok(!bmp.bmBits, "bmBits must be NULL for device-dependent bitmaps\n");
+
+ DeleteObject(hbmp);
+}
+
+
START_TEST(bitmap)
{
is_win9x = GetWindowLongPtrW(GetDesktopWindow(), GWLP_WNDPROC) == 0;
@@ -1009,4 +1028,5 @@ START_TEST(bitmap)
test_dibsections();
test_mono_dibsection();
test_bitmap();
+ test_bmBits();
}
diff --git a/dlls/x11drv/bitmap.c b/dlls/x11drv/bitmap.c
index 060102f..0f958d7 100644
--- a/dlls/x11drv/bitmap.c
+++ b/dlls/x11drv/bitmap.c
@@ -106,7 +106,7 @@ HBITMAP X11DRV_SelectBitmap( X11DRV_PDEV
*
* Returns TRUE on success else FALSE
*/
-BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap )
+BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, LPVOID bmBits )
{
X_PHYSBITMAP *physBitmap;
BITMAP bitmap;
@@ -145,9 +145,9 @@ BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE
return FALSE;
}
- if (bitmap.bmBits) /* Set bitmap bits */
+ if (bmBits) /* Set bitmap bits */
{
- X11DRV_SetBitmapBits( hbitmap, bitmap.bmBits, bitmap.bmHeight * bitmap.bmWidthBytes );
+ X11DRV_SetBitmapBits( hbitmap, bmBits, bitmap.bmHeight * bitmap.bmWidthBytes );
}
else /* else clear the bitmap */
{
diff --git a/dlls/x11drv/winex11.drv.spec b/dlls/x11drv/winex11.drv.spec
index 1a835a9..9c33ce4 100644
--- a/dlls/x11drv/winex11.drv.spec
+++ b/dlls/x11drv/winex11.drv.spec
@@ -5,7 +5,7 @@ # GDI driver
@ cdecl BitBlt(ptr long long long long ptr long long long) X11DRV_BitBlt
@ cdecl ChoosePixelFormat(ptr ptr) X11DRV_ChoosePixelFormat
@ cdecl Chord(ptr long long long long long long long long) X11DRV_Chord
-@ cdecl CreateBitmap(ptr long) X11DRV_CreateBitmap
+@ cdecl CreateBitmap(ptr long ptr) X11DRV_CreateBitmap
@ cdecl CreateDC(long ptr wstr wstr wstr ptr) X11DRV_CreateDC
@ cdecl CreateDIBSection(ptr long ptr long) X11DRV_CreateDIBSection
@ cdecl DeleteBitmap(long) X11DRV_DeleteBitmap
More information about the wine-cvs
mailing list