5#include "absl/strings/str_format.h"
21 absl::Span<const uint8_t> before,
22 absl::Span<const uint8_t> after) {
25 const size_t size = std::min(before.size(), after.size());
26 for (
size_t i = 0; i < size; ++i) {
27 if (before[i] != after[i]) {
28 diff.
offsets.push_back(
static_cast<uint16_t
>(i));
29 diff.
before.push_back(before[i]);
30 diff.
after.push_back(after[i]);
43 if (game_data ==
nullptr) {
46 for (uint16_t sheet = 0; sheet < state.
arena_revisions.size(); ++sheet) {
61 if (store ==
nullptr || !store->HasSheet(sheet)) {
65 if (!bitmap.is_active() || bitmap.vector().size() != kSheetBytes) {
68 const auto pixels = store->Sheet(sheet);
69 if (!std::equal(pixels.begin(), pixels.end(), bitmap.vector().begin())) {
70 bitmap.set_data(std::vector<uint8_t>(pixels.begin(), pixels.end()));
77 absl::Span<const uint8_t> pixels) {
79 if (store ==
nullptr) {
80 return absl::FailedPreconditionError(
81 "Graphics for this ROM are not loaded, or another open ROM's sheets "
84 const uint64_t revision = store->Revision(sheet);
85 if (absl::Status written = store->WriteSheet(sheet, pixels); !written.ok()) {
89 if (store->Revision(sheet) != revision) {
92 return absl::OkStatus();
98 if (store ==
nullptr || !store->HasSheet(diff.
sheet)) {
99 return absl::FailedPreconditionError(absl::StrFormat(
100 "Sheet 0x%02X is not in this ROM's loaded graphics", diff.
sheet));
102 const auto current = store->Sheet(diff.
sheet);
103 std::vector<uint8_t> pixels(current.begin(), current.end());
104 const auto& values = redo ? diff.
after : diff.
before;
105 for (
size_t i = 0; i < diff.
offsets.size(); ++i) {
106 pixels[diff.
offsets[i]] = values[i];
111 return absl::OkStatus();
116 if (store ==
nullptr) {
120 for (uint16_t sheet = 0; sheet < state.
arena_revisions.size(); ++sheet) {
Shared state between GraphicsEditor panel components.
void MarkSheetModified(uint16_t sheet_id)
Mark a sheet as modified for save tracking.
std::map< uint16_t, GraphicsPaletteSelection > preview_palettes
zelda3::GameData * game_data
void ClearSourceContext()
std::array< uint64_t, 223 > arena_revisions
const void * gfx_sheets_owner() const
auto mutable_gfx_sheets()
Get mutable reference to all graphics sheets.
void NotifySheetModified(int sheet_index)
Notify Arena that a graphics sheet has been modified.
uint64_t Revision(uint16_t sheet) const
static constexpr size_t kSheetBytes
One ROM session's graphics sheet pixels, with a revision per sheet.
The Graphics editor's path for sheet pixel writes.
constexpr size_t kSheetBytes
Editors are the view controllers for the application.
zelda3::GraphicsSheetStore * ActiveSheetStore(const GraphicsEditorState &state)
int SyncArenaFromStore(GraphicsEditorState &state)
absl::Status CommitSheetPixels(GraphicsEditorState &state, uint16_t sheet, absl::Span< const uint8_t > pixels)
void AttachSheetStore(GraphicsEditorState &state, zelda3::GameData *game_data)
void RefreshArenaSheet(GraphicsEditorState &state, uint16_t sheet)
absl::Status ApplySheetPixelDiff(GraphicsEditorState &state, const SheetPixelDiff &diff, bool redo)
SheetPixelDiff MakeSheetPixelDiff(uint16_t sheet, absl::Span< const uint8_t > before, absl::Span< const uint8_t > after)
The pixels that differ between two 4096-byte sheets.
#define RETURN_IF_ERROR(expr)
The pixels one undo step changes in one sheet.
std::vector< uint16_t > offsets
std::vector< uint8_t > after
std::vector< uint8_t > before
GraphicsSheetStore sheet_store