From 7025cfe3bfb136c2e949cb9dcd8c7603376844a0 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 14 Nov 2018 12:17:16 +0100 Subject: [PATCH 01/11] Allow the playername labels/markers to cross image edges. Also the orgin circle. --- Image.cpp | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/Image.cpp b/Image.cpp index dc6eacc..5f1936d 100644 --- a/Image.cpp +++ b/Image.cpp @@ -10,11 +10,16 @@ #include "Image.h" #ifndef NDEBUG -#define SIZECHECK(x, y) check_bounds((x), (y), m_width, m_height) +// allow x,y to be 256 pixels outside of the image. +// this allows stuff like the playername labels to be drawn somewhat outside of the +// image (relying on gd's built in clipping) while still catching probable +// buggy draw operations +#define SIZECHECK_FUZZY(x, y) check_bounds((x), (y), m_width, m_height, 256) #else -#define SIZECHECK(x, y) do {} while(0) +#define SIZECHECK_FUZZY(x, y) do {} while(0) #endif + // ARGB but with inverted alpha static inline int color2int(Color c) @@ -35,18 +40,18 @@ static inline Color int2color(int c) return c2; } -static inline void check_bounds(int x, int y, int width, int height) +static inline void check_bounds(int x, int y, int width, int height, int border) { - if(x < 0 || x >= width) { + if(x < -border || x >= width + border) { std::ostringstream oss; oss << "Access outside image bounds (x), 0 < " << x << " < " << width << " is false."; throw std::out_of_range(oss.str()); } - if(y < 0 || y >= height) { + if(y < -border || y >= height + border) { std::ostringstream oss; - oss << "Access outside image bounds (y), 0 < " - << y << " < " << height << " is false."; + oss << "Access outside image bounds (y)," << -border << " 0 < " + << y << " < " << height+border << " is false."; throw std::out_of_range(oss.str()); } } @@ -65,39 +70,39 @@ Image::~Image() void Image::setPixel(int x, int y, const Color &c) { - SIZECHECK(x, y); + SIZECHECK_FUZZY(x, y); m_image->tpixels[y][x] = color2int(c); } Color Image::getPixel(int x, int y) { - SIZECHECK(x, y); + SIZECHECK_FUZZY(x, y); return int2color(m_image->tpixels[y][x]); } void Image::drawLine(int x1, int y1, int x2, int y2, const Color &c) { - SIZECHECK(x1, y1); - SIZECHECK(x2, y2); + SIZECHECK_FUZZY(x1, y1); + SIZECHECK_FUZZY(x2, y2); gdImageLine(m_image, x1, y1, x2, y2, color2int(c)); } void Image::drawText(int x, int y, const std::string &s, const Color &c) { - SIZECHECK(x, y); + SIZECHECK_FUZZY(x, y); gdImageString(m_image, gdFontGetMediumBold(), x, y, (unsigned char*) s.c_str(), color2int(c)); } void Image::drawFilledRect(int x, int y, int w, int h, const Color &c) { - SIZECHECK(x, y); - SIZECHECK(x + w - 1, y + h - 1); + SIZECHECK_FUZZY(x, y); + SIZECHECK_FUZZY(x + w - 1, y + h - 1); gdImageFilledRectangle(m_image, x, y, x + w - 1, y + h - 1, color2int(c)); } void Image::drawCircle(int x, int y, int diameter, const Color &c) { - SIZECHECK(x, y); + SIZECHECK_FUZZY(x, y); gdImageArc(m_image, x, y, diameter, diameter, 0, 360, color2int(c)); } From fe5ba54fc900a6b46cf80b797c4cf756bd5b3e0d Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 14 Nov 2018 12:34:52 +0100 Subject: [PATCH 02/11] Add a --tilesize option. The produces tiled output way faster than repeatedly using --geometry because it only reads the databse once. --- Image.cpp | 6 ++ README.rst | 5 ++ TileGenerator.cpp | 138 +++++++++++++++++++++++++++++++++------- include/Image.h | 1 + include/TileGenerator.h | 19 +++++- mapper.cpp | 14 ++++ minetestmapper.6 | 6 ++ 7 files changed, 164 insertions(+), 25 deletions(-) diff --git a/Image.cpp b/Image.cpp index 5f1936d..0c78f85 100644 --- a/Image.cpp +++ b/Image.cpp @@ -127,3 +127,9 @@ void Image::save(const std::string &filename) fclose(f); #endif } + + +void Image::fill(Color &c) +{ + gdImageFilledRectangle(m_image, 0, 0, m_width - 1 , m_height - 1, color2int(c)); +} diff --git a/README.rst b/README.rst index 993e29c..7d4c6fc 100644 --- a/README.rst +++ b/README.rst @@ -98,6 +98,11 @@ backend: geometry: Limit area to specific geometry (*x:z+w+h* where x and z specify the lower left corner), e.g. ``--geometry -800:-800+1600+1600`` +tilesize: + Don't output one big image, but output tiles of the specified size, e.g. "--tilesize 128x128". The sizes will be rounded to + a multiple of 16. The filenames will be created in the form __, where and + are the tile numbers and is the name specified with -o. Skip empty tiles by also specifying --noemptyimage. + zoom: Apply zoom to drawn nodes by enlarging them to n*n squares, e.g. ``--zoom 4`` diff --git a/TileGenerator.cpp b/TileGenerator.cpp index 90e311b..e2ab7e4 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -95,6 +95,8 @@ TileGenerator::TileGenerator(): m_geomY(-2048), m_geomX2(2048), m_geomY2(2048), + m_tileW(INT_MAX), + m_tileH(INT_MAX), m_zoom(1), m_scales(SCALE_LEFT | SCALE_TOP) { @@ -190,6 +192,13 @@ void TileGenerator::setGeometry(int x, int y, int w, int h) m_geomY2 = round_multiple_nosign(y + h, 16) / 16; } +void TileGenerator::setTileSize(int w, int h) +{ + m_tileW = round_multiple_nosign(w, 16) / 16; + m_tileH = round_multiple_nosign(h, 16) / 16; +} + + void TileGenerator::setMinY(int y) { m_yMin = y; @@ -251,19 +260,66 @@ void TileGenerator::generate(const std::string &input, const std::string &output } createImage(); - renderMap(); + + + if (m_tileW < INT_MAX || m_tileH < INT_MAX) + { + tilePositions(); + + int trueXMin = m_xMin; + int trueZMin = m_zMin; + + for (int x = 0; x < m_numTilesX; x++) + { + for (int y = 0; y < m_numTilesY; y++) + { + TileMap::iterator t = m_tiles.find(x + (y << 16)); + m_xMin = trueXMin + x * m_tileW; + m_zMin = trueZMin + y * m_tileH; + m_xMax = m_xMin + m_tileW - 1; + m_zMax = m_zMin + m_tileH -1; + + if (t != m_tiles.end() || !m_dontWriteEmpty) + { + m_image->fill(m_bgColor); + if (t != m_tiles.end()) + renderMap(t->second); + if (m_drawScale) { + renderScale(); + } + if (m_drawOrigin) { + renderOrigin(); + } + if (m_drawPlayers) { + renderPlayers(input_path); + } + ostringstream fn; + fn << x << '_' << y << '_' << output; + writeImage(fn.str()); + } + } + } + } + else + { + m_image->fill(m_bgColor); + renderMap(m_positions); + if (m_drawScale) { + renderScale(); + } + if (m_drawOrigin) { + renderOrigin(); + } + if (m_drawPlayers) { + renderPlayers(input_path); + } + writeImage(output); + } closeDatabase(); - if (m_drawScale) { - renderScale(); - } - if (m_drawOrigin) { - renderOrigin(); - } - if (m_drawPlayers) { - renderPlayers(input_path); - } - writeImage(output); printUnknown(); + + delete m_image; + m_image = NULL; } void TileGenerator::parseColorsStream(std::istream &in) @@ -380,8 +436,17 @@ void TileGenerator::createImage() m_zMax = m_geomY2-1; } - m_mapWidth = (m_xMax - m_xMin + 1) * 16; - m_mapHeight = (m_zMax - m_zMin + 1) * 16; + m_mapWidth = (m_xMax - m_xMin + 1); + m_mapHeight = (m_zMax - m_zMin + 1); + + if (m_mapWidth > m_tileW) + m_mapWidth = m_tileW; + + if (m_mapHeight > m_tileH) + m_mapHeight = m_tileH; + + m_mapWidth *= 16; + m_mapHeight *= 16; m_xBorder = (m_scales & SCALE_LEFT) ? scale_d : 0; m_yBorder = (m_scales & SCALE_TOP) ? scale_d : 0; @@ -401,15 +466,15 @@ void TileGenerator::createImage() m_image->drawFilledRect(0, 0, image_width, image_height, m_bgColor); // Background } -void TileGenerator::renderMap() +void TileGenerator::renderMap(PositionsList &positions) { BlockDecoder blk; - std::list zlist = getZValueList(); + std::list zlist = getZValueList(positions); for (std::list::iterator zPosition = zlist.begin(); zPosition != zlist.end(); ++zPosition) { int zPos = *zPosition; std::map blocks; m_db->getBlocksOnZ(blocks, zPos); - for (std::list >::const_iterator position = m_positions.begin(); position != m_positions.end(); ++position) { + for (PositionsList::const_iterator position = positions.begin(); position != positions.end(); ++position) { if (position->second != zPos) continue; @@ -637,9 +702,12 @@ void TileGenerator::renderPlayers(const std::string &inputPath) { PlayerAttributes players(inputPath); for (PlayerAttributes::Players::iterator player = players.begin(); player != players.end(); ++player) { - if (player->x < m_xMin * 16 || player->x > m_xMax * 16 || - player->z < m_zMin * 16 || player->z > m_zMax * 16) + if (player->x < m_xMin*16 || player->x > m_xMax * 16 || + player->z < m_zMin*16 || player->z > m_zMax * 16 ) + { continue; + + } if (player->y < m_yMin || player->y > m_yMax) continue; int imageX = getImageX(player->x, true), @@ -651,10 +719,10 @@ void TileGenerator::renderPlayers(const std::string &inputPath) } } -inline std::list TileGenerator::getZValueList() const +inline std::list TileGenerator::getZValueList(PositionsList &positions) const { std::list zlist; - for (std::list >::const_iterator position = m_positions.begin(); position != m_positions.end(); ++position) + for (PositionsList::const_iterator position = positions.begin(); position != positions.end(); ++position) zlist.push_back(position->second); zlist.sort(); zlist.unique(); @@ -665,8 +733,7 @@ inline std::list TileGenerator::getZValueList() const void TileGenerator::writeImage(const std::string &output) { m_image->save(output); - delete m_image; - m_image = NULL; + cout << "wrote image:" << output << endl; } void TileGenerator::printUnknown() @@ -696,3 +763,30 @@ inline void TileGenerator::setZoomed(int x, int y, Color color) { m_image->drawFilledRect(getImageX(x), getImageY(y), m_zoom, m_zoom, color); } + + +void TileGenerator::tilePositions() +{ + m_numTilesX = round_multiple_nosign(m_xMax - m_xMin + 1, m_tileW) / m_tileW; + m_numTilesY = round_multiple_nosign(m_zMax - m_zMin + 1, m_tileH) / m_tileH; + + for (PositionsList::iterator p = m_positions.begin(); p != m_positions.end(); p++) + { + int xtile = (p->first - m_xMin) / m_tileW; + int ytile = (p->second - m_zMin) / m_tileH; + + int key = xtile + (ytile << 16); + + TileMap::iterator t = m_tiles.find(key); + + if (t == m_tiles.end()) + { + PositionsList l; + m_tiles.insert(std::pair(key, l)); + t = m_tiles.find(key); + } + + t->second.push_back(std::pair(p->first, p->second)); + } +} + diff --git a/include/Image.h b/include/Image.h index 1b5a6ba..216a0c2 100644 --- a/include/Image.h +++ b/include/Image.h @@ -26,6 +26,7 @@ public: void drawFilledRect(int x, int y, int w, int h, const Color &c); void drawCircle(int x, int y, int diameter, const Color &c); void save(const std::string &filename); + void fill(Color &c); private: Image(const Image&); diff --git a/include/TileGenerator.h b/include/TileGenerator.h index 6c97a7a..d8739e6 100644 --- a/include/TileGenerator.h +++ b/include/TileGenerator.h @@ -56,6 +56,8 @@ struct BitmapThing { // 16x16 bitmap uint16_t val[16]; }; +typedef std::list > PositionsList; + class TileGenerator { @@ -63,9 +65,11 @@ private: #if __cplusplus >= 201103L typedef std::unordered_map ColorMap; typedef std::unordered_set NameSet; + typedef std::unordered_map TileMap; #else typedef std::map ColorMap; typedef std::set NameSet; + typedef std::map TileMap; #endif public: @@ -81,6 +85,7 @@ public: void setDrawAlpha(bool drawAlpha); void setShading(bool shading); void setGeometry(int x, int y, int w, int h); + void setTileSize(int w, int h); void setMinY(int y); void setMaxY(int y); void parseColorsFile(const std::string &fileName); @@ -90,6 +95,7 @@ public: void setZoom(int zoom); void setScales(uint flags); void setDontWriteEmpty(bool f); + void tilePositions(); private: void parseColorsStream(std::istream &in); @@ -97,8 +103,8 @@ private: void closeDatabase(); void loadBlocks(); void createImage(); - void renderMap(); - std::list getZValueList() const; + void renderMap(PositionsList &positions); + std::list getZValueList(PositionsList &positions) const; void renderMapBlock(const BlockDecoder &blk, const BlockPos &pos); void renderMapBlockBottom(const BlockPos &pos); void renderShading(int zPos); @@ -138,9 +144,11 @@ private: int m_geomY; int m_geomX2; int m_geomY2; + int m_tileW; + int m_tileH; int m_mapWidth; int m_mapHeight; - std::list > m_positions; + ColorMap m_colorMap; BitmapThing m_readPixels; BitmapThing m_readInfo; @@ -148,6 +156,11 @@ private: Color m_color[16][16]; uint8_t m_thickness[16][16]; + PositionsList m_positions; + + TileMap m_tiles; + int m_numTilesX, m_numTilesY; + int m_zoom; uint m_scales; }; // class TileGenerator diff --git a/mapper.cpp b/mapper.cpp index 7acb7a0..cecd966 100644 --- a/mapper.cpp +++ b/mapper.cpp @@ -29,6 +29,7 @@ void usage() " --max-y \n" " --backend \n" " --geometry x:y+w+h\n" + " --tilesize wxh\n" " --extent\n" " --zoom \n" " --colors \n" @@ -82,6 +83,7 @@ int main(int argc, char *argv[]) {"noshading", no_argument, 0, 'H'}, {"backend", required_argument, 0, 'd'}, {"geometry", required_argument, 0, 'g'}, + {"tilesize", required_argument, 0, 't'}, {"extent", no_argument, 0, 'E'}, {"min-y", required_argument, 0, 'a'}, {"max-y", required_argument, 0, 'c'}, @@ -174,6 +176,18 @@ int main(int argc, char *argv[]) generator.setGeometry(x, y, w, h); } break; + case 't': { + std::istringstream geometry(optarg); + int w, h; + char c; + geometry >> w >> c >> h; + if (geometry.fail() || c != 'x' || w < 1 || h < 1) { + usage(); + exit(1); + } + generator.setTileSize(w, h); + } + break; case 'f': { uint flags = 0; if(strchr(optarg, 't') != NULL) diff --git a/minetestmapper.6 b/minetestmapper.6 index 9cba990..8049c4b 100644 --- a/minetestmapper.6 +++ b/minetestmapper.6 @@ -76,6 +76,12 @@ Use specific map backend; supported: *sqlite3*, *leveldb*, *redis*, *postgresql* .BR \-\-geometry " " \fIgeometry\fR Limit area to specific geometry (*x:y+w+h* where x and y specify the lower left corner), e.g. "--geometry -800:-800+1600+1600" +.TP +.BR \-\-tilesize " " \fItilesize\fR +Don't output one big image, but output tiles of the specified size, e.g. "--tilesize 128x128". The sizes will be rounded to +a multiple of 16. The filenames will be created in the form __, where and +are the tile numbers and is the name specified with -o. Skip empty tiles by also specifying --noemptyimage. + .TP .BR \-\-extent " " \fIextent\fR Dont render the image, just print the extent of the map that would be generated, in the same format as the geometry above. From d41e6448cead5c8508c56765a0f28e4ae22b5a86 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Sat, 17 Nov 2018 20:24:40 +0100 Subject: [PATCH 03/11] Fix crash if the total map size is smaller than the tile size; --- TileGenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index e2ab7e4..ea5840a 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -439,10 +439,10 @@ void TileGenerator::createImage() m_mapWidth = (m_xMax - m_xMin + 1); m_mapHeight = (m_zMax - m_zMin + 1); - if (m_mapWidth > m_tileW) + if (m_tileW < INT_MAX) m_mapWidth = m_tileW; - if (m_mapHeight > m_tileH) + if (m_tileH < INT_MAX) m_mapHeight = m_tileH; m_mapWidth *= 16; From 961f65974f7891c64532c29616433f61ddbde36e Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Mon, 26 Nov 2018 22:29:38 +0100 Subject: [PATCH 04/11] Rename tilePositions() to sortPositionsIntoTiles() the first name was confusing. --- TileGenerator.cpp | 5 +++-- include/TileGenerator.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index ea5840a..ece4936 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -264,7 +264,8 @@ void TileGenerator::generate(const std::string &input, const std::string &output if (m_tileW < INT_MAX || m_tileH < INT_MAX) { - tilePositions(); + + sortPositionsIntoTiles(); int trueXMin = m_xMin; int trueZMin = m_zMin; @@ -765,7 +766,7 @@ inline void TileGenerator::setZoomed(int x, int y, Color color) } -void TileGenerator::tilePositions() +void TileGenerator::sortPositionsIntoTiles() { m_numTilesX = round_multiple_nosign(m_xMax - m_xMin + 1, m_tileW) / m_tileW; m_numTilesY = round_multiple_nosign(m_zMax - m_zMin + 1, m_tileH) / m_tileH; diff --git a/include/TileGenerator.h b/include/TileGenerator.h index d8739e6..71422b0 100644 --- a/include/TileGenerator.h +++ b/include/TileGenerator.h @@ -95,7 +95,7 @@ public: void setZoom(int zoom); void setScales(uint flags); void setDontWriteEmpty(bool f); - void tilePositions(); + void sortPositionsIntoTiles(); private: void parseColorsStream(std::istream &in); From aa0506224eacb793abd399362fda7720e1be7c47 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Tue, 27 Nov 2018 10:51:17 +0100 Subject: [PATCH 05/11] Put the origin of the world in the corner of tile 0,0. Negative x/z will be put into negative tiles, so you can easily determine the tile location by dividing the x or z by 16*tileSize. This means the same area of the world will always end up in the same tile, independent of how much of the world is generated. --- TileGenerator.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index ece4936..0da7689 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -264,6 +264,10 @@ void TileGenerator::generate(const std::string &input, const std::string &output if (m_tileW < INT_MAX || m_tileH < INT_MAX) { + m_xMin = round_multiple_nosign(m_xMin, m_tileW); + m_zMin = round_multiple_nosign(m_zMin, m_tileH); + int minTileX = m_xMin / m_tileW; + int minTileY = m_zMin / m_tileH; sortPositionsIntoTiles(); @@ -295,7 +299,7 @@ void TileGenerator::generate(const std::string &input, const std::string &output renderPlayers(input_path); } ostringstream fn; - fn << x << '_' << y << '_' << output; + fn << (x + minTileX) << '_' << (y + minTileY) << '_' << output; writeImage(fn.str()); } } From 4752832fe842e1f86b10615f77063d5bc6b82637 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 28 Nov 2018 09:57:58 +0100 Subject: [PATCH 06/11] Write metadata textfile with tile information, so a separate utility can easily generate a zoom pyramid. --- TileGenerator.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index 0da7689..a81025c 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -274,6 +274,18 @@ void TileGenerator::generate(const std::string &input, const std::string &output int trueXMin = m_xMin; int trueZMin = m_zMin; + std::ostringstream mfn; + mfn << "metadata_" << output << ".txt"; + std::ofstream mf; + + mf.open(mfn.str()); + + mf << "BaseName: " << output << std::endl; + mf << "NumTiles: " << m_numTilesX << " " << m_numTilesY << std::endl; + mf << "MinTile: " << minTileX << " " << minTileY << std::endl; + mf << "TileSize: " << (m_tileW*16) << " " << (m_tileH*16) << std::endl; + mf.close(); + for (int x = 0; x < m_numTilesX; x++) { for (int y = 0; y < m_numTilesY; y++) From ae5a1b8fbee47e42ea1b40247bb5524c7cf5ce3a Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 28 Nov 2018 15:42:49 +0100 Subject: [PATCH 07/11] Fix Clang compilation. Apparently ofstream.open() only takes a char const * and not a std::string in Clang++; --- TileGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index a81025c..bb374e4 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -278,7 +278,7 @@ void TileGenerator::generate(const std::string &input, const std::string &output mfn << "metadata_" << output << ".txt"; std::ofstream mf; - mf.open(mfn.str()); + mf.open(mfn.str().c_str()); mf << "BaseName: " << output << std::endl; mf << "NumTiles: " << m_numTilesX << " " << m_numTilesY << std::endl; From e4397212e9edfab5dc5ad45a46105e20536d00e0 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Wed, 28 Nov 2018 15:44:02 +0100 Subject: [PATCH 08/11] Print warning on failure to write metadata file. --- TileGenerator.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index bb374e4..fab2f77 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -280,11 +280,19 @@ void TileGenerator::generate(const std::string &input, const std::string &output mf.open(mfn.str().c_str()); - mf << "BaseName: " << output << std::endl; - mf << "NumTiles: " << m_numTilesX << " " << m_numTilesY << std::endl; - mf << "MinTile: " << minTileX << " " << minTileY << std::endl; - mf << "TileSize: " << (m_tileW*16) << " " << (m_tileH*16) << std::endl; - mf.close(); + if (mf.is_open()) + { + + mf << "BaseName: " << output << std::endl; + mf << "NumTiles: " << m_numTilesX << " " << m_numTilesY << std::endl; + mf << "MinTile: " << minTileX << " " << minTileY << std::endl; + mf << "TileSize: " << (m_tileW*16) << " " << (m_tileH*16) << std::endl; + mf.close(); + } + else + { + std::cerr << "Warning: could not write to '" << mfn.str() << "'!" << std::endl; + } for (int x = 0; x < m_numTilesX; x++) { From 1ab180c5d0e80bdbbb5480c89324fbc0df37d2ce Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Fri, 30 Nov 2018 13:10:35 +0100 Subject: [PATCH 09/11] Also write zoom factor to metadata file. --- TileGenerator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index fab2f77..4e4c0ad 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -287,6 +287,7 @@ void TileGenerator::generate(const std::string &input, const std::string &output mf << "NumTiles: " << m_numTilesX << " " << m_numTilesY << std::endl; mf << "MinTile: " << minTileX << " " << minTileY << std::endl; mf << "TileSize: " << (m_tileW*16) << " " << (m_tileH*16) << std::endl; + mf << "Zoom: " << m_zoom << std::endl; mf.close(); } else From 07b4aabde6d24a27171af8caff35207d2a422dc9 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Fri, 30 Nov 2018 13:15:22 +0100 Subject: [PATCH 10/11] comment++ --- TileGenerator.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index 4e4c0ad..d691c0b 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -274,6 +274,9 @@ void TileGenerator::generate(const std::string &input, const std::string &output int trueXMin = m_xMin; int trueZMin = m_zMin; + // write info about the number of tiles and the tile sizes to a text file + // which can be used by another utility to generate zoom pyramids and/or + // add map annotations for a specific viewer. std::ostringstream mfn; mfn << "metadata_" << output << ".txt"; std::ofstream mf; From b4e11450861a00665a1d9f3ef345acab0f274882 Mon Sep 17 00:00:00 2001 From: Martijn Versteegh Date: Mon, 3 Dec 2018 10:46:19 +0100 Subject: [PATCH 11/11] Because filesnames starting with a "-" are somewhat annoying to work with, prepend "tile_" to the tile filenames. --- TileGenerator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TileGenerator.cpp b/TileGenerator.cpp index d691c0b..871e124 100644 --- a/TileGenerator.cpp +++ b/TileGenerator.cpp @@ -323,7 +323,7 @@ void TileGenerator::generate(const std::string &input, const std::string &output renderPlayers(input_path); } ostringstream fn; - fn << (x + minTileX) << '_' << (y + minTileY) << '_' << output; + fn << "tile_" << (x + minTileX) << '_' << (y + minTileY) << '_' << output; writeImage(fn.str()); } }