Refactor graphics sheet management with singleton class
Refactor the handling of graphics sheets by introducing a singleton class `GraphicsSheetManager`. This centralizes the management of graphics sheets, replacing direct access through the `Rom` object. Key changes include: - Updated various methods across multiple classes to use `GraphicsSheetManager::GetInstance()` for accessing and manipulating graphics sheets. - Introduced standalone functions `LoadLinkGraphics`, `LoadAllGraphicsData`, and `SaveAllGraphicsData` for loading and saving graphics data. - Refactored the `Rom` class to remove methods and member variables related to graphics sheet management. - Updated `OverworldEditor` to use `std::array` for `maps_bmp_` and added error handling for `std::bad_alloc` exceptions. - Improved code modularity and error handling throughout the application.
This commit is contained in:
@@ -133,31 +133,6 @@ constexpr uint32_t kMaxGraphics = 0xC3FB5;
|
||||
*/
|
||||
class Rom {
|
||||
public:
|
||||
/**
|
||||
* @brief Loads the players 4bpp graphics sheet from Rom data.
|
||||
*/
|
||||
absl::Status LoadLinkGraphics();
|
||||
|
||||
/**
|
||||
* @brief This function iterates over all graphics sheets in the Rom and loads
|
||||
* them into memory. Depending on the sheet's index, it may be uncompressed or
|
||||
* compressed using the LC-LZ2 algorithm. The uncompressed sheets are 3 bits
|
||||
* per pixel (BPP), while the compressed sheets are 4 BPP. The loaded graphics
|
||||
* data is converted to 8 BPP and stored in a bitmap.
|
||||
*
|
||||
* The graphics sheets are divided into the following ranges:
|
||||
*
|
||||
* | Range | Compression Type | Decompressed Size | Number of Chars |
|
||||
* |---------|------------------|------------------|-----------------|
|
||||
* | 0-112 | Compressed 3bpp BGR | 0x600 chars | Decompressed each |
|
||||
* | 113-114 | Compressed 2bpp | 0x800 chars | Decompressed each |
|
||||
* | 115-126 | Uncompressed 3bpp sprites | 0x600 chars | Each |
|
||||
* | 127-217 | Compressed 3bpp sprites | 0x600 chars | Decompressed each |
|
||||
* | 218-222 | Compressed 2bpp | 0x800 chars | Decompressed each |
|
||||
*
|
||||
*/
|
||||
absl::Status LoadAllGraphicsData(bool defer_render = false);
|
||||
|
||||
/**
|
||||
* Load Rom data from a file.
|
||||
*
|
||||
@@ -181,8 +156,6 @@ class Rom {
|
||||
absl::Status SaveToFile(bool backup, bool save_new = false,
|
||||
std::string filename = "");
|
||||
|
||||
absl::Status SaveAllGraphicsData();
|
||||
|
||||
/**
|
||||
* Saves the given palette to the Rom if any of its colors have been modified.
|
||||
*
|
||||
@@ -222,7 +195,7 @@ class Rom {
|
||||
/**
|
||||
* @brief Precondition check for reading and writing to the Rom.
|
||||
*/
|
||||
absl::Status ReadWritePreconditions() {
|
||||
absl::Status ReadWritePreconditions() const {
|
||||
if (!is_loaded_) {
|
||||
return absl::FailedPreconditionError("ROM file not loaded");
|
||||
}
|
||||
@@ -266,7 +239,7 @@ class Rom {
|
||||
}
|
||||
|
||||
absl::StatusOr<std::vector<uint8_t>> ReadByteVector(uint32_t offset,
|
||||
uint32_t length) {
|
||||
uint32_t length) const {
|
||||
RETURN_IF_ERROR(ReadWritePreconditions());
|
||||
if (offset + length > static_cast<uint32_t>(rom_data_.size())) {
|
||||
return absl::OutOfRangeError("Offset and length out of range");
|
||||
@@ -436,6 +409,7 @@ class Rom {
|
||||
|
||||
// Full graphical data for the game
|
||||
std::vector<uint8_t> graphics_buffer() const { return graphics_buffer_; }
|
||||
auto mutable_graphics_buffer() { return &graphics_buffer_; }
|
||||
|
||||
auto title() const { return title_; }
|
||||
auto size() const { return size_; }
|
||||
@@ -450,12 +424,7 @@ class Rom {
|
||||
auto filename() const { return filename_; }
|
||||
auto set_filename(std::string name) { filename_ = name; }
|
||||
|
||||
auto link_graphics() { return link_graphics_; }
|
||||
auto mutable_link_graphics() { return &link_graphics_; }
|
||||
auto gfx_sheets() { return graphics_sheets_; }
|
||||
auto mutable_gfx_sheets() { return &graphics_sheets_; }
|
||||
|
||||
auto palette_group() { return palette_groups_; }
|
||||
auto palette_group() const { return palette_groups_; }
|
||||
auto mutable_palette_group() { return &palette_groups_; }
|
||||
auto dungeon_palette(int i) { return palette_groups_.dungeon_main[i]; }
|
||||
auto mutable_dungeon_palette(int i) {
|
||||
@@ -538,12 +507,6 @@ class Rom {
|
||||
// Full contiguous graphics space
|
||||
std::vector<uint8_t> graphics_buffer_;
|
||||
|
||||
// All graphics sheets in the game
|
||||
std::array<gfx::Bitmap, kNumGfxSheets> graphics_sheets_;
|
||||
|
||||
// All graphics sheets for Link
|
||||
std::array<gfx::Bitmap, kNumLinkSheets> link_graphics_;
|
||||
|
||||
// Label manager for unique resource names.
|
||||
ResourceLabelManager resource_label_manager_;
|
||||
|
||||
@@ -554,6 +517,44 @@ class Rom {
|
||||
Z3_Version version_ = Z3_Version::US;
|
||||
};
|
||||
|
||||
class GraphicsSheetManager {
|
||||
public:
|
||||
static GraphicsSheetManager& GetInstance() {
|
||||
static GraphicsSheetManager instance;
|
||||
return instance;
|
||||
}
|
||||
GraphicsSheetManager() = default;
|
||||
virtual ~GraphicsSheetManager() = default;
|
||||
std::array<gfx::Bitmap, kNumGfxSheets>& gfx_sheets() { return gfx_sheets_; }
|
||||
auto gfx_sheet(int i) { return gfx_sheets_[i]; }
|
||||
auto mutable_gfx_sheet(int i) { return &gfx_sheets_[i]; }
|
||||
auto mutable_gfx_sheets() { return &gfx_sheets_; }
|
||||
private:
|
||||
std::array<gfx::Bitmap, kNumGfxSheets> gfx_sheets_;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This function iterates over all graphics sheets in the Rom and loads
|
||||
* them into memory. Depending on the sheet's index, it may be uncompressed or
|
||||
* compressed using the LC-LZ2 algorithm. The uncompressed sheets are 3 bits
|
||||
* per pixel (BPP), while the compressed sheets are 4 BPP. The loaded graphics
|
||||
* data is converted to 8 BPP and stored in a bitmap.
|
||||
*
|
||||
* The graphics sheets are divided into the following ranges:
|
||||
*
|
||||
* | Range | Compression Type | Decompressed Size | Number of Chars |
|
||||
* |---------|------------------|------------------|-----------------|
|
||||
* | 0-112 | Compressed 3bpp BGR | 0x600 chars | Decompressed each |
|
||||
* | 113-114 | Compressed 2bpp | 0x800 chars | Decompressed each |
|
||||
* | 115-126 | Uncompressed 3bpp sprites | 0x600 chars | Each |
|
||||
* | 127-217 | Compressed 3bpp sprites | 0x600 chars | Decompressed each |
|
||||
* | 218-222 | Compressed 2bpp | 0x800 chars | Decompressed each |
|
||||
*
|
||||
*/
|
||||
absl::StatusOr<std::array<gfx::Bitmap, kNumGfxSheets>> LoadAllGraphicsData(Rom& rom, bool defer_render = false);
|
||||
|
||||
absl::Status SaveAllGraphicsData(Rom& rom, std::array<gfx::Bitmap, kNumGfxSheets>& gfx_sheets);
|
||||
|
||||
/**
|
||||
* @brief Loads 2bpp graphics from Rom data.
|
||||
*
|
||||
@@ -564,6 +565,11 @@ class Rom {
|
||||
*/
|
||||
absl::StatusOr<std::vector<uint8_t>> Load2BppGraphics(const Rom& rom);
|
||||
|
||||
/**
|
||||
* @brief Loads the players 4bpp graphics sheet from Rom data.
|
||||
*/
|
||||
absl::StatusOr<std::array<gfx::Bitmap, kNumLinkSheets>> LoadLinkGraphics(const Rom& rom);
|
||||
|
||||
/**
|
||||
* @brief A class to hold a shared pointer to a Rom object.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user