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();
435 void ZoomOut();
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 void set_draggable(bool draggable) { draggable_ = draggable; }
455
456 // Modern accessors using modular structure
458 const std::vector<ImVec2>& GetSelectedTiles() const {
459 return selected_tiles_;
460 }
461 ImVec2 GetSelectedTilePos() const { return selected_tile_pos_; }
462 void SetSelectedTilePos(ImVec2 pos) { selected_tile_pos_ = pos; }
463
464 // Configuration accessors
465 // COMPAT: prefer CanvasFrameOptions.canvas_size for per-frame size control
470 float GetGlobalScale() const { return config_.global_scale; }
471 // COMPAT: prefer CanvasRuntime.scale for per-frame scale control
472 void SetGlobalScale(float scale) { config_.global_scale = scale; }
474 float GetGridStep() const { return config_.grid_step; }
475
476 // Rectangle selection boundary control (prevents wrapping in large maps)
477 void SetClampRectToLocalMaps(bool clamp) {
479 }
483 float GetCanvasWidth() const { return config_.canvas_size.x; }
484 float GetCanvasHeight() const { return config_.canvas_size.y; }
485
486 // Legacy compatibility accessors
488 auto selected_tiles() const { return selected_tiles_; }
489 auto selected_tile_pos() const { return selected_tile_pos_; }
490 void set_selected_tile_pos(ImVec2 pos) { selected_tile_pos_ = pos; }
491 auto global_scale() const { return config_.global_scale; }
493 auto custom_step() const { return config_.grid_step; }
494 auto width() const { return config_.canvas_size.x; }
495 auto height() const { return config_.canvas_size.y; }
496
497 // Public accessors for methods that need to be accessed externally
498 auto canvas_id() const { return canvas_id_; }
499
500 // Public methods for drawing operations
501 void DrawBitmap(Bitmap& bitmap, int border_offset, float scale);
502 void DrawBitmap(Bitmap& bitmap, int x_offset, int y_offset,
503 float scale = 1.0f, int alpha = 255);
504 void DrawBitmap(Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size,
505 ImVec2 src_pos, ImVec2 src_size);
506 void DrawBitmapTable(const BitmapTable& gfx_bin);
518 void DrawBitmapGroup(std::vector<int>& group, gfx::Tilemap& tilemap,
519 int tile_size, float scale = 1.0f,
520 int local_map_size = 0x200,
521 ImVec2 total_map_size = ImVec2(0x1000, 0x1000));
523 const BitmapPreviewOptions& options);
524 bool DrawTilemapPainter(gfx::Tilemap& tilemap, int current_tile);
525 void DrawSelectRect(int current_map, int tile_size = 0x10,
526 float scale = 1.0f);
527 bool DrawTileSelector(int size, int size_y = 0);
528 void DrawGrid(float grid_step = 64.0f, int tile_id_offset = 8);
529 void DrawOverlay();
530 auto labels(int i) {
531 if (i >= labels_.size()) {
532 labels_.push_back(ImVector<std::string>());
533 }
534 return labels_[i];
535 }
536 auto mutable_labels(int i) {
537 if (i >= labels_.size()) {
538 int x = i;
539 while (x >= labels_.size()) {
540 labels_.push_back(ImVector<std::string>());
541 x--;
542 }
543 labels_.push_back(ImVector<std::string>());
544 }
545 return &labels_[i];
546 }
547
550
553 auto selected_points() const { return selected_points_; }
554
555 auto hover_mouse_pos() const { return mouse_pos_in_canvas_; }
556
557 void set_rom(Rom* rom) { rom_ = rom; }
558 Rom* rom() const { return rom_; }
561
562 void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size);
563 void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color);
564 void AddTextAt(ImVec2 local_pos, const std::string& text, uint32_t color);
565
566 private:
568
569 // Helper to build CanvasRuntime from current state (for delegation to
570 // stateless helpers)
584
585 // Modular configuration and state
589
590 // Phase 4: Optional extensions (lazy-initialized on first use)
591 // Contains: bpp_format_ui, bpp_conversion_dialog, bpp_comparison_tool,
592 // modals, palette_editor, automation_api
593 std::unique_ptr<CanvasExtensions> extensions_;
595
596 // Phase 1: Consolidated state (gradually replacing scattered members)
598
599 // Core canvas state
600 bool is_hovered_ = false;
601 bool refresh_graphics_ = false;
602
603 // Phase 4: Context menu system (declarative menu definition)
606
607 // Phase 4: Persistent popup state for context menu actions (unified registry)
609
610 // Legacy members (to be gradually replaced)
616
617 // Core canvas state
618 Bitmap* bitmap_ = nullptr;
619 Rom* rom_ = nullptr;
621 ImDrawList* draw_list_ = nullptr;
622
623 // Canvas geometry and interaction state
630
631 // Drawing and labeling
632 // NOTE: points_ synchronized from interaction_handler_ for backward
633 // compatibility
634 ImVector<ImVec2> points_;
635 ImVector<ImVector<std::string>> labels_;
636
637 // Identification
638 std::string canvas_id_ = "Canvas";
639 std::string context_id_ = "CanvasContext";
640
641 // Legacy compatibility (gradually being replaced by selection_)
642 std::vector<ImVec2> selected_tiles_;
643 ImVector<ImVec2> selected_points_;
644 ImVec2 selected_tile_pos_ = ImVec2(-1, -1);
646 float custom_step_ = 32.0f;
647 float global_scale_ = 1.0f;
648 bool enable_grid_ = true;
653 bool draggable_ = false;
654};
655
656void BeginCanvas(Canvas& canvas, ImVec2 child_size = ImVec2(0, 0));
657void EndCanvas(Canvas& canvas);
658
659void GraphicsBinCanvasPipeline(int width, int height, int tile_size,
660 int num_sheets_to_load, int canvas_id,
661 bool is_loaded, BitmapTable& graphics_bin);
662
663void BitmapCanvasPipeline(gui::Canvas& canvas, gfx::Bitmap& bitmap, int width,
664 int height, int tile_size, bool is_loaded,
665 bool scrollbar, int canvas_id);
666
667// Table-optimized canvas pipeline with automatic sizing
668void TableCanvasPipeline(gui::Canvas& canvas, gfx::Bitmap& bitmap,
669 const std::string& label = "",
670 bool auto_resize = true);
671
672// ---------- Optional helper APIs ----------
674 const CanvasFrameOptions& options);
675void EndCanvas(gui::Canvas& canvas, CanvasRuntime& runtime,
676 const CanvasFrameOptions& options);
677
678// New Stateless Drawing Helpers (CanvasRuntime-based)
679void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, int border_offset = 2, float scale = 1.0f);
680void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, int x_offset, int y_offset, float scale = 1.0f, int alpha = 255);
681void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, ImVec2 dest_pos, ImVec2 dest_size, ImVec2 src_pos, ImVec2 src_size);
682void DrawBitmap(const CanvasRuntime& rt, gfx::Bitmap& bitmap, const BitmapDrawOpts& opts);
683
684// New Stateless Preview Helpers
685void DrawBitmapPreview(const CanvasRuntime& rt, gfx::Bitmap& bitmap, const BitmapPreviewOptions& options);
686bool RenderPreviewPanel(const CanvasRuntime& rt, gfx::Bitmap& bmp, const PreviewPanelOpts& opts);
687
688bool DrawTilemapPainter(const CanvasRuntime& rt, gfx::Tilemap& tilemap, int current_tile, ImVec2* out_drawn_pos);
689bool DrawTileSelector(const CanvasRuntime& rt, int size, int size_y, ImVec2* out_selected_pos);
690void DrawSelectRect(const CanvasRuntime& rt, int current_map, int tile_size, float scale, CanvasSelection& selection);
691
692TileHit TileIndexAt(const ImVec2& local_pos, float grid_step, float scale,
693 const ImVec2& canvas_px);
694
695void DrawTileOutline(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
696 const ImVec2& tile_size_px, ImU32 color);
697void DrawTileHighlight(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
698 const ImVec2& tile_size_px, ImU32 color);
699void DrawTileLabel(const CanvasRuntime& rt, const ImVec2& tile_pos_px,
700 const char* text, ImU32 color);
701
702// Stateless DrawRect/DrawText helpers (CanvasRuntime-based)
703void DrawRect(const CanvasRuntime& rt, int x, int y, int w, int h,
704 ImVec4 color);
705void DrawText(const CanvasRuntime& rt, const std::string& text, int x, int y);
706void DrawOutline(const CanvasRuntime& rt, int x, int y, int w, int h,
707 ImU32 color = IM_COL32(255, 255, 255, 200));
708
710 const BitmapDrawOpts& opts);
711
713 gfx::Tilemap& tilemap, absl::Span<const int> tile_ids,
714 int tile_size, float scale, ImVec2 clamp_px);
715
717 const SelectorPanelOpts& opts, TileHit* out_hit);
718
720 const PreviewPanelOpts& opts);
721
722ZoomToFitResult ComputeZoomToFit(ImVec2 content_px, ImVec2 canvas_px,
723 float padding_px);
724ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px);
725
727 std::string id;
728 std::string label;
729 std::string shortcut;
730 std::function<bool()> enabled;
731 std::function<void()> on_click;
732};
733
735 public:
736 void Clear() { items_.clear(); }
737 void AddItem(CanvasMenuAction item) { items_.push_back(std::move(item)); }
738 absl::Span<const CanvasMenuAction> items() const { return items_; }
739 const std::string& popup_id() const { return popup_id_; }
740 void set_popup_id(std::string id) { popup_id_ = std::move(id); }
741
742 private:
743 std::vector<CanvasMenuAction> items_;
744 std::string popup_id_ = "CanvasMenuHost";
745};
746
748 const CanvasRuntime& rt, CanvasConfig& cfg);
750 CanvasConfig& cfg);
751
780 public:
785 explicit ScopedCanvas(const std::string& id,
786 ImVec2 canvas_size = ImVec2(0, 0))
787 : canvas_(new Canvas(id, canvas_size)), owned_(true), active_(true) {
788 canvas_->Begin();
789 }
790
794 explicit ScopedCanvas(gfx::IRenderer* renderer, const std::string& id,
795 ImVec2 canvas_size = ImVec2(0, 0))
796 : canvas_(new Canvas(renderer, id, canvas_size)),
797 owned_(true),
798 active_(true) {
799 canvas_->Begin();
800 }
801
805 explicit ScopedCanvas(Canvas& canvas)
806 : canvas_(&canvas), owned_(false), active_(true) {
807 canvas_->Begin();
808 }
809
814 if (active_ && canvas_) {
815 canvas_->End();
816 }
817 if (owned_) {
818 delete canvas_;
819 }
820 }
821
822 // No copy, move only
823 ScopedCanvas(const ScopedCanvas&) = delete;
825
826 ScopedCanvas(ScopedCanvas&& other) noexcept
827 : canvas_(other.canvas_), owned_(other.owned_), active_(other.active_) {
828 other.active_ = false;
829 other.canvas_ = nullptr;
830 }
831
835 Canvas* operator->() { return canvas_; }
836 const Canvas* operator->() const { return canvas_; }
837
841 Canvas& operator*() { return *canvas_; }
842 const Canvas& operator*() const { return *canvas_; }
843
847 Canvas* get() { return canvas_; }
848 const Canvas* get() const { return canvas_; }
849
850 private:
852 bool owned_;
854};
855
870 public:
871 CanvasFrame(Canvas& canvas,
873 ~CanvasFrame();
874
875 CanvasFrame(const CanvasFrame&) = delete;
877
878 CanvasFrame(CanvasFrame&& other) noexcept;
879 CanvasFrame& operator=(CanvasFrame&& other) noexcept;
880
881 Canvas* operator->() { return canvas_; }
882 const Canvas* operator->() const { return canvas_; }
883
884 private:
888};
889
890} // namespace gui
891} // namespace yaze
892
893#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:869
const Canvas * operator->() const
Definition canvas.h:882
CanvasFrame(const CanvasFrame &)=delete
Canvas * operator->()
Definition canvas.h:881
CanvasFrameOptions options_
Definition canvas.h:886
CanvasFrame & operator=(const CanvasFrame &)=delete
CanvasFrame(Canvas &canvas, CanvasFrameOptions options=CanvasFrameOptions())
Definition canvas.cc:2518
Handles all tile-based interactions for Canvas.
absl::Span< const CanvasMenuAction > items() const
Definition canvas.h:738
void set_popup_id(std::string id)
Definition canvas.h:740
void AddItem(CanvasMenuAction item)
Definition canvas.h:737
const std::string & popup_id() const
Definition canvas.h:739
std::vector< CanvasMenuAction > items_
Definition canvas.h:743
Modern, robust canvas for drawing and manipulating graphics.
Definition canvas.h:150
ImVec2 scrolling_
Definition canvas.h:624
void set_scrolling(ImVec2 scroll)
Definition canvas.h:446
CanvasState state_
Definition canvas.h:597
const CanvasInteractionHandler & GetInteractionHandler() const
Definition canvas.h:355
auto selected_tile_pos() const
Definition canvas.h:489
ImVector< ImVec2 > points_
Definition canvas.h:634
int highlight_tile_id
Definition canvas.h:612
void DrawBitmap(Bitmap &bitmap, int border_offset, float scale)
Definition canvas.cc:1157
PopupRegistry popup_registry_
Definition canvas.h:608
Rom * rom() const
Definition canvas.h:558
const CanvasMenuDefinition & editor_menu() const
Definition canvas.h:299
std::string canvas_id_
Definition canvas.h:638
auto labels(int i)
Definition canvas.h:530
float GetCanvasWidth() const
Definition canvas.h:483
auto height() const
Definition canvas.h:495
auto custom_step() const
Definition canvas.h:493
void set_rom(Rom *rom)
Definition canvas.h:557
void ShowScalingControls()
Definition canvas.cc:1934
auto set_current_labels(int i)
Definition canvas.h:548
bool WasDoubleClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:481
CanvasConfig config_
Definition canvas.h:587
ImVec2 selected_tile_pos_
Definition canvas.h:644
auto global_scale() const
Definition canvas.h:491
gfx::IRenderer * renderer_
Definition canvas.h:586
ImVec2 canvas_p1_
Definition canvas.h:627
void ShowBppAnalysis()
Definition canvas.cc:2081
gfx::IRenderer * renderer() const
Definition canvas.h:193
void DrawOutlineWithColor(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1226
auto select_rect_active() const
Definition canvas.h:487
void SetUsageMode(CanvasUsage usage)
Definition canvas.cc:280
uint64_t edit_palette_group_name_index_
Definition canvas.h:614
auto selected_tiles() const
Definition canvas.h:488
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:1236
bool BeginTableCanvas(const std::string &label="")
Definition canvas.cc:388
void InitializeEnhancedComponents()
Definition canvas.cc:259
CanvasRuntime BuildCurrentRuntime() const
Definition canvas.h:571
void ShowBppConversionDialog()
Definition canvas.cc:2090
CanvasAutomationAPI * GetAutomationAPI()
Definition canvas.cc:2147
bool GetClampRectToLocalMaps() const
Definition canvas.h:480
auto hover_mouse_pos() const
Definition canvas.h:555
void ShowAdvancedCanvasProperties()
Definition canvas.cc:1810
void ApplyScaleSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:928
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:582
void DrawContextMenu()
Definition canvas.cc:684
auto push_back(ImVec2 pos)
Definition canvas.h:441
ImVec2 mouse_pos_in_canvas_
Definition canvas.h:629
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:980
bool DrawSolidTilePainter(const ImVec4 &color, int size)
Definition canvas.cc:1018
bool enable_context_menu_
Definition canvas.h:651
auto draw_list() const
Definition canvas.h:442
CanvasMenuDefinition editor_menu_
Definition canvas.h:604
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
Definition canvas.cc:904
auto width() const
Definition canvas.h:494
void DrawLayeredElements()
Definition canvas.cc:1527
float GetCanvasHeight() const
Definition canvas.h:484
const CanvasConfig & GetConfig() const
Definition canvas.h:325
void ReserveTableSpace(const std::string &label="")
Definition canvas.cc:383
bool enable_custom_labels_
Definition canvas.h:650
const PopupRegistry & GetPopupRegistry() const
Definition canvas.h:313
void AddTextAt(ImVec2 local_pos, const std::string &text, uint32_t color)
Definition canvas.cc:2507
void ShowUsageReport()
Definition canvas.cc:307
bool IsSelectRectActive() const
Definition canvas.h:457
CanvasInteractionHandler & GetInteractionHandler()
Definition canvas.h:352
auto mutable_selected_points()
Definition canvas.h:552
void SetRenderer(gfx::IRenderer *renderer)
Definition canvas.h:192
ImVec2 GetMinimumSize() const
Definition canvas.cc:373
void AddRectFilledAt(ImVec2 local_top_left, ImVec2 size, uint32_t color)
Definition canvas.cc:2498
bool DrawTileSelector(int size, int size_y=0)
Definition canvas.cc:1093
bool ConvertBitmapFormat(gfx::BppFormat target_format)
Definition canvas.cc:2110
void DrawGridLines(float grid_step)
Definition canvas.cc:1433
void SetCustomGridStep(float step)
Definition canvas.h:215
uint64_t edit_palette_sub_index_
Definition canvas.h:615
void ShowPerformanceUI()
Definition canvas.cc:301
zelda3::GameData * game_data() const
Definition canvas.h:560
bool custom_canvas_size_
Definition canvas.h:652
void ClearContextMenuItems()
Definition canvas.cc:858
void AddImageAt(ImTextureID texture, ImVec2 local_top_left, ImVec2 size)
Definition canvas.cc:2489
void SetGameData(zelda3::GameData *game_data)
Definition canvas.cc:335
void DrawRect(int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:1423
bool HasValidSelection() const
Definition canvas.cc:473
bool DrawTilePainter(const Bitmap &bitmap, int size, float scale=1.0f)
Definition canvas.cc:934
ImDrawList * draw_list_
Definition canvas.h:621
PopupRegistry & GetPopupRegistry()
Definition canvas.h:312
auto custom_labels_enabled()
Definition canvas.h:492
ImVector< ImVec2 > selected_points_
Definition canvas.h:643
ImVec2 GetCurrentSize() const
Definition canvas.h:369
void SetCanvasSize(ImVec2 canvas_size)
Definition canvas.h:466
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:565
void DrawTileOnBitmap(int tile_size, gfx::Bitmap *bitmap, ImVec4 color)
Definition canvas.cc:1072
void DrawCustomHighlight(float grid_step)
Definition canvas.cc:1475
bool select_rect_active_
Definition canvas.h:645
auto mutable_selected_tiles()
Definition canvas.h:551
auto mutable_labels(int i)
Definition canvas.h:536
Bitmap * bitmap_
Definition canvas.h:618
std::unique_ptr< CanvasExtensions > extensions_
Definition canvas.h:593
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:835
uint16_t edit_palette_index_
Definition canvas.h:613
ImVec2 GetPreferredSize() const
Definition canvas.cc:378
float GetGridStep() const
Definition canvas.h:474
CanvasInteractionHandler interaction_handler_
Definition canvas.h:292
void InitializePaletteEditor(Rom *rom)
Definition canvas.cc:326
void Begin(ImVec2 canvas_size=ImVec2(0, 0))
Begin canvas rendering (ImGui-style)
Definition canvas.cc:495
auto canvas_size() const
Definition canvas.h:451
void set_selected_tile_pos(ImVec2 pos)
Definition canvas.h:490
void SetZoomToFit(const gfx::Bitmap &bitmap)
Definition canvas.cc:878
bool WasClicked(ImGuiMouseButton button=ImGuiMouseButton_Left) const
Definition canvas.cc:477
ImVector< ImVector< std::string > > labels_
Definition canvas.h:635
void set_draggable(bool draggable)
Definition canvas.h:454
void SetContextMenuEnabled(bool enabled)
Definition canvas.h:300
gfx::BppFormat GetCurrentBppFormat() const
Definition canvas.cc:2138
auto canvas_id() const
Definition canvas.h:498
void ClosePersistentPopup(const std::string &popup_id)
Definition canvas.cc:868
void ShowBppFormatSelector()
Definition canvas.cc:2070
CanvasMenuDefinition & editor_menu()
Definition canvas.h:298
void RecordCanvasOperation(const std::string &operation_name, double time_ms)
Definition canvas.cc:290
void RenderPersistentPopups()
Definition canvas.cc:873
void set_global_scale(float scale)
Definition canvas.cc:225
ImVec2 GetSelectedTilePos() const
Definition canvas.h:461
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:501
float GetGlobalScale() const
Definition canvas.h:470
void SetSelectedTilePos(ImVec2 pos)
Definition canvas.h:462
void EndInTable(CanvasRuntime &runtime, const CanvasFrameOptions &options)
Definition canvas.cc:451
void DrawSelectRect(int current_map, int tile_size=0x10, float scale=1.0f)
Definition canvas.cc:1123
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:458
std::unique_ptr< CanvasContextMenu > context_menu_
Definition canvas.h:289
bool refresh_graphics_
Definition canvas.h:601
auto usage_mode() const
Definition canvas.h:345
ImVec2 GetLastClickPosition() const
Definition canvas.cc:486
CanvasSelection & GetSelection()
Definition canvas.h:326
zelda3::GameData * game_data_
Definition canvas.h:620
void ShowPaletteEditor()
Definition canvas.cc:342
float global_scale_
Definition canvas.h:647
void DrawOutline(int x, int y, int w, int h)
Definition canvas.cc:1221
float custom_step_
Definition canvas.h:646
void SetClampRectToLocalMaps(bool clamp)
Definition canvas.h:477
bool context_menu_enabled_
Definition canvas.h:605
void DrawInfoGrid(float grid_step=64.0f, int tile_id_offset=8, int label_id=0)
Definition canvas.cc:1438
CanvasSelection selection_
Definition canvas.h:588
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:415
bool enable_hex_tile_labels_
Definition canvas.h:649
ImVec2 canvas_p0_
Definition canvas.h:626
auto scrolling() const
Definition canvas.h:445
void OpenPersistentPopup(const std::string &popup_id, std::function< void()> render_callback)
Definition canvas.cc:862
void DrawBitmapTable(const BitmapTable &gfx_bin)
Definition canvas.cc:1204
std::string context_id_
Definition canvas.h:639
void DrawBackground(ImVec2 canvas_size=ImVec2(0, 0))
Definition canvas.cc:590
ImVec2 canvas_sz_
Definition canvas.h:625
void InitializeDefaults()
Definition canvas.cc:164
void EndTableCanvas()
Definition canvas.cc:411
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:107
void SetAutoResize(bool auto_resize)
Definition canvas.h:370
void SetGlobalScale(float scale)
Definition canvas.h:472
void DrawGrid(float grid_step=64.0f, int tile_id_offset=8)
Definition canvas.cc:1480
void DrawContextMenuItem(const gui::CanvasMenuItem &item)
Definition canvas.cc:825
void DrawText(const std::string &text, int x, int y)
Definition canvas.cc:1428
ImVec2 drawn_tile_pos_
Definition canvas.h:628
bool * GetCustomLabelsEnabled()
Definition canvas.h:473
auto selected_points() const
Definition canvas.h:553
CanvasExtensions & EnsureExtensions()
Definition canvas.cc:132
std::vector< ImVec2 > selected_tiles_
Definition canvas.h:642
bool ApplyROMPalette(int group_index, int palette_index)
Definition canvas.cc:364
void ShowColorAnalysis()
Definition canvas.cc:354
auto set_highlight_tile_id(int i)
Definition canvas.h:549
Registry for managing persistent popups.
RAII wrapper for Canvas (ImGui-style)
Definition canvas.h:779
ScopedCanvas(const std::string &id, ImVec2 canvas_size=ImVec2(0, 0))
Construct and begin a new canvas (legacy constructor without renderer)
Definition canvas.h:785
~ScopedCanvas()
Destructor automatically calls End()
Definition canvas.h:813
ScopedCanvas(ScopedCanvas &&other) noexcept
Definition canvas.h:826
const Canvas * get() const
Definition canvas.h:848
Canvas & operator*()
Dereference operator for direct access: (*scoped).DrawBitmap(...)
Definition canvas.h:841
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:794
ScopedCanvas(const ScopedCanvas &)=delete
Canvas * operator->()
Arrow operator for clean syntax: scoped->DrawBitmap(...)
Definition canvas.h:835
const Canvas * operator->() const
Definition canvas.h:836
Canvas * get()
Get underlying canvas.
Definition canvas.h:847
ScopedCanvas(Canvas &canvas)
Wrap existing canvas with RAII.
Definition canvas.h:805
ScopedCanvas & operator=(const ScopedCanvas &)=delete
const Canvas & operator*() const
Definition canvas.h:842
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:1751
CanvasUsage
Canvas usage patterns and tracking.
void EndCanvas(Canvas &canvas)
Definition canvas.cc:1591
void DrawBitmapPreview(const CanvasRuntime &rt, gfx::Bitmap &bitmap, const BitmapPreviewOptions &options)
Definition canvas.cc:2217
bool DrawTileSelector(const CanvasRuntime &rt, int size, int size_y, ImVec2 *out_selected_pos)
Definition canvas.cc:2354
bool DrawTilemapPainter(const CanvasRuntime &rt, gfx::Tilemap &tilemap, int current_tile, ImVec2 *out_drawn_pos)
Definition canvas.cc:2295
void DrawRect(const CanvasRuntime &rt, int x, int y, int w, int h, ImVec4 color)
Definition canvas.cc:2264
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
Definition canvas.cc:1568
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:1714
ImVec2 ClampScroll(ImVec2 scroll, ImVec2 content_px, ImVec2 canvas_px)
Definition canvas.cc:1700
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:2271
ZoomToFitResult ComputeZoomToFit(ImVec2 content_px, ImVec2 canvas_px, float padding_px)
Definition canvas.cc:1668
CanvasGridSize
Definition canvas.h:52
void DrawOutline(const CanvasRuntime &rt, int x, int y, int w, int h, ImU32 color)
Definition canvas.cc:2277
void TableCanvasPipeline(gui::Canvas &canvas, gfx::Bitmap &bitmap, const std::string &label, bool auto_resize)
Definition canvas.cc:1779
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:2169
void DrawSelectRect(const CanvasRuntime &rt, int current_map, int tile_size, float scale, CanvasSelection &selection)
Definition canvas.cc:2378
bool RenderPreviewPanel(const CanvasRuntime &rt, gfx::Bitmap &bmp, const PreviewPanelOpts &opts)
Definition canvas.cc:2238
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:731
std::function< bool()> enabled
Definition canvas.h:730
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