using System.Diagnostics; using Microsoft.Extensions.Caching.Memory; namespace LiloStitcher; public static class Program { public static async Task Main(string[] args) { try { Stopwatch sw = Stopwatch.StartNew(); var begin = sw.ElapsedMilliseconds; var opt = new Options { CanvasRect = "A1:AE55", CropOffset = [0.0, 0.0], CropSize = [1.0, 1.0], OutputScale = 1.0, OutputPath = "stitched.png" }; string tileFilePath = "../tiles1705"; // should later be directed to the read-only `ASSET_PATH_RO` environment variable string assetDir = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), tileFilePath)); using var memCache = new MemoryCache(new MemoryCacheOptions { SizeLimit = 256L * 1024 * 1024 }); var tileCache = new TileCache(memCache); var loader = new TileLoader(tileCache, assetDir); var stitcher = new LiloStitcher(loader); var req = new GenerateRequest( opt.CanvasRect!, opt.CropOffset!, opt.CropSize!, opt.OutputScale ); Console.WriteLine("Stitching..."); var pngBytes = await stitcher.CreateImageAsync(req, CancellationToken.None); File.WriteAllBytes(opt.OutputPath!, pngBytes); Console.WriteLine($"Done. Wrote {opt.OutputPath} ({pngBytes.Length / 1024.0:F1} KB)"); Console.WriteLine(begin - sw.ElapsedMilliseconds); return 0; } catch (Exception ex) { Console.Error.WriteLine("ERROR: " + ex.Message); return 1; } } private struct Options { public string? CanvasRect { get; set; } public double[]? CropOffset { get; set; } public double[]? CropSize { get; set; } public double OutputScale { get; set; } public string? OutputPath { get; set; } } }