Dmitry Timoshkov : gdi32: ExtSelectClipRgn(hdc, 0, RGN_DIFF) is supposed to fail.

Alexandre Julliard julliard at winehq.org
Tue Jun 18 14:42:09 CDT 2013


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Jun 18 13:12:54 2013 +0900

gdi32: ExtSelectClipRgn(hdc, 0, RGN_DIFF) is supposed to fail.

---

 dlls/gdi32/clipping.c       |   15 +++++++++++----
 dlls/gdi32/tests/clipping.c |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c
index 572287e..ccd61d0 100644
--- a/dlls/gdi32/clipping.c
+++ b/dlls/gdi32/clipping.c
@@ -148,14 +148,21 @@ INT nulldrv_ExtSelectClipRgn( PHYSDEV dev, HRGN rgn, INT mode )
 
     if (!rgn)
     {
-        if (mode != RGN_COPY)
+        switch (mode)
         {
+        case RGN_COPY:
+            if (dc->hClipRgn) DeleteObject( dc->hClipRgn );
+            dc->hClipRgn = 0;
+            ret = SIMPLEREGION;
+            break;
+
+        case RGN_DIFF:
+            return ERROR;
+
+        default:
             FIXME("Unimplemented: hrgn NULL in mode: %d\n", mode);
             return ERROR;
         }
-        if (dc->hClipRgn) DeleteObject( dc->hClipRgn );
-        dc->hClipRgn = 0;
-        ret = SIMPLEREGION;
     }
     else
     {
diff --git a/dlls/gdi32/tests/clipping.c b/dlls/gdi32/tests/clipping.c
index 0247bbb..6257c17 100644
--- a/dlls/gdi32/tests/clipping.c
+++ b/dlls/gdi32/tests/clipping.c
@@ -2,6 +2,7 @@
  * Unit test suite for clipping
  *
  * Copyright 2005 Huw Davies
+ * Copyright 2008,2011,2013 Dmitry Timoshkov
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -388,6 +389,12 @@ static void test_memory_dc_clipping(void)
     ret = GetClipRgn(hdc, hrgn);
     ok(ret == 0, "expected 0, got %d\n", ret);
 
+    ret = ExtSelectClipRgn(hdc, 0, RGN_DIFF);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
+    ret = GetClipRgn(hdc, hrgn);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
     SelectObject(hdc, hbmp);
 
     ret = ExtSelectClipRgn(hdc, hrgn_empty, RGN_DIFF);
@@ -409,6 +416,17 @@ static void test_memory_dc_clipping(void)
     ret = RectVisible( hdc, &rc );
     ok( ret, "RectVisible failed for %d,%d-%d,%d\n", rc.left, rc.top, rc.right, rc.bottom );
 
+    ret = ExtSelectClipRgn(hdc, 0, RGN_DIFF);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
+    ret = GetClipRgn(hdc, hrgn);
+    ok(ret == 1, "expected 1, got %d\n", ret);
+
+    ret = GetRgnBox(hrgn, &rc);
+    ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
+    ok(rc.left == 0 && rc.top == 0 && rc.right == 100 && rc.bottom == 100,
+       "expected 0,0-100,100, got %d,%d-%d,%d\n", rc.left, rc.top, rc.right, rc.bottom);
+
     DeleteDC(hdc);
     DeleteObject(hrgn);
     DeleteObject(hrgn_empty);
@@ -441,6 +459,12 @@ static void test_window_dc_clipping(void)
     ret = GetClipRgn(hdc, hrgn);
     ok(ret == 0, "expected 0, got %d\n", ret);
 
+    ret = ExtSelectClipRgn(hdc, 0, RGN_DIFF);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
+    ret = GetClipRgn(hdc, hrgn);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
     ret = ExtSelectClipRgn(hdc, hrgn_empty, RGN_DIFF);
     ok(ret == SIMPLEREGION || (ret == COMPLEXREGION && GetSystemMetrics(SM_CMONITORS) > 1),
        "expected SIMPLEREGION, got %d\n", ret);
@@ -462,6 +486,18 @@ static void test_window_dc_clipping(void)
     ret = RectVisible( hdc, &rc );
     ok( ret, "RectVisible failed for %d,%d-%d,%d\n", rc.left, rc.top, rc.right, rc.bottom );
 
+    ret = ExtSelectClipRgn(hdc, 0, RGN_DIFF);
+    ok(ret == 0, "expected 0, got %d\n", ret);
+
+    ret = GetClipRgn(hdc, hrgn);
+    ok(ret == 1, "expected 1, got %d\n", ret);
+
+    ret = GetRgnBox(hrgn, &rc);
+    ok(ret == SIMPLEREGION, "expected SIMPLEREGION, got %d\n", ret);
+    ok(rc.left == 0 && rc.top == 0 && rc.right == screen_width && rc.bottom == screen_height,
+       "expected 0,0-%d,%d, got %d,%d-%d,%d\n", screen_width, screen_height,
+        rc.left, rc.top, rc.right, rc.bottom);
+
     ret = ExtSelectClipRgn(hdc, 0, RGN_COPY);
     ok(ret == SIMPLEREGION || (ret == COMPLEXREGION && GetSystemMetrics(SM_CMONITORS) > 1),
        "expected SIMPLEREGION, got %d\n", ret);




More information about the wine-cvs mailing list