[PATCH 1/5] wined3d: Remove COM from the clipper implementation.

Henri Verbeet hverbeet at codeweavers.com
Thu Feb 3 13:14:03 CST 2011


---
 dlls/ddraw/clipper.c           |   20 ++-----
 dlls/ddraw/ddraw.c             |    9 +--
 dlls/ddraw/ddraw_private.h     |    2 +-
 dlls/wined3d/clipper.c         |  124 +++++++++++++++------------------------
 dlls/wined3d/surface_base.c    |    2 +-
 dlls/wined3d/wined3d.spec      |   10 +++-
 dlls/wined3d/wined3d_private.h |   12 ++--
 include/wine/wined3d.idl       |   44 ++++----------
 8 files changed, 87 insertions(+), 136 deletions(-)

diff --git a/dlls/ddraw/clipper.c b/dlls/ddraw/clipper.c
index 905f006..c9290c8 100644
--- a/dlls/ddraw/clipper.c
+++ b/dlls/ddraw/clipper.c
@@ -95,7 +95,7 @@ static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) {
     if (ref == 0)
     {
         EnterCriticalSection(&ddraw_cs);
-        IWineD3DClipper_Release(This->wineD3DClipper);
+        wined3d_clipper_decref(This->wineD3DClipper);
         HeapFree(GetProcessHeap(), 0, This);
         LeaveCriticalSection(&ddraw_cs);
         return 0;
@@ -127,9 +127,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
     TRACE("iface %p, flags %#x, window %p.\n", iface, dwFlags, hWnd);
 
     EnterCriticalSection(&ddraw_cs);
-    hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper,
-                                 dwFlags,
-                                 hWnd);
+    hr = wined3d_clipper_set_window(This->wineD3DClipper, dwFlags, hWnd);
     LeaveCriticalSection(&ddraw_cs);
     switch(hr)
     {
@@ -167,10 +165,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
             iface, wine_dbgstr_rect(lpRect), lpClipList, lpdwSize);
 
     EnterCriticalSection(&ddraw_cs);
-    hr = IWineD3DClipper_GetClipList(This->wineD3DClipper,
-                                     lpRect,
-                                     lpClipList,
-                                     lpdwSize);
+    hr = wined3d_clipper_get_clip_list(This->wineD3DClipper, lpRect, lpClipList, lpdwSize);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
@@ -198,9 +193,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
     TRACE("iface %p, clip_list %p, flags %#x.\n", iface, lprgn, dwFlag);
 
     EnterCriticalSection(&ddraw_cs);
-    hr = IWineD3DClipper_SetClipList(This->wineD3DClipper,
-                                     lprgn,
-                                     dwFlag);
+    hr = wined3d_clipper_set_clip_list(This->wineD3DClipper, lprgn, dwFlag);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
@@ -225,8 +218,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
     TRACE("iface %p, window %p.\n", iface, hWndPtr);
 
     EnterCriticalSection(&ddraw_cs);
-    hr =  IWineD3DClipper_GetHWnd(This->wineD3DClipper,
-                                  hWndPtr);
+    hr = wined3d_clipper_get_window(This->wineD3DClipper, hWndPtr);
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
@@ -307,7 +299,7 @@ HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper)
 {
     clipper->lpVtbl = &ddraw_clipper_vtbl;
     clipper->ref = 1;
-    clipper->wineD3DClipper = WineDirect3DCreateClipper();
+    clipper->wineD3DClipper = wined3d_clipper_create();
     if (!clipper->wineD3DClipper)
     {
         WARN("Failed to create wined3d clipper.\n");
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index f1ecd31..e96a379 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2516,11 +2516,11 @@ HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDE
 {
     IDirectDrawSurfaceImpl *surfImpl = (IDirectDrawSurfaceImpl *)surf;
     IDirectDrawImpl *This = surfImpl->ddraw;
+    struct wined3d_clipper *clipper = NULL;
     IWineD3DSurface *wineD3DSurface;
     IWineD3DSwapChain *swapchain;
     void *parent;
     HRESULT hr;
-    IWineD3DClipper *clipper = NULL;
 
     WINED3DSURFACE_DESC     Desc;
     enum wined3d_format_id Format;
@@ -2593,10 +2593,9 @@ HRESULT WINAPI ddraw_recreate_surfaces_cb(IDirectDrawSurface7 *surf, DDSURFACEDE
 
     surfImpl->ImplType = This->ImplType;
 
-    if(clipper)
-    {
-        IWineD3DClipper_Release(clipper);
-    }
+    if (clipper)
+        wined3d_clipper_decref(clipper);
+
     return DDENUMRET_OK;
 }
 
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index f34e11d..f883b6b 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -411,7 +411,7 @@ struct IDirectDrawClipperImpl
     const IDirectDrawClipperVtbl *lpVtbl;
     LONG ref;
 
-    IWineD3DClipper           *wineD3DClipper;
+    struct wined3d_clipper *wineD3DClipper;
     BOOL initialized;
 };
 
diff --git a/dlls/wined3d/clipper.c b/dlls/wined3d/clipper.c
index 17aaa4f..3257296 100644
--- a/dlls/wined3d/clipper.c
+++ b/dlls/wined3d/clipper.c
@@ -28,70 +28,51 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
-static HRESULT WINAPI IWineD3DClipperImpl_QueryInterface(IWineD3DClipper *iface, REFIID riid, void **object)
+ULONG CDECL wined3d_clipper_incref(struct wined3d_clipper *clipper)
 {
-    TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
+    ULONG refcount = InterlockedIncrement(&clipper->ref);
 
-    if (IsEqualGUID(riid, &IID_IWineD3DClipper)
-            || IsEqualGUID(riid, &IID_IUnknown))
-    {
-        IUnknown_AddRef(iface);
-        *object = iface;
-        return S_OK;
-    }
-
-    WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
-
-    *object = NULL;
-    return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IWineD3DClipperImpl_AddRef(IWineD3DClipper *iface )
-{
-    IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface;
-    ULONG ref = InterlockedIncrement(&This->ref);
-
-    TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
+    TRACE("%p increasing refcount to %u.\n", clipper, refcount);
 
-    return ref;
+    return refcount;
 }
 
-static ULONG WINAPI IWineD3DClipperImpl_Release(IWineD3DClipper *iface)
+ULONG CDECL wined3d_clipper_decref(struct wined3d_clipper *clipper)
 {
-    IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface;
-    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG refcount = InterlockedDecrement(&clipper->ref);
 
-    TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
+    TRACE("%p decreasing refcount to %u.\n", clipper, refcount);
 
-    if (!ref) HeapFree(GetProcessHeap(), 0, This);
+    if (!refcount)
+        HeapFree(GetProcessHeap(), 0, clipper);
 
-    return ref;
+    return refcount;
 }
 
-static HRESULT WINAPI IWineD3DClipperImpl_SetHwnd(IWineD3DClipper *iface, DWORD flags, HWND hWnd)
+HRESULT CDECL wined3d_clipper_set_window(struct wined3d_clipper *clipper, DWORD flags, HWND window)
 {
-    IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface;
+    TRACE("clipper %p, flags %#x, window %p.\n", clipper, flags, window);
 
-    TRACE("iface %p, flags %#x, window %p.\n", iface, flags, hWnd);
     if (flags)
     {
         FIXME("flags %#x, not supported.\n", flags);
         return WINED3DERR_INVALIDCALL;
     }
 
-    This->hWnd = hWnd;
+    clipper->hWnd = window;
+
     return WINED3D_OK;
 }
 
-static HRESULT WINAPI IWineD3DClipperImpl_GetClipList(IWineD3DClipper *iface, const RECT *Rect,
-        RGNDATA *ClipList, DWORD *Size)
+HRESULT CDECL wined3d_clipper_get_clip_list(const struct wined3d_clipper *clipper, const RECT *rect,
+        RGNDATA *clip_list, DWORD *clip_list_size)
 {
-    IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface;
-    TRACE("(%p,%p,%p,%p)\n", This, Rect, ClipList, Size);
+    TRACE("clipper %p, rect %s, clip_list %p, clip_list_size %p.\n",
+            clipper, wine_dbgstr_rect(rect), clip_list, clip_list_size);
 
-    if (This->hWnd)
+    if (clipper->hWnd)
     {
-        HDC hDC = GetDCEx(This->hWnd, NULL, DCX_WINDOW);
+        HDC hDC = GetDCEx(clipper->hWnd, NULL, DCX_WINDOW);
         if (hDC)
         {
             HRGN hRgn = CreateRectRgn(0,0,0,0);
@@ -101,55 +82,60 @@ static HRESULT WINAPI IWineD3DClipperImpl_GetClipList(IWineD3DClipper *iface, co
                 {
                     /* map region to screen coordinates */
                     POINT org;
-                    GetDCOrgEx( hDC, &org );
-                    OffsetRgn( hRgn, org.x, org.y );
+                    GetDCOrgEx(hDC, &org);
+                    OffsetRgn(hRgn, org.x, org.y);
                 }
-                if (Rect)
+                if (rect)
                 {
-                    HRGN hRgnClip = CreateRectRgn(Rect->left, Rect->top,
-                        Rect->right, Rect->bottom);
+                    HRGN hRgnClip = CreateRectRgn(rect->left, rect->top,
+                            rect->right, rect->bottom);
                     CombineRgn(hRgn, hRgn, hRgnClip, RGN_AND);
                     DeleteObject(hRgnClip);
                 }
-                *Size = GetRegionData(hRgn, *Size, ClipList);
+                *clip_list_size = GetRegionData(hRgn, *clip_list_size, clip_list);
             }
             DeleteObject(hRgn);
-            ReleaseDC(This->hWnd, hDC);
+            ReleaseDC(clipper->hWnd, hDC);
         }
         return WINED3D_OK;
     }
     else
     {
-        static int warned = 0;
-        if (warned++ < 10)
-            FIXME("(%p,%p,%p,%p),stub!\n",This,Rect,ClipList,Size);
-        if (Size) *Size=0;
+        static unsigned int once;
+
+        if (!once++)
+            FIXME("clipper %p, rect %s, clip_list %p, clip_list_size %p stub!\n",
+                    clipper, wine_dbgstr_rect(rect), clip_list, clip_list_size);
+
+        if (clip_list_size)
+            *clip_list_size = 0;
+
         return WINEDDERR_NOCLIPLIST;
     }
 }
 
-static HRESULT WINAPI IWineD3DClipperImpl_SetClipList(IWineD3DClipper *iface, const RGNDATA *rgn, DWORD flags)
+HRESULT CDECL wined3d_clipper_set_clip_list(struct wined3d_clipper *clipper, const RGNDATA *region, DWORD flags)
 {
-    static int warned = 0;
+    static unsigned int once;
 
-    if (warned++ < 10 || !rgn)
-        FIXME("iface %p, region %p, flags %#x stub!\n", iface, rgn, flags);
+    if (!once++ || !region)
+        FIXME("clipper %p, region %p, flags %#x stub!\n", clipper, region, flags);
 
     return WINED3D_OK;
 }
 
-static HRESULT WINAPI IWineD3DClipperImpl_GetHwnd(IWineD3DClipper *iface, HWND *hwnd)
+HRESULT CDECL wined3d_clipper_get_window(const struct wined3d_clipper *clipper, HWND *window)
 {
-    IWineD3DClipperImpl *This = (IWineD3DClipperImpl *)iface;
-    TRACE("(%p)->(%p)\n", This, hwnd);
+    TRACE("clipper %p, window %p.\n", clipper, window);
+
+    *window = clipper->hWnd;
 
-    *hwnd = This->hWnd;
     return WINED3D_OK;
 }
 
-static HRESULT WINAPI IWineD3DClipperImpl_IsClipListChanged(IWineD3DClipper *iface, BOOL *changed)
+HRESULT CDECL wined3d_clipper_is_clip_list_changed(const struct wined3d_clipper *clipper, BOOL *changed)
 {
-    FIXME("iface %p, changed %p stub!\n", iface, changed);
+    FIXME("clipper %p, changed %p stub!\n", clipper, changed);
 
     /* XXX What is safest? */
     *changed = FALSE;
@@ -157,19 +143,7 @@ static HRESULT WINAPI IWineD3DClipperImpl_IsClipListChanged(IWineD3DClipper *ifa
     return WINED3D_OK;
 }
 
-static const IWineD3DClipperVtbl IWineD3DClipper_Vtbl =
-{
-    IWineD3DClipperImpl_QueryInterface,
-    IWineD3DClipperImpl_AddRef,
-    IWineD3DClipperImpl_Release,
-    IWineD3DClipperImpl_GetClipList,
-    IWineD3DClipperImpl_GetHwnd,
-    IWineD3DClipperImpl_IsClipListChanged,
-    IWineD3DClipperImpl_SetClipList,
-    IWineD3DClipperImpl_SetHwnd
-};
-
-IWineD3DClipper * WINAPI WineDirect3DCreateClipper(void)
+struct wined3d_clipper * CDECL wined3d_clipper_create(void)
 {
     IWineD3DClipperImpl *obj;
 
@@ -182,8 +156,6 @@ IWineD3DClipper * WINAPI WineDirect3DCreateClipper(void)
         return NULL;
     }
 
-    obj->lpVtbl = &IWineD3DClipper_Vtbl;
-
-    IWineD3DClipper_AddRef((IWineD3DClipper *)obj);
+    wined3d_clipper_incref(obj);
     return (IWineD3DClipper *) obj;
 }
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 06ea80a..b28e185 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -488,7 +488,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD
 
     *clipper = (IWineD3DClipper *)This->clipper;
     if (*clipper)
-        IWineD3DClipper_AddRef(*clipper);
+        wined3d_clipper_incref(*clipper);
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 2af79e1..bc6084e 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -1,4 +1,3 @@
-@ stdcall WineDirect3DCreateClipper()
 @ stdcall wined3d_mutex_lock()
 @ stdcall wined3d_mutex_unlock()
 
@@ -20,6 +19,15 @@
 @ cdecl wined3d_incref(ptr)
 @ cdecl wined3d_register_software_device(ptr ptr)
 
+@ cdecl wined3d_clipper_create()
+@ cdecl wined3d_clipper_decref(ptr)
+@ cdecl wined3d_clipper_get_clip_list(ptr ptr ptr ptr)
+@ cdecl wined3d_clipper_get_window(ptr ptr)
+@ cdecl wined3d_clipper_incref(ptr)
+@ cdecl wined3d_clipper_is_clip_list_changed(ptr ptr)
+@ cdecl wined3d_clipper_set_clip_list(ptr ptr long)
+@ cdecl wined3d_clipper_set_window(ptr long ptr)
+
 @ cdecl wined3d_device_create(ptr long long ptr long ptr ptr)
 
 @ cdecl wined3d_palette_decref(ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2fe8e59..20da4c7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -58,6 +58,8 @@ typedef struct IWineD3DSwapChainImpl  IWineD3DSwapChainImpl;
 struct IWineD3DBaseShaderImpl;
 struct IWineD3DBaseTextureImpl;
 struct IWineD3DResourceImpl;
+typedef struct wined3d_clipper IWineD3DClipperImpl;
+typedef struct wined3d_clipper IWineD3DClipper;
 
 /* Texture format fixups */
 
@@ -2049,16 +2051,12 @@ struct fbo_entry
     GLuint id;
 };
 
-/*****************************************************************************
- * IWineD3DClipp implementation structure
- */
-typedef struct IWineD3DClipperImpl
+struct wined3d_clipper
 {
-    const IWineD3DClipperVtbl *lpVtbl;
     LONG ref;
 
     HWND hWnd;
-} IWineD3DClipperImpl;
+};
 
 enum wined3d_container_type
 {
@@ -2138,7 +2136,7 @@ struct IWineD3DSurfaceImpl
     SIZE ds_current_size;
 
     /* DirectDraw clippers */
-    struct IWineD3DClipperImpl *clipper;
+    struct wined3d_clipper *clipper;
 
     /* DirectDraw Overlay handling */
     RECT                      overlay_srcrect;
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index 6fbd52b..08850af 100644
--- a/include/wine/wined3d.idl
+++ b/include/wine/wined3d.idl
@@ -2111,6 +2111,7 @@ interface IWineD3DVolume;
 interface IWineD3DSwapChain;
 interface IWineD3DDevice;
 struct wined3d;
+struct wined3d_clipper;
 struct wined3d_palette;
 struct wined3d_stateblock;
 struct wined3d_vertex_declaration;
@@ -2238,34 +2239,6 @@ interface IWineD3DRendertargetView : IWineD3DBase
 [
     object,
     local,
-    uuid(8f2bceb1-d338-488c-ab7f-0ec980bf5d2d)
-]
-interface IWineD3DClipper : IUnknown
-{
-    HRESULT GetClipList(
-        [in] const RECT *rect,
-        [out] RGNDATA *clip_list,
-        [in, out] DWORD *clip_list_size
-    );
-    HRESULT GetHWnd(
-        [out] HWND *hwnd
-    );
-    HRESULT IsClipListChanged(
-        [out] BOOL *changed
-    );
-    HRESULT SetClipList(
-        [in] const RGNDATA *clip_list,
-        [in] DWORD flags
-    );
-    HRESULT SetHWnd(
-        [in] DWORD flags,
-        [in] HWND hwnd
-    );
-}
-
-[
-    object,
-    local,
     uuid(37cd5526-6f30-11d9-c687-00046142c14f)
 ]
 interface IWineD3DSurface : IWineD3DResource
@@ -2350,10 +2323,10 @@ interface IWineD3DSurface : IWineD3DResource
         [in] const WINEDDOVERLAYFX *fx
     );
     HRESULT SetClipper(
-        [in] IWineD3DClipper *clipper
+        [in] struct wined3d_clipper *clipper
     );
     HRESULT GetClipper(
-        [out] IWineD3DClipper **clipper
+        [out] struct wined3d_clipper **clipper
     );
     HRESULT SetFormat(
         [in] enum wined3d_format_id format_id
@@ -3233,7 +3206,6 @@ interface IWineD3DDevice : IUnknown
     );
 }
 
-IWineD3DClipper * __stdcall WineDirect3DCreateClipper(void);
 void __stdcall wined3d_mutex_lock(void);
 void __stdcall wined3d_mutex_unlock(void);
 
@@ -3271,6 +3243,16 @@ void * __cdecl wined3d_get_parent(const struct wined3d *wined3d);
 ULONG __cdecl wined3d_incref(struct wined3d *wined3d);
 HRESULT __cdecl wined3d_register_software_device(struct wined3d *wined3d, void *init_function);
 
+struct wined3d_clipper * __cdecl wined3d_clipper_create(void);
+ULONG __cdecl wined3d_clipper_decref(struct wined3d_clipper *clipper);
+HRESULT __cdecl wined3d_clipper_get_clip_list(const struct wined3d_clipper *clipper,
+        const RECT *rect, RGNDATA *clip_list, DWORD *clip_list_size);
+HRESULT __cdecl wined3d_clipper_get_window(const struct wined3d_clipper *clipper, HWND *hwnd);
+ULONG __cdecl wined3d_clipper_incref(struct wined3d_clipper *clipper);
+HRESULT __cdecl wined3d_clipper_is_clip_list_changed(const struct wined3d_clipper *clipper, BOOL *changed);
+HRESULT __cdecl wined3d_clipper_set_clip_list(struct wined3d_clipper *clipper, const RGNDATA *clip_list, DWORD flags);
+HRESULT __cdecl wined3d_clipper_set_window(struct wined3d_clipper *clipper, DWORD flags, HWND hwnd);
+
 HRESULT __cdecl wined3d_device_create(struct wined3d *wined3d, UINT adapter_idx,
         WINED3DDEVTYPE device_type, HWND focus_window, DWORD behaviour_flags,
         IWineD3DDeviceParent *device_parent, IWineD3DDevice **device);
-- 
1.7.3.4




More information about the wine-patches mailing list