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