[4/5] d3drm: Add IDirect3DRMWinDevice interface

Nikolay Sivov bunglehead at gmail.com
Sun Jan 15 12:31:21 CST 2012


On 1/15/2012 19:04, André Hentschel wrote:
> ---
>   dlls/d3drm/device.c |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 165 insertions(+), 0 deletions(-)
>
> diff --git a/dlls/d3drm/device.c b/dlls/d3drm/device.c
> index f02ce33..957b465 100644
> --- a/dlls/d3drm/device.c
> +++ b/dlls/d3drm/device.c
> @@ -29,17 +29,20 @@
>   #include "wingdi.h"
>
>   #include "d3drm_private.h"
> +#include "d3drmwin.h"
>
>   WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
>
>   typedef struct {
>       IDirect3DRMDevice2 IDirect3DRMDevice2_iface;
>       IDirect3DRMDevice3 IDirect3DRMDevice3_iface;
> +    IDirect3DRMWinDevice IDirect3DRMWinDevice_iface;
>       LONG ref;
>   } IDirect3DRMDeviceImpl;
>
>   static const struct IDirect3DRMDevice2Vtbl Direct3DRMDevice2_Vtbl;
>   static const struct IDirect3DRMDevice3Vtbl Direct3DRMDevice3_Vtbl;
> +static const struct IDirect3DRMWinDeviceVtbl Direct3DRMWinDevice_Vtbl;
You can move instance creation call after all vtables initialization, so 
you won't need these forwards.
>
>   static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMDevice2(IDirect3DRMDevice2 *iface)
>   {
> @@ -51,6 +54,11 @@ static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMDevice3(IDirect3DRMDev
>       return CONTAINING_RECORD(iface, IDirect3DRMDeviceImpl, IDirect3DRMDevice3_iface);
>   }
>
> +static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMWinDevice(IDirect3DRMWinDevice *iface)
> +{
> +    return CONTAINING_RECORD(iface, IDirect3DRMDeviceImpl, IDirect3DRMWinDevice_iface);
> +}
> +
>   HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown** ppObj)
>   {
>       IDirect3DRMDeviceImpl* object;
> @@ -66,6 +74,7 @@ HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown** ppObj)
>
>       object->IDirect3DRMDevice2_iface.lpVtbl =&Direct3DRMDevice2_Vtbl;
>       object->IDirect3DRMDevice3_iface.lpVtbl =&Direct3DRMDevice3_Vtbl;
> +    object->IDirect3DRMWinDevice_iface.lpVtbl =&Direct3DRMWinDevice_Vtbl;
>       object->ref = 1;
>
>       if (IsEqualGUID(riid,&IID_IDirect3DRMFrame3))
> @@ -96,6 +105,10 @@ static HRESULT WINAPI IDirect3DRMDevice2Impl_QueryInterface(IDirect3DRMDevice2*
>       {
>           *object =&This->IDirect3DRMDevice3_iface;
>       }
> +    else if(IsEqualGUID(riid,&IID_IDirect3DRMWinDevice))
> +    {
> +        *object =&This->IDirect3DRMWinDevice_iface;
> +    }
>       else
>       {
>           FIXME("interface %s not implemented\n", debugstr_guid(riid));
> @@ -1021,3 +1034,155 @@ static const struct IDirect3DRMDevice3Vtbl Direct3DRMDevice3_Vtbl =
>       IDirect3DRMDevice3Impl_GetStateChangeOptions,
>       IDirect3DRMDevice3Impl_SetStateChangeOptions
>   };
> +
> +
> +/*** IUnknown methods ***/
> +static HRESULT WINAPI IDirect3DRMWinDeviceImpl_QueryInterface(IDirect3DRMWinDevice* iface,
> +                                                              REFIID riid, void** object)
> +{
> +    IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
> +    return IDirect3DRMDevice2_QueryInterface(&This->IDirect3DRMDevice2_iface, riid, object);
> +}
> +
> +static ULONG WINAPI IDirect3DRMWinDeviceImpl_AddRef(IDirect3DRMWinDevice* iface)
> +{
> +    IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
> +
> +    TRACE("(%p)\n", This);
> +
> +    return InterlockedIncrement(&This->ref);
> +}
> +
> +static ULONG WINAPI IDirect3DRMWinDeviceImpl_Release(IDirect3DRMWinDevice* iface)
> +{
> +    IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
> +    ULONG ref = InterlockedDecrement(&This->ref);
> +
> +    TRACE("(%p)\n", This);
> +
> +    if (!ref)
> +        HeapFree(GetProcessHeap(), 0, This);
> +
> +    return ref;
> +}
AddRef and Release should be forwards as well.




More information about the wine-devel mailing list