Dmitry Timoshkov : gdi32:
CreateBitmap and friends should return stock DEFAULT_BITMAP if
requested bitmap width or height is 0 .
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 5 07:44:51 CST 2007
Module: wine
Branch: master
Commit: 0510a7a5996ea7ece6c6fc9102a898a10f0b0af5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0510a7a5996ea7ece6c6fc9102a898a10f0b0af5
Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date: Sat Jan 27 17:56:31 2007 +0800
gdi32: CreateBitmap and friends should return stock DEFAULT_BITMAP if requested bitmap width or height is 0.
---
dlls/gdi32/bitmap.c | 16 +++++----
dlls/gdi32/tests/bitmap.c | 82 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 91 insertions(+), 7 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index 752c6b3..22384de 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -236,10 +236,8 @@ HBITMAP WINAPI CreateBitmapIndirect( con
BITMAPOBJ *bmpobj;
HBITMAP hbitmap;
- if (!bmp || bmp->bmType || bmp->bmPlanes != 1)
+ if (!bmp || bmp->bmType)
{
- if (bmp && bmp->bmPlanes != 1)
- FIXME("planes = %d\n", bmp->bmPlanes);
SetLastError( ERROR_INVALID_PARAMETER );
return NULL;
}
@@ -248,10 +246,7 @@ HBITMAP WINAPI CreateBitmapIndirect( con
if (!bm.bmWidth || !bm.bmHeight)
{
- bm.bmWidth = bm.bmHeight = 1;
- bm.bmPlanes = bm.bmBitsPixel = 1;
- bm.bmWidthBytes = 2;
- bm.bmBits = NULL;
+ return GetStockObject( DEFAULT_BITMAP );
}
else
{
@@ -261,6 +256,13 @@ HBITMAP WINAPI CreateBitmapIndirect( con
bm.bmWidth = -bm.bmWidth;
}
+ if (bm.bmPlanes != 1)
+ {
+ FIXME("planes = %d\n", bm.bmPlanes);
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return NULL;
+ }
+
/* Create the BITMAPOBJ */
bmpobj = GDI_AllocObject( sizeof(BITMAPOBJ), BITMAP_MAGIC,
(HGDIOBJ *)&hbitmap, &bitmap_funcs );
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index f0da8df..ee4abc3 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -1605,6 +1605,87 @@ static void test_select_object(void)
DeleteDC(hdc);
}
+static void test_mono_1x1_bmp_dbg(HBITMAP hbmp, int line)
+{
+ INT ret;
+ BITMAP bm;
+
+ ret = GetObjectType(hbmp);
+ ok_(__FILE__, line)(ret == OBJ_BITMAP, "the object %p is not bitmap\n", hbmp);
+
+ ret = GetObject(hbmp, 0, 0);
+ ok_(__FILE__, line)(ret == sizeof(BITMAP) /* XP */ ||
+ ret == sizeof(DIBSECTION) /* Win9x */, "object size %d\n", ret);
+
+ memset(&bm, 0xDA, sizeof(bm));
+ SetLastError(0xdeadbeef);
+ ret = GetObject(hbmp, sizeof(bm), &bm);
+ if (!ret) /* XP, only for curObj2 */ return;
+ ok_(__FILE__, line)(ret == sizeof(BITMAP) ||
+ ret == sizeof(DIBSECTION) /* Win9x, only for curObj2 */,
+ "GetObject returned %d, error %u\n", ret, GetLastError());
+ ok_(__FILE__, line)(bm.bmType == 0, "wrong bmType %d\n", bm.bmType);
+ ok_(__FILE__, line)(bm.bmWidth == 1, "wrong bmWidth %d\n", bm.bmWidth);
+ ok_(__FILE__, line)(bm.bmHeight == 1, "wrong bmHeight %d\n", bm.bmHeight);
+ ok_(__FILE__, line)(bm.bmWidthBytes == 2, "wrong bmWidthBytes %d\n", bm.bmWidthBytes);
+ ok_(__FILE__, line)(bm.bmPlanes == 1, "wrong bmPlanes %u\n", bm.bmPlanes);
+ ok_(__FILE__, line)(bm.bmBitsPixel == 1, "wrong bmBitsPixel %d\n", bm.bmBitsPixel);
+ ok_(__FILE__, line)(!bm.bmBits, "wrong bmBits %p\n", bm.bmBits);
+}
+
+#define test_mono_1x1_bmp(a) test_mono_1x1_bmp_dbg((a), __LINE__)
+
+static void test_CreateBitmap(void)
+{
+ HDC screenDC = GetDC(0);
+ HDC hdc = CreateCompatibleDC(screenDC);
+
+ /* all of these are the stock monochrome bitmap */
+ HBITMAP bm = CreateCompatibleBitmap(hdc, 0, 0);
+ HBITMAP bm1 = CreateCompatibleBitmap(screenDC, 0, 0);
+ HBITMAP bm4 = CreateBitmap(0, 1, 0, 0, 0);
+ HBITMAP bm5 = CreateDiscardableBitmap(hdc, 0, 0);
+ HBITMAP curObj1 = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP);
+ HBITMAP curObj2 = (HBITMAP)GetCurrentObject(screenDC, OBJ_BITMAP);
+
+ /* these 2 are not the stock monochrome bitmap */
+ HBITMAP bm2 = CreateCompatibleBitmap(hdc, 1, 1);
+ HBITMAP bm3 = CreateBitmap(1, 1, 1, 1, 0);
+
+ HBITMAP old1 = (HBITMAP)SelectObject(hdc, bm2);
+ HBITMAP old2 = (HBITMAP)SelectObject(screenDC, bm3);
+ SelectObject(hdc, old1);
+ SelectObject(screenDC, old2);
+
+ ok(bm == bm1 && bm == bm4 && bm == bm5 && bm == curObj1 && bm == old1,
+ "0: %p, 1: %p, 4: %p, 5: %p, curObj1 %p, old1 %p\n",
+ bm, bm1, bm4, bm5, curObj1, old1);
+ ok(bm != bm2 && bm != bm3, "0: %p, 2: %p, 3: %p\n", bm, bm2, bm3);
+ ok(bm != curObj2 /* XP */ || bm == curObj2 /* Win9x */,
+ "0: %p, curObj2 %p\n", bm, curObj2);
+ ok(old2 == 0, "old2 %p\n", old2);
+
+ test_mono_1x1_bmp(bm);
+ test_mono_1x1_bmp(bm1);
+ test_mono_1x1_bmp(bm2);
+ test_mono_1x1_bmp(bm3);
+ test_mono_1x1_bmp(bm4);
+ test_mono_1x1_bmp(bm5);
+ test_mono_1x1_bmp(old1);
+ test_mono_1x1_bmp(curObj1);
+ test_mono_1x1_bmp(curObj2);
+
+ DeleteObject(bm);
+ DeleteObject(bm1);
+ DeleteObject(bm2);
+ DeleteObject(bm3);
+ DeleteObject(bm4);
+ DeleteObject(bm5);
+
+ DeleteDC(hdc);
+ ReleaseDC(0, screenDC);
+}
+
START_TEST(bitmap)
{
is_win9x = GetWindowLongPtrW(GetDesktopWindow(), GWLP_WNDPROC) == 0;
@@ -1621,4 +1702,5 @@ START_TEST(bitmap)
test_GetDIBits_selected_DDB(FALSE);
test_GetDIBits();
test_select_object();
+ test_CreateBitmap();
}
More information about the wine-cvs
mailing list