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"
31#include "rom/rom.h"
32#include "zelda3/game_data.h"
33#include "imgui/imgui.h"
34
35namespace yaze {
36
41namespace gui {
42
43// Forward declarations (full includes would cause circular dependency or bloat)
44class CanvasAutomationAPI;
45struct CanvasExtensions;
46
47using gfx::Bitmap;
49
50enum class CanvasType { kTile, kBlock, kMap };
51enum class CanvasMode { kPaint, kSelect };
53
55 ImDrawList* draw_list = nullptr;
56 ImVec2 canvas_p0 = ImVec2(0, 0);
57 ImVec2 canvas_sz = ImVec2(0, 0);
58 ImVec2 scrolling = ImVec2(0, 0);
59 ImVec2 mouse_pos_local = ImVec2(0, 0);
60 bool hovered = false;
61 float grid_step = 16.0f;
62 float scale = 1.0f;
63 ImVec2 content_size = ImVec2(0, 0);
64};
65
67 ImVec2 canvas_size = ImVec2(0, 0);
68 bool draw_context_menu = true;
69 bool draw_grid = true;
70 std::optional<float> grid_step;
71 bool draw_overlay = true;
72 bool render_popups = true;
73 // When true, wraps canvas in ImGui::BeginChild for scrollable container
74 // Default false to match legacy DrawBackground behavior
75 bool use_child_window = false;
76 // Only applies when use_child_window is true
77 bool show_scrollbar = false;
78};
79
81 ImVec2 canvas_size = ImVec2(0, 0);
82 ImVec2 dest_pos = ImVec2(0, 0);
83 ImVec2 dest_size = ImVec2(0, 0);
84 ImVec2 src_pos = ImVec2(0, 0);
85 ImVec2 src_size = ImVec2(0, 0);
86 float scale = 1.0f;
87 int alpha = 255;
88 bool draw_context_menu = false;
89 bool draw_grid = true;
90 std::optional<float> grid_step;
91 bool draw_overlay = true;
92 bool render_popups = true;
93 bool ensure_texture = false;
96};
97
98struct TileHit {
99 int tile_index = -1;
100 ImVec2 tile_origin = ImVec2(0, 0);
101 ImVec2 tile_size = ImVec2(0, 0);
102};
103
105 ImVec2 dest_pos = ImVec2(0, 0);
106 ImVec2 dest_size = ImVec2(0, 0);
107 ImVec2 src_pos = ImVec2(0, 0);
108 ImVec2 src_size = ImVec2(0, 0);
109 float scale = 1.0f;
110 int alpha = 255;
111 bool ensure_texture = true;
112};
113
115 ImVec2 canvas_size = ImVec2(0, 0);
116 float grid_step = 16.0f;
117 bool show_grid = true;
118 bool show_overlay = true;
119 bool render_popups = true;
120 bool ensure_texture = true;
123};
124
126 ImVec2 canvas_size = ImVec2(0, 0);
127 ImVec2 dest_pos = ImVec2(0, 0);
128 ImVec2 dest_size = ImVec2(0, 0);
129 float grid_step = 0.0f; // 0 = no grid
130 bool render_popups = false;
131 bool ensure_texture = true;
132};
133
135 float scale;
136 ImVec2 scroll;
137};
138
150class Canvas {
151 public:
152 // Default constructor
153 Canvas();
155
160 void Init(const CanvasConfig& config);
161 void Init(const std::string& id, ImVec2 canvas_size = ImVec2(0, 0));
162
163 // COMPAT: Legacy constructors - prefer default ctor + Init() for new code
164 [[deprecated("Use default ctor + Init(id, size) instead")]]
165 explicit Canvas(const std::string& id);
166 [[deprecated("Use default ctor + Init(id, size) instead")]]
167 explicit Canvas(const std::string& id, ImVec2 canvas_size);
168 [[deprecated("Use default ctor + Init(config) instead")]]
169 explicit Canvas(const std::string& id, ImVec2 canvas_size,
171 [[deprecated("Use default ctor + Init(config) instead")]]
172 explicit Canvas(const std::string& id, ImVec2 canvas_size,
174
175 // COMPAT: Legacy constructors with renderer - prefer default ctor + Init()
176 [[deprecated("Use default ctor + SetRenderer() + Init() instead")]]
177 explicit Canvas(gfx::IRenderer* renderer);
178 [[deprecated("Use default ctor + SetRenderer() + Init(id, size) instead")]]
179 explicit Canvas(gfx::IRenderer* renderer, const std::string& id);
180 [[deprecated("Use default ctor + SetRenderer() + Init(id, size) instead")]]
181 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
182 ImVec2 canvas_size);
183 [[deprecated("Use default ctor + SetRenderer() + Init(config) instead")]]
184 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
186 [[deprecated("Use default ctor + SetRenderer() + Init(config) instead")]]
187 explicit Canvas(gfx::IRenderer* renderer, const std::string& id,
189 float global_scale);
190
191 // Set renderer after construction (for late initialization)
193 gfx::IRenderer* renderer() const { return renderer_; }
194
195 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
197 switch (grid_size) {
199 config_.grid_step = 8.0f;
200 break;
202 config_.grid_step = 16.0f;
203 break;
205 config_.grid_step = 32.0f;
206 break;
208 config_.grid_step = 64.0f;
209 break;
210 }
212 }
213
214 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
215 void SetCustomGridStep(float step) {
216 config_.grid_step = step;
217 custom_step_ = step;
218 }
219
220 // COMPAT: prefer CanvasFrameOptions.grid_step for per-frame grid control
222
224 if (config_.grid_step == 8.0f)
226 if (config_.grid_step == 16.0f)
228 if (config_.grid_step == 32.0f)
230 if (config_.grid_step == 64.0f)
232 return CanvasGridSize::k16x16; // Default
233 }
234
236 const ImVec4& color,
237 const std::function<void()>& event, int tile_size,
238 float scale = 1.0f);
239
240 void UpdateInfoGrid(ImVec2 bg_size, float grid_size = 64.0f,
241 int label_id = 0);
242
243 // ==================== Modern ImGui-Style Interface ====================
244
262 void Begin(ImVec2 canvas_size = ImVec2(0, 0));
263 void Begin(const CanvasFrameOptions& options);
264
271 void End();
272 void End(const CanvasFrameOptions& options);
273
274 // ==================== Legacy Interface (Backward Compatible)
275 // ====================
276
277 // Background for the Canvas represents region without any content drawn to
278 // it, but can be controlled by the user.
279 void DrawBackground(ImVec2 canvas_size = ImVec2(0, 0));
280
281 // Context Menu refers to what happens when the right mouse button is pressed
282 // This routine also handles the scrolling for the canvas.
283 void DrawContextMenu();
284
285 // Phase 4: Use unified menu item definition from canvas_menu.h
287
288 // Enhanced canvas components (non-optional, used every frame)
289 std::unique_ptr<CanvasContextMenu> context_menu_;
290 std::shared_ptr<CanvasUsageTracker> usage_tracker_;
291 std::shared_ptr<CanvasPerformanceIntegration> performance_integration_;
293
294 void AddContextMenuItem(const gui::CanvasMenuItem& item);
296
297 // Phase 4: Access to editor-provided menu definition
300 void SetContextMenuEnabled(bool enabled) { context_menu_enabled_ = enabled; }
304
305 // Persistent popup management for context menu actions
306 void OpenPersistentPopup(const std::string& popup_id,
307 std::function<void()> render_callback);
308 void ClosePersistentPopup(const std::string& popup_id);
310
311 // Popup registry access (Phase 3: for advanced users and testing)
314
315 // Enhanced view and edit operations
317 void ShowScalingControls();
318 void SetZoomToFit(const gfx::Bitmap& bitmap);
319 void ResetView();
320 void ApplyConfigSnapshot(const CanvasConfig& snapshot);
321 void ApplyScaleSnapshot(const CanvasConfig& snapshot);
322
323 // Modular component access
325 const CanvasConfig& GetConfig() const { return config_; }
327 const CanvasSelection& GetSelection() const { return selection_; }
328
329 // Enhanced palette management
331 void ShowPaletteEditor();
332 void ShowColorAnalysis();
333 bool ApplyROMPalette(int group_index, int palette_index);
334
335 // BPP format management
337 void ShowBppAnalysis();
339 bool ConvertBitmapFormat(gfx::BppFormat target_format);
341
342 // Enhanced canvas management
344 void SetUsageMode(CanvasUsage usage);
345 auto usage_mode() const { return config_.usage_mode; }
346
347 void RecordCanvasOperation(const std::string& operation_name, double time_ms);
348 void ShowPerformanceUI();
349 void ShowUsageReport();
350
351 // Interaction handler access
358
359 // Automation API access (Phase 4A)
361
362 // Initialization and cleanup
363 void InitializeDefaults();
364 void Cleanup();
365
366 // Size reporting for ImGui table integration
367 ImVec2 GetMinimumSize() const;
368 ImVec2 GetPreferredSize() const;
369 ImVec2 GetCurrentSize() const { return config_.canvas_size; }
370 void SetAutoResize(bool auto_resize) { config_.auto_resize = auto_resize; }
371 bool IsAutoResize() const { return config_.auto_resize; }
372
373 // Table integration helpers
374 void ReserveTableSpace(const std::string& label = "");
375 bool BeginTableCanvas(const std::string& label = "");
376 void EndTableCanvas();
377
383 CanvasRuntime BeginInTable(const std::string& label,
384 const CanvasFrameOptions& options);
385 void EndInTable(CanvasRuntime& runtime, const CanvasFrameOptions& options);
386
387 // Improved interaction detection
388 bool HasValidSelection() const;
389 bool WasClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
390 bool WasDoubleClicked(ImGuiMouseButton button = ImGuiMouseButton_Left) const;
391 ImVec2 GetLastClickPosition() const;
392
393 // Tile painter methods
394 bool DrawTilePainter(const Bitmap& bitmap, int size, float scale = 1.0f);
395 bool DrawSolidTilePainter(const ImVec4& color, int size);
396 void DrawTileOnBitmap(int tile_size, gfx::Bitmap* bitmap, ImVec4 color);
397
398 void DrawOutline(int x, int y, int w, int h);
399 void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color);
400 void DrawOutlineWithColor(int x, int y, int w, int h, uint32_t color);
401
402 void DrawRect(int x, int y, int w, int h, ImVec4 color);
403
404 void DrawText(const std::string& text, int x, int y);
405 void DrawGridLines(float grid_step);
406
407 void DrawInfoGrid(float grid_step = 64.0f, int tile_id_offset = 8,
408 int label_id = 0);
409
410 void DrawLayeredElements();
411
413 float x = mouse_pos_in_canvas_.x;
414 float y = mouse_pos_in_canvas_.y;
415 float step = custom_step_ != 0.0f ? custom_step_ : config_.grid_step;
416 float scale = config_.global_scale != 0.0f ? config_.global_scale : 1.0f;
417 if (step <= 0.0f) {
418 return -1;
419 }
420 int num_columns = (canvas_sz_.x / scale) / step;
421 int num_rows = (canvas_sz_.y / scale) / step;
422 if (num_columns <= 0 || num_rows <= 0) {
423 return -1;
424 }
425 int tile_id =
426 static_cast<int>((x / step) + (y / step) * static_cast<float>(num_columns));
427 if (tile_id >= num_columns * num_rows) {
428 tile_id = -1; // Invalid tile ID
429 }
430 return tile_id;
431 }
432 void DrawCustomHighlight(float grid_step);
433 bool IsMouseHovering() const { return is_hovered_; }
434 void ZoomIn() { global_scale_ += 0.25f; }
435 void ZoomOut() { global_scale_ -= 0.25f; }
436
437 // Points accessors - points_ is maintained separately for custom overlay
438 // drawing
439 const ImVector<ImVec2>& points() const { return points_; }
440 ImVector<ImVec2>* mutable_points() { return &points_; }
441 auto push_back(ImVec2 pos) { points_.push_back(pos); }
442 auto draw_list() const { return draw_list_; }
443 auto zero_point() const { return canvas_p0_; }
444 ImVec2 ToCanvasPos(ImVec2 local) const;
445 auto scrolling() const { return scrolling_; }
446 void set_scrolling(ImVec2 scroll) {
447 scrolling_ = scroll;
448 config_.scrolling = scroll; // Sync to config for persistence
449 }
450 auto drawn_tile_position() const { return drawn_tile_pos_; }
451 auto canvas_size() const { return canvas_sz_; }
452 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
453 void set_global_scale(float scale) {
454 global_scale_ = scale;
455 config_.global_scale = scale;
456 }
457 void set_draggable(bool draggable) { draggable_ = draggable; }
458
459 // Modern accessors using modular structure
461 const std::vector<ImVec2>& GetSelectedTiles() const {
462 return selected_tiles_;
463 }
464 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
465 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
466
467 // Configuration accessors
468 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
473 float GetGlobalScale() const { return config_.global_scale; }
474 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
475 void SetGlobalScale(float scale) { config_.global_scale = scale; }
477 float GetGridStep() const { return config_.grid_step; }
478
479 // Rectangle selection boundary control (prevents wrapping in large maps)
480 void SetClampRectToLocalMaps(bool clamp) {
482 }
486 float GetCanvasWidth() const { return config_.canvas_size.x; }
487 float GetCanvasHeight() const { return config_.canvas_size.y; }
488
489 // Legacy compatibility accessors
491 auto selected_tiles() const { return selected_tiles_; }
492 auto selected_tile_pos() const { return selected_tile_pos_; }
493 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
494 auto global_scale() const { return config_.global_scale; }
496 auto custom_step() const { return config_.grid_step; }
497 auto width() const { return config_.canvas_size.x; }
498 auto height() const { return config_.canvas_size.y; }
499
500 // Public accessors for methods that need to be accessed externally
501 auto canvas_id() const { return canvas_id_; }
502
503 // Public methods for drawing operations
504 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
505 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
506 float scale = 1.0f, int alpha = 255);
507 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
508 ImVec2 src_pos, ImVec2 src_size);
509 void DrawBitmapTable(const BitmapTable& gfx_bin);
521 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
522 int tile_size, float scale = 1.0f,
523 int local_map_size = 0x200,
524 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
526 const BitmapPreviewOptions& options);
527 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
528 void DrawSelectRect(int current_map, int tile_size = 0x10,
529 float scale = 1.0f);
530 bool DrawTileSelector(int size, int size_y = 0);
531 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
532 void DrawOverlay();
533 auto labels(int i) {
534 if (i >= labels_.size()) {
535 labels_.push_back(ImVector<std::string>());
536 }
537 return labels_[i];
538 }
539 auto mutable_labels(int i) {
540 if (i >= labels_.size()) {
541 int x = i;
542 while (x >= labels_.size()) {
543 labels_.push_back(ImVector<std::string>());
544 x--;
545 }
546 labels_.push_back(ImVector<std::string>());
547 }
548 return &labels_[i];
549 }
550
553
556 auto selected_points() const { return selected_points_; }
557
558 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
559
560 void set_rom(Rom* rom) { rom_ = rom; }
561 Rom* rom() const { return rom_; }
564
565 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
566 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
567 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
568
569 private:
571
572 // Helper to build CanvasRuntime from current state (for delegation to
573 // stateless helpers)
587
588 // Modular configuration and state
592
593 // Phase 4: Optional extensions (lazy-initialized on first use)
594 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
595 // modals, palette_editor, automation_api
596 std::unique_ptr<CanvasExtensions> extensions_;
598
599 // Phase 1: Consolidated state (gradually replacing scattered members)
601
602 // Core canvas state
603 bool is_hovered_ = false;
604 bool refresh_graphics_ = false;
605
606 // Phase 4: Context menu system (declarative menu definition)
609
610 // Phase 4: Persistent popup state for context menu actions (unified registry)
612
613 // Legacy members (to be gradually replaced)
619
620 // Core canvas state
621 Bitmap* bitmap_ = nullptr;
622 Rom* rom_ = nullptr;
624 ImDrawList* draw_list_ = nullptr;
625
626 // Canvas geometry and interaction state
633
634 // Drawing and labeling
635 // NOTE: points_ synchronized from interaction_handler_ for backward
636 // compatibility
637 ImVector<ImVec2> points_;
638 ImVector<ImVector<std::string>> labels_;
639
640 // Identification
641 std::string canvas_id_ = "Canvas";
642 std::string context_id_ = "CanvasContext";
643
644 // Legacy compatibility (gradually being replaced by selection_)
645 std::vector<ImVec2> selected_tiles_;
646 ImVector<ImVec2> selected_points_;
647 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
649 float custom_step_ = 32.0f;
650 float global_scale_ = 1.0f;
651 bool enable_grid_ = true;
656 bool draggable_ = false;
657};
658
659void BeginCanvas(Canvas& canvas, ImVec2 child_size = ImVec2(0, 0));
660void EndCanvas(Canvas& canvas);
661
662void GraphicsBinCanvasPipeline(int width, int height, int tile_size,
663 int num_sheets_to_load, int canvas_id,
664 bool is_loaded, BitmapTable& graphics_bin);
665
666void BitmapCanvasPipeline(gui::Canvas& canvas, gfx::Bitmap& bitmap, int width,
667 int height, int tile_size, bool is_loaded,
668 bool scrollbar, int canvas_id);
669
670// Table-optimized canvas pipeline with automatic sizing
671void TableCanvasPipeline(gui::Canvas& canvas, gfx::Bitmap& bitmap,
672 const std::string& label = "",
673 bool auto_resize = true);
674
675// ---------- Optional helper APIs ----------
677 const CanvasFrameOptions& options);
678void EndCanvas(gui::Canvas& canvas, CanvasRuntime& runtime,
679 const CanvasFrameOptions& options);
680
681// New Stateless Drawing Helpers (CanvasRuntime-based)
682void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, int border_offset = 2, float scale = 1.0f);
683void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, int x_offset, int y_offset, float scale = 1.0f, int alpha = 255);
684void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size, ImVec2 src_pos, ImVec2 src_size);
685void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, const BitmapDrawOpts& opts);
686
687// New Stateless Preview Helpers
688void DrawBitmapPreview(const CanvasRuntime& rt, gfx::Bitmap& bitmap, const BitmapPreviewOptions& options);
689bool RenderPreviewPanel(const CanvasRuntime& rt, gfx::Bitmap& bmp, const PreviewPanelOpts& opts);
690
691bool DrawTilemapPainter(const CanvasRuntime& rt, gfx::Tilemap& tilemap, int current_tile, ImVec2* out_drawn_pos);
692bool DrawTileSelector(const CanvasRuntime& rt, int size, int size_y, ImVec2* out_selected_pos);
693void DrawSelectRect(const CanvasRuntime& rt, int current_map, int tile_size, float scale, CanvasSelection& selection);
694
695TileHit TileIndexAt(const ImVec2& local_pos, float grid_step, float scale,
696 const ImVec2& canvas_px);
697
698void DrawTileOutline(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
699 const ImVec2& tile_size_px, ImU32 color);
700void DrawTileHighlight(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
701 const ImVec2& tile_size_px, ImU32 color);
702void DrawTileLabel(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
703 const char* text, ImU32 color);
704
705// Stateless DrawRect/DrawText helpers (CanvasRuntime-based)
706void DrawRect(const CanvasRuntime& rt, int x, int y, int w, int h,
707 ImVec4 color);
708void DrawText(const CanvasRuntime& rt, const std::string& text, int x, int y);
709void DrawOutline(const CanvasRuntime& rt, int x, int y, int w, int h,
710 ImU32 color = IM_COL32(255, 255, 255, 200));
711
713 const BitmapDrawOpts& opts);
714
716 gfx::Tilemap& tilemap, absl::Span<const int> tile_ids,
717 int tile_size, float scale, ImVec2 clamp_px);
718
720 const SelectorPanelOpts& opts, TileHit* out_hit);
721
723 const PreviewPanelOpts& opts);
724
725ZoomToFitResult ComputeZoomToFit(ImVec2 content_px, ImVec2 canvas_px,
726 float padding_px);
727ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px);
728
730 std::string id;
731 std::string label;
732 std::string shortcut;
733 std::function<bool()> enabled;
734 std::function<void()> on_click;
735};
736
738 public:
739 void Clear() { items_.clear(); }
740 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
741 absl::Span<const CanvasMenuAction> items() const { return items_; }
742 const std::string& popup_id() const { return popup_id_; }
743 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
744
745 private:
746 std::vector<CanvasMenuAction> items_;
747 std::string popup_id_ = "CanvasMenuHost";
748};
749
751 const CanvasRuntime& rt, CanvasConfig& cfg);
753 CanvasConfig& cfg);
754
783 public:
788 explicit ScopedCanvas(const std::string& id,
789 ImVec2 canvas_size = ImVec2(0, 0))
790 : canvas_(new Canvas(id, canvas_size)), owned_(true), active_(true) {
791 canvas_->Begin();
792 }
793
797 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
798 ImVec2 canvas_size = ImVec2(0, 0))
799 : canvas_(new Canvas(renderer, id, canvas_size)),
800 owned_(true),
801 active_(true) {
802 canvas_->Begin();
803 }
804
808 explicit ScopedCanvas(Canvas& canvas)
809 : canvas_(&canvas), owned_(false), active_(true) {
810 canvas_->Begin();
811 }
812
817 if (active_ && canvas_) {
818 canvas_->End();
819 }
820 if (owned_) {
821 delete canvas_;
822 }
823 }
824
825 // No copy, move only
826 ScopedCanvas(const ScopedCanvas&) = delete;
828
829 ScopedCanvas(ScopedCanvas&& other) noexcept
830 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
831 other.active_ = false;
832 other.canvas_ = nullptr;
833 }
834
838 Canvas* operator->() { return canvas_; }
839 const Canvas* operator->() const { return canvas_; }
840
844 Canvas& operator*() { return *canvas_; }
845 const Canvas& operator*() const { return *canvas_; }
846
850 Canvas* get() { return canvas_; }
851 const Canvas* get() const { return canvas_; }
852
853 private:
855 bool owned_;
857};
858
873 public:
874 CanvasFrame(Canvas& canvas,
876 ~CanvasFrame();
877
878 CanvasFrame(const CanvasFrame&) = delete;
880
881 CanvasFrame(CanvasFrame&& other) noexcept;
882 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
883
884 Canvas* operator->() { return canvas_; }
885 const Canvas* operator->() const { return canvas_; }
886
887 private:
891};
892
893} // namespace gui
894} // namespace yaze
895
896#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:24
Represents a bitmap image optimized for SNES ROM hacking.
Definition bitmap.h:67
Defines an abstract interface for all rendering operations.
Definition irenderer.h:40
Programmatic interface for controlling canvas operations.
Lightweight RAII guard for existing Canvas instances.
Definition canvas.h:872
const Canvas * operator->() const
Definition canvas.h:885
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:884
CanvasFrameOptions options_
Definition canvas.h:889
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Definition canvas.cc:2436
Handles all tile-based interactions for Canvas.
absl::Span< const CanvasMenuAction > items() const
Definition canvas.h:741
void set_popup_id(std::string id)
Definition canvas.h:743
void AddItem(CanvasMenuAction item)
Definition canvas.h:740
const std::string & popup_id() const
Definition canvas.h:742
std::vector< CanvasMenuAction > items_
Definition canvas.h:746
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:150
ImVec2 scrolling_
Definition canvas.h:627
void set_scrolling(ImVec2 scroll)
Definition canvas.h:446
CanvasState state_
Definition canvas.h:600
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:355
auto selected_tile_pos() const
Definition canvas.h:492
ImVector< ImVec2 > points_
Definition canvas.h:637
int highlight_tile_id
Definition canvas.h:615
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1075
PopupRegistry popup_registry_
Definition canvas.h:611
Rom * rom() const
Definition canvas.h:561
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:299
std::string canvas_id_
Definition canvas.h:641
auto labels(int i)
Definition canvas.h:533
float GetCanvasWidth() const
Definition canvas.h:486
auto height() const
Definition canvas.h:498
auto custom_step() const
Definition canvas.h:496
void set_rom(Rom *rom)
Definition canvas.h:560
void ShowScalingControls()
Definition canvas.cc:1852
auto set_current_labels(int i)
Definition canvas.h:551
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:438
CanvasConfig config_
Definition canvas.h:590
ImVec2 selected_tile_pos_
Definition canvas.h:647
auto global_scale() const
Definition canvas.h:494
gfx::IRenderer * renderer_
Definition canvas.h:589
ImVec2 canvas_p1_
Definition canvas.h:630
void ShowBppAnalysis()
Definition canvas.cc:1999
gfx::IRenderer * renderer() const
Definition canvas.h:193
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1144
auto select_rect_active() const
Definition canvas.h:490
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:237
uint64_t edit_palette_group_name_index_
Definition canvas.h:617
auto selected_tiles() const
Definition canvas.h:491
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:1154
bool BeginTableCanvas(const std::string &label="")
Definition canvas.cc:345
void InitializeEnhancedComponents()
Definition canvas.cc:216
CanvasRuntime BuildCurrentRuntime() const
Definition canvas.h:574
void ShowBppConversionDialog()
Definition canvas.cc:2008
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:2065
bool GetClampRectToLocalMaps() const
Definition canvas.h:483
auto hover_mouse_pos() const
Definition canvas.h:558
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1728
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:846
ImVector< ImVec2 > * mutable_points()
Definition canvas.h:440
void UpdateInfoGrid(ImVec2 bg_size, float grid_size=64.0f, int label_id=0)
Definition canvas.cc:539
void DrawContextMenu()
Definition canvas.cc:602
auto push_back(ImVec2 pos)
Definition canvas.h:441
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:632
int GetTileIdFromMousePos()
Definition canvas.h:412
auto drawn_tile_position() const
Definition canvas.h:450
const CanvasSelection & GetSelection() const
Definition canvas.h:327
bool DrawTilemapPainter(gfx::Tilemap &tilemap, int current_tile)
Definition canvas.cc:898
bool DrawSolidTilePainter(const ImVec4 &color, int size)
Definition canvas.cc:936
bool enable_context_menu_
Definition canvas.h:654
auto draw_list() const
Definition canvas.h:442
CanvasMenuDefinition editor_menu_
Definition canvas.h:607
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:822
auto width() const
Definition canvas.h:497
void DrawLayeredElements()
Definition canvas.cc:1445
float GetCanvasHeight() const
Definition canvas.h:487
const CanvasConfig & GetConfig() const
Definition canvas.h:325
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:340
bool enable_custom_labels_
Definition canvas.h:653
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:313
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
Definition canvas.cc:2425
void ShowUsageReport()
Definition canvas.cc:264
bool IsSelectRectActive() const
Definition canvas.h:460
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:352
auto mutable_selected_points()
Definition canvas.h:555
void SetRenderer(gfx::IRenderer *renderer)
Definition canvas.h:192
ImVec2 GetMinimumSize() const
Definition canvas.cc:330
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
Definition canvas.cc:2416
bool DrawTileSelector(int size, int size_y=0)
Definition canvas.cc:1011
bool ConvertBitmapFormat(gfx::BppFormat target_format)
Definition canvas.cc:2028
void DrawGridLines(float grid_step)
Definition canvas.cc:1351
void SetCustomGridStep(float step)
Definition canvas.h:215
uint64_t edit_palette_sub_index_
Definition canvas.h:618
void ShowPerformanceUI()
Definition canvas.cc:258
zelda3::GameData * game_data() const
Definition canvas.h:563
bool custom_canvas_size_
Definition canvas.h:655
void ClearContextMenuItems()
Definition canvas.cc:776
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
Definition canvas.cc:2407
void SetGameData(zelda3::GameData *game_data)
Definition canvas.cc:292
void DrawRect(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1341
bool HasValidSelection() const
Definition canvas.cc:430
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
Definition canvas.cc:852
ImDrawList * draw_list_
Definition canvas.h:624
PopupRegistry & GetPopupRegistry()
Definition canvas.h:312
auto custom_labels_enabled()
Definition canvas.h:495
ImVector< ImVec2 > selected_points_
Definition canvas.h:646
ImVec2 GetCurrentSize() const
Definition canvas.h:369
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:469
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:522
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
Definition canvas.cc:990
void DrawCustomHighlight(float grid_step)
Definition canvas.cc:1393
bool select_rect_active_
Definition canvas.h:648
auto mutable_selected_tiles()
Definition canvas.h:554
auto mutable_labels(int i)
Definition canvas.h:539
Bitmap * bitmap_
Definition canvas.h:621
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:596
void SetCanvasGridSize(CanvasGridSize grid_size)
Definition canvas.h:221
CanvasGridSize grid_size() const
Definition canvas.h:223
void AddContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:753
uint16_t edit_palette_index_
Definition canvas.h:616
ImVec2 GetPreferredSize() const
Definition canvas.cc:335
float GetGridStep() const
Definition canvas.h:477
CanvasInteractionHandler interaction_handler_
Definition canvas.h:292
void InitializePaletteEditor(Rom *rom)
Definition canvas.cc:283
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
Definition canvas.cc:452
auto canvas_size() const
Definition canvas.h:451
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:493
void SetZoomToFit(const gfx::Bitmap &bitmap)
Definition canvas.cc:796
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:434
ImVector< ImVector< std::string > > labels_
Definition canvas.h:638
void set_draggable(bool draggable)
Definition canvas.h:457
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:300
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:2056
auto canvas_id() const
Definition canvas.h:501
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:786
void ShowBppFormatSelector()
Definition canvas.cc:1988
CanvasMenuDefinition & editor_menu()
Definition canvas.h:298
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
Definition canvas.cc:247
void RenderPersistentPopups()
Definition canvas.cc:791
void set_global_scale(float scale)
Definition canvas.h:453
ImVec2 GetSelectedTilePos() const
Definition canvas.h:464
void SetGridSize(CanvasGridSize grid_size)
Definition canvas.h:196
bool IsAutoResize() const
Definition canvas.h:371
void SetShowBuiltinContextMenu(bool show)
Definition canvas.h:301
std::shared_ptr< CanvasUsageTracker > usage_tracker_
Definition canvas.h:290
void End()
End canvas rendering (ImGui-style)
Definition canvas.cc:458
float GetGlobalScale() const
Definition canvas.h:473
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:465
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
Definition canvas.cc:408
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
Definition canvas.cc:1041
auto zero_point() const
Definition canvas.h:443
CanvasConfig & GetConfig()
Definition canvas.h:324
bool IsMouseHovering() const
Definition canvas.h:433
const std::vector< ImVec2 > & GetSelectedTiles() const
Definition canvas.h:461
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:289
bool refresh_graphics_
Definition canvas.h:604
auto usage_mode() const
Definition canvas.h:345
ImVec2 GetLastClickPosition() const
Definition canvas.cc:443
CanvasSelection & GetSelection()
Definition canvas.h:326
zelda3::GameData * game_data_
Definition canvas.h:623
void ShowPaletteEditor()
Definition canvas.cc:299
float global_scale_
Definition canvas.h:650
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1139
float custom_step_
Definition canvas.h:649
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:480
bool context_menu_enabled_
Definition canvas.h:608
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
Definition canvas.cc:1356
CanvasSelection selection_
Definition canvas.h:591
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:372
bool enable_hex_tile_labels_
Definition canvas.h:652
ImVec2 canvas_p0_
Definition canvas.h:629
auto scrolling() const
Definition canvas.h:445
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
Definition canvas.cc:780
void DrawBitmapTable(const BitmapTable &gfx_bin)
Definition canvas.cc:1122
std::string context_id_
Definition canvas.h:642
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
Definition canvas.cc:547
ImVec2 canvas_sz_
Definition canvas.h:628
void InitializeDefaults()
Definition canvas.cc:159
void EndTableCanvas()
Definition canvas.cc:368
const ImVector< ImVec2 > & points() const
Definition canvas.h:439
std::shared_ptr< CanvasPerformanceIntegration > performance_integration_
Definition canvas.h:291
void Init(const CanvasConfig &config)
Initialize canvas with configuration (post-construction) Preferred over constructor parameters for ne...
Definition canvas.cc:102
void SetAutoResize(bool auto_resize)
Definition canvas.h:370
void SetGlobalScale(float scale)
Definition canvas.h:475
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
Definition canvas.cc:1398
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:743
void DrawText(const std::string &text, int x, int y)
Definition canvas.cc:1346
ImVec2 drawn_tile_pos_
Definition canvas.h:631
bool * GetCustomLabelsEnabled()
Definition canvas.h:476
auto selected_points() const
Definition canvas.h:556
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:127
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:645
bool ApplyROMPalette(int group_index, int palette_index)
Definition canvas.cc:321
void ShowColorAnalysis()
Definition canvas.cc:311
auto set_highlight_tile_id(int i)
Definition canvas.h:552
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:782
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:788
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:816
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:829
const Canvas * get() const
Definition canvas.h:851
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:844
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:797
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:838
const Canvas * operator->() const
Definition canvas.h:839
Canvas * get()
Get underlying canvas.
Definition canvas.h:850
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:808
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:845
std::unordered_map< int, std::unique_ptr< gfx::Bitmap > > BitmapTable
Definition bitmap.h:497
BppFormat
BPP format enumeration for SNES graphics.
void BitmapCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, int width, int height, int tile_size, bool is_loaded, bool scrollbar, int canvas_id)
Definition canvas.cc:1669
CanvasUsage
Canvas usage patterns and tracking.
void EndCanvas(Canvas &canvas)
Definition canvas.cc:1509
void DrawBitmapPreview(const CanvasRuntime &rt, gfx::Bitmap &bitmap, const BitmapPreviewOptions &options)
Definition canvas.cc:2135
bool DrawTileSelector(const CanvasRuntime &rt, int size, int size_y, ImVec2 *out_selected_pos)
Definition canvas.cc:2272
bool DrawTilemapPainter(const CanvasRuntime &rt, gfx::Tilemap &tilemap, int current_tile, ImVec2 *out_drawn_pos)
Definition canvas.cc:2213
void DrawRect(const CanvasRuntime &rt, int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:2182
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
Definition canvas.cc:1486
void GraphicsBinCanvasPipeline(int width, int height, int tile_size, int num_sheets_to_load, int canvas_id, bool is_loaded, gfx::BitmapTable &graphics_bin)
Definition canvas.cc:1632
ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px)
Definition canvas.cc:1618
bool RenderSelectorPanel(gui::Canvas &canvas, gfx::Bitmap &bmp, const SelectorPanelOpts &opts, TileHit *out_hit)
TileHit TileIndexAt(const ImVec2 &local_pos, float grid_step, float scale, const ImVec2 &canvas_px)
void DrawTileOutline(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const ImVec2 &tile_size_px, ImU32 color)
void DrawTileLabel(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const char *text, ImU32 color)
void DrawText(const CanvasRuntime &rt, const std::string &text, int x, int y)
Definition canvas.cc:2189
ZoomToFitResult ComputeZoomToFit(ImVec2 content_px, ImVec2 canvas_px, float padding_px)
Definition canvas.cc:1586
CanvasGridSize
Definition canvas.h:52
void DrawOutline(const CanvasRuntime &rt, int x, int y, int w, int h, ImU32 color)
Definition canvas.cc:2195
void TableCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, const std::string &label, bool auto_resize)
Definition canvas.cc:1697
bool DrawTilemapRegion(gui::Canvas &canvas, CanvasRuntime &rt, gfx::Tilemap &tilemap, absl::Span< const int > tile_ids, int tile_size, float scale, ImVec2 clamp_px)
void RenderContextMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
void DrawBitmap(const CanvasRuntime &rt, gfx::Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:2087
void DrawSelectRect(const CanvasRuntime &rt, int current_map, int tile_size, float scale, CanvasSelection &selection)
Definition canvas.cc:2296
bool RenderPreviewPanel(const CanvasRuntime &rt, gfx::Bitmap &bmp, const PreviewPanelOpts &opts)
Definition canvas.cc:2156
void DrawTileHighlight(const CanvasRuntime &rt, const ImVec2 &tile_pos_px, const ImVec2 &tile_size_px, ImU32 color)
void RegisterDefaultCanvasMenu(CanvasMenuActionHost &host, const CanvasRuntime &rt, CanvasConfig &cfg)
Tilemap structure for SNES tile-based graphics management.
Definition tilemap.h:118
std::optional< float > grid_step
Definition canvas.h:90
Unified configuration for canvas display and interaction.
Optional extension modules for Canvas.
std::optional< float > grid_step
Definition canvas.h:70
std::function< void()> on_click
Definition canvas.h:734
std::function< bool()> enabled
Definition canvas.h:733
Complete menu definition.
Declarative menu item definition.
Definition canvas_menu.h:64
ImDrawList * draw_list
Definition canvas.h:55
Selection state for canvas interactions.
Complete canvas state snapshot.
ImVec2 tile_origin
Definition canvas.h:100