12 for (
int q = 0; q < 4; ++q) {
23 using Apply = std::function<absl::Status(
const std::vector<Tile16Commit>&)>;
25 std::vector<Tile16Commit> after,
Apply apply)
26 : before_(std::move(before)),
27 after_(std::move(after)),
28 apply_(std::move(apply)) {}
29 absl::Status
Undo()
override {
return apply_(before_); }
30 absl::Status
Redo()
override {
return apply_(after_); }
32 return before_.size() == 1 ?
"Edit Tile16 definition" :
"Edit Tile16 stamp";
35 return (before_.size() + after_.size()) *
sizeof(
Tile16Commit);
39 std::vector<Tile16Commit> before_,
after_;
47 return absl::OutOfRangeError(
"Tile16 is outside the document");
55 return absl::FailedPreconditionError(
"No Tile16 document");
60 const std::vector<Tile16Commit>& definitions) {
63 std::vector<gfx::Bitmap> bitmaps(definitions.size());
64 for (
size_t i = 0; i < definitions.size(); ++i) {
65 const auto& edit = definitions[i];
69 return absl::OutOfRangeError(
"Tile16 edit is outside the document");
74 for (
size_t i = 0; i < definitions.size(); ++i) {
75 const auto& edit = definitions[i];
79 (*document_definitions_)[edit.tile_id] = edit.tile_data;
98 return absl::OkStatus();
102 const std::function<absl::Status()>& operation) {
108 const auto result = operation();
113 std::vector<Tile16Commit> before, after;
114 for (
const auto& [
id, data] : proposed) {
116 if (!original.ok()) {
118 return original.status();
120 if (!SameDefinition(*original, data)) {
121 before.push_back({id, *original});
122 after.push_back({id, data});
127 for (
const auto& edit : before) {
144 history_->
Push(std::make_unique<Tile16DefinitionEditAction>(
145 std::move(before), std::move(after),
146 [
this](
const std::vector<Tile16Commit>& edits) {
149 return absl::OkStatus();
158 return absl::OkStatus();
absl::StatusOr< gfx::Tile16 > ReadTile16(uint32_t tile16_id, uint32_t tile16_ptr)
void set_dirty(bool dirty)
gfx::Tile16 current_tile16_data_
absl::Status SetCurrentTile(int id)
absl::Status ApplyDefinitions(const std::vector< Tile16Commit > &definitions)
absl::Status RegenerateTile16BitmapFromROM()
absl::Status RunEdit(const std::function< absl::Status()> &operation)
absl::StatusOr< gfx::Tile16 > ReadDocumentTile(int id) const
std::function< void()> before_edit_
void CopyTileBitmapToBlockset(int tile_id, const gfx::Bitmap &tile_bitmap)
std::map< int, gfx::Bitmap > edited_tile_bitmaps_
absl::Status ReplaceCurrentTile(const gfx::Tile16 &data)
gfx::Bitmap * tile16_blockset_bmp_
gfx::Tilemap * tile16_blockset_
std::map< int, gfx::Tile16 > document_edits_
absl::Status BuildTile16BitmapFromData(const gfx::Tile16 &tile_data, gfx::Bitmap *output_bitmap) const
gfx::Bitmap current_tile16_bmp_
bool HasTile16BlocksetBitmap() const
void MarkCurrentTileModified()
bool tile8_usage_cache_dirty_
std::function< void(const std::vector< Tile16Commit > &) on_document_changed_)
std::vector< gfx::Tile16 > * document_definitions_
Abstract base for all undoable actions (Command pattern)
void Push(std::unique_ptr< UndoAction > action)
std::vector< Tile16Commit > after_
Tile16DefinitionEditAction(std::vector< Tile16Commit > before, std::vector< Tile16Commit > after, Apply apply)
absl::Status Redo() override
absl::Status Undo() override
size_t MemoryUsage() const override
Approximate memory footprint for budget enforcement.
std::function< absl::Status(const std::vector< Tile16Commit > &)> Apply
std::string Description() const override
Human-readable description (e.g., "Paint 12 tiles on map 5")
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
Represents a bitmap image optimized for SNES ROM hacking.
const SnesPalette & palette() const
Tile composition of four 8x8 tiles.
bool SameDefinition(const gfx::Tile16 &a, const gfx::Tile16 &b)
Editors are the view controllers for the application.
uint16_t TileInfoToShort(TileInfo tile_info)
void SyncTile16TilesInfo(gfx::Tile16 *tile)
constexpr int kNumTile16Individual
constexpr uint32_t kTile16Ptr
const gfx::TileInfo & Tile16QuadrantInfo(const gfx::Tile16 &tile, int quadrant)
#define RETURN_IF_ERROR(expr)
Bitmap atlas
Master bitmap containing all tiles.