/*
 * Implementation of IDirect3DRMTextureX interfaces
 *
 * Copyright 2012 Christian Costa
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "wine/debug.h"

#define COBJMACROS

#include "winbase.h"
#include "wingdi.h"

#include "d3drm_private.h"

WINE_DEFAULT_DEBUG_CHANNEL(d3drm);

typedef struct {
    IDirect3DRMTexture2 IDirect3DRMTexture2_iface;
    IDirect3DRMTexture3 IDirect3DRMTexture3_iface;
    LONG ref;
    DWORD app_data;
} IDirect3DRMTextureImpl;

static inline IDirect3DRMTextureImpl *impl_from_IDirect3DRMTexture2(IDirect3DRMTexture2 *iface)
{
    return CONTAINING_RECORD(iface, IDirect3DRMTextureImpl, IDirect3DRMTexture2_iface);
}

static inline IDirect3DRMTextureImpl *impl_from_IDirect3DRMTexture3(IDirect3DRMTexture3 *iface)
{
    return CONTAINING_RECORD(iface, IDirect3DRMTextureImpl, IDirect3DRMTexture3_iface);
}

/*** IUnknown methods ***/
static HRESULT WINAPI IDirect3DRMTexture2Impl_QueryInterface(IDirect3DRMTexture2* iface,
                                                             REFIID riid, void** object)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);

    *object = NULL;

    if (IsEqualGUID(riid, &IID_IUnknown) ||
        IsEqualGUID(riid, &IID_IDirect3DRMTexture) ||
        IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
    {
        *object = &This->IDirect3DRMTexture2_iface;
    }
    else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
    {
        *object = &This->IDirect3DRMTexture3_iface;
    }
    else
    {
        FIXME("Interface %s not implemented\n", debugstr_guid(riid));
        return E_NOINTERFACE;
    }

    IDirect3DRMTexture3_AddRef(iface);

    return S_OK;
}

static ULONG WINAPI IDirect3DRMTexture2Impl_AddRef(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    return ref;
}

static ULONG WINAPI IDirect3DRMTexture2Impl_Release(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    if (!ref)
        HeapFree(GetProcessHeap(), 0, This);

    return ref;
}

/*** IDirect3DRMObject methods ***/
static HRESULT WINAPI IDirect3DRMTexture2Impl_Clone(IDirect3DRMTexture2* iface,
                                                    LPUNKNOWN unknown, REFIID riid,
                                                    LPVOID* object)
{
    FIXME("(%p)->(%p, %s, %p): stub\n", iface, unknown, debugstr_guid(riid), object);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_AddDestroyCallback(IDirect3DRMTexture2* iface,
                                                                 D3DRMOBJECTCALLBACK cb,
                                                                 LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_DeleteDestroyCallback(IDirect3DRMTexture2* iface,
                                                                    D3DRMOBJECTCALLBACK cb,
                                                                    LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetAppData(IDirect3DRMTexture2* iface,
                                                         DWORD data)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    TRACE("(%p)->(%u)\n", iface, data);

    return IDirect3DRMTexture3_SetAppData(&This->IDirect3DRMTexture3_iface, data);
}

static DWORD WINAPI IDirect3DRMTexture2Impl_GetAppData(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    TRACE("(%p)->()\n", iface);

    return IDirect3DRMTexture3_GetAppData(&This->IDirect3DRMTexture3_iface);
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetName(IDirect3DRMTexture2* iface, LPCSTR name)
{
    FIXME("(%p)->(%s): stub\n", iface, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_GetName(IDirect3DRMTexture2* iface,
                                                      LPDWORD size, LPSTR name)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, size, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_GetClassName(IDirect3DRMTexture2* iface,
                                                           LPDWORD size, LPSTR name)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);

    return IDirect3DRMTexture3_GetClassName(&This->IDirect3DRMTexture3_iface, size, name);
}

/*** IDirect3DRMTexture3 methods ***/
static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromFile(IDirect3DRMTexture2* iface, const char *filename)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_a(filename));

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromSurface(IDirect3DRMTexture2 *iface,
        IDirectDrawSurface *surface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromResource(IDirect3DRMTexture2* iface, HRSRC resource)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, resource);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_Changed(IDirect3DRMTexture2* iface, BOOL pixels, BOOL palette)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%u, %u): stub\n", iface, This, pixels, palette);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetColors(IDirect3DRMTexture2* iface, DWORD max_colors)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, max_colors);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetShades(IDirect3DRMTexture2* iface, DWORD max_shades)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, max_shades);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalSize(IDirect3DRMTexture2* iface, D3DVALUE width, D3DVALUE height)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%f, %f): stub\n", iface, This, width, height);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalOrigin(IDirect3DRMTexture2* iface, LONG x, LONG y)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%d, %d): stub\n", iface, This, x, y);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalScale(IDirect3DRMTexture2* iface, DWORD scale)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, scale);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalTransparency(IDirect3DRMTexture2* iface, BOOL transparency)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, transparency);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalTransparentColor(IDirect3DRMTexture2* iface, D3DCOLOR color)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%x): stub\n", iface, This, color);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_GetDecalSize(IDirect3DRMTexture2* iface, D3DVALUE* width, D3DVALUE* height)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, height, width);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_GetDecalOrigin(IDirect3DRMTexture2* iface, LONG* x, LONG* y)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, x, y);

    return E_NOTIMPL;
}

static D3DRMIMAGE* WINAPI IDirect3DRMTexture2Impl_GetImage(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return NULL;
}

static DWORD WINAPI IDirect3DRMTexture2Impl_GetShades(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static DWORD WINAPI IDirect3DRMTexture2Impl_GetColors(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static DWORD WINAPI IDirect3DRMTexture2Impl_GetDecalScale(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static BOOL WINAPI IDirect3DRMTexture2Impl_GetDecalTransparency(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return FALSE;
}

static D3DCOLOR WINAPI IDirect3DRMTexture2Impl_GetDecalTransparentColor(IDirect3DRMTexture2* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

/*** IDirect3DRMTexture2 methods ***/
static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromImage(IDirect3DRMTexture2 *iface, D3DRMIMAGE *image)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, image);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromResource2(IDirect3DRMTexture2* iface, HMODULE module,
                                                               LPCSTR /* LPCTSTR */ name, LPCSTR /* LPCTSTR */ type)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%p, %s, %s): stub\n", iface, This, module, debugstr_a(name), debugstr_a(type));

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture2Impl_GenerateMIPMap(IDirect3DRMTexture2* iface, DWORD flags)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);

    FIXME("(%p/%p)->(%x): stub\n", iface, This, flags);

    return E_NOTIMPL;
}

static const struct IDirect3DRMTexture2Vtbl Direct3DRMTexture2_Vtbl =
{
    /*** IUnknown methods ***/
    IDirect3DRMTexture2Impl_QueryInterface,
    IDirect3DRMTexture2Impl_AddRef,
    IDirect3DRMTexture2Impl_Release,
    /*** IDirect3DRMObject methods ***/
    IDirect3DRMTexture2Impl_Clone,
    IDirect3DRMTexture2Impl_AddDestroyCallback,
    IDirect3DRMTexture2Impl_DeleteDestroyCallback,
    IDirect3DRMTexture2Impl_SetAppData,
    IDirect3DRMTexture2Impl_GetAppData,
    IDirect3DRMTexture2Impl_SetName,
    IDirect3DRMTexture2Impl_GetName,
    IDirect3DRMTexture2Impl_GetClassName,
    /*** IDirect3DRMTexture methods ***/
    IDirect3DRMTexture2Impl_InitFromFile,
    IDirect3DRMTexture2Impl_InitFromSurface,
    IDirect3DRMTexture2Impl_InitFromResource,
    IDirect3DRMTexture2Impl_Changed,
    IDirect3DRMTexture2Impl_SetColors,
    IDirect3DRMTexture2Impl_SetShades,
    IDirect3DRMTexture2Impl_SetDecalSize,
    IDirect3DRMTexture2Impl_SetDecalOrigin,
    IDirect3DRMTexture2Impl_SetDecalScale,
    IDirect3DRMTexture2Impl_SetDecalTransparency,
    IDirect3DRMTexture2Impl_SetDecalTransparentColor,
    IDirect3DRMTexture2Impl_GetDecalSize,
    IDirect3DRMTexture2Impl_GetDecalOrigin,
    IDirect3DRMTexture2Impl_GetImage,
    IDirect3DRMTexture2Impl_GetShades,
    IDirect3DRMTexture2Impl_GetColors,
    IDirect3DRMTexture2Impl_GetDecalScale,
    IDirect3DRMTexture2Impl_GetDecalTransparency,
    IDirect3DRMTexture2Impl_GetDecalTransparentColor,
    /*** IDirect3DRMTexture2 methods ***/
    IDirect3DRMTexture2Impl_InitFromImage,
    IDirect3DRMTexture2Impl_InitFromResource2,
    IDirect3DRMTexture2Impl_GenerateMIPMap
};

/*** IUnknown methods ***/
static HRESULT WINAPI IDirect3DRMTexture3Impl_QueryInterface(IDirect3DRMTexture3* iface,
                                                           REFIID riid, void** object)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);

    *object = NULL;

    if (IsEqualGUID(riid, &IID_IUnknown) ||
        IsEqualGUID(riid, &IID_IDirect3DRMTexture) ||
        IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
    {
        *object = &This->IDirect3DRMTexture2_iface;
    }
    else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
    {
        *object = &This->IDirect3DRMTexture3_iface;
    }
    else
    {
        FIXME("Interface %s not implemented\n", debugstr_guid(riid));
        return E_NOINTERFACE;
    }

    IDirect3DRMTexture3_AddRef(iface);

    return S_OK;
}

static ULONG WINAPI IDirect3DRMTexture3Impl_AddRef(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
    ULONG ref = InterlockedIncrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    return ref;
}

static ULONG WINAPI IDirect3DRMTexture3Impl_Release(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
    ULONG ref = InterlockedDecrement(&This->ref);

    TRACE("(%p)->(): new ref = %d\n", iface, ref);

    if (!ref)
        HeapFree(GetProcessHeap(), 0, This);

    return ref;
}

/*** IDirect3DRMObject methods ***/
static HRESULT WINAPI IDirect3DRMTexture3Impl_Clone(IDirect3DRMTexture3* iface,
                                                     LPUNKNOWN unknown, REFIID riid,
                                                     LPVOID* object)
{
    FIXME("(%p)->(%p, %s, %p): stub\n", iface, unknown, debugstr_guid(riid), object);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_AddDestroyCallback(IDirect3DRMTexture3* iface,
                                                                  D3DRMOBJECTCALLBACK cb,
                                                                  LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_DeleteDestroyCallback(IDirect3DRMTexture3* iface,
                                                                     D3DRMOBJECTCALLBACK cb,
                                                                     LPVOID argument)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetAppData(IDirect3DRMTexture3* iface,
                                                         DWORD data)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    TRACE("(%p)->(%u)\n", iface, data);

    This->app_data = data;

    return D3DRM_OK;
}

static DWORD WINAPI IDirect3DRMTexture3Impl_GetAppData(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    TRACE("(%p)->()\n", iface);

    return This->app_data;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetName(IDirect3DRMTexture3* iface, LPCSTR name)
{
    FIXME("(%p)->(%s): stub\n", iface, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetName(IDirect3DRMTexture3* iface,
                                                       LPDWORD size, LPSTR name)
{
    FIXME("(%p)->(%p, %p): stub\n", iface, size, name);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetClassName(IDirect3DRMTexture3* iface,
                                                           LPDWORD size, LPSTR name)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);

    if (!size || *size < strlen("Texture") || !name)
        return E_INVALIDARG;

    strcpy(name, "Texture");
    *size = sizeof("Texture");

    return D3DRM_OK;
}

/*** IDirect3DRMTexture3 methods ***/
static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromFile(IDirect3DRMTexture3* iface, const char *filename)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_a(filename));

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromSurface(IDirect3DRMTexture3 *iface,
        IDirectDrawSurface *surface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromResource(IDirect3DRMTexture3* iface, HRSRC resource)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, resource);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_Changed(IDirect3DRMTexture3* iface, DWORD flags, DWORD nb_rects, LPRECT rects)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%x, %u, %p): stub\n", iface, This, flags, nb_rects, rects);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetColors(IDirect3DRMTexture3* iface, DWORD max_colors)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, max_colors);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetShades(IDirect3DRMTexture3* iface, DWORD max_shades)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, max_shades);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalSize(IDirect3DRMTexture3* iface, D3DVALUE width, D3DVALUE height)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%f, %f): stub\n", iface, This, width, height);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalOrigin(IDirect3DRMTexture3* iface, LONG x, LONG y)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%d, %d): stub\n", iface, This, x, y);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalScale(IDirect3DRMTexture3* iface, DWORD scale)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, scale);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalTransparency(IDirect3DRMTexture3* iface, BOOL transparency)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%u): stub\n", iface, This, transparency);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalTransparentColor(IDirect3DRMTexture3* iface, D3DCOLOR color)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%x): stub\n", iface, This, color);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetDecalSize(IDirect3DRMTexture3* iface, D3DVALUE* width, D3DVALUE* height)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, height, width);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetDecalOrigin(IDirect3DRMTexture3* iface, LONG* x, LONG* y)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, x, y);

    return E_NOTIMPL;
}

static D3DRMIMAGE* WINAPI IDirect3DRMTexture3Impl_GetImage(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return NULL;
}

static DWORD WINAPI IDirect3DRMTexture3Impl_GetShades(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static DWORD WINAPI IDirect3DRMTexture3Impl_GetColors(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static DWORD WINAPI IDirect3DRMTexture3Impl_GetDecalScale(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static BOOL WINAPI IDirect3DRMTexture3Impl_GetDecalTransparency(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return FALSE;
}

static D3DCOLOR WINAPI IDirect3DRMTexture3Impl_GetDecalTransparentColor(IDirect3DRMTexture3* iface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(): stub\n", iface, This);

    return 0;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromImage(IDirect3DRMTexture3 *iface, D3DRMIMAGE *image)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p): stub\n", iface, This, image);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromResource2(IDirect3DRMTexture3* iface, HMODULE module,
                                                               LPCSTR /* LPCTSTR */ name, LPCSTR /* LPCTSTR */ type)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %s, %s): stub\n", iface, This, module, debugstr_a(name), debugstr_a(type));

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GenerateMIPMap(IDirect3DRMTexture3* iface, DWORD flags)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%x): stub\n", iface, This, flags);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetSurface(IDirect3DRMTexture3 *iface,
        DWORD flags, IDirectDrawSurface **surface)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%x, %p): stub\n", iface, This, flags, surface);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetCacheOptions(IDirect3DRMTexture3* iface, LONG importance, DWORD flags)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%d, %x): stub\n", iface, This, importance, flags);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_GetCacheOptions(IDirect3DRMTexture3* iface, LPLONG importance, LPDWORD flags)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, importance, flags);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDownsampleCallback(IDirect3DRMTexture3* iface, D3DRMDOWNSAMPLECALLBACK callback, LPVOID arg)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, callback, arg);

    return E_NOTIMPL;
}

static HRESULT WINAPI IDirect3DRMTexture3Impl_SetValidationCallback(IDirect3DRMTexture3* iface, D3DRMVALIDATIONCALLBACK callback, LPVOID arg)
{
    IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);

    FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, callback, arg);

    return E_NOTIMPL;
}

static const struct IDirect3DRMTexture3Vtbl Direct3DRMTexture3_Vtbl =
{
    /*** IUnknown methods ***/
    IDirect3DRMTexture3Impl_QueryInterface,
    IDirect3DRMTexture3Impl_AddRef,
    IDirect3DRMTexture3Impl_Release,
    /*** IDirect3DRMObject methods ***/
    IDirect3DRMTexture3Impl_Clone,
    IDirect3DRMTexture3Impl_AddDestroyCallback,
    IDirect3DRMTexture3Impl_DeleteDestroyCallback,
    IDirect3DRMTexture3Impl_SetAppData,
    IDirect3DRMTexture3Impl_GetAppData,
    IDirect3DRMTexture3Impl_SetName,
    IDirect3DRMTexture3Impl_GetName,
    IDirect3DRMTexture3Impl_GetClassName,
    /*** IDirect3DRMTexture3 methods ***/
    IDirect3DRMTexture3Impl_InitFromFile,
    IDirect3DRMTexture3Impl_InitFromSurface,
    IDirect3DRMTexture3Impl_InitFromResource,
    IDirect3DRMTexture3Impl_Changed,
    IDirect3DRMTexture3Impl_SetColors,
    IDirect3DRMTexture3Impl_SetShades,
    IDirect3DRMTexture3Impl_SetDecalSize,
    IDirect3DRMTexture3Impl_SetDecalOrigin,
    IDirect3DRMTexture3Impl_SetDecalScale,
    IDirect3DRMTexture3Impl_SetDecalTransparency,
    IDirect3DRMTexture3Impl_SetDecalTransparentColor,
    IDirect3DRMTexture3Impl_GetDecalSize,
    IDirect3DRMTexture3Impl_GetDecalOrigin,
    IDirect3DRMTexture3Impl_GetImage,
    IDirect3DRMTexture3Impl_GetShades,
    IDirect3DRMTexture3Impl_GetColors,
    IDirect3DRMTexture3Impl_GetDecalScale,
    IDirect3DRMTexture3Impl_GetDecalTransparency,
    IDirect3DRMTexture3Impl_GetDecalTransparentColor,
    IDirect3DRMTexture3Impl_InitFromImage,
    IDirect3DRMTexture3Impl_InitFromResource2,
    IDirect3DRMTexture3Impl_GenerateMIPMap,
    IDirect3DRMTexture3Impl_GetSurface,
    IDirect3DRMTexture3Impl_SetCacheOptions,
    IDirect3DRMTexture3Impl_GetCacheOptions,
    IDirect3DRMTexture3Impl_SetDownsampleCallback,
    IDirect3DRMTexture3Impl_SetValidationCallback
};

HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown** ret_iface)
{
    IDirect3DRMTextureImpl* object;

    TRACE("(%p)\n", ret_iface);

    object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMTextureImpl));
    if (!object)
        return E_OUTOFMEMORY;

    object->IDirect3DRMTexture2_iface.lpVtbl = &Direct3DRMTexture2_Vtbl;
    object->IDirect3DRMTexture3_iface.lpVtbl = &Direct3DRMTexture3_Vtbl;
    object->ref = 1;

    if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
        *ret_iface = (IUnknown*)&object->IDirect3DRMTexture3_iface;
    else
        *ret_iface = (IUnknown*)&object->IDirect3DRMTexture2_iface;

    return S_OK;
}
