Generate logos in C#

Fuck fucking JS, node, and yarn
This commit is contained in:
Jordan Dominion
2024-03-22 09:16:58 -04:00
parent 3dcf3b071a
commit 35f9051d5d
5 changed files with 69 additions and 58 deletions
@@ -16,20 +16,13 @@
</ItemGroup>
<!-- This is here because I know we have node as a build dep so this just works -->
<Target Name="IconGeneration" BeforeTargets="ResolveAssemblyReferences" Inputs="build_logo.js;../../build/logo.svg" Outputs="../../artifacts/tgs.ico;../../artifacts/tgs.png">
<Message Text="Restoring yarn packages..." Importance="high" />
<Exec Command="npx --yes yarn@$(TgsYarnVersion) add svg-to-ico@1.0.14 svg2img@1.0.0-beta.2" />
<Target Name="IconGeneration" BeforeTargets="ResolveAssemblyReferences" Inputs="../../build/logo.svg" Outputs="../../artifacts/tgs.ico;../../artifacts/tgs.png;../../tools/Tgstation.Server.LogoGenerator/Program.cs">
<Message Text="Generating icons from SVG..." Importance="high" />
<Exec Command="node ./build_logo.js" />
<Exec Command="dotnet run --project tools/Tgstation.Server.LogoGenerator -c $(Configuration) --no-build" WorkingDirectory="../.." />
</Target>
<Target Name="IconClean" AfterTargets="Clean">
<Message Text="Cleaning icons..." Importance="high" />
<Delete Files="../../artifacts/tgs.ico;../../artifacts/tgs.png" />
</Target>
<Target Name="IconNodeCleanup" AfterTargets="IconGeneration;IconClean">
<RemoveDir Directories="node_modules" />
<Delete Files="package.json;yarn.lock;logo_bg_white.svg;yarn-error.log" />
</Target>
</Project>
-48
View File
@@ -1,48 +0,0 @@
// Prereq packages: svg-to-ico@1.0.14 svg2img@1.0.0-beta.2
// Usage: node ./build_logo.js
// Generates ../../artifacts/tgs.ico and ../../artifacts/tgs.ico
const svg_to_img = require("svg-to-ico");
const svg2img = require('svg2img');
const fs = require('fs');
const { exit } = require("process");
if (!fs.existsSync("../../artifacts")) {
fs.mkdirSync("../../artifacts",'0777', true);
}
const svg_bytes = fs.readFileSync("../../build/logo.svg");
const svg = svg_bytes.toString();
const white_bg_svg = svg
.replace("<!-- DO NOT CHANGE THIS LINE, UNCOMMENTING IT ENABLES THE WHITE BACKGROUND FOR THE .ICO--><!--", "")
.replace("SCRIPT_REPLACE_TOKEN", "");
fs.writeFileSync("logo_white_bg.svg", white_bg_svg);
svg_to_img({
input_name: "logo_white_bg.svg",
output_name: "../../artifacts/tgs.ico",
sizes: [ 160 ]
}).then(() => {
fs.unlinkSync("logo_white_bg.svg");
svg2img(
"../../build/logo.svg",
{
resvg: {
fitTo: {
mode: 'width', // or height
value: 64,
}
}
},
function(error, buffer) {
if(error) {
console.error(`PNG conversion failed: ${error}`);
exit(2);
}
fs.writeFileSync("../../artifacts/tgs.png", buffer);
});
}).catch((error) => {
fs.unlinkSync("logo_white_bg.svg");
console.error(`ICO conversion failed: ${error}`);
exit(1);
});
+19 -1
View File
@@ -176,8 +176,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BasicOperation", "BasicOper
tests\DMAPI\BasicOperation\basic operation_test.dme = tests\DMAPI\BasicOperation\basic operation_test.dme
tests\DMAPI\BasicOperation\Config.dm = tests\DMAPI\BasicOperation\Config.dm
tests\DMAPI\BasicOperation\Test.dm = tests\DMAPI\BasicOperation\Test.dm
tests\DMAPI\BasicOperation\test_event-qwer.sh = tests\DMAPI\BasicOperation\test_event-qwer.sh
tests\DMAPI\BasicOperation\test_event-qwer.bat = tests\DMAPI\BasicOperation\test_event-qwer.bat
tests\DMAPI\BasicOperation\test_event-qwer.sh = tests\DMAPI\BasicOperation\test_event-qwer.sh
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildFail", "BuildFail", "{103C61AB-67D6-46FE-AA47-CC633B88EE0F}"
@@ -204,6 +204,9 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Host.Common", "src\Tgstation.Server.Host.Common\Tgstation.Server.Host.Common.csproj", "{CF3968A0-EA81-4464-B2D4-C7D40F6B5BCB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.Common", "src\Tgstation.Server.Common\Tgstation.Server.Common.csproj", "{70CD9A98-D31A-44A4-81D1-D02764CEEEFD}"
ProjectSection(ProjectDependencies) = postProject
{7F7FCFDF-271D-45C2-830C-BCCB19C57077} = {7F7FCFDF-271D-45C2-830C-BCCB19C57077}
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "package", "package", "{2648A85F-61AE-428E-95E1-66D06C7A3768}"
ProjectSection(SolutionItems) = preProject
@@ -258,6 +261,8 @@ Project("{B7DD6F7E-DEF8-4E67-B5B7-07EF123DB6F0}") = "Tgstation.Server.Host.Servi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tgstation.Server.ReleaseNotes", "tools\Tgstation.Server.ReleaseNotes\Tgstation.Server.ReleaseNotes.csproj", "{69944039-65C2-40E1-9D86-0608FA0C2D70}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tgstation.Server.LogoGenerator", "tools\Tgstation.Server.LogoGenerator\Tgstation.Server.LogoGenerator.csproj", "{7F7FCFDF-271D-45C2-830C-BCCB19C57077}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -516,6 +521,18 @@ Global
{69944039-65C2-40E1-9D86-0608FA0C2D70}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU
{69944039-65C2-40E1-9D86-0608FA0C2D70}.ReleaseNoWix|Any CPU.ActiveCfg = Release|Any CPU
{69944039-65C2-40E1-9D86-0608FA0C2D70}.ReleaseNoWix|Any CPU.Build.0 = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.DebugNoWindows|Any CPU.ActiveCfg = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.DebugNoWindows|Any CPU.Build.0 = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.DebugNoWix|Any CPU.ActiveCfg = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.DebugNoWix|Any CPU.Build.0 = Debug|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.Release|Any CPU.Build.0 = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.ReleaseNoWindows|Any CPU.ActiveCfg = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.ReleaseNoWindows|Any CPU.Build.0 = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.ReleaseNoWix|Any CPU.ActiveCfg = Release|Any CPU
{7F7FCFDF-271D-45C2-830C-BCCB19C57077}.ReleaseNoWix|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -553,6 +570,7 @@ Global
{82996E9D-5E63-4CC5-8179-612C71B4F56C} = {506B9092-AF88-4DA2-84FD-C11646B695B0}
{9E66C6F1-E235-4979-83B5-C2B3FDAD6E01} = {506B9092-AF88-4DA2-84FD-C11646B695B0}
{69944039-65C2-40E1-9D86-0608FA0C2D70} = {A55C1117-5808-4AB2-BEA6-4D4A3E66A2F2}
{7F7FCFDF-271D-45C2-830C-BCCB19C57077} = {A55C1117-5808-4AB2-BEA6-4D4A3E66A2F2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DFD36C95-3E49-41C7-ACDB-86BAF5B18A79}
@@ -0,0 +1,34 @@
// Simplest app 2024
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Text;
using Svg;
var svgContents = await File.ReadAllTextAsync("build/logo.svg");
var whiteBgSvgContents = svgContents
.Replace("<!-- DO NOT CHANGE THIS LINE, UNCOMMENTING IT ENABLES THE WHITE BACKGROUND FOR THE .ICO--><!--", String.Empty)
.Replace("SCRIPT_REPLACE_TOKEN", String.Empty);
await using var pngMs =
new MemoryStream(
Encoding.UTF8.GetBytes(svgContents));
await using var icoMs =
new MemoryStream(
Encoding.UTF8.GetBytes(whiteBgSvgContents));
var svg = SvgDocument.Open<SvgDocument>(pngMs);
var whiteBgSvg = SvgDocument.Open<SvgDocument>(icoMs);
using var bitmap = svg.Draw(64, 64);
using var whiteBgBitmap = whiteBgSvg.Draw(160, 160);
using var icon = Icon.FromHandle(whiteBgBitmap.GetHicon());
Directory.CreateDirectory("artifacts");
await using var iconStream = new FileStream("artifacts/tgs.ico", FileMode.Create);
bitmap.Save("artifacts/tgs.png", ImageFormat.Png);
icon.Save(iconStream);
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="../../build/Common.props" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Svg" Version="3.4.7" />
</ItemGroup>
</Project>