10#include "imgui/imgui.h"
20 handler(command, config);
66 const ImVec2& ,
Rom* rom,
74 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
76 ImGui::OpenPopupOnItemClick(context_id.c_str(), ImGuiPopupFlags_MouseButtonRight);
80 auto popup_callback = [canvas](
const std::string& id, std::function<void()> callback) {
87 if (ImGui::BeginPopup(context_id.c_str())) {
124 if (ImGui::GetIO().KeyCtrl) {
144 const ImVec2& content_size,
153 const ImVec2& scrolling) {
168 std::function<
void(
const std::string&, std::function<
void()>)> popup_callback) {
174 const std::vector<CanvasMenuItem>& items,
175 std::function<
void(
const std::string&, std::function<
void()>)> popup_callback) {
176 if (items.empty())
return;
178 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F),
"%s", title.c_str());
179 for (
const auto& item : items) {
185 std::function<
void(
const std::string&, std::function<
void()>)> popup_callback) {
194 ImGui::TextColored(usage_color,
"%s %s Mode",
ICON_MD_COLOR_LENS, usage_name.c_str());
197 for (
const auto& item : it->second) {
205 if (ImGui::BeginMenu(
"View Controls")) {
206 if (ImGui::MenuItem(
"Reset View",
"Ctrl+R")) {
209 if (ImGui::MenuItem(
"Zoom to Fit",
"Ctrl+F")) {
212 if (ImGui::MenuItem(
"Zoom In",
"Ctrl++")) {
217 if (ImGui::MenuItem(
"Zoom Out",
"Ctrl+-")) {
223 if (ImGui::MenuItem(
"Show Grid",
nullptr,
enable_grid_)) {
250 ImGui::Text(
"Mouse Position: %.0f x %.0f", 0.0F, 0.0F);
252 if (ImGui::MenuItem(
"Advanced Properties...")) {
275 ImGui::Text(
"Size: %d x %d", bitmap->
width(), bitmap->
height());
276 ImGui::Text(
"Pitch: %d", bitmap->
surface()->pitch);
277 ImGui::Text(
"BitsPerPixel: %d", bitmap->
surface()->format->BitsPerPixel);
278 ImGui::Text(
"BytesPerPixel: %d", bitmap->
surface()->format->BytesPerPixel);
280 if (ImGui::BeginMenu(
"Format")) {
281 if (ImGui::MenuItem(
"Indexed")) {
287 if (ImGui::MenuItem(
"4BPP")) {
293 if (ImGui::MenuItem(
"8BPP")) {
309 if (ImGui::MenuItem(
"Edit Palette...")) {
312 if (ImGui::MenuItem(
"Color Analysis...")) {
316 if (rom && ImGui::BeginMenu(
"ROM Palette Selection")) {
320 ImGui::Text(
"Group:"); ImGui::SameLine();
322 ImGui::Text(
"Palette:"); ImGui::SameLine();
325 if (ImGui::Button(
"Apply to Canvas")) {
331 if (ImGui::BeginMenu(
"View Palette")) {
340 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F),
"Bitmap Metadata");
343 const auto& meta = bitmap->
metadata();
344 ImGui::Text(
"Source BPP: %d", meta.source_bpp);
345 ImGui::Text(
"Palette Format: %s", meta.palette_format == 0 ?
"Full" :
"Sub-palette");
346 ImGui::Text(
"Source Type: %s", meta.source_type.c_str());
347 ImGui::Text(
"Expected Colors: %d", meta.palette_colors);
348 ImGui::Text(
"Actual Palette Size: %zu", bitmap->
palette().
size());
351 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F),
"Palette Application Method");
352 if (meta.palette_format == 0) {
353 ImGui::TextWrapped(
"Full palette (SetPalette) - all colors applied directly");
355 ImGui::TextWrapped(
"Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, 1-7 from palette");
359 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F),
"Documentation");
360 if (ImGui::MenuItem(
"Palette System Architecture")) {
361 ImGui::SetClipboardText(
"yaze/docs/palette-system-architecture.md");
364 if (ImGui::MenuItem(
"User Palette Guide")) {
365 ImGui::SetClipboardText(
"yaze/docs/user-palette-guide.md");
384 if (ImGui::MenuItem(
"Format Analysis...")) {
387 if (ImGui::MenuItem(
"Convert Format...")) {
390 if (ImGui::MenuItem(
"Format Comparison...")) {
401 auto canvas_stats = profiler.GetStats(
"canvas_operations");
402 auto draw_stats = profiler.GetStats(
"canvas_draw");
404 ImGui::Text(
"Canvas Operations: %zu", canvas_stats.sample_count);
405 ImGui::Text(
"Average Time: %.2f ms", draw_stats.avg_time_us / 1000.0);
407 if (ImGui::MenuItem(
"Performance Dashboard...")) {
410 if (ImGui::MenuItem(
"Usage Report...")) {
422 const struct GridOption {
425 } options[] = {{
"8x8", 8.0F}, {
"16x16", 16.0F},
426 {
"32x32", 32.0F}, {
"64x64", 64.0F}};
428 for (
const auto& option : options) {
430 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
445 const struct ScaleOption {
448 } options[] = {{
"0.25x", 0.25F}, {
"0.5x", 0.5F}, {
"1x", 1.0F},
449 {
"2x", 2.0F}, {
"4x", 4.0F}, {
"8x", 8.0F}};
451 for (
const auto& option : options) {
452 if (ImGui::MenuItem(option.label)) {
465 static std::unordered_map<std::string, const char*> icon_map = {
474 auto it = icon_map.find(icon_name);
475 if (it != icon_map.end()) {
476 ImGui::TextColored(color,
"%s", it->second);
492 default:
return "Unknown";
508 default:
return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
528 CanvasMenuItem rect_select_item(
"Select Rectangle",
"rect", []() {
546 CanvasMenuItem palette_edit_item(
"Edit Palette",
"palette", []() {
552 CanvasMenuItem bpp_convert_item(
"Convert Format",
"convert", []() {
565 const std::string& label,
const std::string& icon, std::function<
void()> callback) {
570 const std::string& label,
const std::string& icon, std::function<
void()> callback) {
575 const std::string& label,
const std::string& icon, std::function<
void()> callback) {
580 const std::string& label,
const std::string& icon, std::function<
void()> callback) {
585 const std::string& label,
const std::string& icon, std::function<
void()> callback) {
The Rom class is used to load, save, and modify Rom data.
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)
Main namespace for the application.
Unified configuration for canvas display and interaction.
bool enable_custom_labels