From eca194da7f733a89fea56a4d6c481710cc1ff93a Mon Sep 17 00:00:00 2001 From: Evan Stade Date: Mon, 30 Jul 2007 19:09:19 -0700 Subject: [PATCH] gdi32: Handle PS_USERSTYLE in ExtCreatePen. --- dlls/gdi32/pen.c | 32 ++++++++++++++++++++++++++++---- dlls/gdi32/tests/pen.c | 24 ++++++------------------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/dlls/gdi32/pen.c b/dlls/gdi32/pen.c index 3dd545bfd66..2703ecc3b3c 100644 --- a/dlls/gdi32/pen.c +++ b/dlls/gdi32/pen.c @@ -123,14 +123,38 @@ HPEN WINAPI ExtCreatePen( DWORD style, DWORD width, if ((style & PS_STYLE_MASK) == PS_USERSTYLE) { - if (!style_count || (style_count > 16) || !style_bits) + if(((INT)style_count) <= 0) + return 0; + + if ((style_count > 16) || !style_bits) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } - /* FIXME: PS_USERSTYLE workaround */ - FIXME("PS_USERSTYLE not handled\n"); - style = (style & ~PS_STYLE_MASK) | PS_SOLID; + + if ((style & PS_TYPE_MASK) == PS_COSMETIC) + { + /* FIXME: PS_USERSTYLE workaround */ + FIXME("PS_COSMETIC | PS_USERSTYLE not handled\n"); + style = (style & ~PS_STYLE_MASK) | PS_SOLID; + } + else + { + UINT i; + BOOL has_neg = FALSE, all_zero = TRUE; + + for(i = 0; (i < style_count) && !has_neg; i++) + { + has_neg = has_neg || (((INT)(style_bits[i])) < 0); + all_zero = all_zero && (style_bits[i] == 0); + } + + if(all_zero || has_neg) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + } } else { diff --git a/dlls/gdi32/tests/pen.c b/dlls/gdi32/tests/pen.c index 0de3f0de423..ada892b2ae8 100644 --- a/dlls/gdi32/tests/pen.c +++ b/dlls/gdi32/tests/pen.c @@ -409,12 +409,6 @@ test_geometric_pens: ok(ext_pen.elp.elpPenStyle == pen[i].ret_style, "expected %x, got %x\n", pen[i].ret_style, ext_pen.elp.elpPenStyle); else { -if (pen[i].style == PS_USERSTYLE) -{ - todo_wine - ok(ext_pen.elp.elpPenStyle == (PS_GEOMETRIC | pen[i].style), "expected %x, got %x\n", PS_GEOMETRIC | pen[i].style, ext_pen.elp.elpPenStyle); -} -else ok(ext_pen.elp.elpPenStyle == (PS_GEOMETRIC | pen[i].style), "expected %x, got %x\n", PS_GEOMETRIC | pen[i].style, ext_pen.elp.elpPenStyle); } @@ -510,8 +504,7 @@ static void test_ps_userstyle(void) pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, 0, style); ok(pen == 0, "ExtCreatePen should fail\n"); - todo_wine - expect(0xdeadbeef, GetLastError()); + expect(0xdeadbeef, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef); @@ -523,24 +516,19 @@ static void test_ps_userstyle(void) pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, -1, style); ok(pen == 0, "ExtCreatePen should fail\n"); - todo_wine - expect(0xdeadbeef, GetLastError()); + expect(0xdeadbeef, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef); pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, 5, bad_style); - todo_wine - ok(pen == 0, "ExtCreatePen should fail\n"); - todo_wine - expect(ERROR_INVALID_PARAMETER, GetLastError()); + ok(pen == 0, "ExtCreatePen should fail\n"); + expect(ERROR_INVALID_PARAMETER, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef); pen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 50, &lb, 5, bad_style2); - todo_wine - ok(pen == 0, "ExtCreatePen should fail\n"); - todo_wine - expect(ERROR_INVALID_PARAMETER, GetLastError()); + ok(pen == 0, "ExtCreatePen should fail\n"); + expect(ERROR_INVALID_PARAMETER, GetLastError()); DeleteObject(pen); SetLastError(0xdeadbeef);