Alexandre Julliard : gdi32: Add some brush tests.

Alexandre Julliard julliard at winehq.org
Tue Nov 1 13:23:24 CDT 2011


Module: wine
Branch: master
Commit: 4ec87b3e8debe3dff817f1c4170b03f41f99ab16
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ec87b3e8debe3dff817f1c4170b03f41f99ab16

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov  1 14:07:05 2011 +0100

gdi32: Add some brush tests.

---

 dlls/gdi32/brush.c       |   14 ++++-
 dlls/gdi32/tests/brush.c |  137 +++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 147 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c
index ca95f20..0beda64 100644
--- a/dlls/gdi32/brush.c
+++ b/dlls/gdi32/brush.c
@@ -108,11 +108,17 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
 
     switch (ptr->logbrush.lbStyle)
     {
+    case BS_SOLID:
+    case BS_HOLLOW:
+    case BS_HATCHED:
+        break;
+
     case BS_PATTERN8X8:
         ptr->logbrush.lbStyle = BS_PATTERN;
         /* fall through */
     case BS_PATTERN:
         ptr->logbrush.lbHatch = (ULONG_PTR)BITMAP_CopyBitmap( (HBITMAP) ptr->logbrush.lbHatch );
+        ptr->logbrush.lbColor = 0;
         if (!ptr->logbrush.lbHatch) goto error;
         break;
 
@@ -123,7 +129,6 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
         if (!ptr->logbrush.lbHatch) goto error;
         break;
 
-    case BS_DIBPATTERN8X8:
     case BS_DIBPATTERN:
        {
             BITMAPINFO* bmi;
@@ -137,9 +142,12 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
             break;
        }
 
+    case BS_DIBPATTERN8X8:
+    case BS_MONOPATTERN:
+    case BS_INDEXED:
     default:
-        if(ptr->logbrush.lbStyle > BS_MONOPATTERN) goto error;
-        break;
+        WARN( "invalid brush style %u\n", ptr->logbrush.lbStyle );
+        goto error;
     }
 
     if ((hbrush = alloc_gdi_handle( &ptr->header, OBJ_BRUSH, &brush_funcs )))
diff --git a/dlls/gdi32/tests/brush.c b/dlls/gdi32/tests/brush.c
index 2197f7e..a2767ff 100644
--- a/dlls/gdi32/tests/brush.c
+++ b/dlls/gdi32/tests/brush.c
@@ -78,8 +78,143 @@ static void test_solidbrush(void)
            "GetObject succeeded on a deleted %s brush\n", stock[i].name);
     }
 }
- 
+
+static void test_pattern_brush(void)
+{
+    char buffer[sizeof(BITMAPINFOHEADER) + 2 * sizeof(RGBQUAD) + 32 * 32 / 8];
+    BITMAPINFO *info = (BITMAPINFO *)buffer;
+    HBRUSH brush;
+    HBITMAP bitmap;
+    LOGBRUSH br;
+    INT ret;
+    void *bits;
+    DIBSECTION dib;
+    HGLOBAL mem;
+
+    bitmap = CreateBitmap( 20, 20, 1, 1, NULL );
+    ok( bitmap != NULL, "CreateBitmap failed\n" );
+    brush = CreatePatternBrush( bitmap );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_PATTERN, "wrong style %u\n", br.lbStyle );
+    ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    todo_wine ok( (HBITMAP)br.lbHatch == bitmap, "wrong handle %p/%p\n", (HBITMAP)br.lbHatch, bitmap );
+    DeleteObject( brush );
+
+    br.lbStyle = BS_PATTERN8X8;
+    br.lbColor = 0x12345;
+    br.lbHatch = (ULONG_PTR)bitmap;
+    brush = CreateBrushIndirect( &br );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_PATTERN, "wrong style %u\n", br.lbStyle );
+    ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    todo_wine ok( (HBITMAP)br.lbHatch == bitmap, "wrong handle %p/%p\n", (HBITMAP)br.lbHatch, bitmap );
+    ret = GetObjectW( bitmap, sizeof(dib), &dib );
+    ok( ret == sizeof(dib.dsBm), "wrong size %u\n", ret );
+    DeleteObject( bitmap );
+    ret = GetObjectW( bitmap, sizeof(dib), &dib );
+    ok( ret == 0, "wrong size %u\n", ret );
+    DeleteObject( brush );
+
+    memset( info, 0, sizeof(buffer) );
+    info->bmiHeader.biSize = sizeof(info->bmiHeader);
+    info->bmiHeader.biHeight = 32;
+    info->bmiHeader.biWidth = 32;
+    info->bmiHeader.biBitCount = 1;
+    info->bmiHeader.biPlanes = 1;
+    info->bmiHeader.biCompression = BI_RGB;
+    bitmap = CreateDIBSection( 0, info, DIB_RGB_COLORS, (void**)&bits, NULL, 0 );
+    ok( bitmap != NULL, "CreateDIBSection failed\n" );
+
+    /* MSDN says a DIB section is not allowed, but it works fine */
+    brush = CreatePatternBrush( bitmap );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_PATTERN, "wrong style %u\n", br.lbStyle );
+    ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    todo_wine ok( (HBITMAP)br.lbHatch == bitmap, "wrong handle %p/%p\n", (HBITMAP)br.lbHatch, bitmap );
+    ret = GetObjectW( bitmap, sizeof(dib), &dib );
+    ok( ret == sizeof(dib), "wrong size %u\n", ret );
+    DeleteObject( brush );
+    DeleteObject( bitmap );
+
+    brush = CreateDIBPatternBrushPt( info, DIB_RGB_COLORS );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_DIBPATTERN, "wrong style %u\n", br.lbStyle );
+    ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    todo_wine ok( (BITMAPINFO *)br.lbHatch == info || broken(!br.lbHatch), /* nt4 */
+        "wrong handle %p/%p\n", (BITMAPINFO *)br.lbHatch, info );
+    DeleteObject( brush );
+
+    br.lbStyle = BS_DIBPATTERNPT;
+    br.lbColor = DIB_PAL_COLORS;
+    br.lbHatch = (ULONG_PTR)info;
+    brush = CreateBrushIndirect( &br );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_DIBPATTERN, "wrong style %u\n", br.lbStyle );
+    todo_wine ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    todo_wine ok( (BITMAPINFO *)br.lbHatch == info || broken(!br.lbHatch), /* nt4 */
+        "wrong handle %p/%p\n", (BITMAPINFO *)br.lbHatch, info );
+
+    mem = GlobalAlloc( GMEM_MOVEABLE, sizeof(buffer) );
+    memcpy( GlobalLock( mem ), buffer, sizeof(buffer) );
+
+    br.lbStyle = BS_DIBPATTERN;
+    br.lbColor = DIB_PAL_COLORS;
+    br.lbHatch = (ULONG_PTR)mem;
+    brush = CreateBrushIndirect( &br );
+    ok( brush != NULL, "CreatePatternBrush failed\n" );
+    memset( &br, 0x55, sizeof(br) );
+    ret = GetObjectW( brush, sizeof(br), &br );
+    ok( ret == sizeof(br), "wrong size %u\n", ret );
+    ok( br.lbStyle == BS_DIBPATTERN, "wrong style %u\n", br.lbStyle );
+    todo_wine ok( br.lbColor == 0, "wrong color %u\n", br.lbColor );
+    ok( (HGLOBAL)br.lbHatch != mem, "wrong handle %p/%p\n", (HGLOBAL)br.lbHatch, mem );
+    bits = GlobalLock( mem );
+    todo_wine ok( (HGLOBAL)br.lbHatch == bits || broken(!br.lbHatch), /* nt4 */
+        "wrong handle %p/%p\n", (HGLOBAL)br.lbHatch, bits );
+    ret = GlobalFlags( mem );
+    ok( ret == 2, "wrong flags %x\n", ret );
+    DeleteObject( brush );
+    ret = GlobalFlags( mem );
+    ok( ret == 2, "wrong flags %x\n", ret );
+
+    br.lbStyle = BS_DIBPATTERN8X8;
+    br.lbColor = DIB_RGB_COLORS;
+    br.lbHatch = (ULONG_PTR)mem;
+    brush = CreateBrushIndirect( &br );
+    ok( !brush, "CreatePatternBrush succeeded\n" );
+
+    br.lbStyle = BS_MONOPATTERN;
+    br.lbColor = DIB_RGB_COLORS;
+    br.lbHatch = (ULONG_PTR)mem;
+    brush = CreateBrushIndirect( &br );
+    ok( !brush, "CreatePatternBrush succeeded\n" );
+
+    br.lbStyle = BS_INDEXED;
+    br.lbColor = DIB_RGB_COLORS;
+    br.lbHatch = (ULONG_PTR)mem;
+    brush = CreateBrushIndirect( &br );
+    ok( !brush, "CreatePatternBrush succeeded\n" );
+
+    GlobalFree( mem );
+}
+
 START_TEST(brush)
 {
     test_solidbrush();
+    test_pattern_brush();
 }




More information about the wine-cvs mailing list