From 5963483fc23c359e3ad9811ed1010bc80e68ea1a Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Wed, 2 Feb 2011 20:22:52 +0100 Subject: [PATCH] wined3d: Remove COM from the palette. --- dlls/ddraw/ddraw_private.h | 3 +- dlls/ddraw/palette.c | 12 +-- dlls/ddraw/surface.c | 18 ++-- dlls/wined3d/palette.c | 165 ++++++++++++--------------------- dlls/wined3d/wined3d.spec | 7 ++ dlls/wined3d/wined3d_private.h | 15 +-- include/wine/wined3d.idl | 40 +++----- 7 files changed, 102 insertions(+), 158 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 30b36bd8b3a..f34e11d4f6b 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 c62fe46cc01..08a0464f053 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 df303d068e3..dca4014b5d9 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 2293f7d404f..5e9f863a3cc 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)) + TRACE("%p increasing refcount to %u.\n", palette, refcount); + + return refcount; +} + +ULONG CDECL wined3d_palette_decref(struct wined3d_palette *palette) +{ + ULONG refcount = InterlockedDecrement(&palette->ref); + + TRACE("%p decreasing refcount to %u.\n", palette, refcount); + + if (!refcount) { - IUnknown_AddRef(iface); - *object = iface; - return S_OK; + DeleteObject(palette->hpal); + HeapFree(GetProcessHeap(), 0, palette); } - WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); - - *object = NULL; - return E_NOINTERFACE; + return 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; -} - -static ULONG WINAPI IWineD3DPaletteImpl_Release(IWineD3DPalette *iface) { - IWineD3DPaletteImpl *This = (IWineD3DPaletteImpl *)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); - - if (!ref) { - DeleteObject(This->hpal); - HeapFree(GetProcessHeap(), 0, This); - return 0; - } - - return ref; -} - -/* 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 bc939089ce3..2af79e1c3a8 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 2465ba3fe64..1c1c3f0e282 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 76b41a36d63..6fbd52b19af 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; @@ -2234,30 +2235,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, @@ -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);