yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
canvas.h
Go to the documentation of this file.
1#ifndef YAZE_GUI_CANVAS_H
2#define YAZE_GUI_CANVAS_H
3
5#define IMGUI_DEFINE_MATH_OPERATORS
6
7#include <cstdint>
8#include <functional>
9#include <memory>
10#include <optional>
11#include <string>
12#include <string_view>
13#include <vector>
14
15#include "absl/types/span.h"
16#include "app/gfx/core/bitmap.h"
34#include "imgui/imgui.h"
35#include "rom/rom.h"
36#include "zelda3/game_data.h"
37
38namespace yaze {
39
44namespace gui {
45
46// Forward declarations (full includes would cause circular dependency or bloat)
47class CanvasAutomationAPI;
48struct CanvasExtensions;
49
50using gfx::Bitmap;
52
64class Canvas {
65 public:
66 // Default constructor
67 Canvas();
68 ~Canvas();
69
74 void Init(const CanvasConfig& config);
75 void Init(const std::string& id, ImVec2 canvas_size = ImVec2(0, 0));
76
77 // Thin delegators (editor headers use these in member initializers).
78 explicit Canvas(const std::string& id);
79 explicit Canvas(const std::string& id, ImVec2 canvas_size);
80 explicit Canvas(const std::string& id, ImVec2 canvas_size,
82 explicit Canvas(const std::string& id, ImVec2 canvas_size,
85 explicit Canvas(gfx::IRenderer* renderer, const std::string& id);
86 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
87 ImVec2 canvas_size);
88 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
90 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
92 float global_scale);
93
94 // Set renderer after construction (for late initialization)
96 gfx::IRenderer* renderer() const { return renderer_; }
97
98 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
100 switch (grid_size) {
102 config_.grid_step = 8.0f;
103 break;
105 config_.grid_step = 16.0f;
106 break;
108 config_.grid_step = 32.0f;
109 break;
111 config_.grid_step = 64.0f;
112 break;
113 }
115 }
116
117 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
118 void SetCustomGridStep(float step) {
119 config_.grid_step = step;
120 custom_step_ = step;
121 }
122
123 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
125
127 if (config_.grid_step == 8.0f)
129 if (config_.grid_step == 16.0f)
131 if (config_.grid_step == 32.0f)
133 if (config_.grid_step == 64.0f)
135 return CanvasGridSize::k16x16; // Default
136 }
137
139 const ImVec4& color,
140 const std::function<void()>& event, int tile_size,
141 float scale = 1.0f);
142
143 void UpdateInfoGrid(ImVec2 bg_size, float grid_size = 64.0f,
144 int label_id = 0);
145
146 // ==================== Modern ImGui-Style Interface ====================
147
165 void Begin(ImVec2 canvas_size = ImVec2(0, 0));
166 void Begin(const CanvasFrameOptions& options);
167
174 void End();
175 void End(const CanvasFrameOptions& options);
176
177 // ==================== Legacy Interface (Backward Compatible)
178 // ====================
179
180 // Background for the Canvas represents region without any content drawn to
181 // it, but can be controlled by the user. This is the low-level frame setup;
182 // prefer gui::BeginCanvas(..., CanvasFrameOptions) when you need child
183 // windows, optional grid step, and matching EndCanvas.
184 void DrawBackground(ImVec2 canvas_size = ImVec2(0, 0));
185
186 // Context Menu refers to what happens when the right mouse button is pressed
187 // This routine also handles the scrolling for the canvas.
188 void DrawContextMenu();
189
190 // Phase 4: Use unified menu item definition from canvas_menu.h
192
193 // Enhanced canvas components (non-optional, used every frame)
194 std::unique_ptr<CanvasContextMenu> context_menu_;
195 std::shared_ptr<CanvasUsageTracker> usage_tracker_;
196 std::shared_ptr<CanvasPerformanceIntegration> performance_integration_;
198
199 void AddContextMenuItem(const gui::CanvasMenuItem& item);
201
202 // Phase 4: Access to editor-provided menu definition
205 void SetContextMenuEnabled(bool enabled) { context_menu_enabled_ = enabled; }
209
210 // Persistent popup management for context menu actions
211 void OpenPersistentPopup(const std::string& popup_id,
212 std::function<void()> render_callback);
213 void ClosePersistentPopup(const std::string& popup_id);
215
216 // Popup registry access (Phase 3: for advanced users and testing)
219
220 // Enhanced view and edit operations
222 void ShowScalingControls();
223 void SetZoomToFit(const gfx::Bitmap& bitmap);
224 void ResetView();
225 void ApplyConfigSnapshot(const CanvasConfig& snapshot);
226 void ApplyScaleSnapshot(const CanvasConfig& snapshot);
227
228 // Modular component access
230 const CanvasConfig& GetConfig() const { return config_; }
232 const CanvasSelection& GetSelection() const { return selection_; }
233
234 // Enhanced palette management
236 void ShowPaletteEditor();
237 void ShowColorAnalysis();
238 bool ApplyROMPalette(int group_index, int palette_index);
239
240 // BPP format management
242 void ShowBppAnalysis();
244 bool ConvertBitmapFormat(gfx::BppFormat target_format);
246
247 // Enhanced canvas management
249 void SetUsageMode(CanvasUsage usage);
250 auto usage_mode() const { return config_.usage_mode; }
251
252 void RecordCanvasOperation(const std::string& operation_name, double time_ms);
253 void ShowPerformanceUI();
254 void ShowUsageReport();
255
256 // Interaction handler access
263
264 // Automation API access (Phase 4A)
266
267 // Initialization and cleanup
268 void InitializeDefaults();
269 void Cleanup();
270
271 // Size reporting for ImGui table integration
272 ImVec2 GetMinimumSize() const;
273 ImVec2 GetPreferredSize() const;
274 ImVec2 GetCurrentSize() const { return config_.canvas_size; }
275 void SetAutoResize(bool auto_resize) { config_.auto_resize = auto_resize; }
276 bool IsAutoResize() const { return config_.auto_resize; }
277
278 // Table integration helpers
279 void ReserveTableSpace(const std::string& label = "");
280 bool BeginTableCanvas(const std::string& label = "");
281 void EndTableCanvas();
282
288 CanvasRuntime BeginInTable(const std::string& label,
289 const CanvasFrameOptions& options);
290 void EndInTable(CanvasRuntime& runtime, const CanvasFrameOptions& options);
291
292 // Improved interaction detection
293 bool HasValidSelection() const;
294 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
295 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
296 ImVec2 GetLastClickPosition() const;
297
298 // Tile painter methods
299 bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
300 bool DrawSolidTilePainter(const ImVec4& color, int size);
301 void DrawTileOnBitmap(int tile_size, gfx::Bitmap* bitmap, ImVec4 color);
302
303 void DrawOutline(int x, int y, int w, int h);
304 void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color);
305 void DrawOutlineWithColor(int x, int y, int w, int h, uint32_t color);
306
307 void DrawRect(int x, int y, int w, int h, ImVec4 color);
308
309 void DrawText(const std::string& text, int x, int y);
310 void DrawGridLines(float grid_step);
311
312 void DrawInfoGrid(float grid_step = 64.0f, int tile_id_offset = 8,
313 int label_id = 0);
314
315 void DrawLayeredElements();
316
318 float x = mouse_pos_in_canvas_.x;
319 float y = mouse_pos_in_canvas_.y;
320 float step = custom_step_ != 0.0f ? custom_step_ : config_.grid_step;
321 float scale = config_.global_scale != 0.0f ? config_.global_scale : 1.0f;
322 if (step <= 0.0f) {
323 return -1;
324 }
325 int num_columns = (canvas_sz_.x / scale) / step;
326 int num_rows = (canvas_sz_.y / scale) / step;
327 if (num_columns <= 0 || num_rows <= 0) {
328 return -1;
329 }
330 int tile_id = static_cast<int>(
331 (x / step) + (y / step) * static_cast<float>(num_columns));
332 if (tile_id >= num_columns * num_rows) {
333 tile_id = -1; // Invalid tile ID
334 }
335 return tile_id;
336 }
337 void DrawCustomHighlight(float grid_step);
338 bool IsMouseHovering() const { return is_hovered_; }
339 void ZoomIn();
340 void ZoomOut();
341
342 // Points accessors - points_ is maintained separately for custom overlay
343 // drawing
344 const ImVector<ImVec2>& points() const { return points_; }
345 ImVector<ImVec2>* mutable_points() { return &points_; }
346 auto push_back(ImVec2 pos) { points_.push_back(pos); }
347 auto draw_list() const { return draw_list_; }
348 auto zero_point() const { return canvas_p0_; }
349 ImVec2 ToCanvasPos(ImVec2 local) const;
350 auto scrolling() const { return scrolling_; }
351 void set_scrolling(ImVec2 scroll) {
352 state_.geometry.scrolling = scroll;
353 scrolling_ = scroll;
354 config_.scrolling = scroll; // Sync to config for persistence
355 }
356 auto drawn_tile_position() const { return drawn_tile_pos_; }
357 auto canvas_size() const { return canvas_sz_; }
358 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
359 void set_global_scale(float scale);
360 void set_draggable(bool draggable) { draggable_ = draggable; }
361
362 // Modern accessors using modular structure
364 const std::vector<ImVec2>& GetSelectedTiles() const {
365 return selected_tiles_;
366 }
367 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
368 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
369
370 // Configuration accessors
371 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
376 float GetGlobalScale() const { return config_.global_scale; }
377 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
378 void SetGlobalScale(float scale) { config_.global_scale = scale; }
380 float GetGridStep() const { return config_.grid_step; }
381
382 // Rectangle selection boundary control (prevents wrapping in large maps)
383 void SetClampRectToLocalMaps(bool clamp) {
385 }
389 float GetCanvasWidth() const { return config_.canvas_size.x; }
390 float GetCanvasHeight() const { return config_.canvas_size.y; }
391
392 // Legacy compatibility accessors
394 auto selected_tiles() const { return selected_tiles_; }
395 auto selected_tile_pos() const { return selected_tile_pos_; }
396 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
397 auto global_scale() const { return config_.global_scale; }
399 auto custom_step() const { return config_.grid_step; }
400 auto width() const { return config_.canvas_size.x; }
401 auto height() const { return config_.canvas_size.y; }
402
403 // Public accessors for methods that need to be accessed externally
404 auto canvas_id() const { return canvas_id_; }
405
406 // Public methods for drawing operations
407 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
408 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
409 float scale = 1.0f, int alpha = 255);
410 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
411 ImVec2 src_pos, ImVec2 src_size);
412 void DrawBitmapTable(const BitmapTable& gfx_bin);
424 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
425 int tile_size, float scale = 1.0f,
426 int local_map_size = 0x200,
427 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
428 void DrawBitmapPreview(Bitmap& bitmap, const BitmapPreviewOptions& options);
429 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
430 void DrawSelectRect(int current_map, int tile_size = 0x10,
431 float scale = 1.0f);
432 bool DrawTileSelector(int size, int size_y = 0);
433 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
434 void DrawOverlay();
435 auto labels(int i) {
436 if (i >= labels_.size()) {
437 labels_.push_back(ImVector<std::string>());
438 }
439 return labels_[i];
440 }
441 auto mutable_labels(int i) {
442 if (i >= labels_.size()) {
443 int x = i;
444 while (x >= labels_.size()) {
445 labels_.push_back(ImVector<std::string>());
446 x--;
447 }
448 labels_.push_back(ImVector<std::string>());
449 }
450 return &labels_[i];
451 }
452
455
458 auto selected_points() const { return selected_points_; }
459
460 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
461
462 void set_rom(Rom* rom) { rom_ = rom; }
463 Rom* rom() const { return rom_; }
466
467 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
468 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
469 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
470
471 private:
475
476 // Helper to build CanvasRuntime from current state (for delegation to
477 // stateless helpers)
491
492 // Modular configuration and state
496
497 // Phase 4: Optional extensions (lazy-initialized on first use)
498 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
499 // modals, palette_editor, automation_api
500 std::unique_ptr<CanvasExtensions> extensions_;
502
503 // Phase 1: Consolidated state (gradually replacing scattered members)
505
506 // Core canvas state
507 bool is_hovered_ = false;
508 bool refresh_graphics_ = false;
509
510 // Phase 4: Context menu system (declarative menu definition)
513
514 // Phase 4: Persistent popup state for context menu actions (unified registry)
516
517 // Legacy members (to be gradually replaced)
523
524 // Core canvas state
525 Bitmap* bitmap_ = nullptr;
526 Rom* rom_ = nullptr;
528 ImDrawList* draw_list_ = nullptr;
529
530 // Canvas geometry and interaction state
537
538 // Drawing and labeling
539 // NOTE: points_ synchronized from interaction_handler_ for backward
540 // compatibility
541 ImVector<ImVec2> points_;
542 ImVector<ImVector<std::string>> labels_;
543
544 // Identification
545 std::string canvas_id_ = "Canvas";
546 std::string context_id_ = "CanvasContext";
547
548 // Legacy compatibility (gradually being replaced by selection_)
549 std::vector<ImVec2> selected_tiles_;
550 ImVector<ImVec2> selected_points_;
551 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
553 float custom_step_ = 32.0f;
554 float global_scale_ = 1.0f;
555 bool enable_grid_ = true;
560 bool draggable_ = false;
561};
562
564 std::string id;
565 std::string label;
566 std::string shortcut;
567 std::function<bool()> enabled;
568 std::function<void()> on_click;
569};
570
572 public:
573 void Clear() { items_.clear(); }
574 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
575 absl::Span<const CanvasMenuAction> items() const { return items_; }
576 const std::string& popup_id() const { return popup_id_; }
577 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
578
579 private:
580 std::vector<CanvasMenuAction> items_;
581 std::string popup_id_ = "CanvasMenuHost";
582};
583
585 const CanvasRuntime& rt, CanvasConfig& cfg);
587 CanvasConfig& cfg);
588
617 public:
622 explicit ScopedCanvas(const std::string& id,
623 ImVec2 canvas_size = ImVec2(0, 0))
624 : canvas_(new Canvas()), owned_(true), active_(true) {
625 canvas_->Init(id, canvas_size);
626 canvas_->Begin();
627 }
628
632 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
633 ImVec2 canvas_size = ImVec2(0, 0))
634 : canvas_(new Canvas()), owned_(true), active_(true) {
635 canvas_->SetRenderer(renderer);
636 canvas_->Init(id, canvas_size);
637 canvas_->Begin();
638 }
639
643 explicit ScopedCanvas(Canvas& canvas)
644 : canvas_(&canvas), owned_(false), active_(true) {
645 canvas_->Begin();
646 }
647
652 if (active_ && canvas_) {
653 canvas_->End();
654 }
655 if (owned_) {
656 delete canvas_;
657 }
658 }
659
660 // No copy, move only
661 ScopedCanvas(const ScopedCanvas&) = delete;
663
664 ScopedCanvas(ScopedCanvas&& other) noexcept
665 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
666 other.active_ = false;
667 other.canvas_ = nullptr;
668 }
669
673 Canvas* operator->() { return canvas_; }
674 const Canvas* operator->() const { return canvas_; }
675
679 Canvas& operator*() { return *canvas_; }
680 const Canvas& operator*() const { return *canvas_; }
681
685 Canvas* get() { return canvas_; }
686 const Canvas* get() const { return canvas_; }
687
688 private:
690 bool owned_;
692};
693
708 public:
709 CanvasFrame(Canvas& canvas,
711 ~CanvasFrame();
712
713 CanvasFrame(const CanvasFrame&) = delete;
715
716 CanvasFrame(CanvasFrame&& other) noexcept;
717 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
718
719 Canvas* operator->() { return canvas_; }
720 const Canvas* operator->() const { return canvas_; }
721
722 private:
726};
727
728} // namespace gui
729} // namespace yaze
730
731#endif
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:60
Programmatic interface for controlling canvas operations.
Lightweight RAII guard for existing Canvas instances.
Definition canvas.h:707
const Canvas * operator->() const
Definition canvas.h:720
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:719
CanvasFrameOptions options_
Definition canvas.h:724
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Definition canvas.cc:1957
Handles all tile-based interactions for Canvas.
absl::Span< const CanvasMenuAction > items() const
Definition canvas.h:575
void set_popup_id(std::string id)
Definition canvas.h:577
void AddItem(CanvasMenuAction item)
Definition canvas.h:574
const std::string & popup_id() const
Definition canvas.h:576
std::vector< CanvasMenuAction > items_
Definition canvas.h:580
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:64
ImVec2 scrolling_
Definition canvas.h:531
void set_scrolling(ImVec2 scroll)
Definition canvas.h:351
CanvasState state_
Definition canvas.h:504
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:260
auto selected_tile_pos() const
Definition canvas.h:395
ImVector< ImVec2 > points_
Definition canvas.h:541
int highlight_tile_id
Definition canvas.h:519
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1162
PopupRegistry popup_registry_
Definition canvas.h:515
Rom * rom() const
Definition canvas.h:463
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:204
std::string canvas_id_
Definition canvas.h:545
auto labels(int i)
Definition canvas.h:435
float GetCanvasWidth() const
Definition canvas.h:389
auto height() const
Definition canvas.h:401
auto custom_step() const
Definition canvas.h:399
void set_rom(Rom *rom)
Definition canvas.h:462
void ShowScalingControls()
Definition canvas.cc:1698
auto set_current_labels(int i)
Definition canvas.h:453
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:493
CanvasConfig config_
Definition canvas.h:494
ImVec2 selected_tile_pos_
Definition canvas.h:551
auto global_scale() const
Definition canvas.h:397
gfx::IRenderer * renderer_
Definition canvas.h:493
ImVec2 canvas_p1_
Definition canvas.h:534
void ShowBppAnalysis()
Definition canvas.cc:1846
gfx::IRenderer * renderer() const
Definition canvas.h:96
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1231
auto select_rect_active() const
Definition canvas.h:393
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:290
uint64_t edit_palette_group_name_index_
Definition canvas.h:521
auto selected_tiles() const
Definition canvas.h:394
ImVec2 ToCanvasPos(ImVec2 local) const
void DrawBitmapPreview(Bitmap &bitmap, const BitmapPreviewOptions &options)
void DrawBitmapGroup(std::vector< int > &group, gfx::Tilemap &tilemap, int tile_size, float scale=1.0f, int local_map_size=0x200, ImVec2 total_map_size=ImVec2(0x1000, 0x1000))
Draw group of bitmaps for multi-tile selection preview.
Definition canvas.cc:1241
bool BeginTableCanvas(const std::string &label="")
Definition canvas.cc:400
void InitializeEnhancedComponents()
Definition canvas.cc:273
CanvasRuntime BuildCurrentRuntime() const
Definition canvas.h:478
void ShowBppConversionDialog()
Definition canvas.cc:1855
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:1912
bool GetClampRectToLocalMaps() const
Definition canvas.h:386
auto hover_mouse_pos() const
Definition canvas.h:460
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1573
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:933
ImVector< ImVec2 > * mutable_points()
Definition canvas.h:345
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
Definition canvas.cc:594
void DrawContextMenu()
Definition canvas.cc:692
auto push_back(ImVec2 pos)
Definition canvas.h:346
void EnsurePerformanceIntegration()
Definition canvas.cc:108
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:536
int GetTileIdFromMousePos()
Definition canvas.h:317
auto drawn_tile_position() const
Definition canvas.h:356
const CanvasSelection & GetSelection() const
Definition canvas.h:232
bool DrawTilemapPainter(gfx::Tilemap &tilemap, int current_tile)
Definition canvas.cc:985
bool DrawSolidTilePainter(const ImVec4 &color, int size)
Definition canvas.cc:1023
bool enable_context_menu_
Definition canvas.h:558
auto draw_list() const
Definition canvas.h:347
CanvasMenuDefinition editor_menu_
Definition canvas.h:511
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:909
auto width() const
Definition canvas.h:400
void DrawLayeredElements()
Definition canvas.cc:1531
float GetCanvasHeight() const
Definition canvas.h:390
const CanvasConfig & GetConfig() const
Definition canvas.h:230
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:395
bool enable_custom_labels_
Definition canvas.h:557
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:218
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
Definition canvas.cc:1944
void ShowUsageReport()
Definition canvas.cc:319
bool IsSelectRectActive() const
Definition canvas.h:363
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:257
auto mutable_selected_points()
Definition canvas.h:457
void SetRenderer(gfx::IRenderer *renderer)
Definition canvas.h:95
ImVec2 GetMinimumSize() const
Definition canvas.cc:385
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
Definition canvas.cc:1933
bool DrawTileSelector(int size, int size_y=0)
Definition canvas.cc:1098
bool ConvertBitmapFormat(gfx::BppFormat target_format)
Definition canvas.cc:1875
void DrawGridLines(float grid_step)
Definition canvas.cc:1437
void SetCustomGridStep(float step)
Definition canvas.h:118
uint64_t edit_palette_sub_index_
Definition canvas.h:522
void ShowPerformanceUI()
Definition canvas.cc:312
zelda3::GameData * game_data() const
Definition canvas.h:465
bool custom_canvas_size_
Definition canvas.h:559
void ClearContextMenuItems()
Definition canvas.cc:863
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
Definition canvas.cc:1922
void SetGameData(zelda3::GameData *game_data)
Definition canvas.cc:347
void DrawRect(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1427
bool HasValidSelection() const
Definition canvas.cc:485
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
Definition canvas.cc:939
ImDrawList * draw_list_
Definition canvas.h:528
PopupRegistry & GetPopupRegistry()
Definition canvas.h:217
auto custom_labels_enabled()
Definition canvas.h:398
ImVector< ImVec2 > selected_points_
Definition canvas.h:550
ImVec2 GetCurrentSize() const
Definition canvas.h:274
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:372
void UpdateColorPainter(gfx::IRenderer *renderer, gfx::Bitmap &bitmap, const ImVec4 &color, const std::function< void()> &event, int tile_size, float scale=1.0f)
Definition canvas.cc:577
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
Definition canvas.cc:1077
void DrawCustomHighlight(float grid_step)
Definition canvas.cc:1479
bool select_rect_active_
Definition canvas.h:552
auto mutable_selected_tiles()
Definition canvas.h:456
auto mutable_labels(int i)
Definition canvas.h:441
Bitmap * bitmap_
Definition canvas.h:525
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:500
void SetCanvasGridSize(CanvasGridSize grid_size)
Definition canvas.h:124
CanvasGridSize grid_size() const
Definition canvas.h:126
void AddContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:840
uint16_t edit_palette_index_
Definition canvas.h:520
ImVec2 GetPreferredSize() const
Definition canvas.cc:390
float GetGridStep() const
Definition canvas.h:380
CanvasInteractionHandler interaction_handler_
Definition canvas.h:197
void InitializePaletteEditor(Rom *rom)
Definition canvas.cc:338
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
Definition canvas.cc:507
auto canvas_size() const
Definition canvas.h:357
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:396
void SetZoomToFit(const gfx::Bitmap &bitmap)
Definition canvas.cc:883
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:489
ImVector< ImVector< std::string > > labels_
Definition canvas.h:542
void set_draggable(bool draggable)
Definition canvas.h:360
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:205
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:1903
auto canvas_id() const
Definition canvas.h:404
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:873
void ShowBppFormatSelector()
Definition canvas.cc:1835
CanvasMenuDefinition & editor_menu()
Definition canvas.h:203
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
Definition canvas.cc:300
void RenderPersistentPopups()
Definition canvas.cc:878
void set_global_scale(float scale)
Definition canvas.cc:239
ImVec2 GetSelectedTilePos() const
Definition canvas.h:367
void SetGridSize(CanvasGridSize grid_size)
Definition canvas.h:99
bool IsAutoResize() const
Definition canvas.h:276
void SetShowBuiltinContextMenu(bool show)
Definition canvas.h:206
std::shared_ptr< CanvasUsageTracker > usage_tracker_
Definition canvas.h:195
void End()
End canvas rendering (ImGui-style)
Definition canvas.cc:513
float GetGlobalScale() const
Definition canvas.h:376
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:368
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
Definition canvas.cc:463
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
Definition canvas.cc:1128
auto zero_point() const
Definition canvas.h:348
CanvasConfig & GetConfig()
Definition canvas.h:229
bool IsMouseHovering() const
Definition canvas.h:338
const std::vector< ImVec2 > & GetSelectedTiles() const
Definition canvas.h:364
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:194
bool refresh_graphics_
Definition canvas.h:508
auto usage_mode() const
Definition canvas.h:250
ImVec2 GetLastClickPosition() const
Definition canvas.cc:498
CanvasSelection & GetSelection()
Definition canvas.h:231
zelda3::GameData * game_data_
Definition canvas.h:527
void ShowPaletteEditor()
Definition canvas.cc:354
float global_scale_
Definition canvas.h:554
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1226
float custom_step_
Definition canvas.h:553
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:383
bool context_menu_enabled_
Definition canvas.h:512
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
Definition canvas.cc:1442
CanvasSelection selection_
Definition canvas.h:495
CanvasRuntime BeginInTable(const std::string &label, const CanvasFrameOptions &options)
Begin canvas in table cell with frame options (modern API) Returns CanvasRuntime for stateless helper...
Definition canvas.cc:427
bool enable_hex_tile_labels_
Definition canvas.h:556
ImVec2 canvas_p0_
Definition canvas.h:533
auto scrolling() const
Definition canvas.h:350
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
Definition canvas.cc:867
void DrawBitmapTable(const BitmapTable &gfx_bin)
Definition canvas.cc:1209
std::string context_id_
Definition canvas.h:546
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
Definition canvas.cc:602
ImVec2 canvas_sz_
Definition canvas.h:532
void InitializeDefaults()
Definition canvas.cc:178
void EndTableCanvas()
Definition canvas.cc:423
const ImVector< ImVec2 > & points() const
Definition canvas.h:344
std::shared_ptr< CanvasPerformanceIntegration > performance_integration_
Definition canvas.h:196
void Init(const CanvasConfig &config)
Initialize canvas with configuration (post-construction) Preferred over constructor parameters for ne...
Definition canvas.cc:121
void SetAutoResize(bool auto_resize)
Definition canvas.h:275
void SetGlobalScale(float scale)
Definition canvas.h:378
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
Definition canvas.cc:1484
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:830
void DrawText(const std::string &text, int x, int y)
Definition canvas.cc:1432
ImVec2 drawn_tile_pos_
Definition canvas.h:535
void SyncLegacyGeometryFromState()
Definition canvas.cc:101
bool * GetCustomLabelsEnabled()
Definition canvas.h:379
auto selected_points() const
Definition canvas.h:458
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:146
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:549
bool ApplyROMPalette(int group_index, int palette_index)
Definition canvas.cc:376
void ShowColorAnalysis()
Definition canvas.cc:366
auto set_highlight_tile_id(int i)
Definition canvas.h:454
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:616
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:622
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:651
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:664
const Canvas * get() const
Definition canvas.h:686
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:679
ScopedCanvas(gfx::IRenderer *renderer, const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (with optional renderer)
Definition canvas.h:632
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:673
const Canvas * operator->() const
Definition canvas.h:674
Canvas * get()
Get underlying canvas.
Definition canvas.h:685
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:643
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:680
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
Definition bitmap.h:518
BppFormat
BPP format enumeration for SNES graphics.
CanvasUsage
Canvas usage patterns and tracking.
void RenderContextMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
void RegisterDefaultCanvasMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118
Unified configuration for canvas display and interaction.
Optional extension modules for Canvas.
std::function< void()> on_click
Definition canvas.h:568
std::function< bool()> enabled
Definition canvas.h:567
Complete menu definition.
Declarative menu item definition.
Definition canvas_menu.h:64
Selection state for canvas interactions.
Complete canvas state snapshot.
CanvasGeometry geometry