[PATCH 3/4] wined3d: Remove COM from the palette.
Henri Verbeet
hverbeet at codeweavers.com
Wed Feb 2 13:22:52 CST 2011
---
dlls/ddraw/ddraw_private.h | 3 +-
dlls/ddraw/palette.c | 12 ++--
dlls/ddraw/surface.c | 18 +++--
dlls/wined3d/palette.c | 157 ++++++++++++++--------------------------
dlls/wined3d/wined3d.spec | 7 ++
dlls/wined3d/wined3d_private.h | 15 ++---
include/wine/wined3d.idl | 40 ++++-------
7 files changed, 98 insertions(+), 154 deletions(-)
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 30b36bd..f34e11d 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -426,8 +426,7 @@ struct IDirectDrawPaletteImpl
const IDirectDrawPaletteVtbl *lpVtbl;
LONG ref;
- /* WineD3D uplink */
- IWineD3DPalette *wineD3DPalette;
+ struct wined3d_palette *wineD3DPalette;
/* IDirectDrawPalette fields */
IUnknown *ifaceToRelease;
diff --git a/dlls/ddraw/palette.c b/dlls/ddraw/palette.c
index c62fe46..08a0464 100644
--- a/dlls/ddraw/palette.c
+++ b/dlls/ddraw/palette.c
@@ -98,7 +98,7 @@ IDirectDrawPaletteImpl_Release(IDirectDrawPalette *iface)
if (ref == 0)
{
EnterCriticalSection(&ddraw_cs);
- IWineD3DPalette_Release(This->wineD3DPalette);
+ wined3d_palette_decref(This->wineD3DPalette);
if(This->ifaceToRelease)
{
IUnknown_Release(This->ifaceToRelease);
@@ -156,14 +156,14 @@ IDirectDrawPaletteImpl_GetCaps(IDirectDrawPalette *iface,
DWORD *Caps)
{
IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface;
- HRESULT hr;
TRACE("iface %p, caps %p.\n", iface, Caps);
EnterCriticalSection(&ddraw_cs);
- hr = IWineD3DPalette_GetCaps(This->wineD3DPalette, Caps);
+ *Caps = wined3d_palette_get_flags(This->wineD3DPalette);
LeaveCriticalSection(&ddraw_cs);
- return hr;
+
+ return D3D_OK;
}
/*****************************************************************************
@@ -201,7 +201,7 @@ IDirectDrawPaletteImpl_SetEntries(IDirectDrawPalette *iface,
return DDERR_INVALIDPARAMS;
EnterCriticalSection(&ddraw_cs);
- hr = IWineD3DPalette_SetEntries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
+ hr = wined3d_palette_set_entries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
LeaveCriticalSection(&ddraw_cs);
return hr;
}
@@ -240,7 +240,7 @@ IDirectDrawPaletteImpl_GetEntries(IDirectDrawPalette *iface,
return DDERR_INVALIDPARAMS;
EnterCriticalSection(&ddraw_cs);
- hr = IWineD3DPalette_GetEntries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
+ hr = wined3d_palette_get_entries(This->wineD3DPalette, Flags, Start, Count, PalEnt);
LeaveCriticalSection(&ddraw_cs);
return hr;
}
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index df303d0..dca4014 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -2717,7 +2717,7 @@ static HRESULT WINAPI ddraw_surface3_SetSurfaceDesc(IDirectDrawSurface3 *iface,
static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDirectDrawPalette **Pal)
{
IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface;
- IWineD3DPalette *wPal;
+ struct wined3d_palette *wined3d_palette;
HRESULT hr;
TRACE("iface %p, palette %p.\n", iface, Pal);
@@ -2726,16 +2726,16 @@ static HRESULT WINAPI ddraw_surface7_GetPalette(IDirectDrawSurface7 *iface, IDir
return DDERR_INVALIDPARAMS;
EnterCriticalSection(&ddraw_cs);
- hr = IWineD3DSurface_GetPalette(This->WineD3DSurface, &wPal);
- if(hr != DD_OK)
+ hr = IWineD3DSurface_GetPalette(This->WineD3DSurface, &wined3d_palette);
+ if (FAILED(hr))
{
LeaveCriticalSection(&ddraw_cs);
return hr;
}
- if(wPal)
+ if (wined3d_palette)
{
- *Pal = IWineD3DPalette_GetParent(wPal);
+ *Pal = wined3d_palette_get_parent(wined3d_palette);
IDirectDrawPalette_AddRef(*Pal);
}
else
@@ -3227,7 +3227,7 @@ static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTextu
for (;;)
{
- IWineD3DPalette *wined3d_dst_pal, *wined3d_src_pal;
+ struct wined3d_palette *wined3d_dst_pal, *wined3d_src_pal;
IDirectDrawPalette *dst_pal = NULL, *src_pal = NULL;
DDSURFACEDESC *src_desc, *dst_desc;
@@ -3245,7 +3245,8 @@ static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTextu
LeaveCriticalSection(&ddraw_cs);
return D3DERR_TEXTURE_LOAD_FAILED;
}
- if (wined3d_dst_pal) dst_pal = IWineD3DPalette_GetParent(wined3d_dst_pal);
+ if (wined3d_dst_pal)
+ dst_pal = wined3d_palette_get_parent(wined3d_dst_pal);
hr = IWineD3DSurface_GetPalette(src_surface->WineD3DSurface, &wined3d_src_pal);
if (FAILED(hr))
@@ -3254,7 +3255,8 @@ static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTextu
LeaveCriticalSection(&ddraw_cs);
return D3DERR_TEXTURE_LOAD_FAILED;
}
- if (wined3d_src_pal) src_pal = IWineD3DPalette_GetParent(wined3d_src_pal);
+ if (wined3d_src_pal)
+ src_pal = wined3d_palette_get_parent(wined3d_src_pal);
if (src_pal)
{
diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index 2293f7d..5e9f863 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -30,51 +30,31 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
#define SIZE_BITS (WINEDDPCAPS_1BIT | WINEDDPCAPS_2BIT | WINEDDPCAPS_4BIT | WINEDDPCAPS_8BIT)
-static HRESULT WINAPI IWineD3DPaletteImpl_QueryInterface(IWineD3DPalette *iface, REFIID riid, void **object)
+ULONG CDECL wined3d_palette_incref(struct wined3d_palette *palette)
{
- TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
+ ULONG refcount = InterlockedIncrement(&palette->ref);
- if (IsEqualGUID(riid, &IID_IWineD3DPalette)
- || IsEqualGUID(riid, &IID_IWineD3DBase)
- || 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;
-}
+ TRACE("%p increasing refcount to %u.\n", palette, refcount);
-static ULONG WINAPI IWineD3DPaletteImpl_AddRef(IWineD3DPalette *iface) {
- IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
- ULONG ref = InterlockedIncrement(&This->ref);
-
- TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
-
- return ref;
+ return refcount;
}
-static ULONG WINAPI IWineD3DPaletteImpl_Release(IWineD3DPalette *iface) {
- IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
- ULONG ref = InterlockedDecrement(&This->ref);
+ULONG CDECL wined3d_palette_decref(struct wined3d_palette *palette)
+{
+ ULONG refcount = InterlockedDecrement(&palette->ref);
- TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
+ TRACE("%p decreasing refcount to %u.\n", palette, refcount);
- if (!ref) {
- DeleteObject(This->hpal);
- HeapFree(GetProcessHeap(), 0, This);
- return 0;
+ if (!refcount)
+ {
+ DeleteObject(palette->hpal);
+ HeapFree(GetProcessHeap(), 0, palette);
}
- return ref;
+ return refcount;
}
-/* Not called from the vtable */
-static WORD IWineD3DPaletteImpl_Size(DWORD flags)
+static WORD wined3d_palette_size(DWORD flags)
{
switch (flags & SIZE_BITS)
{
@@ -88,85 +68,75 @@ static WORD IWineD3DPaletteImpl_Size(DWORD flags)
}
}
-static HRESULT WINAPI IWineD3DPaletteImpl_GetEntries(IWineD3DPalette *iface,
- DWORD flags, DWORD Start, DWORD Count, PALETTEENTRY *PalEnt)
+HRESULT CDECL wined3d_palette_get_entries(const struct wined3d_palette *palette,
+ DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries)
{
- IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
-
- TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n",
- iface, flags, Start, Count, PalEnt);
+ TRACE("palette %p, flags %#x, start %u, count %u, entries %p.\n",
+ palette, flags, start, count, entries);
if (flags) return WINED3DERR_INVALIDCALL; /* unchecked */
- if (Start + Count > IWineD3DPaletteImpl_Size(This->flags))
+ if (start + count > wined3d_palette_size(palette->flags))
return WINED3DERR_INVALIDCALL;
- if (This->flags & WINEDDPCAPS_8BITENTRIES)
+ if (palette->flags & WINEDDPCAPS_8BITENTRIES)
{
+ BYTE *entry = (BYTE *)entries;
unsigned int i;
- LPBYTE entry = (LPBYTE)PalEnt;
- for (i=Start; i < Count+Start; i++)
- *entry++ = This->palents[i].peRed;
+ for (i = start; i < count + start; ++i)
+ *entry++ = palette->palents[i].peRed;
}
else
- memcpy(PalEnt, This->palents+Start, Count * sizeof(PALETTEENTRY));
+ memcpy(entries, palette->palents + start, count * sizeof(*entries));
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface,
- DWORD flags, DWORD Start, DWORD Count, const PALETTEENTRY *PalEnt)
+HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette,
+ DWORD flags, DWORD start, DWORD count, const PALETTEENTRY *entries)
{
- IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
IWineD3DResourceImpl *res;
- TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n",
- iface, flags, Start, Count, PalEnt);
- TRACE("Palette flags: %#x.\n", This->flags);
+ TRACE("palette %p, flags %#x, start %u, count %u, entries %p.\n",
+ palette, flags, start, count, entries);
+ TRACE("Palette flags: %#x.\n", palette->flags);
- if (This->flags & WINEDDPCAPS_8BITENTRIES)
+ if (palette->flags & WINEDDPCAPS_8BITENTRIES)
{
+ const BYTE *entry = (const BYTE *)entries;
unsigned int i;
- const BYTE* entry = (const BYTE*)PalEnt;
- for (i=Start; i < Count+Start; i++)
- This->palents[i].peRed = *entry++;
+ for (i = start; i < count + start; ++i)
+ palette->palents[i].peRed = *entry++;
}
- else {
- memcpy(This->palents+Start, PalEnt, Count * sizeof(PALETTEENTRY));
+ else
+ {
+ memcpy(palette->palents + start, entries, count * sizeof(*palette->palents));
/* When WINEDDCAPS_ALLOW256 isn't set we need to override entry 0 with black and 255 with white */
- if (!(This->flags & WINEDDPCAPS_ALLOW256))
+ if (!(palette->flags & WINEDDPCAPS_ALLOW256))
{
TRACE("WINEDDPCAPS_ALLOW256 set, overriding palette entry 0 with black and 255 with white\n");
- This->palents[0].peRed = 0;
- This->palents[0].peGreen = 0;
- This->palents[0].peBlue = 0;
+ palette->palents[0].peRed = 0;
+ palette->palents[0].peGreen = 0;
+ palette->palents[0].peBlue = 0;
- This->palents[255].peRed = 255;
- This->palents[255].peGreen = 255;
- This->palents[255].peBlue = 255;
+ palette->palents[255].peRed = 255;
+ palette->palents[255].peGreen = 255;
+ palette->palents[255].peBlue = 255;
}
- if (This->hpal)
- SetPaletteEntries(This->hpal, Start, Count, This->palents+Start);
+ if (palette->hpal)
+ SetPaletteEntries(palette->hpal, start, count, palette->palents + start);
}
-#if 0
- /* Now, if we are in 'depth conversion mode', update the screen palette */
- /* FIXME: we need to update the image or we won't get palette fading. */
- if (This->ddraw->d->palette_convert)
- This->ddraw->d->palette_convert(palent,This->screen_palents,start,count);
-#endif
-
/* If the palette is attached to the render target, update all render targets */
-
- LIST_FOR_EACH_ENTRY(res, &This->device->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ LIST_FOR_EACH_ENTRY(res, &palette->device->resources, IWineD3DResourceImpl, resource.resource_list_entry)
{
if (IWineD3DResource_GetType((IWineD3DResource *)res) == WINED3DRTYPE_SURFACE)
{
IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)res;
- if (surface->palette == This)
+ if (surface->palette == palette)
surface->surface_ops->surface_realize_palette(surface);
}
}
@@ -174,46 +144,31 @@ static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface,
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DPaletteImpl_GetCaps(IWineD3DPalette *iface, DWORD *Caps) {
- IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface;
- TRACE("(%p)->(%p)\n", This, Caps);
+DWORD CDECL wined3d_palette_get_flags(const struct wined3d_palette *palette)
+{
+ TRACE("palette %p.\n", palette);
- *Caps = This->flags;
- return WINED3D_OK;
+ return palette->flags;
}
-static void * WINAPI IWineD3DPaletteImpl_GetParent(IWineD3DPalette *iface)
+void * CDECL wined3d_palette_get_parent(const struct wined3d_palette *palette)
{
- TRACE("iface %p.\n", iface);
+ TRACE("palette %p.\n", palette);
- return ((IWineD3DPaletteImpl *)iface)->parent;
+ return palette->parent;
}
-static const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
-{
- /*** IUnknown ***/
- IWineD3DPaletteImpl_QueryInterface,
- IWineD3DPaletteImpl_AddRef,
- IWineD3DPaletteImpl_Release,
- /*** IWineD3DPalette ***/
- IWineD3DPaletteImpl_GetParent,
- IWineD3DPaletteImpl_GetEntries,
- IWineD3DPaletteImpl_GetCaps,
- IWineD3DPaletteImpl_SetEntries
-};
-
HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device,
DWORD flags, const PALETTEENTRY *entries, void *parent)
{
HRESULT hr;
- palette->lpVtbl = &IWineD3DPalette_Vtbl;
palette->ref = 1;
palette->parent = parent;
palette->device = device;
palette->flags = flags;
- palette->palNumEntries = IWineD3DPaletteImpl_Size(flags);
+ palette->palNumEntries = wined3d_palette_size(flags);
palette->hpal = CreatePalette((const LOGPALETTE *)&palette->palVersion);
if (!palette->hpal)
{
@@ -221,7 +176,7 @@ HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *d
return E_FAIL;
}
- hr = IWineD3DPalette_SetEntries((IWineD3DPalette *)palette, 0, 0, IWineD3DPaletteImpl_Size(flags), entries);
+ hr = wined3d_palette_set_entries(palette, 0, 0, wined3d_palette_size(flags), entries);
if (FAILED(hr))
{
WARN("Failed to set palette entries, hr %#x.\n", hr);
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index bc93908..2af79e1 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -22,6 +22,13 @@
@ cdecl wined3d_device_create(ptr long long ptr long ptr ptr)
+@ cdecl wined3d_palette_decref(ptr)
+@ cdecl wined3d_palette_get_entries(ptr long long long ptr)
+@ cdecl wined3d_palette_get_flags(ptr)
+@ cdecl wined3d_palette_get_parent(ptr)
+@ cdecl wined3d_palette_incref(ptr)
+@ cdecl wined3d_palette_set_entries(ptr long long long ptr)
+
@ cdecl wined3d_stateblock_apply(ptr)
@ cdecl wined3d_stateblock_capture(ptr)
@ cdecl wined3d_stateblock_decref(ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2465ba3..1c1c3f0 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -53,12 +53,13 @@
#define WINED3D_QUIRK_FBO_TEX_UPDATE 0x00000020
typedef struct IWineD3DSurfaceImpl IWineD3DSurfaceImpl;
-typedef struct IWineD3DPaletteImpl IWineD3DPaletteImpl;
typedef struct IWineD3DDeviceImpl IWineD3DDeviceImpl;
typedef struct IWineD3DSwapChainImpl IWineD3DSwapChainImpl;
struct IWineD3DBaseShaderImpl;
struct IWineD3DBaseTextureImpl;
struct IWineD3DResourceImpl;
+typedef struct wined3d_palette IWineD3DPaletteImpl;
+typedef struct wined3d_palette IWineD3DPalette;
/* Texture format fixups */
@@ -2941,18 +2942,12 @@ static const float srgb_pow = 0.41666f;
static const float srgb_mul_high = 1.055f;
static const float srgb_sub_high = 0.055f;
-/*****************************************************************************
- * IWineD3DPalette implementation structure
- */
-struct IWineD3DPaletteImpl {
- /* IUnknown parts */
- const IWineD3DPaletteVtbl *lpVtbl;
- LONG ref;
-
+struct wined3d_palette
+{
+ LONG ref;
void *parent;
IWineD3DDeviceImpl *device;
- /* IWineD3DPalette */
HPALETTE hpal;
WORD palVersion; /*| */
WORD palNumEntries; /*| LOGPALETTE */
diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl
index 76b41a3..6fbd52b 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_palette;
struct wined3d_stateblock;
struct wined3d_vertex_declaration;
@@ -2237,30 +2238,6 @@ interface IWineD3DRendertargetView : IWineD3DBase
[
object,
local,
- uuid(f756720c-32b9-4439-b5a3-1d6c97037d9e)
-]
-interface IWineD3DPalette : IWineD3DBase
-{
- HRESULT GetEntries(
- [in] DWORD flags,
- [in] DWORD start,
- [in] DWORD count,
- [out] PALETTEENTRY *entries
- );
- HRESULT GetCaps(
- [out] DWORD *caps
- );
- HRESULT SetEntries(
- [in] DWORD flags,
- [in] DWORD start,
- [in] DWORD count,
- [in] const PALETTEENTRY *entries
- );
-}
-
-[
- object,
- local,
uuid(8f2bceb1-d338-488c-ab7f-0ec980bf5d2d)
]
interface IWineD3DClipper : IUnknown
@@ -2339,10 +2316,10 @@ interface IWineD3DSurface : IWineD3DResource
[in] DWORD trans
);
HRESULT GetPalette(
- [out] IWineD3DPalette **palette
+ [out] struct wined3d_palette **palette
);
HRESULT SetPalette(
- [in] IWineD3DPalette *palette
+ [in] struct wined3d_palette *palette
);
HRESULT SetColorKey(
[in] DWORD flags,
@@ -2800,7 +2777,7 @@ interface IWineD3DDevice : IUnknown
[in] DWORD flags,
[in] const PALETTEENTRY *palette_entry,
[in] void *parent,
- [out] IWineD3DPalette **palette
+ [out] struct wined3d_palette **palette
);
HRESULT Init3D(
[in] WINED3DPRESENT_PARAMETERS *present_parameters
@@ -3298,6 +3275,15 @@ 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);
+ULONG __cdecl wined3d_palette_decref(struct wined3d_palette *palette);
+HRESULT __cdecl wined3d_palette_get_entries(const struct wined3d_palette *palette,
+ DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries);
+DWORD __cdecl wined3d_palette_get_flags(const struct wined3d_palette *palette);
+void * __cdecl wined3d_palette_get_parent(const struct wined3d_palette *palette);
+ULONG __cdecl wined3d_palette_incref(struct wined3d_palette *palette);
+HRESULT __cdecl wined3d_palette_set_entries(struct wined3d_palette *palette,
+ DWORD flags, DWORD start, DWORD count, const PALETTEENTRY *entries);
+
HRESULT __cdecl wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock);
HRESULT __cdecl wined3d_stateblock_capture(struct wined3d_stateblock *stateblock);
ULONG __cdecl wined3d_stateblock_decref(struct wined3d_stateblock *stateblock);
--
1.7.3.4
More information about the wine-patches
mailing list