diff options
| author | heinrich5991 <heinrich5991@gmail.com> | 2011-11-22 18:54:53 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-12-29 14:35:33 +0100 |
| commit | 41daa3b11085a555056b569d3887bb220062a357 (patch) | |
| tree | cacde7ad6f198c21afd23e83a5b82815728e31db | |
| parent | 80835d2c11f1d58e71641be9d87bc42ad3bbf968 (diff) | |
| download | zcatch-41daa3b11085a555056b569d3887bb220062a357.tar.gz zcatch-41daa3b11085a555056b569d3887bb220062a357.zip | |
added tileset_bordercopy tool
| -rw-r--r-- | src/tools/tileset_bordercopy.cpp | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/tools/tileset_bordercopy.cpp b/src/tools/tileset_bordercopy.cpp new file mode 100644 index 00000000..5bbe0921 --- /dev/null +++ b/src/tools/tileset_bordercopy.cpp @@ -0,0 +1,78 @@ +/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ +/* If you are missing that file, acquire a complete release at teeworlds.com. */ +#include <base/math.h> +#include <base/system.h> +#include <engine/external/pnglite/pnglite.h> + +typedef struct +{ + unsigned char r, g, b, a; +} CPixel; + +static void TilesetBorderfix(int w, int h, CPixel *pSrc, CPixel *pDest) +{ + int TileW = w/16; + int TileH = h/16; + + for(int tx = 0; tx < 16; tx++) + { + for(int ty = 0; ty < 16; ty++) + { + for(int x = 0; x < TileW; x++) + { + for(int y = 0; y < TileH; y++) + { + #define TILE_INDEX(tx, ty, x, y) (((ty) * TileH + (y)) * w + (tx) * TileW + (x)) + pDest[TILE_INDEX(tx, ty, x, y)] = pSrc[TILE_INDEX(tx, ty, clamp(x, 2, 13), clamp(y, 2, 13))]; + } + } + } + } +} + + +int FixFile(const char *pFileName) +{ + png_t Png; + CPixel *pBuffer[2] = {0,0}; + + png_init(0, 0); + png_open_file(&Png, pFileName); + + if(Png.color_type != PNG_TRUECOLOR_ALPHA) + { + dbg_msg("tileset_borderfix", "%s: not an RGBA image", pFileName); + return 1; + } + + int w = Png.width; + int h = Png.height; + + pBuffer[0] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); + pBuffer[1] = (CPixel*)mem_alloc(w*h*sizeof(CPixel), 1); + png_get_data(&Png, (unsigned char *)pBuffer[0]); + png_close_file(&Png); + + TilesetBorderfix(w, h, pBuffer[0], pBuffer[1]); + + // save here + png_open_file_write(&Png, pFileName); + png_set_data(&Png, w, h, 8, PNG_TRUECOLOR_ALPHA, (unsigned char *)pBuffer[1]); + png_close_file(&Png); + + return 0; +} + +int main(int argc, const char **argv) +{ + dbg_logger_stdout(); + if(argc == 1) + { + dbg_msg("Usage", "%s FILE1 [ FILE2... ]", argv[0]); + return -1; + } + + for(int i = 1; i < argc; i++) + FixFile(argv[i]); + return 0; +} |