fix(palette): align ROM backing and tests

This commit is contained in:
scawful
2025-12-22 14:55:31 -05:00
parent c8ec329f14
commit 26ce12cd6f
6 changed files with 42 additions and 24 deletions

View File

@@ -18,7 +18,7 @@ void PaletteManager::Initialize(zelda3::GameData* game_data) {
} }
game_data_ = game_data; game_data_ = game_data;
rom_ = nullptr; // Clear legacy ROM pointer rom_ = game_data->rom();
// Load original palette snapshots for all groups // Load original palette snapshots for all groups
auto* palette_groups = &game_data_->palette_groups; auto* palette_groups = &game_data_->palette_groups;
@@ -67,6 +67,19 @@ void PaletteManager::Initialize(Rom* rom) {
ClearHistory(); ClearHistory();
} }
void PaletteManager::ResetForTesting() {
game_data_ = nullptr;
rom_ = nullptr;
original_palettes_.clear();
modified_palettes_.clear();
modified_colors_.clear();
change_listeners_.clear();
next_callback_id_ = 1;
batch_depth_ = 0;
batch_changes_.clear();
ClearHistory();
}
// ========== Color Operations ========== // ========== Color Operations ==========
SnesColor PaletteManager::GetColor(const std::string& group_name, SnesColor PaletteManager::GetColor(const std::string& group_name,
@@ -245,6 +258,14 @@ absl::Status PaletteManager::SaveGroup(const std::string& group_name) {
return absl::FailedPreconditionError("PaletteManager not initialized"); return absl::FailedPreconditionError("PaletteManager not initialized");
} }
Rom* rom = rom_;
if (!rom && game_data_) {
rom = game_data_->rom();
}
if (!rom) {
return absl::FailedPreconditionError("No ROM available for palette save");
}
auto* group = GetMutableGroup(group_name); auto* group = GetMutableGroup(group_name);
if (!group) { if (!group) {
return absl::NotFoundError( return absl::NotFoundError(
@@ -271,7 +292,8 @@ absl::Status PaletteManager::SaveGroup(const std::string& group_name) {
GetPaletteAddress(group_name, palette_idx, color_idx); GetPaletteAddress(group_name, palette_idx, color_idx);
// Write color to ROM - write the 16-bit SNES color value // Write color to ROM - write the 16-bit SNES color value
rom_->WriteShort(address, (*palette)[color_idx].snes()); RETURN_IF_ERROR(
rom->WriteShort(address, (*palette)[color_idx].snes()));
} }
} }
} }
@@ -286,7 +308,7 @@ absl::Status PaletteManager::SaveGroup(const std::string& group_name) {
ClearModifiedFlags(group_name); ClearModifiedFlags(group_name);
// Mark ROM as dirty // Mark ROM as dirty
rom_->set_dirty(true); rom->set_dirty(true);
// Notify listeners // Notify listeners
PaletteChangeEvent event{PaletteChangeEvent::Type::kGroupSaved, group_name, PaletteChangeEvent event{PaletteChangeEvent::Type::kGroupSaved, group_name,

View File

@@ -106,6 +106,11 @@ class PaletteManager {
*/ */
bool IsInitialized() const { return game_data_ != nullptr || rom_ != nullptr; } bool IsInitialized() const { return game_data_ != nullptr || rom_ != nullptr; }
/**
* @brief Reset all state for test isolation
*/
void ResetForTesting();
// ========== Color Operations ========== // ========== Color Operations ==========
/** /**

View File

@@ -79,6 +79,7 @@ uint32_t GetGraphicsAddress(const uint8_t* data, uint8_t addr, uint32_t ptr1,
absl::Status LoadGameData(Rom& rom, GameData& data, const LoadOptions& options) { absl::Status LoadGameData(Rom& rom, GameData& data, const LoadOptions& options) {
data.Clear(); data.Clear();
data.set_rom(&rom);
if (options.populate_metadata) { if (options.populate_metadata) {
RETURN_IF_ERROR(LoadMetadata(rom, data)); RETURN_IF_ERROR(LoadMetadata(rom, data));

View File

@@ -170,8 +170,8 @@ TEST_F(PaletteEditorSaveTest, SnesColorFormat_RoundTrip) {
// Convert to SnesColor and back // Convert to SnesColor and back
gfx::SnesColor color(test_snes); gfx::SnesColor color(test_snes);
// Get RGB representation // Get RGB representation in 0-255 range
auto rgb = color.rgb(); auto rgb = color.rom_color();
// Create new color from RGB // Create new color from RGB
gfx::SnesColor reconstructed(rgb); gfx::SnesColor reconstructed(rgb);
@@ -284,19 +284,11 @@ TEST_F(PaletteEditorSaveTest, PaletteManager_SaveAllToRom) {
} }
// Try to modify a color through PaletteManager // Try to modify a color through PaletteManager
// Access overworld main palettes through game_data gfx::SnesColor original_color = pm.GetColor("ow_main", 0, 0);
auto* ow_main = game_data_->palette_groups.overworld_main.mutable_palette(0);
if (!ow_main || ow_main->size() == 0) {
GTEST_SKIP() << "No overworld main palette available";
}
// Record original color
gfx::SnesColor original_color = (*ow_main)[0];
// Modify the color // Modify the color
uint16_t new_snes_value = (original_color.snes() + 0x0842) & 0x7FFF; uint16_t new_snes_value = (original_color.snes() + 0x0842) & 0x7FFF;
(*ow_main)[0] = gfx::SnesColor(new_snes_value); ASSERT_OK(pm.SetColor("ow_main", 0, 0, gfx::SnesColor(new_snes_value)));
(*ow_main)[0].set_modified(true);
// Save through PaletteManager // Save through PaletteManager
auto save_result = pm.SaveAllToRom(); auto save_result = pm.SaveAllToRom();
@@ -436,4 +428,3 @@ TEST_F(PaletteEditorSaveTest, RoundTrip_NoModification) {
} // namespace test } // namespace test
} // namespace yaze } // namespace yaze

View File

@@ -14,9 +14,8 @@ namespace {
class PaletteManagerTest : public ::testing::Test { class PaletteManagerTest : public ::testing::Test {
protected: protected:
void SetUp() override { void SetUp() override {
// PaletteManager is a singleton, so we need to reset it between tests // PaletteManager is a singleton, so reset it for test isolation
// Note: In a real scenario, we'd need a way to reset the singleton PaletteManager::Get().ResetForTesting();
// For now, we'll work with the existing instance
} }
void TearDown() override { void TearDown() override {

View File

@@ -31,17 +31,17 @@ TEST(SnesColorConversionTest, DefaultConstructor) {
EXPECT_EQ(color.rgb().x, 0.0f); EXPECT_EQ(color.rgb().x, 0.0f);
EXPECT_EQ(color.rgb().y, 0.0f); EXPECT_EQ(color.rgb().y, 0.0f);
EXPECT_EQ(color.rgb().z, 0.0f); EXPECT_EQ(color.rgb().z, 0.0f);
EXPECT_EQ(color.rgb().w, 0.0f); EXPECT_EQ(color.rgb().w, 255.0f);
EXPECT_EQ(color.snes(), 0); EXPECT_EQ(color.snes(), 0);
} }
TEST(SnesColorConversionTest, RGBConstructor) { TEST(SnesColorConversionTest, RGBConstructor) {
ImVec4 rgb(1.0f, 0.5f, 0.25f, 1.0f); ImVec4 rgb(1.0f, 0.5f, 0.25f, 1.0f);
yaze::gfx::SnesColor color(rgb); yaze::gfx::SnesColor color(rgb);
EXPECT_EQ(color.rgb().x, rgb.x); EXPECT_EQ(color.rgb().x, 255.0f);
EXPECT_EQ(color.rgb().y, rgb.y); EXPECT_EQ(color.rgb().y, 127.5f);
EXPECT_EQ(color.rgb().z, rgb.z); EXPECT_EQ(color.rgb().z, 63.75f);
EXPECT_EQ(color.rgb().w, rgb.w); EXPECT_EQ(color.rgb().w, 255.0f);
} }
TEST(SnesColorConversionTest, SNESConstructor) { TEST(SnesColorConversionTest, SNESConstructor) {