29 return "selection-source";
31 return "composite-output";
39 "Skipped %s: bitmap purpose=%s active=%d size=%dx%d (no texture)",
51 draw_list->AddRectFilled(
56 if (theme.enable_glow_effects) {
57 const float dot_spacing = 32.0f;
58 const uint32_t dot_color =
63 x < geometry.
canvas_p1.x; x += dot_spacing) {
66 y < geometry.
canvas_p1.y; y += dot_spacing) {
67 draw_list->AddCircleFilled(ImVec2(x, y), 1.0f, dot_color);
76 theme.window_border_size > 0 ? theme.window_border_size : 1.0f);
103 const ImVector<ImVec2>& points,
104 const ImVector<ImVec2>& selected_points) {
123 const ImVector<ImVector<std::string>>& labels,
124 int current_labels,
int tile_id_offset) {
146 draw_list->PopClipRect();
153 LogBitmapDropIfDebug(bitmap,
"RenderBitmapOnCanvas(border)");
159 draw_list->AddImage((ImTextureID)(intptr_t)bitmap.
texture(),
163 ImVec2(0, 0), ImVec2(1, 1),
164 ImGui::GetColorU32(ImVec4(1, 1, 1, 1)));
172 float scale,
int alpha) {
174 LogBitmapDropIfDebug(bitmap,
"RenderBitmapOnCanvas(offset)");
181 ImVec2 rendered_size(bitmap.
width() * scale, bitmap.
height() * scale);
188 (ImTextureID)(intptr_t)bitmap.
texture(),
195 ImVec2(0, 0), ImVec2(1, 1),
196 ImGui::GetColorU32(IM_COL32(255, 255, 255, alpha)));
201 ImVec2 dest_size, ImVec2 src_pos, ImVec2 src_size) {
203 LogBitmapDropIfDebug(bitmap,
"RenderBitmapOnCanvas(custom-uv)");
210 (ImTextureID)(intptr_t)bitmap.
texture(),
211 ImVec2(geometry.
canvas_p0.x + dest_pos.x,
213 ImVec2(geometry.
canvas_p0.x + dest_pos.x + dest_size.x,
214 geometry.
canvas_p0.y + dest_pos.y + dest_size.y),
215 ImVec2(src_pos.x / bitmap.
width(), src_pos.y / bitmap.
height()),
216 ImVec2((src_pos.x + src_size.x) / bitmap.
width(),
217 (src_pos.y + src_size.y) / bitmap.
height()),
218 ImGui::GetColorU32(ImVec4(1, 1, 1, 1)));
223 int tile_size,
float scale,
int local_map_size,
224 ImVec2 total_map_size) {
234 bool use_optimized_rendering = group.size() > 128;
237 const float tile_scale = tile_size * scale;
248 for (
const auto tile_id : group) {
250 int tiles_per_row = 32;
251 int x = i % tiles_per_row;
252 int y = i / tiles_per_row;
254 int tile_pos_x = x * tile_size * scale;
255 int tile_pos_y = y * tile_size * scale;
259 if (tile_id >= 0 && tile_id < tilemap_size) {
261 atlas_tiles_per_row > 0) {
263 (tile_id % atlas_tiles_per_row) * tilemap.
tile_size.
x;
265 (tile_id / atlas_tiles_per_row) * tilemap.
tile_size.
y;
268 if (atlas_tile_x >= 0 && atlas_tile_x < tilemap.
atlas.
width() &&
269 atlas_tile_y >= 0 && atlas_tile_y < tilemap.
atlas.
height()) {
271 const float atlas_width =
static_cast<float>(tilemap.
atlas.
width());
272 const float atlas_height =
static_cast<float>(tilemap.
atlas.
height());
274 ImVec2(atlas_tile_x / atlas_width, atlas_tile_y / atlas_height);
276 ImVec2((atlas_tile_x + tilemap.
tile_size.
x) / atlas_width,
277 (atlas_tile_y + tilemap.
tile_size.
y) / atlas_height);
288 uint32_t alpha_color = use_optimized_rendering
289 ? IM_COL32(255, 255, 255, 200)
290 : IM_COL32(255, 255, 255, 150);
293 draw_list->AddImage((ImTextureID)(intptr_t)tilemap.
atlas.
texture(),
294 ImVec2(screen_x, screen_y),
295 ImVec2(screen_x + screen_w, screen_y + screen_h),
296 uv0, uv1, ImGui::GetColorU32(alpha_color));
Represents a bitmap image optimized for SNES ROM hacking.
TextureHandle texture() const
BitmapPurpose
How a bitmap is used in the editor pipeline.
BitmapMetadata & metadata()
RAII scope that samples the images drawn inside it with nearest-neighbor filtering.
const Theme & GetCurrentTheme() const
static ThemeManager & Get()
#define LOG_DEBUG(category, format,...)
void DrawCanvasLabels(const CanvasRenderContext &ctx, const ImVector< ImVector< std::string > > &labels, int current_labels, int tile_id_offset)
void DrawCanvasOverlay(const CanvasRenderContext &ctx, const ImVector< ImVec2 > &points, const ImVector< ImVec2 > &selected_points)
void DrawCanvasGrid(const CanvasRenderContext &ctx, int highlight_tile_id)
void LogBitmapDropIfDebug(const gfx::Bitmap &bitmap, const char *site)
const char * PurposeLabel(gfx::Bitmap::BitmapPurpose purpose)
ImVec4 ConvertColorToImVec4(const Color &color)
void RenderBitmapGroup(ImDrawList *draw_list, const CanvasGeometry &geometry, std::vector< int > &group, gfx::Tilemap &tilemap, int tile_size, float scale, int local_map_size, ImVec2 total_map_size)
Render group of bitmaps from tilemap.
void RenderCanvasLabels(ImDrawList *draw_list, const CanvasGeometry &geometry, const CanvasConfig &config, const ImVector< ImVector< std::string > > &labels, int current_labels, int tile_id_offset)
Render canvas labels on grid.
void RenderCanvasBackground(ImDrawList *draw_list, const CanvasGeometry &geometry)
Render canvas background and border.
void RenderCanvasGrid(ImDrawList *draw_list, const CanvasGeometry &geometry, const CanvasConfig &config, int highlight_tile_id)
Render canvas grid with optional highlighting.
void RenderBitmapOnCanvas(ImDrawList *draw_list, const CanvasGeometry &geometry, gfx::Bitmap &bitmap, int, float scale)
Render bitmap on canvas (border offset variant)
void RenderCanvasOverlay(ImDrawList *draw_list, const CanvasGeometry &geometry, const CanvasConfig &config, const ImVector< ImVec2 > &points, const ImVector< ImVec2 > &selected_points)
Render canvas overlay (hover and selection points)
int y
Y coordinate or height.
int x
X coordinate or width.
Tilemap structure for SNES tile-based graphics management.
Pair tile_size
Size of individual tiles (8x8 or 16x16)
Pair map_size
Size of tilemap in tiles.
Bitmap atlas
Master bitmap containing all tiles.
Unified configuration for canvas display and interaction.
bool enable_custom_labels
Canvas geometry calculated per-frame.