Henri Verbeet : ddraw: Use the window's client rect for clipping.

Alexandre Julliard julliard at winehq.org
Fri Jan 6 15:31:34 CST 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Jan  6 11:20:03 2012 +0100

ddraw: Use the window's client rect for clipping.

---

 dlls/ddraw/clipper.c |   76 ++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 56 insertions(+), 20 deletions(-)

diff --git a/dlls/ddraw/clipper.c b/dlls/ddraw/clipper.c
index b3482e7..5b8e9ce 100644
--- a/dlls/ddraw/clipper.c
+++ b/dlls/ddraw/clipper.c
@@ -93,6 +93,32 @@ static HRESULT WINAPI ddraw_clipper_SetHWnd(IDirectDrawClipper *iface, DWORD fla
     return DD_OK;
 }
 
+static HRGN get_window_region(HWND window)
+{
+    POINT origin = {0, 0};
+    RECT client_rect;
+
+    if (!GetClientRect(window, &client_rect))
+    {
+        ERR("Failed to get client rect.\n");
+        return NULL;
+    }
+
+    if (!ClientToScreen(window, &origin))
+    {
+        ERR("Failed to translate origin.\n");
+        return NULL;
+    }
+
+    if (!OffsetRect(&client_rect, origin.x, origin.y))
+    {
+        ERR("Failed to translate client rect.\n");
+        return NULL;
+    }
+
+    return CreateRectRgnIndirect(&client_rect);
+}
+
 /*****************************************************************************
  * IDirectDrawClipper::GetClipList
  *
@@ -116,6 +142,7 @@ static HRESULT WINAPI ddraw_clipper_GetClipList(IDirectDrawClipper *iface, RECT
 {
     struct ddraw_clipper *clipper = impl_from_IDirectDrawClipper(iface);
     static unsigned int once;
+    HRGN region;
 
     TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n",
             iface, wine_dbgstr_rect(rect), clip_list, clip_list_size);
@@ -124,31 +151,40 @@ static HRESULT WINAPI ddraw_clipper_GetClipList(IDirectDrawClipper *iface, RECT
 
     if (clipper->window)
     {
-        HDC dc = GetDCEx(clipper->window, NULL, DCX_WINDOW);
-        if (dc)
+        if (!(region = get_window_region(clipper->window)))
+        {
+            wined3d_mutex_unlock();
+            ERR("Failed to get window region.\n");
+            return E_FAIL;
+        }
+
+        if (rect)
         {
-            HRGN rgn = CreateRectRgn(0, 0, 0, 0);
-            if (GetRandomRgn(dc, rgn, SYSRGN))
+            HRGN clip_region;
+            int ret;
+
+            if (!(clip_region = CreateRectRgnIndirect(rect)))
+            {
+                wined3d_mutex_unlock();
+                ERR("Failed to create region.\n");
+                DeleteObject(region);
+                return E_FAIL;
+            }
+
+            ret = CombineRgn(region, region, clip_region, RGN_AND);
+            DeleteObject(clip_region);
+            if (ret == ERROR)
             {
-                if (GetVersion() & 0x80000000)
-                {
-                    POINT origin;
-                    GetDCOrgEx(dc, &origin);
-                    OffsetRgn(rgn, origin.x, origin.y);
-                }
-                if (rect)
-                {
-                    HRGN clip_rgn = CreateRectRgn(rect->left, rect->top,
-                            rect->right, rect->bottom);
-                    CombineRgn(rgn, rgn, clip_rgn, RGN_AND);
-                    DeleteObject(clip_rgn);
-                }
-                *clip_list_size = GetRegionData(rgn, *clip_list_size, clip_list);
+                wined3d_mutex_unlock();
+                ERR("Failed to combine regions.\n");
+                DeleteObject(region);
+                return E_FAIL;
             }
-            DeleteObject(rgn);
-            ReleaseDC(clipper->window, dc);
         }
 
+        *clip_list_size = GetRegionData(region, *clip_list_size, clip_list);
+        DeleteObject(region);
+
         wined3d_mutex_unlock();
         return DD_OK;
     }




More information about the wine-cvs mailing list