yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
snes_palette.cc
Go to the documentation of this file.
2
4
5#include <cstdint>
6#include <cstdlib>
7#include <cstring>
8#include <vector>
9
10#include "absl/container/flat_hash_map.h"
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
13#include "absl/strings/str_format.h"
15#include "imgui/imgui.h"
16#include "util/macro.h"
17
18namespace yaze::gfx {
19
21 assert((sizeof(data) % 4 == 0) && (sizeof(data) <= 32));
22 for (unsigned i = 0; i < sizeof(data); i += 2) {
23 SnesColor col;
24 col.set_snes(static_cast<uint8_t>(data[i + 1]) << 8);
25 col.set_snes(col.snes() | static_cast<uint8_t>(data[i]));
26 colors_[size_++] = col;
27 }
28}
29
30SnesPalette::SnesPalette(const unsigned char* snes_pal) {
31 assert((sizeof(snes_pal) % 4 == 0) && (sizeof(snes_pal) <= 32));
32 for (unsigned i = 0; i < sizeof(snes_pal); i += 2) {
33 SnesColor col;
34 col.set_snes(snes_pal[i + 1] << (uint16_t)8);
35 col.set_snes(col.snes() | snes_pal[i]);
36 colors_[size_++] = col;
37 }
38}
39
40SnesPalette::SnesPalette(const char* data, size_t length) : size_(0) {
41 for (size_t i = 0; i < length && size_ < kMaxColors; i += 2) {
42 uint16_t color = (static_cast<uint8_t>(data[i + 1]) << 8) |
43 static_cast<uint8_t>(data[i]);
44 colors_[size_++] = SnesColor(color);
45 }
46}
47
48SnesPalette::SnesPalette(const std::vector<uint16_t>& colors) : size_(0) {
49 for (const auto& color : colors) {
50 if (size_ < kMaxColors) {
51 colors_[size_++] = SnesColor(color);
52 }
53 }
54}
55
56SnesPalette::SnesPalette(const std::vector<SnesColor>& colors) : size_(0) {
57 for (const auto& color : colors) {
58 if (size_ < kMaxColors) {
59 colors_[size_++] = color;
60 }
61 }
62}
63
64SnesPalette::SnesPalette(const std::vector<ImVec4>& colors) : size_(0) {
65 for (const auto& color : colors) {
66 if (size_ < kMaxColors) {
67 colors_[size_++] = SnesColor(color);
68 }
69 }
70}
71
76namespace palette_group_internal {
77absl::Status LoadOverworldMainPalettes(const std::vector<uint8_t>& rom_data,
78 gfx::PaletteGroupMap& palette_groups) {
79 auto data = rom_data.data();
80 size_t rom_size = rom_data.size();
81 for (int i = 0; i < 6; i++) {
82 int offset = kOverworldPaletteMain + (i * (35 * 2));
83 int num_colors = 35;
84 // Bounds check: each color is 2 bytes, so we need offset + (num_colors * 2) bytes
85 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
86 return absl::OutOfRangeError(absl::StrFormat(
87 "Overworld main palette %d out of bounds: offset %d, size %zu", i,
88 offset, rom_size));
89 }
90 palette_groups.overworld_main.AddPalette(
91 gfx::ReadPaletteFromRom(offset, num_colors, data));
92 }
93 return absl::OkStatus();
94}
95
97 const std::vector<uint8_t>& rom_data,
98 gfx::PaletteGroupMap& palette_groups) {
99 auto data = rom_data.data();
100 size_t rom_size = rom_data.size();
101 for (int i = 0; i < 20; i++) {
102 int offset = kOverworldPaletteAux + (i * (21 * 2));
103 int num_colors = 21;
104 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
105 return absl::OutOfRangeError(absl::StrFormat(
106 "Overworld aux palette %d out of bounds: offset %d, size %zu", i,
107 offset, rom_size));
108 }
109 palette_groups.overworld_aux.AddPalette(
110 gfx::ReadPaletteFromRom(offset, num_colors, data));
111 }
112 return absl::OkStatus();
113}
114
116 const std::vector<uint8_t>& rom_data,
117 gfx::PaletteGroupMap& palette_groups) {
118 auto data = rom_data.data();
119 size_t rom_size = rom_data.size();
120 for (int i = 0; i < 14; i++) {
121 int offset = kOverworldPaletteAnimated + (i * (7 * 2));
122 int num_colors = 7;
123 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
124 return absl::OutOfRangeError(absl::StrFormat(
125 "Overworld animated palette %d out of bounds: offset %d, size %zu", i,
126 offset, rom_size));
127 }
128 palette_groups.overworld_animated.AddPalette(
129 gfx::ReadPaletteFromRom(offset, num_colors, data));
130 }
131 return absl::OkStatus();
132}
133
134absl::Status LoadHUDPalettes(const std::vector<uint8_t>& rom_data,
135 gfx::PaletteGroupMap& palette_groups) {
136 auto data = rom_data.data();
137 size_t rom_size = rom_data.size();
138 for (int i = 0; i < 2; i++) {
139 int offset = kHudPalettes + (i * 64);
140 int num_colors = 32;
141 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
142 return absl::OutOfRangeError(
143 absl::StrFormat("HUD palette %d out of bounds: offset %d, size %zu",
144 i, offset, rom_size));
145 }
146 palette_groups.hud.AddPalette(
147 gfx::ReadPaletteFromRom(offset, num_colors, data));
148 }
149 return absl::OkStatus();
150}
151
152absl::Status LoadGlobalSpritePalettes(const std::vector<uint8_t>& rom_data,
153 gfx::PaletteGroupMap& palette_groups) {
154 auto data = rom_data.data();
155 size_t rom_size = rom_data.size();
156
157 // Check first palette
158 int offset1 = kGlobalSpritesLW;
159 int num_colors1 = 60;
160 if (offset1 < 0 || offset1 + (num_colors1 * 2) > static_cast<int>(rom_size)) {
161 return absl::OutOfRangeError(absl::StrFormat(
162 "Global sprite LW palette out of bounds: offset %d, size %zu", offset1,
163 rom_size));
164 }
165 palette_groups.global_sprites.AddPalette(
166 gfx::ReadPaletteFromRom(offset1, num_colors1, data));
167
168 // Check second palette
169 int offset2 = kGlobalSpritePalettesDW;
170 int num_colors2 = 60;
171 if (offset2 < 0 || offset2 + (num_colors2 * 2) > static_cast<int>(rom_size)) {
172 return absl::OutOfRangeError(absl::StrFormat(
173 "Global sprite DW palette out of bounds: offset %d, size %zu", offset2,
174 rom_size));
175 }
176 palette_groups.global_sprites.AddPalette(
177 gfx::ReadPaletteFromRom(offset2, num_colors2, data));
178 return absl::OkStatus();
179}
180
181absl::Status LoadArmorPalettes(const std::vector<uint8_t>& rom_data,
182 gfx::PaletteGroupMap& palette_groups) {
183 auto data = rom_data.data();
184 size_t rom_size = rom_data.size();
185 for (int i = 0; i < 5; i++) {
186 int offset = kArmorPalettes + (i * 30);
187 int num_colors = 15;
188 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
189 return absl::OutOfRangeError(
190 absl::StrFormat("Armor palette %d out of bounds: offset %d, size %zu",
191 i, offset, rom_size));
192 }
193 palette_groups.armors.AddPalette(
194 gfx::ReadPaletteFromRom(offset, num_colors, data));
195 }
196 return absl::OkStatus();
197}
198
199absl::Status LoadSwordPalettes(const std::vector<uint8_t>& rom_data,
200 gfx::PaletteGroupMap& palette_groups) {
201 auto data = rom_data.data();
202 size_t rom_size = rom_data.size();
203 for (int i = 0; i < 4; i++) {
204 int offset = kSwordPalettes + (i * 6);
205 int num_colors = 3;
206 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
207 return absl::OutOfRangeError(
208 absl::StrFormat("Sword palette %d out of bounds: offset %d, size %zu",
209 i, offset, rom_size));
210 }
211 palette_groups.swords.AddPalette(
212 gfx::ReadPaletteFromRom(offset, num_colors, data));
213 }
214 return absl::OkStatus();
215}
216
217absl::Status LoadShieldPalettes(const std::vector<uint8_t>& rom_data,
218 gfx::PaletteGroupMap& palette_groups) {
219 auto data = rom_data.data();
220 size_t rom_size = rom_data.size();
221 for (int i = 0; i < 3; i++) {
222 int offset = kShieldPalettes + (i * 8);
223 int num_colors = 4;
224 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
225 return absl::OutOfRangeError(absl::StrFormat(
226 "Shield palette %d out of bounds: offset %d, size %zu", i, offset,
227 rom_size));
228 }
229 palette_groups.shields.AddPalette(
230 gfx::ReadPaletteFromRom(offset, num_colors, data));
231 }
232 return absl::OkStatus();
233}
234
235absl::Status LoadSpriteAux1Palettes(const std::vector<uint8_t>& rom_data,
236 gfx::PaletteGroupMap& palette_groups) {
237 auto data = rom_data.data();
238 size_t rom_size = rom_data.size();
239 for (int i = 0; i < 12; i++) {
240 int offset = kSpritesPalettesAux1 + (i * 14);
241 int num_colors = 7;
242 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
243 return absl::OutOfRangeError(absl::StrFormat(
244 "Sprite aux1 palette %d out of bounds: offset %d, size %zu", i,
245 offset, rom_size));
246 }
247 palette_groups.sprites_aux1.AddPalette(
248 gfx::ReadPaletteFromRom(offset, num_colors, data));
249 }
250 return absl::OkStatus();
251}
252
253absl::Status LoadSpriteAux2Palettes(const std::vector<uint8_t>& rom_data,
254 gfx::PaletteGroupMap& palette_groups) {
255 auto data = rom_data.data();
256 size_t rom_size = rom_data.size();
257 for (int i = 0; i < 11; i++) {
258 int offset = kSpritesPalettesAux2 + (i * 14);
259 int num_colors = 7;
260 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
261 return absl::OutOfRangeError(absl::StrFormat(
262 "Sprite aux2 palette %d out of bounds: offset %d, size %zu", i,
263 offset, rom_size));
264 }
265 palette_groups.sprites_aux2.AddPalette(
266 gfx::ReadPaletteFromRom(offset, num_colors, data));
267 }
268 return absl::OkStatus();
269}
270
271absl::Status LoadSpriteAux3Palettes(const std::vector<uint8_t>& rom_data,
272 gfx::PaletteGroupMap& palette_groups) {
273 auto data = rom_data.data();
274 size_t rom_size = rom_data.size();
275 for (int i = 0; i < 24; i++) {
276 int offset = kSpritesPalettesAux3 + (i * 14);
277 int num_colors = 7;
278 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
279 return absl::OutOfRangeError(absl::StrFormat(
280 "Sprite aux3 palette %d out of bounds: offset %d, size %zu", i,
281 offset, rom_size));
282 }
283 palette_groups.sprites_aux3.AddPalette(
284 gfx::ReadPaletteFromRom(offset, num_colors, data));
285 }
286 return absl::OkStatus();
287}
288
289absl::Status LoadDungeonMainPalettes(const std::vector<uint8_t>& rom_data,
290 gfx::PaletteGroupMap& palette_groups) {
291 auto data = rom_data.data();
292 size_t rom_size = rom_data.size();
293 for (int i = 0; i < 20; i++) {
294 int offset = kDungeonMainPalettes + (i * 180);
295 int num_colors = 90;
296 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
297 return absl::OutOfRangeError(absl::StrFormat(
298 "Dungeon main palette %d out of bounds: offset %d, size %zu", i,
299 offset, rom_size));
300 }
301 palette_groups.dungeon_main.AddPalette(
302 gfx::ReadPaletteFromRom(offset, num_colors, data));
303 }
304 return absl::OkStatus();
305}
306
307absl::Status LoadGrassColors(const std::vector<uint8_t>& rom_data,
308 gfx::PaletteGroupMap& palette_groups) {
309 size_t rom_size = rom_data.size();
310
311 // Each color is 2 bytes
312 if (kHardcodedGrassLW < 0 ||
313 kHardcodedGrassLW + 2 > static_cast<int>(rom_size)) {
314 return absl::OutOfRangeError(
315 absl::StrFormat("Grass LW color out of bounds: offset %d, size %zu",
316 kHardcodedGrassLW, rom_size));
317 }
318 palette_groups.grass.AddColor(
319 gfx::ReadColorFromRom(kHardcodedGrassLW, rom_data.data()));
320
321 if (kHardcodedGrassDW < 0 ||
322 kHardcodedGrassDW + 2 > static_cast<int>(rom_size)) {
323 return absl::OutOfRangeError(
324 absl::StrFormat("Grass DW color out of bounds: offset %d, size %zu",
325 kHardcodedGrassDW, rom_size));
326 }
327 palette_groups.grass.AddColor(
328 gfx::ReadColorFromRom(kHardcodedGrassDW, rom_data.data()));
329
330 if (kHardcodedGrassSpecial < 0 ||
331 kHardcodedGrassSpecial + 2 > static_cast<int>(rom_size)) {
332 return absl::OutOfRangeError(absl::StrFormat(
333 "Grass special color out of bounds: offset %d, size %zu",
334 kHardcodedGrassSpecial, rom_size));
335 }
336 palette_groups.grass.AddColor(
338 return absl::OkStatus();
339}
340
341absl::Status Load3DObjectPalettes(const std::vector<uint8_t>& rom_data,
342 gfx::PaletteGroupMap& palette_groups) {
343 auto data = rom_data.data();
344 size_t rom_size = rom_data.size();
345
346 int offset1 = kTriforcePalette;
347 int num_colors1 = 8;
348 if (offset1 < 0 || offset1 + (num_colors1 * 2) > static_cast<int>(rom_size)) {
349 return absl::OutOfRangeError(
350 absl::StrFormat("Triforce palette out of bounds: offset %d, size %zu",
351 offset1, rom_size));
352 }
353 palette_groups.object_3d.AddPalette(
354 gfx::ReadPaletteFromRom(offset1, num_colors1, data));
355
356 int offset2 = kCrystalPalette;
357 int num_colors2 = 8;
358 if (offset2 < 0 || offset2 + (num_colors2 * 2) > static_cast<int>(rom_size)) {
359 return absl::OutOfRangeError(
360 absl::StrFormat("Crystal palette out of bounds: offset %d, size %zu",
361 offset2, rom_size));
362 }
363 palette_groups.object_3d.AddPalette(
364 gfx::ReadPaletteFromRom(offset2, num_colors2, data));
365 return absl::OkStatus();
366}
367
369 const std::vector<uint8_t>& rom_data,
370 gfx::PaletteGroupMap& palette_groups) {
371 auto data = rom_data.data();
372 size_t rom_size = rom_data.size();
373 for (int i = 0; i < 2; i++) {
374 int offset = kOverworldMiniMapPalettes + (i * 256);
375 int num_colors = 128;
376 if (offset < 0 || offset + (num_colors * 2) > static_cast<int>(rom_size)) {
377 return absl::OutOfRangeError(absl::StrFormat(
378 "Overworld minimap palette %d out of bounds: offset %d, size %zu", i,
379 offset, rom_size));
380 }
381 palette_groups.overworld_mini_map.AddPalette(
382 gfx::ReadPaletteFromRom(offset, num_colors, data));
383 }
384 return absl::OkStatus();
385}
386} // namespace palette_group_internal
387
388const absl::flat_hash_map<std::string, uint32_t> kPaletteGroupAddressMap = {
389 {"ow_main", kOverworldPaletteMain},
390 {"ow_aux", kOverworldPaletteAux},
391 {"ow_animated", kOverworldPaletteAnimated},
392 {"hud", kHudPalettes},
393 {"global_sprites", kGlobalSpritesLW},
394 {"armors", kArmorPalettes},
395 {"swords", kSwordPalettes},
396 {"shields", kShieldPalettes},
397 {"sprites_aux1", kSpritesPalettesAux1},
398 {"sprites_aux2", kSpritesPalettesAux2},
399 {"sprites_aux3", kSpritesPalettesAux3},
400 {"dungeon_main", kDungeonMainPalettes},
401 {"grass", kHardcodedGrassLW},
402 {"3d_object", kTriforcePalette},
403 {"ow_mini_map", kOverworldMiniMapPalettes},
404};
405
406const absl::flat_hash_map<std::string, uint32_t> kPaletteGroupColorCounts = {
407 {"ow_main", 35}, {"ow_aux", 21}, {"ow_animated", 7},
408 {"hud", 32}, {"global_sprites", 60}, {"armors", 15},
409 {"swords", 3}, {"shields", 4}, {"sprites_aux1", 7},
410 {"sprites_aux2", 7}, {"sprites_aux3", 7}, {"dungeon_main", 90},
411 {"grass", 1}, {"3d_object", 8}, {"ow_mini_map", 128},
412};
413
414uint32_t GetPaletteAddress(const std::string& group_name, size_t palette_index,
415 size_t color_index) {
416 // Retrieve the base address for the palette group
417 uint32_t base_address = kPaletteGroupAddressMap.at(group_name);
418
419 // Retrieve the number of colors for each palette in the group
420 uint32_t colors_per_palette = kPaletteGroupColorCounts.at(group_name);
421
422 // Calculate the address for thes specified color in the ROM
423 uint32_t address = base_address + (palette_index * colors_per_palette * 2) +
424 (color_index * 2);
425
426 return address;
427}
428
455SnesPalette ReadPaletteFromRom(int offset, int num_colors, const uint8_t* rom) {
456 int color_offset = 0;
457 std::vector<gfx::SnesColor> colors(num_colors);
458
459 while (color_offset < num_colors) {
460 // Bounds check before accessing ROM data
461 // Each color is 2 bytes, so we need at least offset + 1 bytes available
462 // Note: We can't check full bounds here without ROM size, but we can at least
463 // validate the immediate access. Full bounds should be checked by caller.
464
465 // Read SNES 15-bit color (little endian)
466 uint16_t snes_color_word = (uint16_t)((rom[offset + 1]) << 8) | rom[offset];
467
468 // Extract RGB components (5-bit each) and expand to 8-bit (0-255)
469 snes_color new_color;
470 new_color.red = (snes_color_word & 0x1F) * 8; // Bits 0-4
471 new_color.green = ((snes_color_word >> 5) & 0x1F) * 8; // Bits 5-9
472 new_color.blue = ((snes_color_word >> 10) & 0x1F) * 8; // Bits 10-14
473
474 // Create SnesColor by converting RGB back to SNES format
475 // (This ensures all internal representations are consistent)
476 colors[color_offset].set_snes(ConvertRgbToSnes(new_color));
477
478 // DO NOT mark as transparent - preserve actual ROM color data!
479 // Transparency is handled at render time, not in the data
480
481 color_offset++;
482 offset += 2; // SNES colors are 2 bytes each
483 }
484
485 return gfx::SnesPalette(colors);
486}
487
488std::array<float, 4> ToFloatArray(const SnesColor& color) {
489 std::array<float, 4> colorArray;
490 colorArray[0] = color.rgb().x / 255.0f;
491 colorArray[1] = color.rgb().y / 255.0f;
492 colorArray[2] = color.rgb().z / 255.0f;
493 colorArray[3] = color.rgb().w;
494 return colorArray;
495}
496
497absl::StatusOr<PaletteGroup> CreatePaletteGroupFromColFile(
498 std::vector<SnesColor>& palette_rows) {
499 PaletteGroup palette_group;
500 for (int i = 0; i < palette_rows.size(); i += 8) {
501 SnesPalette palette;
502 for (int j = 0; j < 8; j++) {
503 palette.AddColor(palette_rows[i + j]);
504 }
505 palette_group.AddPalette(palette);
506 }
507 return palette_group;
508}
509
525absl::StatusOr<PaletteGroup> CreatePaletteGroupFromLargePalette(
526 SnesPalette& palette, int num_colors) {
527 PaletteGroup palette_group;
528 for (int i = 0; i < palette.size(); i += num_colors) {
529 SnesPalette new_palette;
530 if (i + num_colors <= palette.size()) {
531 for (int j = 0; j < num_colors; j++) {
532 auto color = palette[i + j];
533 // DO NOT mark as transparent - preserve actual color data!
534 // Transparency is handled at render time, not in the data
535 new_palette.AddColor(color);
536 }
537 }
538 palette_group.AddPalette(new_palette);
539 }
540 return palette_group;
541}
542
543using namespace palette_group_internal;
544
545// TODO: Refactor LoadAllPalettes to use group names, move to zelda3 namespace
546absl::Status LoadAllPalettes(const std::vector<uint8_t>& rom_data,
547 PaletteGroupMap& groups) {
551 RETURN_IF_ERROR(LoadHUDPalettes(rom_data, groups))
553 RETURN_IF_ERROR(LoadArmorPalettes(rom_data, groups))
554 RETURN_IF_ERROR(LoadSwordPalettes(rom_data, groups))
555 RETURN_IF_ERROR(LoadShieldPalettes(rom_data, groups))
556 RETURN_IF_ERROR(LoadSpriteAux1Palettes(rom_data, groups))
557 RETURN_IF_ERROR(LoadSpriteAux2Palettes(rom_data, groups))
558 RETURN_IF_ERROR(LoadSpriteAux3Palettes(rom_data, groups))
560 RETURN_IF_ERROR(LoadGrassColors(rom_data, groups))
561 RETURN_IF_ERROR(Load3DObjectPalettes(rom_data, groups))
563 return absl::OkStatus();
564}
565
566std::unordered_map<uint8_t, gfx::Paletteset> GfxContext::palettesets_;
567
568} // namespace yaze::gfx
static std::unordered_map< uint8_t, gfx::Paletteset > palettesets_
SNES Color container.
Definition snes_color.h:110
constexpr ImVec4 rgb() const
Get RGB values (WARNING: stored as 0-255 in ImVec4)
Definition snes_color.h:183
void set_snes(uint16_t val)
Set color from SNES 15-bit format.
constexpr uint16_t snes() const
Get SNES 15-bit color.
Definition snes_color.h:193
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
void AddColor(const SnesColor &color)
static constexpr size_t kMaxColors
absl::Status LoadDungeonMainPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadOverworldMiniMapPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadSpriteAux2Palettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadOverworldMainPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadSpriteAux1Palettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadGlobalSpritePalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadOverworldAnimatedPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadArmorPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadGrassColors(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadSpriteAux3Palettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadHUDPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadShieldPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadOverworldAuxiliaryPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status Load3DObjectPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
absl::Status LoadSwordPalettes(const std::vector< uint8_t > &rom_data, gfx::PaletteGroupMap &palette_groups)
Contains classes for handling graphical data.
Definition editor.h:26
constexpr int kHardcodedGrassSpecial
constexpr int kHudPalettes
constexpr int kOverworldPaletteAux
SnesPalette ReadPaletteFromRom(int offset, int num_colors, const uint8_t *rom)
Read a palette from ROM data.
absl::StatusOr< PaletteGroup > CreatePaletteGroupFromLargePalette(SnesPalette &palette, int num_colors)
Create a PaletteGroup by dividing a large palette into sub-palettes.
constexpr int kHardcodedGrassLW
constexpr int kArmorPalettes
constexpr int kCrystalPalette
const absl::flat_hash_map< std::string, uint32_t > kPaletteGroupAddressMap
uint16_t ConvertRgbToSnes(const snes_color &color)
Convert RGB (0-255) to SNES 15-bit color.
Definition snes_color.cc:33
constexpr int kShieldPalettes
constexpr int kSpritesPalettesAux2
constexpr int kOverworldPaletteAnimated
SnesColor ReadColorFromRom(int offset, const uint8_t *rom)
Definition snes_color.cc:48
constexpr int kOverworldMiniMapPalettes
constexpr int kOverworldPaletteMain
constexpr int kSwordPalettes
constexpr int kHardcodedGrassDW
constexpr int kGlobalSpritesLW
const absl::flat_hash_map< std::string, uint32_t > kPaletteGroupColorCounts
constexpr int kSpritesPalettesAux1
std::array< float, 4 > ToFloatArray(const SnesColor &color)
constexpr int kGlobalSpritePalettesDW
constexpr int kSpritesPalettesAux3
constexpr int kDungeonMainPalettes
uint32_t GetPaletteAddress(const std::string &group_name, size_t palette_index, size_t color_index)
constexpr int kTriforcePalette
absl::Status LoadAllPalettes(const std::vector< uint8_t > &rom_data, PaletteGroupMap &groups)
Loads all the palettes for the game.
absl::StatusOr< PaletteGroup > CreatePaletteGroupFromColFile(std::vector< SnesColor > &palette_rows)
SDL2/SDL3 compatibility layer.
#define RETURN_IF_ERROR(expr)
Definition snes.cc:22
SNES color in 15-bit RGB format (BGR555)
Definition yaze.h:218
uint16_t green
Definition yaze.h:220
uint16_t red
Definition yaze.h:219
uint16_t blue
Definition yaze.h:221
Represents a mapping of palette groups.
Represents a group of palettes.
void AddColor(SnesColor color)
void AddPalette(SnesPalette pal)