Isle
Loading...
Searching...
No Matches
mxpalette.cpp
Go to the documentation of this file.
1#include "mxpalette.h"
2
3#include "mxmisc.h"
4#include "mxvideomanager.h"
5
6// GLOBAL: LEGO1 0x10102188
7// GLOBAL: BETA10 0x10203558
8PALETTEENTRY g_defaultPaletteEntries[256] = {
9 {0u, 0u, 0u, 0u}, {128u, 0u, 0u, 0u}, {0u, 128u, 0u, 0u}, {128u, 128u, 0u, 0u},
10 {0u, 0u, 128u, 0u}, {128u, 0u, 128u, 0u}, {0u, 128u, 128u, 0u}, {128u, 128u, 128u, 0u},
11 {192u, 220u, 192u, 0u}, {166u, 202u, 240u, 0u}, {255u, 255u, 255u, 0u}, {250u, 250u, 250u, 0u},
12 {239u, 239u, 239u, 0u}, {228u, 228u, 228u, 0u}, {217u, 217u, 217u, 0u}, {206u, 206u, 206u, 0u},
13 {195u, 195u, 195u, 0u}, {185u, 185u, 185u, 0u}, {174u, 174u, 174u, 0u}, {163u, 163u, 163u, 0u},
14 {152u, 152u, 152u, 0u}, {141u, 141u, 141u, 0u}, {130u, 130u, 130u, 0u}, {123u, 123u, 123u, 0u},
15 {115u, 115u, 115u, 0u}, {108u, 108u, 108u, 0u}, {101u, 101u, 101u, 0u}, {93u, 93u, 93u, 0u},
16 {86u, 86u, 86u, 0u}, {79u, 79u, 79u, 0u}, {71u, 71u, 71u, 0u}, {64u, 64u, 64u, 0u},
17 {54u, 54u, 54u, 0u}, {43u, 43u, 43u, 0u}, {33u, 33u, 33u, 0u}, {22u, 22u, 22u, 0u},
18 {12u, 12u, 12u, 0u}, {8u, 8u, 8u, 0u}, {4u, 4u, 4u, 0u}, {0u, 0u, 0u, 0u},
19 {225u, 218u, 217u, 0u}, {195u, 182u, 179u, 0u}, {165u, 145u, 141u, 0u}, {134u, 108u, 102u, 0u},
20 {104u, 72u, 64u, 0u}, {74u, 35u, 26u, 0u}, {59u, 28u, 21u, 0u}, {44u, 21u, 16u, 0u},
21 {30u, 14u, 10u, 0u}, {15u, 7u, 5u, 0u}, {250u, 231u, 232u, 0u}, {240u, 185u, 189u, 0u},
22 {233u, 154u, 160u, 0u}, {226u, 124u, 131u, 0u}, {219u, 93u, 102u, 0u}, {213u, 62u, 73u, 0u},
23 {203u, 18u, 32u, 0u}, {172u, 15u, 27u, 0u}, {159u, 14u, 25u, 0u}, {146u, 13u, 23u, 0u},
24 {133u, 12u, 21u, 0u}, {120u, 11u, 19u, 0u}, {107u, 10u, 17u, 0u}, {94u, 8u, 15u, 0u},
25 {81u, 7u, 13u, 0u}, {68u, 6u, 11u, 0u}, {55u, 5u, 9u, 0u}, {42u, 4u, 7u, 0u},
26 {29u, 3u, 5u, 0u}, {10u, 1u, 2u, 0u}, {227u, 236u, 242u, 0u}, {178u, 203u, 220u, 0u},
27 {145u, 181u, 205u, 0u}, {112u, 159u, 191u, 0u}, {79u, 137u, 176u, 0u}, {30u, 104u, 154u, 0u},
28 {0u, 84u, 140u, 0u}, {0u, 79u, 132u, 0u}, {0u, 72u, 119u, 0u}, {0u, 66u, 110u, 0u},
29 {0u, 61u, 101u, 0u}, {0u, 55u, 92u, 0u}, {0u, 47u, 78u, 0u}, {0u, 39u, 65u, 0u},
30 {0u, 34u, 56u, 0u}, {0u, 28u, 47u, 0u}, {0u, 23u, 38u, 0u}, {0u, 18u, 29u, 0u},
31 {0u, 12u, 20u, 0u}, {0u, 4u, 7u, 0u}, {230u, 242u, 234u, 0u}, {180u, 215u, 193u, 0u},
32 {147u, 198u, 166u, 0u}, {113u, 180u, 138u, 0u}, {80u, 162u, 111u, 0u}, {30u, 136u, 70u, 0u},
33 {0u, 120u, 45u, 0u}, {0u, 114u, 43u, 0u}, {0u, 102u, 38u, 0u}, {0u, 95u, 35u, 0u},
34 {0u, 83u, 31u, 0u}, {0u, 72u, 27u, 0u}, {0u, 63u, 24u, 0u}, {0u, 56u, 21u, 0u},
35 {0u, 48u, 18u, 0u}, {0u, 36u, 14u, 0u}, {0u, 25u, 9u, 0u}, {0u, 17u, 6u, 0u},
36 {0u, 9u, 3u, 0u}, {0u, 1u, 1u, 0u}, {254u, 244u, 220u, 0u}, {255u, 239u, 181u, 0u},
37 {255u, 231u, 156u, 0u}, {255u, 222u, 132u, 0u}, {255u, 222u, 115u, 0u}, {255u, 214u, 99u, 0u},
38 {255u, 206u, 66u, 0u}, {255u, 198u, 41u, 0u}, {255u, 185u, 0u, 0u}, {255u, 189u, 8u, 0u},
39 {247u, 181u, 0u, 0u}, {222u, 156u, 0u, 0u}, {189u, 140u, 0u, 0u}, {173u, 123u, 0u, 0u},
40 {148u, 107u, 0u, 0u}, {132u, 90u, 0u, 0u}, {107u, 74u, 0u, 0u}, {74u, 49u, 0u, 0u},
41 {57u, 41u, 0u, 0u}, {33u, 24u, 0u, 0u}, {117u, 52u, 87u, 0u}, {176u, 158u, 50u, 0u},
42 {122u, 165u, 29u, 0u}, {242u, 142u, 8u, 0u}, {164u, 43u, 36u, 0u}, {113u, 67u, 20u, 0u},
43 {255u, 0u, 255u, 0u}, {255u, 0u, 255u, 0u}, {255u, 0u, 255u, 0u}, {255u, 0u, 255u, 0u},
44 {255u, 0u, 255u, 0u}, {57u, 163u, 217u, 0u}, {255u, 255u, 255u, 0u}, {254u, 255u, 247u, 0u},
45 {253u, 253u, 239u, 0u}, {248u, 247u, 247u, 0u}, {248u, 247u, 231u, 0u}, {240u, 240u, 240u, 0u},
46 {239u, 239u, 218u, 0u}, {227u, 232u, 236u, 0u}, {224u, 221u, 209u, 0u}, {215u, 222u, 215u, 0u},
47 {213u, 214u, 215u, 0u}, {214u, 214u, 203u, 0u}, {255u, 219u, 57u, 0u}, {206u, 206u, 206u, 0u},
48 {206u, 206u, 198u, 0u}, {255u, 214u, 18u, 0u}, {207u, 203u, 186u, 0u}, {197u, 199u, 199u, 0u},
49 {255u, 206u, 0u, 0u}, {207u, 198u, 159u, 0u}, {247u, 204u, 0u, 0u}, {189u, 198u, 189u, 0u},
50 {189u, 189u, 189u, 0u}, {238u, 199u, 0u, 0u}, {189u, 189u, 181u, 0u}, {238u, 190u, 24u, 0u},
51 {181u, 189u, 184u, 0u}, {161u, 186u, 224u, 0u}, {181u, 181u, 181u, 0u}, {231u, 189u, 0u, 0u},
52 {173u, 182u, 173u, 0u}, {222u, 181u, 0u, 0u}, {173u, 173u, 173u, 0u}, {213u, 182u, 0u, 0u},
53 {172u, 173u, 160u, 0u}, {214u, 173u, 0u, 0u}, {165u, 165u, 165u, 0u}, {206u, 173u, 0u, 0u},
54 {160u, 168u, 151u, 0u}, {206u, 164u, 0u, 0u}, {198u, 165u, 0u, 0u}, {157u, 156u, 156u, 0u},
55 {134u, 156u, 200u, 0u}, {153u, 156u, 144u, 0u}, {142u, 156u, 161u, 0u}, {189u, 156u, 0u, 0u},
56 {148u, 148u, 148u, 0u}, {146u, 148u, 138u, 0u}, {133u, 143u, 161u, 0u}, {189u, 143u, 0u, 0u},
57 {140u, 140u, 140u, 0u}, {177u, 147u, 0u, 0u}, {131u, 140u, 136u, 0u}, {146u, 130u, 126u, 0u},
58 {170u, 137u, 0u, 0u}, {132u, 132u, 130u, 0u}, {123u, 125u, 125u, 0u}, {123u, 123u, 133u, 0u},
59 {153u, 126u, 0u, 0u}, {114u, 116u, 118u, 0u}, {110u, 112u, 108u, 0u}, {97u, 109u, 136u, 0u},
60 {127u, 108u, 6u, 0u}, {0u, 173u, 0u, 0u}, {100u, 99u, 101u, 0u}, {176u, 71u, 41u, 0u},
61 {36u, 142u, 33u, 0u}, {98u, 91u, 75u, 0u}, {80u, 88u, 104u, 0u}, {252u, 0u, 0u, 0u},
62 {78u, 71u, 73u, 0u}, {73u, 71u, 78u, 0u}, {62u, 63u, 61u, 0u}, {0u, 66u, 211u, 0u},
63 {99u, 51u, 14u, 0u}, {198u, 0u, 0u, 0u}, {189u, 0u, 0u, 0u}, {0u, 57u, 206u, 0u},
64 {181u, 0u, 0u, 0u}, {0u, 56u, 185u, 0u}, {173u, 0u, 0u, 0u}, {165u, 0u, 0u, 0u},
65 {49u, 49u, 49u, 0u}, {0u, 49u, 165u, 0u}, {156u, 0u, 0u, 0u}, {42u, 45u, 60u, 0u},
66 {148u, 0u, 0u, 0u}, {140u, 0u, 0u, 0u}, {41u, 41u, 41u, 0u}, {0u, 41u, 144u, 0u},
67 {132u, 0u, 0u, 0u}, {123u, 0u, 0u, 0u}, {7u, 35u, 114u, 0u}, {34u, 36u, 32u, 0u},
68 {115u, 0u, 0u, 0u}, {107u, 0u, 0u, 0u}, {90u, 0u, 0u, 0u}, {23u, 24u, 27u, 0u},
69 {74u, 0u, 0u, 0u}, {15u, 15u, 16u, 0u}, {49u, 0u, 0u, 0u}, {16u, 12u, 4u, 0u},
70 {7u, 8u, 8u, 0u}, {0u, 0u, 8u, 0u}, {255u, 251u, 240u, 0u}, {160u, 160u, 164u, 0u},
71 {128u, 128u, 128u, 0u}, {255u, 0u, 0u, 0u}, {0u, 255u, 0u, 0u}, {255u, 255u, 0u, 0u},
72 {0u, 0u, 255u, 0u}, {255u, 0u, 255u, 0u}, {0u, 255u, 255u, 0u}, {255u, 255u, 255u, 0u}
73};
74
75// FUNCTION: LEGO1 0x100bee30
76// FUNCTION: BETA10 0x10143b50
78{
79 m_overrideSkyColor = FALSE;
80 m_palette = NULL;
81 GetDefaultPalette(m_entries);
82 m_skyColor = m_entries[141];
83}
84
85// FUNCTION: LEGO1 0x100beed0
86// FUNCTION: BETA10 0x10143bf4
87MxPalette::MxPalette(const RGBQUAD* p_colors)
88{
89 m_overrideSkyColor = FALSE;
90 m_palette = NULL;
92
93 for (MxS32 i = 10; i < 246; i++) {
94 m_entries[i].peRed = p_colors[i].rgbRed;
95 m_entries[i].peGreen = p_colors[i].rgbGreen;
96 m_entries[i].peBlue = p_colors[i].rgbBlue;
97 m_entries[i].peFlags = 0;
98 }
99
100 m_skyColor = m_entries[141];
101}
102
103// FUNCTION: LEGO1 0x100bef90
104// FUNCTION: BETA10 0x10143d01
106{
107 if (m_palette) {
108 m_palette->Release();
109 }
110}
111
112// FUNCTION: LEGO1 0x100bf000
113// FUNCTION: BETA10 0x10143d88
115{
116 if (m_palette == NULL) {
117 MxS32 i;
118 for (i = 0; i < 10; i++) {
119 m_entries[i].peFlags = D3DPAL_RESERVED;
120 }
121
122 for (; i < 136; i++) {
123 m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
124 }
125
126 for (; i < 140; i++) {
127 m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
128 }
129
130 m_entries[i++].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
131 m_entries[i++].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
132
133 for (; i < 246; i++) {
134 m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
135 }
136
137 for (; i < 256; i++) {
138 m_entries[i].peFlags = D3DPAL_RESERVED;
139 }
140
141 if (!MVideoManager()) {
142 goto done;
143 }
144
145 if (!MVideoManager()->GetDirectDraw()) {
146 goto done;
147 }
148
149 if (MVideoManager()->GetDirectDraw()->CreatePalette(DDPCAPS_8BIT, m_entries, &m_palette, NULL)) {
150 goto done;
151 }
152 }
153
154done:
155 return m_palette;
156}
157
158// FUNCTION: LEGO1 0x100bf0b0
159// FUNCTION: BETA10 0x10143f13
161{
162 MxPalette* result = new MxPalette;
163 GetEntries(result->m_entries);
164 result->SetOverrideSkyColor(m_overrideSkyColor);
165 return result;
166}
167
168// FUNCTION: LEGO1 0x100bf150
169// FUNCTION: BETA10 0x10143fc8
170MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries)
171{
172 memcpy(p_entries, m_entries, sizeof(m_entries));
173 return SUCCESS;
174}
175
176// FUNCTION: LEGO1 0x100bf170
177// FUNCTION: BETA10 0x10143ffa
178MxResult MxPalette::SetEntries(LPPALETTEENTRY p_entries)
179{
180 MxResult status = SUCCESS;
181
182 if (m_palette) {
183 MxS32 i;
184 for (i = 0; i < 10; i++) {
185 m_entries[i].peFlags = D3DPAL_RESERVED;
186 }
187
188 for (; i < 136; i++) {
189 m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
190 m_entries[i].peRed = p_entries[i].peRed;
191 m_entries[i].peGreen = p_entries[i].peGreen;
192 m_entries[i].peBlue = p_entries[i].peBlue;
193 }
194
195 for (; i < 140; i++) {
196 m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
197 m_entries[i].peRed = p_entries[i].peRed;
198 m_entries[i].peGreen = p_entries[i].peGreen;
199 m_entries[i].peBlue = p_entries[i].peBlue;
200 }
201
202 if (!m_overrideSkyColor) {
203 m_entries[i].peFlags = D3DPAL_READONLY | PC_NOCOLLAPSE;
204 m_entries[i].peRed = p_entries[i].peRed;
205 m_entries[i].peGreen = p_entries[i].peGreen;
206 m_entries[i].peBlue = p_entries[i].peBlue;
207 i++;
208 m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
209 m_entries[i].peRed = p_entries[i].peRed;
210 m_entries[i].peGreen = p_entries[i].peGreen;
211 m_entries[i].peBlue = p_entries[i].peBlue;
212 i++;
213 }
214 else {
215 i = 142;
216 }
217
218 for (; i < 246; i++) {
219 m_entries[i].peFlags = D3DPAL_RESERVED | PC_NOCOLLAPSE;
220 m_entries[i].peRed = p_entries[i].peRed;
221 m_entries[i].peGreen = p_entries[i].peGreen;
222 m_entries[i].peBlue = p_entries[i].peBlue;
223 }
224
225 for (; i < 256; i++) {
226 m_entries[i].peFlags = D3DPAL_RESERVED;
227 }
228
229 if (m_palette->SetEntries(0, 0, 256, m_entries)) {
230 status = FAILURE;
231 }
232 }
233
234 return status;
235}
236
237// FUNCTION: LEGO1 0x100bf2d0
238// FUNCTION: BETA10 0x101442aa
239MxResult MxPalette::SetSkyColor(LPPALETTEENTRY p_skyColor)
240{
241 MxResult status = 0;
242 if (m_palette != NULL) {
243 m_entries[141].peRed = p_skyColor->peRed;
244 m_entries[141].peGreen = p_skyColor->peGreen;
245 m_entries[141].peBlue = p_skyColor->peBlue;
246 m_skyColor = m_entries[141];
247 if (m_palette->SetEntries(0, 141, 1, &m_skyColor)) {
248 status = -1;
249 }
250 }
251 return status;
252}
253
254// FUNCTION: BETA10 0x1014434a
256{
257 if (m_palette) {
258 m_palette->Release();
259 }
260
261 m_palette = p_palette;
262}
263
264// FUNCTION: LEGO1 0x100bf330
265// FUNCTION: BETA10 0x1014438a
267{
268 m_palette = NULL;
269}
270
271// FUNCTION: LEGO1 0x100bf340
272// FUNCTION: BETA10 0x101443aa
274{
275 for (MxS32 i = 0; i < 256; i++) {
276 if (m_entries[i].peRed != p_other.m_entries[i].peRed) {
277 return FALSE;
278 }
279
280 if (m_entries[i].peGreen != p_other.m_entries[i].peGreen) {
281 return FALSE;
282 }
283
284 if (m_entries[i].peBlue != p_other.m_entries[i].peBlue) {
285 return FALSE;
286 }
287 }
288 return TRUE;
289}
290
291// FUNCTION: LEGO1 0x100bf390
292// FUNCTION: BETA10 0x1014445a
293void MxPalette::ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries)
294{
295 HDC hdc;
296
297 hdc = GetDC(0);
298 if ((GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0 && GetDeviceCaps(hdc, SIZEPALETTE) == 256) {
299 GetSystemPaletteEntries(hdc, 0, 10, p_entries);
300 GetSystemPaletteEntries(hdc, 246, 10, &p_entries[246]);
301 }
302 else {
303 memcpy(p_entries, g_defaultPaletteEntries, sizeof(PALETTEENTRY) * 10);
304 memcpy(&p_entries[246], &g_defaultPaletteEntries[246], sizeof(PALETTEENTRY) * 10);
305 }
306 ReleaseDC(0, hdc);
307}
308
309// FUNCTION: LEGO1 0x100bf420
310// FUNCTION: BETA10 0x10144517
311void MxPalette::GetDefaultPalette(LPPALETTEENTRY p_entries)
312{
313 HDC hdc;
314
315 hdc = GetDC(0);
316 if ((GetDeviceCaps(hdc, RASTERCAPS) & RC_PALETTE) != 0 && GetDeviceCaps(hdc, SIZEPALETTE) == 256) {
317 GetSystemPaletteEntries(hdc, 0, 256, p_entries);
318 memcpy(&p_entries[10], &g_defaultPaletteEntries[10], sizeof(PALETTEENTRY) * 236);
319 }
320 else {
321 memcpy(p_entries, g_defaultPaletteEntries, sizeof(PALETTEENTRY) * 256);
322 }
323
324 ReleaseDC(0, hdc);
325}
326
327// FUNCTION: LEGO1 0x100bf490
328// FUNCTION: BETA10 0x101445bf
329void MxPalette::Reset(MxBool p_ignoreSkyColor)
330{
331 if (m_palette != NULL) {
332 GetDefaultPalette(m_entries);
333 if (!p_ignoreSkyColor) {
334 m_entries[140] = m_entries[141] = m_skyColor;
335 }
336
337 SetEntries(m_entries);
338 m_palette->SetEntries(0, 0, 256, m_entries);
339 }
340}
[AI] Encapsulates a DirectDraw 8-bit (256 color) palette for use with DirectX rendering.
Definition: mxpalette.h:17
LPDIRECTDRAWPALETTE CreateNativePalette()
[AI] Creates the internal DirectDraw palette object and populates it with the current palette entries...
Definition: mxpalette.cpp:114
MxResult SetEntries(LPPALETTEENTRY p_palette)
[AI] Sets the palette's RGB entries from an external array and updates the DirectDraw palette if atta...
Definition: mxpalette.cpp:178
void SetOverrideSkyColor(MxBool p_value)
[AI] Sets whether the sky color is overridden, preventing calls to SetSkyColor from effecting palette...
Definition: mxpalette.h:112
void Detach()
[AI] Detaches the internal DirectDraw palette object, releasing ownership.
Definition: mxpalette.cpp:266
MxPalette()
[AI] Constructs a new palette, initializing to the system or default palette entries.
Definition: mxpalette.cpp:77
MxPalette * Clone()
[AI] Creates a duplicate of this palette object with the same palette data and override flag.
Definition: mxpalette.cpp:160
MxResult GetEntries(LPPALETTEENTRY p_entries)
[AI] Copies all palette entries to external buffer.
Definition: mxpalette.cpp:170
void GetDefaultPalette(LPPALETTEENTRY p_entries)
[AI] Retrieves the default palette for the current system/graphics environment.
Definition: mxpalette.cpp:311
MxBool operator==(MxPalette &p_other)
[AI] Compares two palettes for equality by checking all 256 color entries (RGB only,...
Definition: mxpalette.cpp:273
void ApplySystemEntriesToPalette(LPPALETTEENTRY p_entries)
[AI] Copies system palette entries (first and last 10) to the specified buffer.
Definition: mxpalette.cpp:293
void SetPalette(LPDIRECTDRAWPALETTE p_palette)
[AI] Sets the internal DirectDraw palette pointer, releasing any previously held instance.
Definition: mxpalette.cpp:255
MxResult SetSkyColor(LPPALETTEENTRY p_skyColor)
[AI] Sets the "sky color" palette entry (typically index 141, reserved for sky background),...
Definition: mxpalette.cpp:239
void Reset(MxBool p_ignoreSkyColor)
[AI] Resets palette entries to default system values, optionally preserving the current sky color,...
Definition: mxpalette.cpp:329
~MxPalette() override
[AI] Destructor.
Definition: mxpalette.cpp:105
#define TRUE
Definition: d3drmdef.h:28
#define FALSE
Definition: d3drmdef.h:27
#define D3DPAL_READONLY
Definition: d3dtypes.h:1196
#define D3DPAL_RESERVED
Definition: d3dtypes.h:1197
struct IDirectDrawPalette FAR * LPDIRECTDRAWPALETTE
Definition: ddraw.h:78
#define DDPCAPS_8BIT
Definition: ddraw.h:2096
#define NULL
[AI] Null pointer value (C/C++ semantics).
Definition: legotypes.h:26
#define FAILURE
[AI] Used to indicate a failed operation in result codes.
Definition: legotypes.h:34
#define SUCCESS
[AI] Used to indicate a successful operation in result codes.
Definition: legotypes.h:30
MxVideoManager * MVideoManager()
[AI] Returns the video manager used for video/cutscene presenter management.
Definition: mxmisc.cpp:65
PALETTEENTRY g_defaultPaletteEntries[256]
Definition: mxpalette.cpp:8
MxU8 MxBool
[AI]
Definition: mxtypes.h:124
MxLong MxResult
[AI]
Definition: mxtypes.h:106
signed int MxS32
[AI]
Definition: mxtypes.h:38