diff --git a/data/gui.xml b/data/gui.xml
index ded775596..19e157635 100644
--- a/data/gui.xml
+++ b/data/gui.xml
@@ -925,6 +925,7 @@
+
diff --git a/data/pref.xml b/data/pref.xml
index 3984ca328..002a92a71 100644
--- a/data/pref.xml
+++ b/data/pref.xml
@@ -526,6 +526,7 @@
+
diff --git a/data/strings/en.ini b/data/strings/en.ini
index 098c1ac6b..9d1785e85 100644
--- a/data/strings/en.ini
+++ b/data/strings/en.ini
@@ -470,6 +470,7 @@ ShowPaletteSortOptions = Show Palette Sort Options
ShowPixelGrid = Show Pixel Grid
ShowSelectionEdges = Show Selection Edges
ShowSlices = Show Slices
+ShowTileNumbers = Show Tile Numbers
SliceProperties = Slice Properties
SnapToGrid = Snap to Grid
SpriteProperties = Sprite Properties
@@ -973,6 +974,7 @@ view_show_auto_guides = &Auto Guides
view_show_slices = Sl&ices
view_show_pixel_grid = &Pixel Grid
view_show_brush_preview = &Brush Preview
+view_show_tile_numbers = &Tile Numbers
view_grid = &Grid
view_grid_settings = Gri&d Settings
view_grid_selection_as_grid = Select&ion as Grid
diff --git a/src/app/commands/cmd_show.cpp b/src/app/commands/cmd_show.cpp
index 758d05d45..53e80152d 100644
--- a/src/app/commands/cmd_show.cpp
+++ b/src/app/commands/cmd_show.cpp
@@ -1,4 +1,5 @@
// Aseprite
+// Copyright (C) 2020 Igara Studio S.A.
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
@@ -183,6 +184,24 @@ protected:
}
};
+class ShowTileNumbersCommand : public Command {
+public:
+ ShowTileNumbersCommand()
+ : Command(CommandId::ShowTileNumbers(), CmdUIOnlyFlag) {
+ }
+
+protected:
+ bool onChecked(Context* ctx) override {
+ DocumentPreferences& docPref = Preferences::instance().document(ctx->activeDocument());
+ return docPref.show.tileNumbers();
+ }
+
+ void onExecute(Context* ctx) override {
+ DocumentPreferences& docPref = Preferences::instance().document(ctx->activeDocument());
+ docPref.show.tileNumbers(!docPref.show.tileNumbers());
+ }
+};
+
Command* CommandFactory::createShowExtrasCommand()
{
return new ShowExtrasCommand;
@@ -223,4 +242,9 @@ Command* CommandFactory::createShowSlicesCommand()
return new ShowSlicesCommand;
}
+Command* CommandFactory::createShowTileNumbersCommand()
+{
+ return new ShowTileNumbersCommand;
+}
+
} // namespace app
diff --git a/src/app/commands/commands_list.h b/src/app/commands/commands_list.h
index ad9daf91e..8e6556ea4 100644
--- a/src/app/commands/commands_list.h
+++ b/src/app/commands/commands_list.h
@@ -150,6 +150,7 @@ FOR_EACH_COMMAND(ShowOnionSkin)
FOR_EACH_COMMAND(ShowPixelGrid)
FOR_EACH_COMMAND(ShowSelectionEdges)
FOR_EACH_COMMAND(ShowSlices)
+FOR_EACH_COMMAND(ShowTileNumbers)
FOR_EACH_COMMAND(SliceProperties)
FOR_EACH_COMMAND(SnapToGrid)
FOR_EACH_COMMAND(SpriteProperties)
diff --git a/src/app/ui/editor/editor.cpp b/src/app/ui/editor/editor.cpp
index 5924ec482..3e46baf6b 100644
--- a/src/app/ui/editor/editor.cpp
+++ b/src/app/ui/editor/editor.cpp
@@ -915,9 +915,39 @@ void Editor::drawSpriteUnclippedRect(ui::Graphics* g, const gfx::Rect& _rc)
m_state->requireBrushPreview()) {
Cel* cel = (m_layer ? m_layer->cel(m_frame): nullptr);
if (cel) {
- drawCelBounds(
- g, cel,
- color_utils::color_for_ui(Preferences::instance().guides.layerEdgesColor()));
+ gfx::Color color = color_utils::color_for_ui(Preferences::instance().guides.layerEdgesColor());
+ drawCelBounds(g, cel, color);
+
+ // Draw tile numbers
+ if (m_docPref.show.tileNumbers() &&
+ cel->layer()->isTilemap()) {
+ color = color_utils::color_for_ui(Preferences::instance().guides.autoGuidesColor());
+ gfx::Color fgColor = color_utils::blackandwhite_neg(color);
+
+ const doc::Grid grid = getSite().grid();
+ const gfx::Size tileSize = editorToScreen(grid.tileToCanvas(gfx::Rect(0, 0, 1, 1))).size();
+ if (tileSize.h > g->font()->height()) {
+ const gfx::Point offset(tileSize.w/2,
+ tileSize.h/2 - g->font()->height()/2);
+ const gfx::Rect rc = cel->bounds();
+ const doc::Image* image = cel->image();
+ std::string text;
+ for (int y=0; yheight(); ++y) {
+ for (int x=0; xwidth(); ++x) {
+ doc::tile_t t = image->getPixel(x, y);
+ if (t != doc::tile_i_notile) {
+ gfx::Point pt = editorToScreen(grid.tileToCanvas(gfx::Point(x, y)));
+ pt -= bounds().origin();
+ pt += offset;
+
+ text = fmt::format("{}", (t & doc::tile_i_mask));
+ pt.x -= g->measureUIText(text).w/2;
+ g->drawText(text, fgColor, color, pt);
+ }
+ }
+ }
+ }
+ }
if (m_showAutoCelGuides &&
m_showGuidesThisCel != cel) {
@@ -1157,9 +1187,8 @@ void Editor::drawCelGuides(ui::Graphics* g, const Cel* cel, const Cel* mouseCel)
scrCmpBounds = getCelScreenBounds(mouseCel);
sprCmpBounds = mouseCel->bounds();
- drawCelBounds(
- g, mouseCel,
- color_utils::color_for_ui(Preferences::instance().guides.autoGuidesColor()));
+ const gfx::Color color = color_utils::color_for_ui(Preferences::instance().guides.autoGuidesColor());
+ drawCelBounds(g, mouseCel, color);
}
// Use whole canvas
else {