Henri Verbeet | b1a385d | 2010-09-08 11:24:49 +0200 | [diff] [blame] | 1 | /* |
Alexandre Julliard | e1ced22 | 2008-10-18 19:19:45 +0200 | [diff] [blame] | 2 | * Copyright 2006 Stefan Dösinger |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 3 | * |
| 4 | * This library is free software; you can redistribute it and/or |
| 5 | * modify it under the terms of the GNU Lesser General Public |
| 6 | * License as published by the Free Software Foundation; either |
| 7 | * version 2.1 of the License, or (at your option) any later version. |
| 8 | * |
| 9 | * This library is distributed in the hope that it will be useful, |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 | * Lesser General Public License for more details. |
| 13 | * |
| 14 | * You should have received a copy of the GNU Lesser General Public |
| 15 | * License along with this library; if not, write to the Free Software |
| 16 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| 17 | */ |
| 18 | |
| 19 | #include "config.h" |
Henri Verbeet | c5a1408 | 2010-08-18 19:26:20 +0200 | [diff] [blame] | 20 | #include "wine/port.h" |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 21 | |
| 22 | #include "ddraw_private.h" |
| 23 | |
| 24 | WINE_DEFAULT_DEBUG_CHANNEL(ddraw); |
| 25 | |
| 26 | /***************************************************************************** |
| 27 | * IDirectDrawPalette::QueryInterface |
| 28 | * |
| 29 | * A usual QueryInterface implementation. Can only Query IUnknown and |
| 30 | * IDirectDrawPalette |
| 31 | * |
| 32 | * Params: |
| 33 | * refiid: The interface id queried for |
| 34 | * obj: Address to return the interface pointer at |
| 35 | * |
| 36 | * Returns: |
| 37 | * S_OK on success |
| 38 | * E_NOINTERFACE if the requested interface wasn't found |
| 39 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 40 | static HRESULT WINAPI ddraw_palette_QueryInterface(IDirectDrawPalette *iface, REFIID refiid, void **obj) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 41 | { |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 42 | TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 43 | |
| 44 | if (IsEqualGUID(refiid, &IID_IUnknown) |
| 45 | || IsEqualGUID(refiid, &IID_IDirectDrawPalette)) |
| 46 | { |
| 47 | *obj = iface; |
| 48 | IDirectDrawPalette_AddRef(iface); |
| 49 | return S_OK; |
| 50 | } |
| 51 | else |
| 52 | { |
| 53 | *obj = NULL; |
| 54 | return E_NOINTERFACE; |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | /***************************************************************************** |
| 59 | * IDirectDrawPaletteImpl::AddRef |
| 60 | * |
| 61 | * Increases the refcount. |
| 62 | * |
| 63 | * Returns: |
| 64 | * The new refcount |
| 65 | * |
| 66 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 67 | static ULONG WINAPI ddraw_palette_AddRef(IDirectDrawPalette *iface) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 68 | { |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 69 | struct ddraw_palette *This = impl_from_IDirectDrawPalette(iface); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 70 | ULONG ref = InterlockedIncrement(&This->ref); |
| 71 | |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 72 | TRACE("%p increasing refcount to %u.\n", This, ref); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 73 | |
| 74 | return ref; |
| 75 | } |
| 76 | |
| 77 | /***************************************************************************** |
| 78 | * IDirectDrawPaletteImpl::Release |
| 79 | * |
| 80 | * Reduces the refcount. If the refcount falls to 0, the object is destroyed |
| 81 | * |
| 82 | * Returns: |
| 83 | * The new refcount |
| 84 | * |
| 85 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 86 | static ULONG WINAPI ddraw_palette_Release(IDirectDrawPalette *iface) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 87 | { |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 88 | struct ddraw_palette *This = impl_from_IDirectDrawPalette(iface); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 89 | ULONG ref = InterlockedDecrement(&This->ref); |
| 90 | |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 91 | TRACE("%p decreasing refcount to %u.\n", This, ref); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 92 | |
| 93 | if (ref == 0) |
| 94 | { |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 95 | wined3d_mutex_lock(); |
Henri Verbeet | 5963483 | 2011-02-02 20:22:52 +0100 | [diff] [blame] | 96 | wined3d_palette_decref(This->wineD3DPalette); |
Stefan Dösinger | 915174d | 2006-07-10 10:53:11 +0200 | [diff] [blame] | 97 | if(This->ifaceToRelease) |
| 98 | { |
| 99 | IUnknown_Release(This->ifaceToRelease); |
| 100 | } |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 101 | wined3d_mutex_unlock(); |
| 102 | |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 103 | HeapFree(GetProcessHeap(), 0, This); |
| 104 | } |
| 105 | |
| 106 | return ref; |
| 107 | } |
| 108 | |
| 109 | /***************************************************************************** |
| 110 | * IDirectDrawPalette::Initialize |
| 111 | * |
| 112 | * Initializes the palette. As we start initialized, return |
| 113 | * DDERR_ALREADYINITIALIZED |
| 114 | * |
| 115 | * Params: |
Austin English | 825baa2 | 2008-04-02 14:26:42 -0500 | [diff] [blame] | 116 | * DD: DirectDraw interface this palette is assigned to |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 117 | * Flags: Some flags, as usual |
| 118 | * ColorTable: The startup color table |
| 119 | * |
| 120 | * Returns: |
| 121 | * DDERR_ALREADYINITIALIZED |
| 122 | * |
| 123 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 124 | static HRESULT WINAPI ddraw_palette_Initialize(IDirectDrawPalette *iface, |
| 125 | IDirectDraw *ddraw, DWORD flags, PALETTEENTRY *entries) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 126 | { |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 127 | TRACE("iface %p, ddraw %p, flags %#x, entries %p.\n", |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 128 | iface, ddraw, flags, entries); |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 129 | |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 130 | return DDERR_ALREADYINITIALIZED; |
| 131 | } |
| 132 | |
| 133 | /***************************************************************************** |
| 134 | * IDirectDrawPalette::GetCaps |
| 135 | * |
| 136 | * Returns the palette description |
| 137 | * |
| 138 | * Params: |
| 139 | * Caps: Address to store the caps at |
| 140 | * |
| 141 | * Returns: |
| 142 | * D3D_OK on success |
| 143 | * DDERR_INVALIDPARAMS if Caps is NULL |
| 144 | * For more details, see IWineD3DPalette::GetCaps |
| 145 | * |
| 146 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 147 | static HRESULT WINAPI ddraw_palette_GetCaps(IDirectDrawPalette *iface, DWORD *caps) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 148 | { |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 149 | struct ddraw_palette *palette = impl_from_IDirectDrawPalette(iface); |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 150 | |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 151 | TRACE("iface %p, caps %p.\n", iface, caps); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 152 | |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 153 | wined3d_mutex_lock(); |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 154 | *caps = wined3d_palette_get_flags(palette->wineD3DPalette); |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 155 | wined3d_mutex_unlock(); |
Henri Verbeet | 5963483 | 2011-02-02 20:22:52 +0100 | [diff] [blame] | 156 | |
| 157 | return D3D_OK; |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 158 | } |
| 159 | |
| 160 | /***************************************************************************** |
| 161 | * IDirectDrawPalette::SetEntries |
| 162 | * |
| 163 | * Sets the palette entries from a PALETTEENTRY structure. WineD3D takes |
| 164 | * care for updating the surface. |
| 165 | * |
| 166 | * Params: |
| 167 | * Flags: Flags, as usual |
| 168 | * Start: First palette entry to set |
| 169 | * Count: Number of entries to set |
| 170 | * PalEnt: Source entries |
| 171 | * |
| 172 | * Returns: |
| 173 | * D3D_OK on success |
| 174 | * DDERR_INVALIDPARAMS if PalEnt is NULL |
| 175 | * For details, see IWineD3DDevice::SetEntries |
| 176 | * |
| 177 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 178 | static HRESULT WINAPI ddraw_palette_SetEntries(IDirectDrawPalette *iface, |
| 179 | DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 180 | { |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 181 | struct ddraw_palette *palette = impl_from_IDirectDrawPalette(iface); |
Stefan Dösinger | a2227de | 2007-05-30 16:11:25 +0200 | [diff] [blame] | 182 | HRESULT hr; |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 183 | |
| 184 | TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 185 | iface, flags, start, count, entries); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 186 | |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 187 | if (!entries) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 188 | return DDERR_INVALIDPARAMS; |
| 189 | |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 190 | wined3d_mutex_lock(); |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 191 | hr = wined3d_palette_set_entries(palette->wineD3DPalette, flags, start, count, entries); |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 192 | wined3d_mutex_unlock(); |
| 193 | |
Stefan Dösinger | a2227de | 2007-05-30 16:11:25 +0200 | [diff] [blame] | 194 | return hr; |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 195 | } |
| 196 | |
| 197 | /***************************************************************************** |
| 198 | * IDirectDrawPalette::GetEntries |
| 199 | * |
| 200 | * Returns the entries stored in this interface. |
| 201 | * |
| 202 | * Params: |
| 203 | * Flags: Flags :) |
| 204 | * Start: First entry to return |
| 205 | * Count: The number of entries to return |
| 206 | * PalEnt: PALETTEENTRY structure to write the entries to |
| 207 | * |
| 208 | * Returns: |
| 209 | * D3D_OK on success |
| 210 | * DDERR_INVALIDPARAMS if PalEnt is NULL |
| 211 | * For details, see IWineD3DDevice::SetEntries |
| 212 | * |
| 213 | *****************************************************************************/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 214 | static HRESULT WINAPI ddraw_palette_GetEntries(IDirectDrawPalette *iface, |
| 215 | DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 216 | { |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 217 | struct ddraw_palette *palette = impl_from_IDirectDrawPalette(iface); |
Stefan Dösinger | a2227de | 2007-05-30 16:11:25 +0200 | [diff] [blame] | 218 | HRESULT hr; |
Henri Verbeet | 20a42b4 | 2010-08-19 18:57:50 +0200 | [diff] [blame] | 219 | |
| 220 | TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 221 | iface, flags, start, count, entries); |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 222 | |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 223 | if (!entries) |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 224 | return DDERR_INVALIDPARAMS; |
| 225 | |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 226 | wined3d_mutex_lock(); |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 227 | hr = wined3d_palette_get_entries(palette->wineD3DPalette, flags, start, count, entries); |
Henri Verbeet | a2963b6 | 2011-11-13 19:52:24 +0100 | [diff] [blame] | 228 | wined3d_mutex_unlock(); |
| 229 | |
Stefan Dösinger | a2227de | 2007-05-30 16:11:25 +0200 | [diff] [blame] | 230 | return hr; |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 231 | } |
| 232 | |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 233 | static const struct IDirectDrawPaletteVtbl ddraw_palette_vtbl = |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 234 | { |
| 235 | /*** IUnknown ***/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 236 | ddraw_palette_QueryInterface, |
| 237 | ddraw_palette_AddRef, |
| 238 | ddraw_palette_Release, |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 239 | /*** IDirectDrawPalette ***/ |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 240 | ddraw_palette_GetCaps, |
| 241 | ddraw_palette_GetEntries, |
| 242 | ddraw_palette_Initialize, |
| 243 | ddraw_palette_SetEntries |
Stefan Dösinger | c8901d6 | 2006-06-09 19:36:12 +0200 | [diff] [blame] | 244 | }; |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 245 | |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 246 | struct ddraw_palette *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface) |
Ričardas Barkauskas | a8616b7 | 2011-10-03 17:14:08 -0500 | [diff] [blame] | 247 | { |
| 248 | if (!iface) return NULL; |
| 249 | assert(iface->lpVtbl == &ddraw_palette_vtbl); |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 250 | return CONTAINING_RECORD(iface, struct ddraw_palette, IDirectDrawPalette_iface); |
Ričardas Barkauskas | a8616b7 | 2011-10-03 17:14:08 -0500 | [diff] [blame] | 251 | } |
| 252 | |
Henri Verbeet | d0a37cd | 2012-03-12 19:56:10 +0100 | [diff] [blame] | 253 | HRESULT ddraw_palette_init(struct ddraw_palette *palette, |
Henri Verbeet | 1cee189 | 2012-03-08 20:27:16 +0100 | [diff] [blame] | 254 | struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries) |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 255 | { |
| 256 | HRESULT hr; |
| 257 | |
Ričardas Barkauskas | a665646 | 2011-10-03 17:14:27 -0500 | [diff] [blame] | 258 | palette->IDirectDrawPalette_iface.lpVtbl = &ddraw_palette_vtbl; |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 259 | palette->ref = 1; |
| 260 | |
Henri Verbeet | 8d4ca1f | 2011-05-16 23:01:22 +0200 | [diff] [blame] | 261 | hr = wined3d_palette_create(ddraw->wined3d_device, flags, |
Henri Verbeet | 6c4c351 | 2010-08-31 18:41:40 +0200 | [diff] [blame] | 262 | entries, palette, &palette->wineD3DPalette); |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 263 | if (FAILED(hr)) |
| 264 | { |
| 265 | WARN("Failed to create wined3d palette, hr %#x.\n", hr); |
| 266 | return hr; |
| 267 | } |
| 268 | |
Michael Stefaniuc | 9745108 | 2011-01-19 01:42:43 +0100 | [diff] [blame] | 269 | palette->ifaceToRelease = (IUnknown *)&ddraw->IDirectDraw7_iface; |
Henri Verbeet | e202172 | 2010-08-19 18:57:46 +0200 | [diff] [blame] | 270 | IUnknown_AddRef(palette->ifaceToRelease); |
| 271 | |
| 272 | return DD_OK; |
| 273 | } |