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"
21 assert((
sizeof(data) % 4 == 0) && (
sizeof(data) <= 32));
22 for (
unsigned i = 0; i <
sizeof(data); i += 2) {
24 col.
set_snes(
static_cast<uint8_t
>(data[i + 1]) << 8);
25 col.
set_snes(col.
snes() |
static_cast<uint8_t
>(data[i]));
33 assert((
sizeof(snes_pal) % 4 == 0) && (
sizeof(snes_pal) <= 32));
34 for (
unsigned i = 0; i <
sizeof(snes_pal); i += 2) {
36 col.
set_snes(snes_pal[i + 1] << (uint16_t)8);
46 uint16_t color = (
static_cast<uint8_t
>(data[i + 1]) << 8) |
47 static_cast<uint8_t
>(data[i]);
53 for (
const auto &color : colors) {
61 for (
const auto &color : colors) {
69 for (
const auto &color : colors) {
83 auto data = rom_data.data();
84 for (
int i = 0; i < 6; i++) {
89 return absl::OkStatus();
93 const std::vector<uint8_t> &rom_data,
95 auto data = rom_data.data();
96 for (
int i = 0; i < 20; i++) {
101 return absl::OkStatus();
105 const std::vector<uint8_t> &rom_data,
107 auto data = rom_data.data();
108 for (
int i = 0; i < 14; i++) {
112 return absl::OkStatus();
117 auto data = rom_data.data();
118 for (
int i = 0; i < 2; i++) {
122 return absl::OkStatus();
127 auto data = rom_data.data();
132 return absl::OkStatus();
137 auto data = rom_data.data();
138 for (
int i = 0; i < 5; i++) {
142 return absl::OkStatus();
147 auto data = rom_data.data();
148 for (
int i = 0; i < 4; i++) {
152 return absl::OkStatus();
157 auto data = rom_data.data();
158 for (
int i = 0; i < 3; i++) {
162 return absl::OkStatus();
167 auto data = rom_data.data();
168 for (
int i = 0; i < 12; i++) {
172 return absl::OkStatus();
177 auto data = rom_data.data();
178 for (
int i = 0; i < 11; i++) {
182 return absl::OkStatus();
187 auto data = rom_data.data();
188 for (
int i = 0; i < 24; i++) {
192 return absl::OkStatus();
197 auto data = rom_data.data();
198 for (
int i = 0; i < 20; i++) {
202 return absl::OkStatus();
213 return absl::OkStatus();
218 auto data = rom_data.data();
223 return absl::OkStatus();
227 const std::vector<uint8_t> &rom_data,
229 auto data = rom_data.data();
230 for (
int i = 0; i < 2; i++) {
234 return absl::OkStatus();
257 {
"ow_main", 35}, {
"ow_aux", 21}, {
"ow_animated", 7},
258 {
"hud", 32}, {
"global_sprites", 60}, {
"armors", 15},
259 {
"swords", 3}, {
"shields", 4}, {
"sprites_aux1", 7},
260 {
"sprites_aux2", 7}, {
"sprites_aux3", 7}, {
"dungeon_main", 90},
261 {
"grass", 1}, {
"3d_object", 8}, {
"ow_mini_map", 128},
265 size_t color_index) {
273 uint32_t address = base_address + (palette_index * colors_per_palette * 2) +
280 int color_offset = 0;
281 std::vector<gfx::SnesColor> colors(num_colors);
283 while (color_offset < num_colors) {
284 short color = (uint16_t)((rom[offset + 1]) << 8) | rom[offset];
286 new_color.
red = (color & 0x1F) * 8;
287 new_color.
green = ((color >> 5) & 0x1F) * 8;
288 new_color.
blue = ((color >> 10) & 0x1F) * 8;
290 if (color_offset == 0) {
291 colors[color_offset].set_transparent(
true);
301 std::array<float, 4> colorArray;
302 colorArray[0] = color.
rgb().x / 255.0f;
303 colorArray[1] = color.
rgb().y / 255.0f;
304 colorArray[2] = color.
rgb().z / 255.0f;
305 colorArray[3] = color.
rgb().w;
310 std::vector<SnesColor> &palette_rows) {
312 for (
int i = 0; i < palette_rows.size(); i += 8) {
314 for (
int j = 0; j < 8; j++) {
315 palette.
AddColor(palette_rows[i + j]);
319 return palette_group;
325 for (
int i = 0; i < palette.
size(); i += num_colors) {
327 if (i + num_colors < palette.
size()) {
328 for (
int j = 0; j < num_colors; j++) {
329 new_palette.
AddColor(palette[i + j]);
334 return palette_group;
337using namespace palette_group_internal;
357 return absl::OkStatus();
static std::unordered_map< uint8_t, gfx::Paletteset > palettesets_
constexpr ImVec4 rgb() const
void set_snes(uint16_t val)
constexpr uint16_t snes() const
void set_rgb(const ImVec4 val)
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
void AddColor(const SnesColor &color)
static constexpr size_t kMaxColors
#define RETURN_IF_ERROR(expression)
Internal functions for loading palettes by group.
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.
constexpr int kHardcodedGrassSpecial
constexpr int kHudPalettes
constexpr int kOverworldPaletteAux
SnesPalette ReadPaletteFromRom(int offset, int num_colors, const uint8_t *rom)
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)
constexpr int kShieldPalettes
constexpr int kSpritesPalettesAux2
constexpr int kOverworldPaletteAnimated
SnesColor ReadColorFromRom(int offset, const uint8_t *rom)
constexpr int kOverworldMiniMapPalettes
constexpr int kOverworldPaletteMain
constexpr int kSwordPalettes
constexpr int kHardcodedGrassDW
snes_color ConvertSnesToRgb(uint16_t color_snes)
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 > CreatePaletteGroupFromLargePalette(SnesPalette &palette, int num_colors)
Take a SNESPalette, divide it into palettes of 8 colors.
absl::StatusOr< PaletteGroup > CreatePaletteGroupFromColFile(std::vector< SnesColor > &palette_rows)
Main namespace for the application.
Primitive of 16-bit RGB SNES color.
Represents a mapping of palette groups.
PaletteGroup overworld_main
PaletteGroup overworld_aux
PaletteGroup overworld_mini_map
PaletteGroup sprites_aux1
PaletteGroup sprites_aux2
PaletteGroup overworld_animated
PaletteGroup sprites_aux3
PaletteGroup dungeon_main
PaletteGroup global_sprites
Represents a group of palettes.
void AddColor(SnesColor color)
void AddPalette(SnesPalette pal)