From 40611d4d54967db0660fe713ab3ba76a44f934e0 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Tue, 8 Jul 2025 22:54:59 -0400 Subject: [PATCH] Crop the map sprite so it's not bigger than necessary. --- assets/map_tiles.png | Bin 6013 -> 15380 bytes tools/icongen.cpp | 29 ++++++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/assets/map_tiles.png b/assets/map_tiles.png index f342d63a706b17ec0ab5251dfa1d784b28ab6e83..56e5c516c23fe92f32c482591e758cd42ba8f1c7 100644 GIT binary patch literal 15380 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 diff --git a/tools/icongen.cpp b/tools/icongen.cpp index 919a76e..7bee6ab 100644 --- a/tools/icongen.cpp +++ b/tools/icongen.cpp @@ -10,6 +10,8 @@ namespace fs = std::filesystem; constexpr const int TILE_COUNT=10; +constexpr const sf::Color DEFAULT_COLOR{255, 255, 255, 255}; +constexpr const size_t DEFAULT_DIM=128; using namespace shiterator; @@ -23,19 +25,17 @@ struct MapTileBuilder { unsigned int $font_size = 20; sf::Glyph $glyph; sf::Font $font{FONT_FILE_NAME}; + std::shared_ptr $render = nullptr; sf::Vector2u $size; sf::Vector2u $image_size; - sf::RenderTexture $render; sf::RenderTexture $temp_render; MapTileBuilder(size_t x, size_t y) : $size(x, y), $image_size($size.x * TILE_COUNT, $size.y * TILE_COUNT), - $render($image_size), $temp_render($size) { $font.setSmooth(false); - $render.setSmooth(false); } void best_size(wchar_t for_char) { @@ -56,25 +56,29 @@ struct MapTileBuilder { } void save_image(std::string icon_path) { + dbc::check($render != nullptr, "You have to call run() first."); fs::path out_path{icon_path}; if(fs::exists(out_path)) { fs::remove(out_path); } - sf::Image out_img = $render.getTexture().copyToImage(); + sf::Image out_img = $render->getTexture().copyToImage(); bool worked = out_img.saveToFile(out_path); dbc::check(worked, "Failed to write screenshot.png"); } + void run(MapGrid& map, unsigned int width, unsigned int height, BoolGrid& centered) { + sf::Vector2u crop{$size.x * width, $size.y * height}; + $render = std::make_shared(crop); - void run(MapGrid& map, BoolGrid& centered) { + $render->setSmooth(false); sf::Vector2f cell_pos{0.0f,0.0f}; for(each_row_t it{map}; it.next();) { - // skip empty slots - if(map[it.y][it.x] == 0) continue; + // a 0 slot means we're done + if(map[it.y][it.x] == 0) break; cell_pos.x = it.x * $size.x; cell_pos.y = it.y * $size.y; bool is_centered = centered[it.y][it.x]; @@ -97,7 +101,6 @@ struct MapTileBuilder { dbc::check(int($size.x - t_size.x) > 0, "font too big on x"); dbc::check(int($size.y - t_size.y) > 0, "font too big on y"); - if(is_centered) { sf::Vector2f center{ (float($size.x) - float(t_size.x)) / 2.0f, @@ -112,12 +115,12 @@ struct MapTileBuilder { sprite.setPosition(cell_pos); } - sprite.setColor({0, 0, 0, 255}); + sprite.setColor(DEFAULT_COLOR); - $render.draw(sprite); + $render->draw(sprite); } - $render.display(); + $render->display(); } }; @@ -159,8 +162,8 @@ int main() { load_config(map, centered, true, it, "./assets/devices.json", component_display); load_config(map, centered, true, it, "./assets/enemies.json", component_display); - MapTileBuilder builder(32, 32); - builder.run(map, centered); + MapTileBuilder builder(DEFAULT_DIM, DEFAULT_DIM); + builder.run(map, it.width, it.y, centered); builder.save_image("./assets/map_tiles.png"); return 0;