static void CreatePng(TileSetLoader loader, string dstPath)
{
int numSymbols = EnumHelpers.GetEnumMax <SymbolID>() + 1;
int[] tileSizes = new int[] {
8, 10, 12,
16, 20, 24,
32, 40, 48,
64, 80, 96
};
int maxTileSize = tileSizes.Max();
WriteableBitmap target = new WriteableBitmap(tileSizes.Sum(), maxTileSize * numSymbols, 96, 96,
PixelFormats.Bgra32, null);
target.Lock();
// leave the first one (Undefined) empty
for (int i = 1; i < numSymbols; ++i)
{
int xOffset = 0;
foreach (int tileSize in tileSizes)
{
var source = loader.GetTileBitmap((SymbolID)i, tileSize);
int stride = source.PixelWidth * (source.Format.BitsPerPixel / 8);
byte[] data = new byte[stride * source.PixelHeight];
source.CopyPixels(data, stride, 0);
target.WritePixels(new Int32Rect(xOffset, i * maxTileSize, tileSize, tileSize), data, stride, 0);
xOffset += tileSize;
}
}
target.Unlock();
string tileSizesStr = string.Join(",", tileSizes.Select(i => i.ToString()));
var pngEncoder = new PngBitmapEncoder();
var metadata = new BitmapMetadata("png");
metadata.SetQuery("/tEXt/Software", "Dwarrowdelf");
metadata.SetQuery("/tEXt/tilesizes", tileSizesStr);
var frame = BitmapFrame.Create(target, null, metadata, null);
pngEncoder.Frames = new BitmapFrame[] { frame };
string path = Path.Combine(dstPath, "TileSet.png");
using (var stream = File.OpenWrite(path))
pngEncoder.Save(stream);
Console.WriteLine("Generated TileSet to {0}", path);
}