#include "IDirectDrawPalette.h"
#include "ddpalette.h"
#include "ddsurface.h"
#include "debug.h"


HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj)
{
    TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj);
    HRESULT ret = E_NOINTERFACE;
    TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
    return ret;
}

ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This)
{
    TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
    ULONG ret = ++This->ref;
    TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
    return ret;
}

ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This)
{
    TRACE("-> %s(This=%p)\n", __FUNCTION__, This);

    ULONG ret = --This->ref;

    if (This->ref == 0)
    {
        TRACE("     Released (%p)\n", This);

        if (g_ddraw)
            g_ddraw->last_freed_palette = This;

        HeapFree(GetProcessHeap(), 0, This);
    }

    TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret);
    return ret;
}

HRESULT __stdcall IDirectDrawPalette__GetCaps(IDirectDrawPaletteImpl* This, LPDWORD lpdwCaps)
{
    TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p)\n", __FUNCTION__, This, lpdwCaps);
    HRESULT ret = DDERR_INVALIDOBJECT;
    TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__);
    return ret;
}

HRESULT __stdcall IDirectDrawPalette__GetEntries(
    IDirectDrawPaletteImpl* This,
    DWORD dwFlags,
    DWORD dwBase,
    DWORD dwNumEntries,
    LPPALETTEENTRY lpEntries)
{
    TRACE(
        "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p)\n",
        __FUNCTION__,
        This,
        dwFlags,
        dwBase,
        dwNumEntries,
        lpEntries);

    HRESULT ret = ddp_GetEntries(This, dwFlags, dwBase, dwNumEntries, lpEntries);

    TRACE("<- %s\n", __FUNCTION__);
    return ret;
}

HRESULT __stdcall IDirectDrawPalette__Initialize(
    IDirectDrawPaletteImpl* This,
    LPDIRECTDRAW lpDD,
    DWORD dwFlags,
    LPPALETTEENTRY lpDDColorTable)
{
    TRACE("-> %s(This=%p)\n", __FUNCTION__, This);
    HRESULT ret = DD_OK;
    TRACE("<- %s\n", __FUNCTION__);
    return ret;
}

HRESULT __stdcall IDirectDrawPalette__SetEntries(
    IDirectDrawPaletteImpl* This,
    DWORD dwFlags,
    DWORD dwStartingEntry,
    DWORD dwCount,
    LPPALETTEENTRY lpEntries)
{
    TRACE_EXT(
        "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p)\n",
        __FUNCTION__,
        This,
        dwFlags,
        dwStartingEntry,
        dwCount,
        lpEntries);

    HRESULT ret = ddp_SetEntries(This, dwFlags, dwStartingEntry, dwCount, lpEntries);

    TRACE_EXT("<- %s\n", __FUNCTION__);
    return ret;
}

struct IDirectDrawPaletteImplVtbl g_ddp_vtbl =
{
    /*** IUnknown methods ***/
    IDirectDrawPalette__QueryInterface,
    IDirectDrawPalette__AddRef,
    IDirectDrawPalette__Release,
    /*** IDirectDrawPalette methods ***/
    IDirectDrawPalette__GetCaps,
    IDirectDrawPalette__GetEntries,
    IDirectDrawPalette__Initialize,
    IDirectDrawPalette__SetEntries
};