ReactOS 0.4.17-dev-966-gf06eace
palette.c
Go to the documentation of this file.
1/*
2 * Copyright 2006 Stefan Dösinger
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 "ddraw_private.h"
20
22
23/*****************************************************************************
24 * IDirectDrawPalette::QueryInterface
25 *
26 * A usual QueryInterface implementation. Can only Query IUnknown and
27 * IDirectDrawPalette
28 *
29 * Params:
30 * refiid: The interface id queried for
31 * obj: Address to return the interface pointer at
32 *
33 * Returns:
34 * S_OK on success
35 * E_NOINTERFACE if the requested interface wasn't found
36 *****************************************************************************/
37static HRESULT WINAPI ddraw_palette_QueryInterface(IDirectDrawPalette *iface, REFIID refiid, void **obj)
38{
39 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj);
40
41 if (IsEqualGUID(refiid, &IID_IUnknown)
42 || IsEqualGUID(refiid, &IID_IDirectDrawPalette))
43 {
44 *obj = iface;
45 IDirectDrawPalette_AddRef(iface);
46 return S_OK;
47 }
48 else
49 {
50 *obj = NULL;
51 return E_NOINTERFACE;
52 }
53}
54
55/*****************************************************************************
56 * IDirectDrawPaletteImpl::AddRef
57 *
58 * Increases the refcount.
59 *
60 * Returns:
61 * The new refcount
62 *
63 *****************************************************************************/
64static ULONG WINAPI ddraw_palette_AddRef(IDirectDrawPalette *iface)
65{
68
69 TRACE("%p increasing refcount to %lu.\n", This, ref);
70
71 return ref;
72}
73
74/*****************************************************************************
75 * IDirectDrawPaletteImpl::Release
76 *
77 * Reduces the refcount. If the refcount falls to 0, the object is destroyed
78 *
79 * Returns:
80 * The new refcount
81 *
82 *****************************************************************************/
83static ULONG WINAPI ddraw_palette_Release(IDirectDrawPalette *iface)
84{
87
88 TRACE("%p decreasing refcount to %lu.\n", palette, ref);
89
90 if (ref == 0)
91 {
93 wined3d_palette_decref(palette->wined3d_palette);
94 if ((palette->flags & DDPCAPS_PRIMARYSURFACE) && palette->ddraw->primary)
95 palette->ddraw->primary->palette = NULL;
96 if (palette->ifaceToRelease)
97 IUnknown_Release(palette->ifaceToRelease);
99
100 free(palette);
101 }
102
103 return ref;
104}
105
106/*****************************************************************************
107 * IDirectDrawPalette::Initialize
108 *
109 * Initializes the palette. As we start initialized, return
110 * DDERR_ALREADYINITIALIZED
111 *
112 * Params:
113 * DD: DirectDraw interface this palette is assigned to
114 * Flags: Some flags, as usual
115 * ColorTable: The startup color table
116 *
117 * Returns:
118 * DDERR_ALREADYINITIALIZED
119 *
120 *****************************************************************************/
121static HRESULT WINAPI ddraw_palette_Initialize(IDirectDrawPalette *iface,
122 IDirectDraw *ddraw, DWORD flags, PALETTEENTRY *entries)
123{
124 TRACE("iface %p, ddraw %p, flags %#lx, entries %p.\n",
125 iface, ddraw, flags, entries);
126
128}
129
130static HRESULT WINAPI ddraw_palette_GetCaps(IDirectDrawPalette *iface, DWORD *caps)
131{
133
134 TRACE("iface %p, caps %p.\n", iface, caps);
135
137 *caps = palette->flags;
139
140 return D3D_OK;
141}
142
143/*****************************************************************************
144 * IDirectDrawPalette::SetEntries
145 *
146 * Sets the palette entries from a PALETTEENTRY structure. WineD3D takes
147 * care for updating the surface.
148 *
149 * Params:
150 * Flags: Flags, as usual
151 * Start: First palette entry to set
152 * Count: Number of entries to set
153 * PalEnt: Source entries
154 *
155 * Returns:
156 * D3D_OK on success
157 * DDERR_INVALIDPARAMS if PalEnt is NULL
158 *
159 *****************************************************************************/
160static HRESULT WINAPI ddraw_palette_SetEntries(IDirectDrawPalette *iface,
162{
164 HRESULT hr;
165
166 TRACE("iface %p, flags %#lx, start %lu, count %lu, entries %p.\n",
167 iface, flags, start, count, entries);
168
169 if (!entries)
170 return DDERR_INVALIDPARAMS;
171
173 hr = wined3d_palette_set_entries(palette->wined3d_palette, flags, start, count, entries);
174
177
179
180 return hr;
181}
182
183/*****************************************************************************
184 * IDirectDrawPalette::GetEntries
185 *
186 * Returns the entries stored in this interface.
187 *
188 * Params:
189 * Flags: Flags :)
190 * Start: First entry to return
191 * Count: The number of entries to return
192 * PalEnt: PALETTEENTRY structure to write the entries to
193 *
194 * Returns:
195 * D3D_OK on success
196 * DDERR_INVALIDPARAMS if PalEnt is NULL
197 *
198 *****************************************************************************/
199static HRESULT WINAPI ddraw_palette_GetEntries(IDirectDrawPalette *iface,
201{
203 HRESULT hr;
204
205 TRACE("iface %p, flags %#lx, start %lu, count %lu, entries %p.\n",
206 iface, flags, start, count, entries);
207
208 if (!entries)
209 return DDERR_INVALIDPARAMS;
210
212 hr = wined3d_palette_get_entries(palette->wined3d_palette, flags, start, count, entries);
214
215 return hr;
216}
217
218/* Some windowed mode wrappers expect this vtbl to be writable. */
219static struct IDirectDrawPaletteVtbl ddraw_palette_vtbl =
220{
221 /*** IUnknown ***/
225 /*** IDirectDrawPalette ***/
230};
231
232struct ddraw_palette *unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
233{
234 if (!iface) return NULL;
235 assert(iface->lpVtbl == &ddraw_palette_vtbl);
237}
238
239static unsigned int palette_size(DWORD flags)
240{
242 {
243 case DDPCAPS_1BIT:
244 return 2;
245 case DDPCAPS_2BIT:
246 return 4;
247 case DDPCAPS_4BIT:
248 return 16;
249 case DDPCAPS_8BIT:
250 return 256;
251 default:
252 return ~0u;
253 }
254}
255
257 struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries)
258{
259 unsigned int entry_count;
260 DWORD wined3d_flags = 0;
261 HRESULT hr;
262
263 if ((entry_count = palette_size(flags)) == ~0u)
264 {
265 WARN("Invalid flags %#lx.\n", flags);
266 return DDERR_INVALIDPARAMS;
267 }
268
270 wined3d_flags |= WINED3D_PALETTE_8BIT_ENTRIES;
272 wined3d_flags |= WINED3D_PALETTE_ALLOW_256;
273 if (flags & DDPCAPS_ALPHA)
274 wined3d_flags |= WINED3D_PALETTE_ALPHA;
275
276 palette->IDirectDrawPalette_iface.lpVtbl = &ddraw_palette_vtbl;
277 palette->ref = 1;
278 palette->flags = flags;
279
281 wined3d_flags, entry_count, entries, &palette->wined3d_palette)))
282 {
283 WARN("Failed to create wined3d palette, hr %#lx.\n", hr);
284 return hr;
285 }
286
287 palette->ddraw = ddraw;
288 palette->ifaceToRelease = (IUnknown *)&ddraw->IDirectDraw7_iface;
289 IUnknown_AddRef(palette->ifaceToRelease);
290
291 return DD_OK;
292}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
const GUID IID_IUnknown
#define D3D_OK
Definition: d3d.h:106
HRESULT ddraw_surface_update_frontbuffer(struct ddraw_surface *surface, const RECT *rect, BOOL read, unsigned int swap_interval)
Definition: surface.c:61
static struct ddraw_palette * impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
#define free
Definition: debug_ros.c:5
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
static HRESULT WINAPI ddraw_palette_GetEntries(IDirectDrawPalette *iface, DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries)
Definition: palette.c:199
static ULONG WINAPI ddraw_palette_AddRef(IDirectDrawPalette *iface)
Definition: palette.c:64
static HRESULT WINAPI ddraw_palette_SetEntries(IDirectDrawPalette *iface, DWORD flags, DWORD start, DWORD count, PALETTEENTRY *entries)
Definition: palette.c:160
static struct IDirectDrawPaletteVtbl ddraw_palette_vtbl
Definition: palette.c:219
static HRESULT WINAPI ddraw_palette_QueryInterface(IDirectDrawPalette *iface, REFIID refiid, void **obj)
Definition: palette.c:37
static HRESULT WINAPI ddraw_palette_Initialize(IDirectDrawPalette *iface, IDirectDraw *ddraw, DWORD flags, PALETTEENTRY *entries)
Definition: palette.c:121
struct ddraw_palette * unsafe_impl_from_IDirectDrawPalette(IDirectDrawPalette *iface)
Definition: palette.c:232
static unsigned int palette_size(DWORD flags)
Definition: palette.c:239
static ULONG WINAPI ddraw_palette_Release(IDirectDrawPalette *iface)
Definition: palette.c:83
static HRESULT WINAPI ddraw_palette_GetCaps(IDirectDrawPalette *iface, DWORD *caps)
Definition: palette.c:130
HRESULT ddraw_palette_init(struct ddraw_palette *palette, struct ddraw *ddraw, DWORD flags, PALETTEENTRY *entries)
Definition: palette.c:256
HRESULT CDECL wined3d_palette_create(struct wined3d_device *device, uint32_t flags, unsigned int entry_count, const PALETTEENTRY *entries, struct wined3d_palette **palette)
Definition: palette.c:161
HRESULT CDECL wined3d_palette_get_entries(const struct wined3d_palette *palette, uint32_t flags, unsigned int start, unsigned int count, PALETTEENTRY *entries)
Definition: palette.c:58
ULONG CDECL wined3d_palette_decref(struct wined3d_palette *palette)
Definition: palette.c:42
HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette, uint32_t flags, unsigned int start, unsigned int count, const PALETTEENTRY *entries)
Definition: palette.c:97
#define assert(_expr)
Definition: assert.h:32
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint start
Definition: gl.h:1545
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static HPALETTE palette
Definition: clipboard.c:1457
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define DDPCAPS_PRIMARYSURFACE
Definition: ddraw.h:458
#define DDPCAPS_ALLOW256
Definition: ddraw.h:460
#define DDPCAPS_8BITENTRIES
Definition: ddraw.h:456
#define DDPCAPS_1BIT
Definition: ddraw.h:462
#define DDPCAPS_2BIT
Definition: ddraw.h:463
#define DD_OK
Definition: ddraw.h:188
#define DDPCAPS_8BIT
Definition: ddraw.h:457
#define DDPCAPS_ALPHA
Definition: ddraw.h:464
#define DDERR_INVALIDPARAMS
Definition: ddraw.h:81
#define DDERR_ALREADYINITIALIZED
Definition: ddraw.h:69
#define DDPCAPS_4BIT
Definition: ddraw.h:455
#define TRACE(s)
Definition: solgame.cpp:4
IDirectDrawPalette IDirectDrawPalette_iface
struct ddraw * ddraw
struct wined3d_device * wined3d_device
Definition: ddraw_private.h:99
IDirectDraw7 IDirectDraw7_iface
Definition: ddraw_private.h:83
Definition: send.c:48
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define WINED3D_PALETTE_8BIT_ENTRIES
Definition: wined3d.h:1559
#define WINED3D_PALETTE_ALLOW_256
Definition: wined3d.h:1560
#define WINED3D_PALETTE_ALPHA
Definition: wined3d.h:1561
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define E_NOINTERFACE
Definition: winerror.h:3479