[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