[PATCH 2/2] Fix FillRect behaviour for invalid brush passed

Nikolay Sivov bunglehead at gmail.com
Tue Dec 29 13:06:33 CST 2009


---
 dlls/user32/tests/Makefile.in |    1 +
 dlls/user32/tests/misc.c      |   69 +++++++++++++++++++++++++++++++++++++++++
 dlls/user32/uitools.c         |    6 ++--
 3 files changed, 73 insertions(+), 3 deletions(-)
 create mode 100644 dlls/user32/tests/misc.c

diff --git a/dlls/user32/tests/Makefile.in b/dlls/user32/tests/Makefile.in
index 102653f..4f4e812 100644
--- a/dlls/user32/tests/Makefile.in
+++ b/dlls/user32/tests/Makefile.in
@@ -19,6 +19,7 @@ CTESTS = \
 	input.c \
 	listbox.c \
 	menu.c \
+	misc.c \
 	monitor.c \
 	msg.c \
 	resource.c \
diff --git a/dlls/user32/tests/misc.c b/dlls/user32/tests/misc.c
new file mode 100644
index 0000000..ddb11f4
--- /dev/null
+++ b/dlls/user32/tests/misc.c
@@ -0,0 +1,69 @@
+/* Unit test suite for misc user32 helper functions
+ *
+ * Copyright 2009 Nikolay Sivov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/test.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+
+static void test_FillRect(void)
+{
+    HDC hdc, hdcmem;
+    DWORD bits[64];
+    HBITMAP hbmp, oldhbmp;
+    COLORREF col;
+    HBRUSH old_brush;
+    RECT r;
+
+    /* fill bitmap data with white */
+    memset(bits, 0xff, sizeof(bits));
+
+    hdc = GetDC(0);
+    ok( hdc != NULL, "CreateDC rets %p\n", hdc);
+    /* create a memory dc */
+    hdcmem = CreateCompatibleDC(hdc);
+    ok(hdcmem != NULL, "CreateCompatibleDC rets %p\n", hdcmem);
+    /* test monochrome bitmap: should always work */
+    hbmp = CreateBitmap(32, 32, 1, 1, bits);
+    ok(hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
+    oldhbmp = SelectObject(hdcmem, hbmp);
+    ok(oldhbmp != NULL, "SelectObject returned NULL\n"); /* a memdc always has a bitmap selected */
+    col = GetPixel(hdcmem, 0, 0);
+    ok( col == 0xffffff, "GetPixel returned %08x, expected 0xffffff\n", col);
+
+    /* select black brush */
+    old_brush = SelectObject(hdcmem, GetStockObject(BLACK_BRUSH));
+    r.left  = r.top = 0;
+    r.right = r.bottom = 5;
+    FillRect(hdcmem, &r, 0);
+    SelectObject(hdcmem, old_brush);
+    /* bitmap filled with last selected brush */
+    col = GetPixel(hdcmem, 0, 0);
+    ok(col == 0, "GetPixel returned %08x, expected 0\n", col);
+
+    SelectObject(hdcmem, oldhbmp);
+    DeleteObject(hbmp);
+    DeleteDC(hdcmem);
+    ReleaseDC(0, hdc);
+}
+
+START_TEST(misc)
+{
+    test_FillRect();
+}
diff --git a/dlls/user32/uitools.c b/dlls/user32/uitools.c
index c8e9580..80490cf 100644
--- a/dlls/user32/uitools.c
+++ b/dlls/user32/uitools.c
@@ -1425,14 +1425,14 @@ BOOL WINAPI SubtractRect( LPRECT dest, const RECT *src1, const RECT *src2 )
  */
 INT WINAPI FillRect( HDC hdc, const RECT *rect, HBRUSH hbrush )
 {
-    HBRUSH prevBrush;
+    HBRUSH prev_brush;
 
     if (hbrush <= (HBRUSH) (COLOR_MAX + 1)) hbrush = GetSysColorBrush( HandleToULong(hbrush) - 1 );
 
-    if (!(prevBrush = SelectObject( hdc, hbrush ))) return 0;
+    prev_brush = SelectObject( hdc, hbrush );
     PatBlt( hdc, rect->left, rect->top,
               rect->right - rect->left, rect->bottom - rect->top, PATCOPY );
-    SelectObject( hdc, prevBrush );
+    if (prev_brush) SelectObject( hdc, prev_brush );
     return 1;
 }
 
-- 
1.5.6.5


--=-AkVeMvYz6iUcgTt7f4A+--




More information about the wine-patches mailing list