From 3901d698d6a5cd37439383e256e721b87a2b2fc5 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 19 Apr 2018 07:51:53 +0100 Subject: [PATCH] Add rendering of new SVG country flags to PNG, JPEG and WebP. --- cicm_web/Program.cs | 16 ++++++--- cicm_web/SvgRender.cs | 78 ++++++++++++++++++++++++++++++++++++++++ cicm_web/cicm_web.csproj | 5 ++- 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 cicm_web/SvgRender.cs diff --git a/cicm_web/Program.cs b/cicm_web/Program.cs index 865cd724..9bbeabab 100644 --- a/cicm_web/Program.cs +++ b/cicm_web/Program.cs @@ -29,6 +29,7 @@ *******************************************************************************/ using System; +using Cicm.Database; using DiscImageChef.Interop; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; @@ -38,8 +39,8 @@ namespace cicm_web { public static class Program { - internal static Cicm.Database.IDbCore Database; - + internal static IDbCore Database; + public static void Main(string[] args) { Console.Clear(); @@ -99,14 +100,14 @@ namespace cicm_web "DEBUG" #else "RELEASE" - #endif + #endif , DetectOS.GetPlatformName(DetectOS.GetRealPlatformID()), Environment.Is64BitOperatingSystem ? 64 : 32, Environment.Is64BitProcess ? 64 : 32, DetectOS.IsMono ? "Mono" : ".NET Core", DetectOS.IsMono ? Version.GetMonoVersion() : Version.GetNetCoreVersion()); Console.WriteLine("\u001b[31;1mConnecting to MySQL database...\u001b[0m"); - Database = new Cicm.Database.Mysql(); + Database = new Mysql(); bool res = Database.OpenDb("localhost", "cicm", "cicm", "cicmpass", 3306); if(!res) { @@ -118,6 +119,13 @@ namespace cicm_web return; } } + + DateTime start = DateTime.Now; + Console.WriteLine("\u001b[31;1mRendering new country flags...\u001b[0m"); + SvgRender.RenderCountries(); + DateTime end = DateTime.Now; + Console.WriteLine("\u001b[31;1mTook \u001b[32;1m{0} seconds\u001b[31;1m...\u001b[0m", + (end - start).TotalSeconds); Console.WriteLine("\u001b[31;1mStarting web server...\u001b[0m"); BuildWebHost(args).Run(); diff --git a/cicm_web/SvgRender.cs b/cicm_web/SvgRender.cs new file mode 100644 index 00000000..8b8f7270 --- /dev/null +++ b/cicm_web/SvgRender.cs @@ -0,0 +1,78 @@ +using System; +using System.IO; +using SkiaSharp; +using SKSvg = SkiaSharp.Extended.Svg.SKSvg; + +namespace cicm_web +{ + public static class SvgRender + { + public static void RenderCountries() + { + if(!Directory.Exists("wwwroot/assets/flags/countries")) return; + + foreach(string file in Directory.GetFiles("wwwroot/assets/flags/countries/", "*.svg", + SearchOption.TopDirectoryOnly)) + { + SKSvg svg = null; + + string flagname = Path.GetFileNameWithoutExtension(file); + + foreach(string format in new[] {"png", "jpeg", "webp"}) + { + if(!Directory.Exists(Path.Combine("wwwroot/assets/flags/countries", format))) ; + Directory.CreateDirectory(Path.Combine("wwwroot/assets/flags/countries", format)); + + SKEncodedImageFormat skFormat; + switch(format) + { + case "jpeg": + skFormat = SKEncodedImageFormat.Jpeg; + break; + case "webp": + skFormat = SKEncodedImageFormat.Webp; + break; + default: + skFormat = SKEncodedImageFormat.Png; + break; + } + + foreach(int multiplier in new[] {1, 2, 3}) + { + if(!Directory.Exists(Path.Combine("wwwroot/assets/flags/countries", format, $"{multiplier}x")) + ) ; + Directory.CreateDirectory(Path.Combine("wwwroot/assets/flags/countries", format, + $"{multiplier}x")); + + string rendered = Path.Combine("wwwroot/assets/flags/countries", format, $"{multiplier}x", + flagname + $".{format}"); + + if(File.Exists(rendered)) continue; + + Console.WriteLine("Rendering {0}", rendered); + if(svg == null) + { + svg = new SKSvg(); + svg.Load(file); + } + + SKRect svgSize = svg.Picture.CullRect; + float svgMax = Math.Max(svgSize.Width, svgSize.Height); + float canvasMin = 32 * multiplier; + float scale = canvasMin / svgMax; + SKMatrix matrix = SKMatrix.MakeScale(scale, scale); + SKBitmap bitmap = new SKBitmap((int)(svgSize.Width * scale), (int)(svgSize.Height * scale)); + SKCanvas canvas = new SKCanvas(bitmap); + canvas.DrawPicture(svg.Picture, ref matrix); + canvas.Flush(); + SKImage image = SKImage.FromBitmap(bitmap); + SKData data = image.Encode(skFormat, 100); + FileStream outfs = new FileStream(rendered, FileMode.CreateNew); + data.SaveTo(outfs); + outfs.Close(); + } + } + } + } + } +} \ No newline at end of file diff --git a/cicm_web/cicm_web.csproj b/cicm_web/cicm_web.csproj index f8280c15..44a62adb 100644 --- a/cicm_web/cicm_web.csproj +++ b/cicm_web/cicm_web.csproj @@ -2,7 +2,7 @@ netcoreapp2.0 - 3.0.99.123 + 3.0.99.139 Canary Islands Computer Museum Copyright © 2003-2018 Natalia Portillo Canary Islands Computer Museum Website @@ -18,6 +18,9 @@ + + +