fix(palette): align ROM backing and tests
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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 ==========
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user