11#include "imgui/imgui.h"
21 handler(command, config);
68 const std::string& context_id,
const ImVec2& ,
Rom* rom,
76 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
78 ImGui::OpenPopupOnItemClick(context_id.c_str(),
79 ImGuiPopupFlags_MouseButtonRight);
83 auto popup_callback = [canvas](
const std::string& id,
84 std::function<void()> callback) {
91 if (ImGui::BeginPopup(context_id.c_str())) {
130 if (ImGui::GetIO().KeyCtrl) {
151 const ImVec2& canvas_size,
const ImVec2& content_size,
float global_scale,
152 float grid_step,
bool enable_grid,
bool ,
154 bool ,
bool ,
const ImVec2& scrolling) {
170 std::function<
void(
const std::string&, std::function<
void()>)>
177 const std::string& title,
const std::vector<CanvasMenuItem>& items,
178 std::function<
void(
const std::string&, std::function<
void()>)>
183 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F),
"%s", title.c_str());
184 for (
const auto& item : items) {
190 std::function<
void(
const std::string&, std::function<
void()>)>
204 for (
const auto& item : it->second) {
212 if (ImGui::BeginMenu(
"View Controls")) {
213 if (ImGui::MenuItem(
"Reset View",
"Ctrl+R")) {
216 if (ImGui::MenuItem(
"Zoom to Fit",
"Ctrl+F")) {
219 if (ImGui::MenuItem(
"Zoom In",
"Ctrl++")) {
224 if (ImGui::MenuItem(
"Zoom Out",
"Ctrl+-")) {
230 if (ImGui::MenuItem(
"Show Grid",
nullptr,
enable_grid_)) {
257 ImGui::Text(
"Mouse Position: %.0f x %.0f", 0.0F,
260 if (ImGui::MenuItem(
"Advanced Properties...")) {
284 ImGui::Text(
"Size: %d x %d", bitmap->
width(), bitmap->
height());
285 if (
auto* surface = bitmap->
surface()) {
286 ImGui::Text(
"Pitch: %d", surface->pitch);
287 ImGui::Text(
"BitsPerPixel: %d",
289 ImGui::Text(
"BytesPerPixel: %d",
293 if (ImGui::BeginMenu(
"Format")) {
294 if (ImGui::MenuItem(
"Indexed")) {
300 if (ImGui::MenuItem(
"4BPP")) {
306 if (ImGui::MenuItem(
"8BPP")) {
324 if (ImGui::MenuItem(
"Edit Palette...")) {
328 if (ImGui::MenuItem(
"Color Analysis...")) {
332 if (rom && ImGui::BeginMenu(
"ROM Palette Selection")) {
336 ImGui::Text(
"Group:");
338 ImGui::InputScalar(
"##group", ImGuiDataType_U64,
340 ImGui::Text(
"Palette:");
344 if (ImGui::Button(
"Apply to Canvas")) {
351 if (ImGui::BeginMenu(
"View Palette")) {
360 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F),
"Bitmap Metadata");
363 const auto& meta = bitmap->
metadata();
364 ImGui::Text(
"Source BPP: %d", meta.source_bpp);
365 ImGui::Text(
"Palette Format: %s",
366 meta.palette_format == 0 ?
"Full" :
"Sub-palette");
367 ImGui::Text(
"Source Type: %s", meta.source_type.c_str());
368 ImGui::Text(
"Expected Colors: %d", meta.palette_colors);
369 ImGui::Text(
"Actual Palette Size: %zu", bitmap->
palette().
size());
372 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F),
373 "Palette Application Method");
374 if (meta.palette_format == 0) {
376 "Full palette (SetPalette) - all colors applied directly");
379 "Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, "
384 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F),
"Documentation");
385 if (ImGui::MenuItem(
"Palette System Architecture")) {
386 ImGui::SetClipboardText(
"yaze/docs/palette-system-architecture.md");
389 if (ImGui::MenuItem(
"User Palette Guide")) {
390 ImGui::SetClipboardText(
"yaze/docs/user-palette-guide.md");
411 if (ImGui::MenuItem(
"Format Analysis...")) {
414 if (ImGui::MenuItem(
"Convert Format...")) {
417 if (ImGui::MenuItem(
"Format Comparison...")) {
428 auto canvas_stats = profiler.GetStats(
"canvas_operations");
429 auto draw_stats = profiler.GetStats(
"canvas_draw");
431 ImGui::Text(
"Canvas Operations: %zu", canvas_stats.sample_count);
432 ImGui::Text(
"Average Time: %.2f ms", draw_stats.avg_time_us / 1000.0);
434 if (ImGui::MenuItem(
"Performance Dashboard...")) {
437 if (ImGui::MenuItem(
"Usage Report...")) {
449 const struct GridOption {
453 {
"8x8", 8.0F}, {
"16x16", 16.0F}, {
"32x32", 32.0F}, {
"64x64", 64.0F}};
455 for (
const auto& option : options) {
457 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
472 const struct ScaleOption {
475 } options[] = {{
"0.25x", 0.25F}, {
"0.5x", 0.5F}, {
"1x", 1.0F},
476 {
"2x", 2.0F}, {
"4x", 4.0F}, {
"8x", 8.0F}};
478 for (
const auto& option : options) {
479 if (ImGui::MenuItem(option.label)) {
491 const ImVec4& color) {
493 static std::unordered_map<std::string, const char*> icon_map = {
517 auto it = icon_map.find(icon_name);
518 if (it != icon_map.end()) {
519 ImGui::TextColored(color,
"%s", it->second);
526 return "Tile Painting";
528 return "Tile Selecting";
530 return "Rectangle Selection";
532 return "Color Painting";
534 return "Bitmap Editing";
536 return "Palette Editing";
538 return "BPP Conversion";
540 return "Performance Mode";
542 return "Entity Manipulation";
553 return ImVec4(0.2F, 1.0F, 0.2F, 1.0F);
555 return ImVec4(0.2F, 0.8F, 1.0F, 1.0F);
557 return ImVec4(1.0F, 0.8F, 0.2F, 1.0F);
559 return ImVec4(1.0F, 0.2F, 1.0F, 1.0F);
561 return ImVec4(1.0F, 0.5F, 0.2F, 1.0F);
563 return ImVec4(0.8F, 0.2F, 1.0F, 1.0F);
565 return ImVec4(0.2F, 1.0F, 1.0F, 1.0F);
567 return ImVec4(1.0F, 0.2F, 0.2F, 1.0F);
569 return ImVec4(0.4F, 0.8F, 1.0F, 1.0F);
571 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
573 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
594 CanvasMenuItem rect_select_item(
"Select Rectangle",
"rect", []() {
615 CanvasMenuItem palette_edit_item(
"Edit Palette",
"palette", []() {
622 CanvasMenuItem bpp_convert_item(
"Convert Format",
"convert", []() {
636 const std::string& label,
const std::string& icon,
637 std::function<
void()> callback) {
642 const std::string& label,
const std::string& icon,
643 std::function<
void()> callback) {
648 const std::string& label,
const std::string& icon,
649 std::function<
void()> callback) {
654 const std::string& label,
const std::string& icon,
655 std::function<
void()> callback) {
660 const std::string& label,
const std::string& icon,
661 std::function<
void()> callback) {
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
Represents a bitmap image optimized for SNES ROM hacking.
const SnesPalette & palette() const
void Reformat(int format)
Reformat the bitmap to use a different pixel format.
BitmapMetadata & metadata()
SnesPalette * mutable_palette()
SDL_Surface * surface() const
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Modern, robust canvas for drawing and manipulating graphics.
PopupRegistry & GetPopupRegistry()
CanvasMenuDefinition & editor_menu()
#define ICON_MD_FUNCTIONS
#define ICON_MD_FIT_SCREEN
#define ICON_MD_TRENDING_UP
#define ICON_MD_SWAP_HORIZ
#define ICON_MD_DRAG_INDICATOR
#define ICON_MD_VISIBILITY
#define ICON_MD_COLOR_LENS
CanvasUsage
Canvas usage patterns and tracking.
void RenderCanvasMenu(const CanvasMenuDefinition &menu, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a complete menu definition.
void RenderMenuItem(const CanvasMenuItem &item, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a single menu item.
absl::Status DisplayEditablePalette(gfx::SnesPalette &palette, const std::string &title, bool show_color_picker, int colors_per_row, ImGuiColorEditFlags flags)
SDL2/SDL3 compatibility layer.
Unified configuration for canvas display and interaction.
bool enable_custom_labels
bool show_builtin_context_menu