From a49a87f4c9a557a553eb1c78554a47ce094f0f28 Mon Sep 17 00:00:00 2001 From: Maximilien Noal Date: Sun, 26 Jul 2026 13:56:41 +0200 Subject: [PATCH 1/4] feat: Add Hnm0Encoder tool and end-to-end tests - Introduced Hnm0Encoder project for encoding PNG frames into HNM format. - Implemented command line parsing, frame discovery, and quantization logic. - Added validation for encoded streams and palette records. - Created end-to-end tests for encoder CLI and headless player functionality. - Included sample frames and output files for testing purposes. - Updated solution file to include new projects and configurations. --- HnmPlayer/App.cs | 6 +- HnmPlayer/HeadlessCaptureWindow.cs | 36 +++ HnmPlayer/HeadlessPlayerRunner.cs | 91 +++++++ HnmPlayer/HnmPlayer.csproj | 5 + HnmPlayer/PlayerLaunchContext.cs | 77 ++++++ HnmPlayer/Program.cs | 22 +- logo.sln | 31 +++ tests/HnmEndToEndTests/HnmEncoderE2eTests.cs | 229 ++++++++++++++++++ .../HnmEndToEndTests/HnmEndToEndTests.csproj | 24 ++ tmp-e2e-check/frame0001.png | Bin 0 -> 788 bytes tmp-e2e-check/frame0002.png | Bin 0 -> 788 bytes tmp-e2e-check/out.hnm | Bin 0 -> 128795 bytes tmp-hnm0-smoke/frame0001.png | Bin 0 -> 166595 bytes tmp-hnm0-smoke/out.hnm | Bin 0 -> 64789 bytes tools/Hnm0Encoder/CanonicalFrame.cs | 8 + tools/Hnm0Encoder/CommandLineParser.cs | 145 +++++++++++ tools/Hnm0Encoder/EncoderOptions.cs | 10 + tools/Hnm0Encoder/FrameDiscovery.cs | 142 +++++++++++ tools/Hnm0Encoder/FrameLoader.cs | 43 ++++ tools/Hnm0Encoder/FramePreflight.cs | 56 +++++ tools/Hnm0Encoder/FrameQuantizer.cs | 48 ++++ tools/Hnm0Encoder/Hnm0Encoder.csproj | 14 ++ tools/Hnm0Encoder/Hnm0Writer.cs | 84 +++++++ tools/Hnm0Encoder/HnmStreamValidator.cs | 138 +++++++++++ tools/Hnm0Encoder/PaletteRecordWriter.cs | 47 ++++ tools/Hnm0Encoder/Program.cs | 38 +++ tools/Hnm0Encoder/QuantizedFrame.cs | 13 + 27 files changed, 1302 insertions(+), 5 deletions(-) create mode 100644 HnmPlayer/HeadlessCaptureWindow.cs create mode 100644 HnmPlayer/HeadlessPlayerRunner.cs create mode 100644 HnmPlayer/PlayerLaunchContext.cs create mode 100644 tests/HnmEndToEndTests/HnmEncoderE2eTests.cs create mode 100644 tests/HnmEndToEndTests/HnmEndToEndTests.csproj create mode 100644 tmp-e2e-check/frame0001.png create mode 100644 tmp-e2e-check/frame0002.png create mode 100644 tmp-e2e-check/out.hnm create mode 100644 tmp-hnm0-smoke/frame0001.png create mode 100644 tmp-hnm0-smoke/out.hnm create mode 100644 tools/Hnm0Encoder/CanonicalFrame.cs create mode 100644 tools/Hnm0Encoder/CommandLineParser.cs create mode 100644 tools/Hnm0Encoder/EncoderOptions.cs create mode 100644 tools/Hnm0Encoder/FrameDiscovery.cs create mode 100644 tools/Hnm0Encoder/FrameLoader.cs create mode 100644 tools/Hnm0Encoder/FramePreflight.cs create mode 100644 tools/Hnm0Encoder/FrameQuantizer.cs create mode 100644 tools/Hnm0Encoder/Hnm0Encoder.csproj create mode 100644 tools/Hnm0Encoder/Hnm0Writer.cs create mode 100644 tools/Hnm0Encoder/HnmStreamValidator.cs create mode 100644 tools/Hnm0Encoder/PaletteRecordWriter.cs create mode 100644 tools/Hnm0Encoder/Program.cs create mode 100644 tools/Hnm0Encoder/QuantizedFrame.cs diff --git a/HnmPlayer/App.cs b/HnmPlayer/App.cs index 0b9f239..796940c 100644 --- a/HnmPlayer/App.cs +++ b/HnmPlayer/App.cs @@ -1,6 +1,7 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Themes.Fluent; +using System.Runtime.Versioning; namespace logo; @@ -11,11 +12,14 @@ public override void Initialize() Styles.Add(new FluentTheme()); } + [SupportedOSPlatform("windows")] public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - desktop.MainWindow = new MainWindow(); + desktop.MainWindow = PlayerLaunchContext.Current.Headless + ? new HeadlessCaptureWindow() + : new MainWindow(); } base.OnFrameworkInitializationCompleted(); diff --git a/HnmPlayer/HeadlessCaptureWindow.cs b/HnmPlayer/HeadlessCaptureWindow.cs new file mode 100644 index 0000000..1b04ab5 --- /dev/null +++ b/HnmPlayer/HeadlessCaptureWindow.cs @@ -0,0 +1,36 @@ +using Avalonia; +using Avalonia.Controls; +using Avalonia.Media.Imaging; +using System.Diagnostics; +using System.Runtime.Versioning; + +namespace logo; + +[SupportedOSPlatform("windows")] +public sealed class HeadlessCaptureWindow : Window +{ + public HeadlessCaptureWindow() + { + Opened += OnOpened; + } + + private async void OnOpened(object? sender, EventArgs e) + { + Debug.Assert(PlayerLaunchContext.Current.Headless, "Headless capture window should only be used in headless mode."); + if (string.IsNullOrWhiteSpace(PlayerLaunchContext.Current.InputPath)) + { + throw new InvalidOperationException("Headless mode requires an input path."); + } + + if (string.IsNullOrWhiteSpace(PlayerLaunchContext.Current.ScreenshotDirectory)) + { + throw new InvalidOperationException("Headless mode requires a screenshot directory."); + } + + string inputPath = PlayerLaunchContext.Current.InputPath; + string screenshotDirectory = PlayerLaunchContext.Current.ScreenshotDirectory; + + await HeadlessPlayerRunner.RunAsync(inputPath, screenshotDirectory); + Close(); + } +} \ No newline at end of file diff --git a/HnmPlayer/HeadlessPlayerRunner.cs b/HnmPlayer/HeadlessPlayerRunner.cs new file mode 100644 index 0000000..d4468c7 --- /dev/null +++ b/HnmPlayer/HeadlessPlayerRunner.cs @@ -0,0 +1,91 @@ +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using Avalonia; +using Avalonia.Media.Imaging; +using Avalonia.Platform; +using System.Diagnostics; + +namespace logo; + +[SupportedOSPlatform("windows")] +internal static class HeadlessPlayerRunner +{ + public static async Task RunAsync(string inputPath, string screenshotDirectory) + { + Debug.Assert(!string.IsNullOrWhiteSpace(inputPath), "Input path must not be empty."); + Debug.Assert(!string.IsNullOrWhiteSpace(screenshotDirectory), "Screenshot directory must not be empty."); + + Directory.CreateDirectory(screenshotDirectory); + + var engine = new HnmPlaybackEngine(); + await engine.LoadAsync(inputPath); + + using WriteableBitmap bitmap = new( + new PixelSize(HnmPlaybackEngine.FrameWidth, HnmPlaybackEngine.FrameHeight), + new Vector(96, 96), + Avalonia.Platform.PixelFormat.Bgra8888, + AlphaFormat.Opaque); + + int screenshotIndex = 0; + SaveScreenshot(engine, bitmap, Path.Combine(screenshotDirectory, FormatScreenshotName(screenshotIndex++))); + + while (true) + { + HnmStepResult stepResult = engine.Step(); + if (!stepResult.Advanced) + { + break; + } + + if (stepResult.VisualChanged) + { + SaveScreenshot(engine, bitmap, Path.Combine(screenshotDirectory, FormatScreenshotName(screenshotIndex++))); + } + } + } + + private static void SaveScreenshot(HnmPlaybackEngine engine, WriteableBitmap bitmap, string path) + { + engine.RenderCurrentFrame(bitmap); + WriteableBitmapToPng(bitmap, path); + } + + private static void WriteableBitmapToPng(WriteableBitmap bitmap, string path) + { + if (!OperatingSystem.IsWindows()) + { + throw new PlatformNotSupportedException("Headless screenshot capture requires Windows GDI+ support."); + } + + using var png = new System.Drawing.Bitmap(bitmap.PixelSize.Width, bitmap.PixelSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + System.Drawing.Rectangle rect = new(0, 0, png.Width, png.Height); + BitmapData data = png.LockBits(rect, ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + + try + { + using var lockedFramebuffer = bitmap.Lock(); + int rowLength = bitmap.PixelSize.Width * 4; + byte[] rowBuffer = new byte[rowLength]; + + for (int y = 0; y < bitmap.PixelSize.Height; y++) + { + IntPtr sourceRow = IntPtr.Add(lockedFramebuffer.Address, y * lockedFramebuffer.RowBytes); + Marshal.Copy(sourceRow, rowBuffer, 0, rowLength); + IntPtr destinationRow = IntPtr.Add(data.Scan0, y * data.Stride); + Marshal.Copy(rowBuffer, 0, destinationRow, rowLength); + } + } + finally + { + png.UnlockBits(data); + } + + png.Save(path, ImageFormat.Png); + } + + private static string FormatScreenshotName(int index) + { + return $"frame{index:0000}.png"; + } +} \ No newline at end of file diff --git a/HnmPlayer/HnmPlayer.csproj b/HnmPlayer/HnmPlayer.csproj index f715a53..e960ad5 100644 --- a/HnmPlayer/HnmPlayer.csproj +++ b/HnmPlayer/HnmPlayer.csproj @@ -14,11 +14,16 @@ + + + + + \ No newline at end of file diff --git a/HnmPlayer/PlayerLaunchContext.cs b/HnmPlayer/PlayerLaunchContext.cs new file mode 100644 index 0000000..7d1eb91 --- /dev/null +++ b/HnmPlayer/PlayerLaunchContext.cs @@ -0,0 +1,77 @@ +namespace logo; + +internal static class PlayerLaunchContext +{ + public static PlayerLaunchOptions Current { get; set; } = PlayerLaunchOptions.UiDefault; +} + +public sealed record PlayerLaunchOptions(bool Headless, string? InputPath, string? ScreenshotDirectory) +{ + public static PlayerLaunchOptions UiDefault { get; } = new(false, null, null); +} + +internal static class PlayerCommandLineParser +{ + public static PlayerLaunchOptions Parse(string[] args) + { + bool headless = false; + string? inputPath = null; + string? screenshotDirectory = null; + + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + switch (arg) + { + case "--headless": + headless = true; + break; + case "--input": + inputPath = ReadValue(args, ref i, arg); + break; + case "--screenshot-dir": + screenshotDirectory = ReadValue(args, ref i, arg); + break; + default: + throw new InvalidOperationException($"Unknown argument '{arg}'."); + } + } + + if (!headless) + { + return PlayerLaunchOptions.UiDefault; + } + + if (string.IsNullOrWhiteSpace(inputPath)) + { + throw new InvalidOperationException("Missing required argument --input for headless mode."); + } + + if (string.IsNullOrWhiteSpace(screenshotDirectory)) + { + throw new InvalidOperationException("Missing required argument --screenshot-dir for headless mode."); + } + + return new PlayerLaunchOptions( + true, + Path.GetFullPath(inputPath), + Path.GetFullPath(screenshotDirectory)); + } + + private static string ReadValue(string[] args, ref int index, string argName) + { + if (index + 1 >= args.Length) + { + throw new InvalidOperationException($"Missing value after {argName}."); + } + + index++; + string value = args[index]; + if (string.IsNullOrWhiteSpace(value)) + { + throw new InvalidOperationException($"Argument {argName} requires a non-empty value."); + } + + return value; + } +} \ No newline at end of file diff --git a/HnmPlayer/Program.cs b/HnmPlayer/Program.cs index c3c3b70..e291acf 100644 --- a/HnmPlayer/Program.cs +++ b/HnmPlayer/Program.cs @@ -1,4 +1,5 @@ using Avalonia; +using Avalonia.Headless; namespace logo; @@ -7,10 +8,23 @@ public static class Program [STAThread] public static void Main(string[] args) { - BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); + PlayerLaunchOptions launchOptions = PlayerCommandLineParser.Parse(args); + PlayerLaunchContext.Current = launchOptions; + BuildAvaloniaApp(launchOptions).StartWithClassicDesktopLifetime(args); } - public static AppBuilder BuildAvaloniaApp() - => AppBuilder.Configure() - .UsePlatformDetect(); + public static AppBuilder BuildAvaloniaApp(PlayerLaunchOptions launchOptions) + { + AppBuilder builder = AppBuilder.Configure(); + if (launchOptions.Headless) + { + builder = builder.UseHeadless(new Avalonia.Headless.AvaloniaHeadlessPlatformOptions()); + } + else + { + builder = builder.UsePlatformDetect(); + } + + return builder; + } } \ No newline at end of file diff --git a/logo.sln b/logo.sln index e3d0ba8..00869a1 100644 --- a/logo.sln +++ b/logo.sln @@ -11,6 +11,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnHsq", "tools\UnHsq\UnHsq. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HnmPlayer", "HnmPlayer\HnmPlayer.csproj", "{F8DEF2B9-AD93-47AF-B31F-AE852AA7ABD9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hnm0Encoder", "tools\Hnm0Encoder\Hnm0Encoder.csproj", "{6162235E-64B9-4E11-8B27-D0BAC2C24382}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HnmEndToEndTests", "tests\HnmEndToEndTests\HnmEndToEndTests.csproj", "{7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -57,11 +63,36 @@ Global {F8DEF2B9-AD93-47AF-B31F-AE852AA7ABD9}.Release|x64.Build.0 = Release|Any CPU {F8DEF2B9-AD93-47AF-B31F-AE852AA7ABD9}.Release|x86.ActiveCfg = Release|Any CPU {F8DEF2B9-AD93-47AF-B31F-AE852AA7ABD9}.Release|x86.Build.0 = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|x64.ActiveCfg = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|x64.Build.0 = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|x86.ActiveCfg = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Debug|x86.Build.0 = Debug|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|Any CPU.Build.0 = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|x64.ActiveCfg = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|x64.Build.0 = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|x86.ActiveCfg = Release|Any CPU + {6162235E-64B9-4E11-8B27-D0BAC2C24382}.Release|x86.Build.0 = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|x64.ActiveCfg = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|x64.Build.0 = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|x86.ActiveCfg = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Debug|x86.Build.0 = Debug|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|Any CPU.Build.0 = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|x64.ActiveCfg = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|x64.Build.0 = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|x86.ActiveCfg = Release|Any CPU + {7A6B7A63-ED7A-4E1A-9FE1-7E85F8B8D1A4}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {0113F160-F445-4A6E-A865-13CD1AC4C956} = {07C2787E-EAC7-C090-1BA3-A61EC2A24D84} + {6162235E-64B9-4E11-8B27-D0BAC2C24382} = {07C2787E-EAC7-C090-1BA3-A61EC2A24D84} EndGlobalSection EndGlobal diff --git a/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs b/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs new file mode 100644 index 0000000..e4f2ba0 --- /dev/null +++ b/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs @@ -0,0 +1,229 @@ +using System.Buffers.Binary; +using System.Diagnostics; +using System.Runtime.Versioning; +using System.Drawing; +using System.Drawing.Imaging; +using logo; +using Xunit; + +namespace HnmEndToEndTests; + +[SupportedOSPlatform("windows")] +public sealed class HnmEncoderE2eTests +{ + [Fact] + public async Task EncoderCliOutput_DecodesThroughPlayerParser_AndMatchesSourceFrames() + { + string repoRoot = FindRepoRoot(); + string workDir = Path.Combine(Path.GetTempPath(), "hnm0-e2e", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(workDir); + + string framesDir = Path.Combine(workDir, "frames"); + Directory.CreateDirectory(framesDir); + + string outputPath = Path.Combine(workDir, "out.hnm"); + IReadOnlyList sourceFrames = CreateSourceFrames(framesDir); + + string encoderProject = Path.Combine(repoRoot, "tools", "Hnm0Encoder", "Hnm0Encoder.csproj"); + RunEncoderCli(repoRoot, encoderProject, framesDir, outputPath); + + byte[] encodedBytes = await File.ReadAllBytesAsync(outputPath); + List chunks = new(); + HnmFileParser.ParseChunks(encodedBytes, chunks); + + Assert.Equal(sourceFrames.Count + 1, chunks.Count); + + byte[] framebuffer = new byte[HnmPlaybackEngine.VgaSegmentByteCount]; + byte[] palette = new byte[256 * 3]; + byte[] compressedFrameBuffer = new byte[HnmPlaybackEngine.VgaSegmentByteCount]; + + Assert.True(HnmPaletteParser.TryApplyPaletteRecords(chunks[0].GetPayloadSpan(), palette)); + + for (int frameIndex = 0; frameIndex < sourceFrames.Count; frameIndex++) + { + Assert.True(HnmFrameParser.TryRenderFrameChunk(chunks[frameIndex + 1].GetPayloadSpan(), framebuffer, compressedFrameBuffer)); + AssertFrameMatchesPng(sourceFrames[frameIndex], framebuffer, palette); + } + } + + [Fact] + public void HeadlessPlayerCli_WritesScreenshots() + { + string repoRoot = FindRepoRoot(); + string workDir = Path.Combine(Path.GetTempPath(), "hnm-player-headless-e2e", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(workDir); + + string screenshotDir = Path.Combine(workDir, "screenshots"); + string inputPath = Path.Combine(repoRoot, "LOGO.HNM"); + string playerProject = Path.Combine(repoRoot, "HnmPlayer", "HnmPlayer.csproj"); + + RunHeadlessPlayerCli(repoRoot, playerProject, inputPath, screenshotDir); + + string[] screenshots = Directory.GetFiles(screenshotDir, "*.png"); + Assert.NotEmpty(screenshots); + + using System.Drawing.Bitmap firstScreenshot = new(screenshots[0]); + Assert.Equal(HnmPlaybackEngine.FrameWidth, firstScreenshot.Width); + Assert.Equal(HnmPlaybackEngine.FrameHeight, firstScreenshot.Height); + } + + private static string FindRepoRoot() + { + DirectoryInfo? current = new DirectoryInfo(AppContext.BaseDirectory); + while (current is not null) + { + if (File.Exists(Path.Combine(current.FullName, "logo.sln"))) + { + return current.FullName; + } + + current = current.Parent; + } + + throw new InvalidOperationException("Could not locate the LOGO repository root from the test output path."); + } + + private static IReadOnlyList CreateSourceFrames(string framesDir) + { + Color colorA = Color.FromArgb(64, 128, 192); + Color colorB = Color.FromArgb(192, 64, 128); + + var paths = new List(2) + { + DrawCheckerboard(Path.Combine(framesDir, "frame0001.png"), colorA, colorB, swapCells: false), + DrawCheckerboard(Path.Combine(framesDir, "frame0002.png"), colorA, colorB, swapCells: true) + }; + + return paths; + } + + private static string DrawCheckerboard(string path, Color colorA, Color colorB, bool swapCells) + { + using var bitmap = new System.Drawing.Bitmap(HnmPlaybackEngine.FrameWidth, HnmPlaybackEngine.FrameHeight); + using Graphics graphics = Graphics.FromImage(bitmap); + + for (int y = 0; y < HnmPlaybackEngine.FrameHeight; y++) + { + for (int x = 0; x < HnmPlaybackEngine.FrameWidth; x++) + { + bool useFirst = ((x / 16) + (y / 16)) % 2 == 0; + if (swapCells) + { + useFirst = !useFirst; + } + + bitmap.SetPixel(x, y, useFirst ? colorA : colorB); + } + } + + bitmap.Save(path, ImageFormat.Png); + return path; + } + + private static void RunEncoderCli(string repoRoot, string encoderProject, string inputDir, string outputPath) + { + string arguments = string.Join(" ", new[] + { + "run", + "--project", + Quote(encoderProject), + "--", + "--input-dir", + Quote(inputDir), + "--output", + Quote(outputPath), + "--fps", + "1", + "--overwrite" + }); + + var startInfo = new ProcessStartInfo + { + FileName = "dotnet", + Arguments = arguments, + WorkingDirectory = repoRoot, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using Process process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start dotnet run for the encoder CLI."); + string stdout = process.StandardOutput.ReadToEnd(); + string stderr = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException($"Encoder CLI failed with exit code {process.ExitCode}.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}"); + } + + Assert.True(File.Exists(outputPath), "Encoder CLI did not create the expected HNM output file."); + } + + private static void RunHeadlessPlayerCli(string repoRoot, string playerProject, string inputPath, string screenshotDir) + { + string arguments = string.Join(" ", new[] + { + "run", + "--project", + Quote(playerProject), + "--", + "--headless", + "--input", + Quote(inputPath), + "--screenshot-dir", + Quote(screenshotDir) + }); + + var startInfo = new ProcessStartInfo + { + FileName = "dotnet", + Arguments = arguments, + WorkingDirectory = repoRoot, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using Process process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start dotnet run for the headless player CLI."); + string stdout = process.StandardOutput.ReadToEnd(); + string stderr = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException($"Headless player CLI failed with exit code {process.ExitCode}.\nSTDOUT:\n{stdout}\nSTDERR:\n{stderr}"); + } + + Assert.True(Directory.Exists(screenshotDir), "Headless player CLI did not create the screenshot directory."); + } + + private static string Quote(string value) + { + return $"\"{value}\""; + } + + private static void AssertFrameMatchesPng(string pngPath, byte[] framebuffer, byte[] palette) + { + using System.Drawing.Bitmap png = new(pngPath); + Assert.Equal(HnmPlaybackEngine.FrameWidth, png.Width); + Assert.Equal(HnmPlaybackEngine.FrameHeight, png.Height); + + for (int y = 0; y < png.Height; y++) + { + for (int x = 0; x < png.Width; x++) + { + Color expected = png.GetPixel(x, y); + byte index = framebuffer[(y * HnmPlaybackEngine.FrameWidth) + x]; + int paletteOffset = index * 3; + Color actual = Color.FromArgb(palette[paletteOffset + 0] << 2, palette[paletteOffset + 1] << 2, palette[paletteOffset + 2] << 2); + + Assert.Equal(expected.R & 0xFC, actual.R); + Assert.Equal(expected.G & 0xFC, actual.G); + Assert.Equal(expected.B & 0xFC, actual.B); + } + } + } +} \ No newline at end of file diff --git a/tests/HnmEndToEndTests/HnmEndToEndTests.csproj b/tests/HnmEndToEndTests/HnmEndToEndTests.csproj new file mode 100644 index 0000000..4fd1de2 --- /dev/null +++ b/tests/HnmEndToEndTests/HnmEndToEndTests.csproj @@ -0,0 +1,24 @@ + + + + net10.0 + enable + enable + false + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + \ No newline at end of file diff --git a/tmp-e2e-check/frame0001.png b/tmp-e2e-check/frame0001.png new file mode 100644 index 0000000000000000000000000000000000000000..d43243991a161153920da5f5547b5b969e241bda GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoPjIjS$(bw`tAP|_age(c!@6@aFM%AEbVpxD z28NCO+M1MG6B0(@IYl$B>G+w^s}q85DR9Z18lJx>Ues zFE&frpS9$go%n)`e+&VM4Gz;7nIhRZQX~~7q>ge%!+`$jfWOaFYvO#9f>dBiX7F_N Kb6Mw<&;$TdKg$IG literal 0 HcmV?d00001 diff --git a/tmp-e2e-check/frame0002.png b/tmp-e2e-check/frame0002.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecfe3841f01da254cf7ad628744eb3f5adedbb6 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoPjIjS$(bw`tAP|_age(c!@6@aFM%AEbVpxD z28NCO+M1MG6B0(@IYl$B>G+w^s}q85DR9Z18lJx>Ues zFE&frpS9%NE%5~z{}=)i8yu!FGDWg+q(~}ENFC*jh5`N40l%cB)qr2n z2@oJafB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7csfvrHDJ;vH*0s;gG5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk w1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK;TG$4-PX4e*gdg literal 0 HcmV?d00001 diff --git a/tmp-hnm0-smoke/frame0001.png b/tmp-hnm0-smoke/frame0001.png new file mode 100644 index 0000000000000000000000000000000000000000..5330f1b9a04d4e625bca7a40f30002d36cf7ff29 GIT binary patch literal 166595 zcmY(KXHZjJ7w-iG2?9!$P}BfH5(p9?bdVAPgx-q*rT30fRX~JrI6hWjD zdhbPgQIuxmk;nJ?-23Uyth4u7Gye}~&+n{RYwekZGd9#_Vd7=Fa^(t(t`5@l$`u;5 zzwcB=hQBNEsyyZIMiXSJt#PGxod58zbJb1VK>f;uYz9q9l10Dm2upet8cd;fcA z2K_3WuUz?GsV-98Jk)+?hDK9}mM&_u&BeAXuPv`_O%66A_5YbJLHMsJ{J%|?K>E-7 z&jQC4_DMniEfF8?Y+c+)Rl9rBzlVW_kM=5~7A-9;J&8wHO_hf@)m3?(R?ekUdl$-wHv9#IGs?>u zs3G57d2giV92a#iMbFc4l~e$`3)PN-Td4)-M_oUo&tbZXu@=2srW4g>t>%r3N<`CJ z4`0P#B<|K~M7=dti_DDDYX;O?TyJecscF<)iO7rU3#Z9OF#5|dwRY&LnKoW=ON`pF zq_JuO_`kj0+Mub1F253z9X0DqWA&Z!zl)!CM~ovU_;XuMC+S-E3M`3#-0|4$=DA98sv-=PF(tsnbuC`gJ9jelVe7R-(RIO|68hyqccK-lJIF8xF*%cLub# zm&6P0K^s#rTHa=+PjY>INz zr(Jfss>~-=*ekfvCQp-hN}JyTI6&V#(I}4cjgPvOe)XI1_0S=3p`2FNNG0t*%Cz>n z9FqkS8x{po(abb;E=-I0;EnIzG%pos*Qs2R8TU5EB58W*Y1g5glBU8NUmR&lz_jZS zE=fy~jkQ3UZ7$k%3a6wAc;jCmS`i9;q_NQBD$B0;C$wds=_68n!#zkD%WDFB*}Mofze;Ei|>ns(Q#m-1qdf0CjK_UMmnZl0VMN4?jh zeQv{D@2AyON1^>u2l(Y<*A*>5`}`whV?%=G#Syo^dur5!pG@){MqQ77)AK9b-8g

RdO}ECh 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

#t*$tYe`L0Cqdj=gJZ19<5z` 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�?4@j{i^ILU z0t^h7nz<4T4bPJZ$<}S$YW7mjQ~1Vu5^V~c~^?nT!~=VzY18MR(cPc{;ozV2ay(X3<^px`yytfAn=2i|5Oczwo(6yfM_NbL(6Vvtffni_~Av&q`6$hrPL)#El zMfmlp^;IUO>%FF7WEtUdb*rT%CbCi2(6f&4e7Dt-iizyhFbpjr=;gFd%V8p0bqsxL z2!ji)(`}f@ZY{${6$Fttt#Tol$Ywpm4HHSzFO!q44#QK?t#V(fM5eUyNme%m3%AG)-6-!Io3*0@M_y{^Nz%r4EIDz`Y*QbyNn-=784j)CBI6c zlsaoS)v^d$;`Ylf)S$VN%>0 zOSex!R)dZ?te7{rGiHJJ$lXTIol{ANK}{TMbUluwD)4@5FMwnFw8U%>ki-V+ol)Rl`Q2}@okF|kF3GGK zHLU;23y8Gs-3Z%O?6S~%ki}}=f%_mRP_aLKce!k1`m=KUkL{QHRJLx@LDa8M{p;I` zzYB3MwUj-chdvdY2pljMIC57WRjmi^KV{Wvz_dQg`=8+;Ew) z{Il&&Aqk zay``1e>y$Ca09C?z=IS}0PhSf6>gNLDmTmTbVjz|_9d15=Bt5Txj2W8y&>a?K!<8v zx12yn#oo}^c%WW6E?z<)9JwbtG7)G~k1JLc2;bThl^PE;EyCf21b%YuiAqicx>Vts zWd(j_?TI#wA3i9F*4aIS*Lf+z$7Uy@bX%i(5+|U%HCqnv z@|zUZR!Dn13cF|O8e`hU`L{=+z!@j!of>1)x@z}*C!z1`#zwf*S{%NgcN?d9zRh<* zoQ#z1HkI!XO=piWSV4#K{FUYt36H&|t!=vz>Tz_wpk7b@eWnu$&fP$+9XqL+W3NO( zo2vZxpH6CD?FHIw+tp1Uhi3|!w&g!YpVU%!4`+7l8fK6E69ipK1anSKVS8+?+lT(t zU_`E<>)ZScm6J;$yKJF5SNCUv;c0@0CTbN2lkBYyX&!0$tM8&r7Ay4LxQy*wK6%PN z4OA%=Icdy?;OlcIw`Q(RO0~bnx;k!7r`($6nw2ZBMr8C;g*)T_4Kz-WP6t)KLp$Rl|bR4u_+p zf_7x;x4R;&Oyl*^P{yX~Z}JUeqDEq)q`uE)2v2A57kX(G<`4Hr$usVBsoIW#tMbJ) zPkdOZ!DWtP1Zg#!XM6M2)4`!n^L^8!>dp7&1nPhM8&ZR# zbMnta)WSWs#fGMXy$JaqebmA?x5YkDgTwRl*JIRva%_u40 zCgvXnsa?0+uBx0qewdm639WXWx?NRGJq~!CzZ<2NCbwOMnm+c<$X`IJrL}EWVW`Iu zx%vNushNgsqqe7yJ+kr#{M1apZ=)8fwsxGNa>Dl_k!ksacTxGDD=I?Y=WnrYqf{!l z&a|QyuJ1*zy~xLvL^-RLR~&cdXPIp8>{5?|3i1zP)f$+$cX+0ccVFhe?u&Bfn`psU zj_tWeg{AF9x@(T*8>so4?98jwZPnSS{gQ}U&Yx;|>^!C-uXdU1r2B2lYJai$5( zCjh=vBXr^Y{tsJ4jEpqKo-0skZogH-vbdrv3@$pn+}3=j%AY>yx5oLmGU~cB$M9hu z8u_ojRb<#WWb9Gk&DNLxrd1qg&=Pk$gW1Se`rDK)!&ENwh>yJVThfOy2Nv6Qo>R}a zaa|k?GnNd;D8^W0g@?n^-yF*0o=GtL@L@<+VvHSwtqwuI>Gi~wU1S*5WEj?A{39X1 z3X%C{Qx%sf%Wx3HP{Yair(SNgO7@#+TU;A2!?HcYUMS zj3#K<9Uo{w(A&5ttPI5_3~^43COh(X4rBs$O&B!ZGV6!&U0HTtZGFdB`inWQXXU}r z1%~DXM$PLyiW`j=&e#~d1YtMAMxLy9#(iUF9NmQ#?n48@-p9STz)-Ehkgmlz$|GMW zC=+l{8CNO8kQ2x-@mG~ASNK{s;7@B@wjG0Va@?E}!>tj%@kM6G&WCsWCZ6=V-ialD z&>3b-kz%;jz^!i!dw9gH?+6Vbzq!yd_Mt465r57ie2vBDigbWoVO**kL)K-UIS!vy zrm8r~UB-H5Sfh^LYPB?jLm!J{om`{j#}BY{#`YQ(M?TLxpoI^tb#c?&46`I&{VBdq z_0b1W-En*=jIuYGm$JR@O!=&q3p3d9F)wvbJoo`-=yF+_?n z`kBIB79dw~Aq)T>#)A<#vuw}RdLITICB}nMm|33JYJLm@2*7wCDQ9NyvD)Lt;0a

rD+3f9V**?F!Op&6`TjDqzrGbgXr^e6@x3!|W~oY|tsY7>$nRFYB9 zA7-|KTulsPU=d)<-Ot6XEwhuAPA~ z|GszO@0W46SoyXU-Bw8@jLK;|5j&l6_3Vt!2e9$aUaOh03~CIF&H{3c!9yP~eT-qL z+!2qaKOD#~_^0sAL0wlV1`N>^%-t~Ghby&l9g>Vc#&{yUmOos`jSIiU%Al`aljfz^%HKzH^|kJP=>)6#{cjS?ibHl!TWS}O<=(#?j07nqpCT5 zmzU{d@u??H=kR?97K%Sep?CpWfNS~+Z#xA?{H&ci1EvAh4 zD!3WT$QGb!vvR=p5a4@HZo45lw=vn~Y+u?>ejv^f_?X6H_eo)0Lb}<}n>Ho{tak%G z&g8ZegRM(Jo9+E*UzvdUaNxg|Ja#qm>vb~C&KTN?GO#BKD93$>krVQkU0?B`m2v?; zS_4Hoc&>UY2<=MWoI}xGNdedWfE7QuuP&gpn}_wk{at*K5&DdwojlUj{K1zlAbm4x ze2C|H%FuN_rQ;XrjU~DqgDFpMD+JA41%7e{di~@{+*T;&mAibpMI}|WWmtdM4>)!pGx=tADEL=O>lcNi^9#T)ms7g~hV%zr zf%gPuCL^bZ3rt^z;5({~ysa z-Q_&#=J3fO2MgUF#(a^{Gefb->EZMg{%nP#ddg5Q0QgmsSBWNl^ar2bH>|53z@yac zM(eWz>Z$3f+e3qVJ`WA51OLN6{~kjFKd$tPXtKY%09I#_n-Gydw0oKO=OKH6p)vE* z>{FrX{=%jHELSl0qj5}`oD9F~`kp>J5Y4`#P2^6MKdhVSw@pd>>Smm>XB>0e%S~vx z|GF-F##L~vk(`XD{GkOtafbzrl+Vfj?6JN@0ZTX-oi|ham*m-JzJTc#M&~)`j|Aj; zM+o~h9`HU9%++Fap6~lH-F-dHk=-y7oOcE$Tr)bi^Zsb%vEJauE)D`Om4U5?jn19? zK3cf07r@yuR^V|`NfrV9!FMX8_T<~L`R0Er=V1zshuFl7@7hN{W3mkuX{xT7IJ@<-= zn`Yp&_NffJmw-Z%s_Xi`GdtTOu;p*C&|ewUTT{(reaV&G90-;x0T&M%Ck3RN`zXM18W7NIi@3!?MahB0|pI7$qpT@+`K=3j*tjTMnKX(KC!z4Qb zGuhuG#_n&LJ9i(mE|8qa5DZ>^tq?elTz>~(f6isx{Z%?Jg4}<37>w&Qis^J)->yzf zQw8Jdh^G;s`vVIS|HD7*u}Jkpg(-2lW7HF3&jV;dBIV>V@l17Y}_u4R)Z|b`Xgxe)L%mXuBo!eHqbCU%`D$x+NP$ z|0w~*`9L4jvh6;>Hb$T=dH(dVi_m&a=wnWzotXTFluU~~n*LQ5njZxH*D~9#MsA}{ zw#C_(zQPObv4>6*4{H>F-qIT@-t&kPk6$BC4-|q2E3J8RyBg3fR$?NrdN_e9EsD}5aVy*i9El7c3RBc<$M?mx1-LMTR)Z-^cRM3z{j z)UiT~xi|gj|Dd@SDUNsLTa<=IGJBEj`V>b_HzcN#ShI<2e@5&AFO7ti5i!7#Qth1i zBKZtnPx>2gD9Ro>JD6>d1`AGDHqy-_@@-H&cqvP-9)iUuMkq+=yaCd0{vp__gy^6^ zB!Bjyw@V_A+H<-d6qT_sN7H*{p_!XV!D?v>D-?YV0;N)sf>kmW78v@3GPLbG zQV=6;G3!k~1Vg`5kon#+Q{!klSst4D1)0AqJvEJ@??^!@pON`HGE>b{BQ0-7S`Xxp zmjt1{(G=D9V@AJXq4)Turvk@ElAn)+2+AK%vO%5nDBUq5Mn40g4SCX2Qy4l`9jfw+ z(k=fGIa^4aeLk}PS2ys2s8)hp=7+X~FO4{`BYzm@L`Hua`GbOf9m!F8D06&}M@%?I zF1HYsS|8GX>p-6iAk}SUgFWU)o=ZXXY(`>Q(e&)WkwFX+*N}TwF!sOhACXw{$v+~; zRno+sCm!n8jLKc|Mz%D_%$G!tpUDw>UwZT~8zc4eM{Hcl%+E!R+hmF9FFbk@jgXeF zM>@>ODLNv@ujPq{*&aP<#z@VAk?VnEqXCiQ5*cFEQ;%4<5pp4K#0VkV!iPVLbeAO< zlh2!#h+UFo+YT`Fy(H14L&V+CfZj3f!8M6*st{?(P9OP7Br7)K&wwh#vOJHxF0#ZH z=-4Y(wm#nD55x#rCdv~YC|d&}pF8EGR7emXf6B0{(I0Rijzn3>{%b9=QDcBz@HpSa zvrUU^th^jCNF`s%#Vd6w5uXq|wCl*1+CjnaXxVj~hshTsaHTkpLAY$M8ab~W%Cl4N zVY2etXej@$MN`Jr&sifpzcSKq>(fUP$WH~}x`B$sZ$NThs2tB`lgFrfzEOXohvhr6 z_7707$z$2wIFC^QBQRR@uY;=W#9y64PD+>r@pv#Jk*Ke$Ks4I7l)YsnQc_?{*EEz3 z3?_5aGZH&M!4sOY10)ZrFyV~GS1BkZqPC4}R;{qRvoRfEDr3R zE0JI)OIg$e*|EVGtOh3Xxn+>YMS|TOWr>I6B@ZL8_+4Tydj?rvB-jvf^zU#5!@!;A z|M!1=8UITF!v8n#49{Sx=Fe4-QlA14y*U})re5cgN^nlvr!B=|6Ful z5gcE-{cQmEgz)-;{{fTtXMt}s`A^#4UGV>U&HMJ12(QNv2IHQDUuO(qWjtT`_jxT7 zTlanK#;D5G1lM?2AK*6bMy-I@srRdgpS^nr-7oD8GO6>3%tn!~s6{2F79y$Z*d9Ja3YINh0RH~aQkNTcCK z%x%cFgT$%E)%JUA=iK0Jh4_Mx02QH2_f>jF%i>)KSHmQ4oxjm+j4oU4(C^I`?fp6t z|4t_Uz8m1z`lZJM*BEbJdJJOvA#(MP2^YUU+j#~=F&liU;3S=W_m0I4JV;U4L0VWZ zz`OpTcm8T)OmE}G-nD1(YdZ13BmfY8Nsqv!OSp=I+)Amw!S5u-?F3RRx0f#04e+UZ z=<|BDGpe_fvG*`F{?Is{JqN&Ue@UdB3EY0w1bxeB_eS25Savr&;1jy{6)fIjmZ`j+ z{cp*zv~R-diB#`NYCKf_D$<85uS-X|#Ua2t?ct1d@BHGWmT17%$yK_~t-Qs1*>AN1 zmQ8xQo#KzfuhGA>@A%ax4<|HwbrLSJ33W!ixD!(OfR$ZBP^#18 z>4Q`bM`d`UN9%($wx_9_j`AiC2d+sK+__R9+L&>PEdyX<#MW6AFJ5t#U~=n}C*BhZ zu%X$_Ak7YW&-q0F*)e z+YG>tSbQ`Bz=Mj9o&peg;(y5k?Cj!ywE*Uo;x7jQlp^CV9|O7o@z0q6kvj3ulL2R- zcs)1(;2Ezs40y&FKL`QnSj7+407$TS5i|f48ZWX3C}WAQ;01UZ$5-S6HYMY|>;as< z@m`C7Oo8|kU;WGw zKbjE#lM(RmuYbQj*SEf&9wTkpjLfF>t>N2%!nadj)$)PPB3eCubCX5fL3{%SfB)Ne za_*e@6nkt4leaQJx#jvj*^qfvB8-OXDW@*pdqZ@o^Dkm#g^SiTL*!!k6)&e@pdQ%i({FGnmT_hh9GQfU}bE z%wz(84v;5DTuH)IR>CDHBF-bCi1tE={KAc#4#KCG;Y&UVmwW>0+34%qz;RXhlqv$h z1CYl-T&dnfw%$1?Ccz`7g!U9neu^X~O5zji@EHrj84DnhaD8w%+{6wD!z(?)2X`3Ke;AG~ z-X(Te1pSdBpMS<*`=QUZpXu0X+8prU=6;rh@|~{jLTzTa6l?lZ*7TtwJgHAOi#e;3 z4R5FiC#2xFC-99j_~8Ngh$4A&1GL6299AsshNmTwZz|{nZCa8iQ8({9HTz&`)kOSe zi?GcYp*9=X_4gV!Rmp9~p!93Pvy!j0CGn2;geQvdd|ZZZuV@1x{G2q|Soh{FsV*hW zn_q=HBr=61GM3&r;yX2i7U2enQrZtugP>L#j@tlUOB+=*KzGyXFB#Yu(+-3UqMB*> z90t18v}HL1^(SUW9_-@v4v)~jmZ*F!71Xy9B#TN5&fZK9>$G|;G` zO~@L!cF~%c49v@DhY*9nHd-RDfk7ROtZaaKN2_8quq&bMfDIyBXhbdpof_J_yn*Li zS{JKMXH?cMWPZ)>kW^NbPaxk$>O;n76;*mFhkyG;RfGK zIp2)#WpUI&Mt76bU$2qK;OC{G6|_1heEVm7$4~u*pYY{*ksa=r-EUncBOe?sYmloo z$p8L+JhXd*bXki7gN3N`m)oj19!^{#y-80>(-WIXvyPF~ZE~$$p9)N>KTH|}i^`i= z#;6-Kp_AtGpItnF^agzXG>|FjD02q(~Kx zt*@3ND`lMzJKTB&NzbA=ul*E@zd$Pfos`Tf+OI((B_xgCc*b9Bt7;iYmVU-t-x>1M zjjaDnu`6LWo)Oys)QN@%^$tCdfMV)C)()VPJ3C%#QN+D#^x^CGEr{YdABQ`G%h3Dey zK#mSYosS4o-7rVuFlR@dnQ)!ul30FeGlK>R35+521>v6%{pC zwXYVHuu!$G7p*o^b*>VvN2r?DiB_4b+SQ2GS*Thyh+@oCKUa$SBUGnqE4|HC7pp6M zEL3OfD|gLQSE?$V%OYIcijk@7q_(7m(4?#x@m+aQ=L5vFzh!r`!9=6o;Vzesd&hd4 zpw5&vX>XB(@-9i?9}dYyPX8a`_Ti$-3sv5WWf9RG#gEd~U%yMjJxU6{%<=jc=T`x< zTII@!$7Y9*|GoX!X9`KVL3yqP!#qc+^VZubXdWNxQ~oi}G1bM$r%c2sTTj7Ej^`sN z16Om#M9}ialQA-OEs;s|;i??TDLEJ8*^sgE7&VJ2sNpfihccs-}=(uHKpLzEDX3_kn+?VD3l%Nt)VEn>~MBsPwY(OvE5q+V0pt2`O!*l>-)b3f9LW^~>qw z5|nWtimOtNYgbO+v0UFVOpn7`mjjKHm`stF;kPR0v8q;jV+4KU7;N+mX;em^gHYzs zlt5TcU|Y_{p4`SBOhnEbEQdDnnKbg5$(t@FPFE{+8UO9m3x+>O!Yk<0RykEQu!_0~ zBZnHLN3W6pL{WJ7@Yt({S!H-%t9`<8aXdVv6_MndwJLA zSJ}xJ2LHW=Pf9tMEws=Usy??N(Y~-Nwg?=RPG>Aiyh>f_v}Lc6Q;?kKe}?jt&p8dC zNV4Tzs^|)>0tXW5?VCBJoH>g&Xgm-Wu8l$z!@>u=5$>>X5^8cC7B1pF$qxG|jFQE} zewKU7TEKpmp_(UQKfS!0p|I;7sGw%pb-H&@Fzos!>gWh|{g(I9HCP%4iYW<}M(}1b zgr#Mol0L!GY`l}iVWyTScs0y)#v6`-nNm@oc44Lp-ky{4GZX$FF7-@6bBVKUlo}D*U8qeGucv#i{cK9T%e z(>c`W#2w2FJGm!+UdpUO;ErX5?#p3aKC-+OVt%jOcTk31A@KZ=P&n`T*ce{6mZsm= zBidImfsNztb7{i<4#d9SV7Yvg`CnmPRxr;WV|nIsZhhF(QXW`=W7u>;Pf>JQrkDsg<+>= zdCME1c}>gG?g?unQhg(-*cN#nq_2G5JCgL<#Q>8u*HP=fu0`hHXqK(-Jak`$ycPfK z_k97qCVlZv*lXc@Tn93jqFIuE@JR7Wzxa(!zRskt?-qCQEnYucj~8rMJ}s7}WEKT6t)-iN6jyA7dnah= z!am|TPt$Za?W2{i_waWTT9o}(nw#MaMN;4 zTx&vTnG@FzgR}ylttG;>3^LcqXf0IgT9v()-RrfTD6PnZHKMMTPR80iQp+=Wt;<@= z>Tk$ym{#cXwPz+;6i8ok4NDt_`Cc7tx(?diy=?Zr_ZvK`$hBmRYK$GAU}xL8bKbBt z{N&E*;9Z_Wdhfux=e@i?`$g2OjJNlF`(dK>OR7)hEsH=j^Vb7d$N{ul;h}BY%C|ok z`gRkr*BM#<{rT_R+gRHf)}|P_>1My|&5bp}cc4T;N~;gI=UGT=875`3rHPQbAyJUl z;gj?5%&pk-Sa>)qL(-w#wkHR@laD-$dQ;|w-OMEt>RKdLM%#UI-Ov2$%fjtj~*=|hVwlMD_IUd>Ko6S zCY$d~9(ld;yt8m*lj8ZfcJr&^a9qUj{i}q8M8e|?i3BniLgH=}L2FV%Yf|z#(iV%f zXB}>49&YE)cjw8+C<%?p3atcr#CduYZB_~mSGo;PfCv+11oux8?w=$Ft!)Ra?Qu2D zDK+i`fdziR}wP z|L_iz6=HRo#AI2E)eHT>~2;bEHRg!8b@FA28~L5H!1+ZU2mz3o)JyM+6Tv9?kIXgk@F z;^z(@b#0~iP%VfH3$Ea-QP;mO5emTQtS$r1`ohCY>>n`gI{W+u=234p`^jEM8~}j;fBVgrb+xwR2TFUp4Ycad;rgd=~5ZR3;K77^y1UK zyA;THqEFX757 z=)+O3#&C|t@PAK5Z<6I^V{e;>_Wh;$Zn9 z?jBfC-ZUgeiQMGbyip^DJE+1nR47H2tMm}p=9H%nzeo(W&*Q$*6{EJ4dkVI;bHARt z#<~B}9862*|NZgMqSAfPZE);UQ*h!&mh_<1#wl#6N#)~VZt%X{?&%|<``4hs+v5Dc ztd;+ygfMF>{YeVjPYXO3*i*c*bt)Z#F2Z?(EPzA-&-Jp?$zZIAn?mv)&N)G(NZv?h}DAN5x^ExOp4YPr<1@3>s z1_8fu02TgQ2O$zmn^(eAxV{8Bw$9%Dp(G_3@bn;jhyh2sERe;lZ24ki@-7afB@mSj z^y%DaW@Cj;2A+xPoq9hP*m%Lc*Xfqmmm2P<)Y}wN+-Djjk-OiCPI5o99HdV1iCg0;uOml{8?wTuUD2pF=sTL;Ivw~+R_`ciP(YktOk5ybR~b>lAFiV^>Bb*Es64sB|Fd63_9p*N zu(E6h|4)!gGlKtTg>v&0|MgOpAX)zFNadgw{_CD9M?w78x0H{L`O|1BOicV~T*^$z z{ArvjNpSwOEajwOe$!Vfa0tJtwKBYh-_%Ow6Pn+2R{7H&|Jbw&gqMFzUKx_hKL%5& zw&x$~P_AC&zt^gQR_4DKri`{xa<>0c>97$ISyvMKdL#2Y4$FeGdCQ;5C(z&M+3P0-RE`yC$~aI87#_;AqifBzryQHW>V5YNX$J?n>gJ{j)WFv9ccNKe-&&u61O z8^?G)AM4pP&hy21&*ll9FDH7oO!9m++0#A6^Yv6u&os|B(>+^fc)p$K**44b-E2?q z9MAW2J$>^$Kg{=RU*P$1p{IY5=O^LW5$gGQv1h09{IbNeE6nq&@$3%w{1)Na<2=7F z_3T~d`D3|f-wMy4D?I~|p1-0z`=dR7$9N9Jdj5&?9E|t;o8TEt^pNBUN%kC);u(_a zIW)~PG~IJphG$r&=kP4g@NCZ!Ii3-@o+I--BlA5+6?jG!dX6sgj4t*ZQ{ov@>N&Q| zGq&7wT!m*`rRVr6&-iN32{oPxwVo5}JQM3ZCpCB`HF{2N@=R{_oYLZ%(&{<2%`>&# zb6SUITBqmqRi5dqJ!h=(%vkF=bDd}Ade2!KJhQqyXK(b(-sCxFvuDm0&$->6xjmlq zwtD7m^PJ!7ncwHRV7q5Qzvsdoo`pL-!7k6D-JXl~c*I`M#rr&=10K2Gv-p7Ll7k*K z=(#k+vt)=z5A}o%^ISIEV@7x`AL$7n<*}nZ5o0`8jP)ZeQw2Ugo)DxhG|X=gyU$)JV@=QJ%DD&)qSe z^jOb5ah{BL&%Ftr%tX(9NuI1^&;2Q$>{QPKX`Y;P&x0AB+)U3yS)ROX&%-&M{9Ml? zd7grN&!YvN!a~nuMV_K!&*LSY;!@8OWuB69&yy9N(n`-$Ri3hH&(k%Y@>Q>JSZJwHT&x;+N+D^|)t2}k9Juk2E)UWltvd+`6-t+1P zPh*$owT+&pO`g{`dz!a+-stwU^myLf>S^8Pd8^mc*5`S9yQjV1^Ue-W$4<|?yF8t{ zJ@4)DtlH~&f1hXdfain#o;3$NA0G6q9rXO)|NjR^D25B<>~@C$00006mK8%Jd6Q&Ap+E@xQkJrny%-w862e+2 zP|8k$QnrGjAuJ)Rg#xAQ6ewjYOKHkhwn894%2pbnbY||ob7y|@TW02db573Wo&0?A z{hXg-`5*nd#kF*PR}{t8qS!oDY}wk`RCIfV`l~zD>+PDD*f8vL2SsOGY#SBDpu2U@ z-8|}cr@K1_#qNHweWo*-?hFULUBg~~x;H)UZr(W9(iv{-4SU_ehR$@i7JE!{7-TrkpjLz6LvuQBc)*oz`8B9$NC$^8a45xeJ@%G_xH0Te>L~vbK~OBsF)pe&lz;*N8JN6 zy~BfIeb8B+E>@>INBZ64!`{+#Z++aID~1O;!@a%XVt25oGkvfa&vnO#rp8M}|3oo3 zGSxr6b#Q|Xqw8;*IeRcz91Q2i{e|h_zU`v}!|BEG_}t-eb4wAkCUTx?w`Hm-N3);pV)x?5Iy8`pciweI$n z&Um>Pt`)mii@|btX1Tj_wL4nxZJh0IogHjm=ua*7uf1n4Ssq zbJOG5@$ley_riF?%5ZAA-&q@MTkRLiFKrc zzWtNSv&D(o;>bd=y4X29+dZ+jyR_I_UF@B`T%5C1>|O6Htar{{>K<6>?OpFJu655{ z>8vdmD{IBc)na+Mdt$kJWVO4x-rGCdKWBC@ztCS;>|bxs=(>ky4(}ZtpBpYM4%ZJ3 z&YhcHn;owl9G_em?^zixEcfTu28UMrv&-Z8)$#t5Gl!Q4Czb|F>;2XB;n8zP$5*D; z*TzLLyS13zJT=?x&2B0VZrgZpV)DRLZ}E)H^Znl3_Riw4d$6}-{;ae1cPEbSoH*7Q z9pAO{=)Q@4OH&6Hcg!Ezwg2G6(ZiF+=0?YloOyKP!hy5q_e~tzKYe(9^ZsMweMcvc z9v!Y8-@9<&*!;eI$M&xuo}b@;Y;E7s{YQ_ktRC0fzd`?P>Y5vF_{9I|uLhWnAX6Yc zkOzbO3CQC?{uJae$Wf3RfczfFt3du1C})3N(E5d1C>{4NvxjtPF}34WIdeisRT5&bzoHO~4eK6d{UAG?2wkKI4T$L^ov zWA{(-vHPd^*!_#?&-m$a&QJ4kewvT-(|nwt=HvV{ALpm}I6uwD`9<}o{meMyXZRRD z!^ij;KE}`RF@A=R@iTmkpW$Qt;`)<*AekC96SMt$* zk^L#ZYMk_|_(;EskMyhfNWY4Y^sD$tzlx9atN2L2*#3lHJx=-6e3W0!NBPx!lwZw9 z`PF=sU(HAP)qIp+bbs8>juU>CkMOg6grDUj{45{gXZZ*}%SZTGKEf})e+Oi<&P0=K zAZO^D+2o-h57T*glP7^ZS?A47j)Sb}tT(wa$W3%^+2l1Kuhn^7lXrr=OXo37K>bc? ze{8!e6Im~uLFGV1bmNa+aH;C z`7pm``P2*XYnD&F5Wi;m)C=)zmQTG9zh?Q=3-N1~PrVSoX8F{sZU1oI<3s#BKE%)C zL;O5G#LweH{5(Fy&*MYkB5FfU+Cxag?>I?=;!l=em-C5=ktYrK40jU z*dO|V@xTx81%7}p@B@5-AK(l80AJt-_yRw`7x<<22Y#D``5l7ag@WJZg5Rp(cfR0v zso;09;FsLr_uC}Q?-2Yh6#On1{8k0O^98?41;2|0zx4i|-zH&xhv0Xi;CH#;w<`FZ zFZf+5_+2dcW%PIb)Hu6;ijUnt#mDZS;$!zu@v-}-_}KkZeC+-yK6d|d`a6Dlob%Is zoS)|7{4^iur};QP&Bys^KF&|`aei6-ciD_gra|`G95T5+$TMu7Y4U84m)d;H+j0zZ|BSL5#XB!e1`zv^#R{A0pGI$ z-^T#oCjj4V0N?EZ-+ck!{Q=(x0N;lI-}3?A3)}Xu=PN$auiU;vq+hvx&m{fI?fV$% zS8m^JNWXIX?o0ZW+xG#|uiU=plYY7VE5CZ2@~inMznYKotNAFunve3U`6$1dkMgVe zD8KCfrJo%q{45{gXZZ*}%SZTGKEluP5q_4B@Uwh`Uw(h%*No$S4Il2;@Zo+9AMV%i z;eHJt?$_|)ehnY)*P_4nbH-6WhY$60_)tHG5A}2SP(Ozc^>g@8KZg(XYttX_VSX+j z=I8QZel8#8=kj5GE+6LS@?m~1ALi%sCHMEYZ-mTye2AaNhxmDXh@Z!Y_<4MYpT~#z zd3=bU$CupS`{Gr&$ zYYH>iJIP=5*3Ul!))h4~f0_gujD zKEU@$!1pP@cL%_CH^BEm!1o})_YuJNbinr_!1v;|{rUNM!EZ(Id!OLAekC96 zSMt$*B_Hh<*`M;O#!0`5kMyhfNWY4Y^sD$tzlx9atN2L2ijVY*?N9jCOA=U z1M;Q%LB3Q!$d~Gu+~4>6YVy4A7w{$e1$>Eq0binDdVkOFtLgKeU&xo{7xJa~g?wp# z8U0;9HQs9f5WXZogfGbt;Y;$%>F@aI@iu-KUy2{bm*R)lN59f>b!};RK1sHJ1W3?{Ybt@KawxfkK~K=%kOXen(;h8nlH|e z=8N;A`QrRq^w)mQc$Oc-7v;zBMfov&QGRXu1HK$TjxWZK%ek$bWLWKI?7V3Yu<@{9w-!%f?Zw0;|3Vh!Y_> z*Tzrtweiz@ZTw9Cd_ObZ!q4!v@H2cZ{0v_Uzp{U}Upb!dSMufim3;YrC11W@)j!v- z8qfBt__F;fzHGmWFWax~pXpbR=la!rxqdZYu3ycU>u3At`PuPIKg*ZtXZbSyEMKNy z(?83v8PD@;`11T3zC6E%FVD~EpX29@XZbmNS$+;*mY>6y<>&U#@N>s={9L{qKbJ4Z z&*jVU^ZKXzdE*&=9$$u^$Cu&f@n!h={geIt@pM0*FWt}QOZW5n()~dHR6j7D><9Rg z{QzIGAK**&gZ&fz;CQMZ&DY2w##P!k6TS@Fn?S{S*AK@f1IdFU1ezOYy__QvA^V zlS2A7Crxe$a$3k6Y~E_}c90W7Zf3K^qziIN$RlkYXYvFPq5h<;-^cq$&zIvT0pAS; zzSDs3t$^?C0^bS1w*~NZ1-?^&?{R?d32pnw&R2Zde&zPPHQTS;zAf2)<@P-;+mGrW z=~s{E`qg~7el=gNU(J{6NA{2Nv*Ve5mM_!K@@4v2zDz&5f0SP{p6A!_<@q&yd43IF zo*&ac#?Kkg@^kpI{2ab4KZh^NkLw@d=Z@$2xqLZ(E?B{ z%kcB~GW_`dqMtvW?&tHR`}ut7em-BipU_|OyAjCmgGk>$zXRm&L8R}Ww}M<7MEd^u zi6DOl(zd@azXtej1o&P zUMu*$OYqw)_?;p6JxuU>vfwB8XZ_SMF?RpdF)?=k)G;x3|I{%tcK_5dHg^BiF*SDo z)G;-7|I{(Hw*9$zeT$9r)3?|-KYfdh^V7H3I6r;Mj`P#E=r})pi;nZtx9HmTXXZ5@ z=coBNKh4MaX+F-+oC0M0G#}@u`8Yq#$N5F|r~S-0<7fC7Kf}lP89v6(@G<*m_!vLK z$M_jO#xJfv=~s@^ekC96SMt$*B_Hiq^3i@JAMIE2(S9W#?HAdf@~g&4zlx9atN2L2 zijVZG_(;EskMyhfNWY4Y^o#9J_|@Z-U(HAP)qIp+%}4pwe3W0!NBPx!lwZw9`9=4~ z{p>j5XZZ*}%SZTGKEluP5q_4B@Uwh`pXDR`;`{FfnbWy#le>f5Q|Dey-UISpoewto zG{|RlKG)>VAa~UnH`xbrKxd)JQ$e1l^Q0eP9u%bS4udsF*k^NrqZZwvVD4*2c` z_}&BfJ_z_e4fs9>`0fn&#(-}h;9CHEPX&C>0(>t4d@pa?ADMUgFu!K`)C=)zmQTG9 zzh?Q=3-N1~PrVSoX8F_$@oSb(y%4`<`P8dz|8U;pL;O5G#LweH{5(Fy&*MYja#_pdw z#>wuVI>yQFpE}0L?q5cK*H7Q_yEovw58(SS;QJ`x`#j+L0^pkgeAfYdi-7MO!1o-$_dLM&3c&Zuw*Bk* zijVXwx9{GhU%7oBCjH9o`#kAaZr=>)S8m@T=~r&wb4b5(`(8o%<@T@q>T$}i=A-;- zKFY7=qx@<<%CF|5{AxbRujZrtvip~QcAW6De1xCnBm68M;b-{>Kg&n>Sw6zg@)3Ud z{f%EUj{7xyxL?DE`!#&HU&Dv{HGH^V!-xAde7IkW{@TwONBtZ=)X(8V{Tx2j&*4M; z96r>~;Y0l#KGd&Gf53I?=;!l=em-C5=ktYr zK40kP^M!ssUvhu!{*e3G_l02hhuqKpSI8GZ{te_mg?RT1kbn4ZA#PXfE!6)$HsgLK z%%k_468x?Pd|w27Ul#b#`&BNZz=z(iO6l+ZyV#reyRxO<)q>xb1;1~$^!rsyzbmiA z%-qjdKXn|--8JmZe)+27SnU3(V{GjHsUObo?i%)H_fH)MbGu@1sXsR3e#Xt~+hUlR z`x)n_Z;Nq$`j#E%r*9izX6|R4pT4c;cE#ROe{9D6jF~s5*<35^&G?zqY>b~d1<3fB z(-5u|_GbLdX*#zn_Lll%Gwx^fyy0uHe}<3QKf}lDpW$ni(`3_9p!5@m#-} zkMgVeD8HI7*RSTw^|SpkGxsyx&yHvMSw6zg@)3TPFVoNRW%@P!T`TO3`ZeQuehuH% z{|@pWI$vpm{{GwW<@q&yd45iR%*_1^^K-_t{2V^iuhIL;S1><^FU!y2%kp#kyH?m6 z@pH#>{9HcF&*j7XT)rGXmoLZ9>yMeapM`$jc!rqm+lApV`lDW&<~6!`vJbd5AX$kfG^n(@Fn}f{;n1F27Yin z)erJPzbgbk$d~E|`BMFY{+OBjneP{jC;A0^!0!sdFW^h`3-}WK!v3xm_V)b3@if1X z&-YWuz}Wo@`O^GCzBE6iKW65B=K3MyNqz{Q=cjMcaefG2k{`mC z=STC!`7!-t{Fw15KZY;LkKv2*WB8){xc(7-+<1&1#~0(r@x}OYd@+7(f7y>6kMLvp zBK%ms2tSrD!jJDS`tjqkAI~TI@qDr$&nNo{{UtwPT=Wz8L_dK~^b`0*KdHaqC*9wb z{G|K4lAn0LSorgYbbna#6Z`XiKNRQrKfnF7rQf$(`d!n~Pwvn9spHVn{<41RICQJ8 zUv(U!)z_~&j@|0(H=;l1r*CVw@zb}p+xY3*8g2aaZSgjKG5r}oJ>JGo^R@9ar%77) znbYho{G$5PerCLdpW$oaXZTv|pW$n+;M0v+dvD!(4& zGMzUz0riih_Q&QOz7v4&rhxC}fbZ3S?-byB1mJrV;M)NBCIR1ez&8YZ4*`6q0pIHZ z-y7TZN9J8V%&%EK^+Nod?K_3}HOr@7h@Z24lbBz#eCmbxIoo#{^J|t*z1sE<=RH2e z&*MYI? z=;!l=eu@2|9~ck(0AJt-_yRw`7x)3bzz^^Ret<9V1AKvBYJcDd$D!ZN1V6|J{T?a! zK|bi$7yKX}^m~Kgm)zg?3&w%p%>=)I5BNP&@C*2WUtjPG_<-LV1i$qDo?kfb`>A7; z?EZy(zMncq$?jjs=liK+p6vdGe7>JL#>wtqMt|228Tb73ElgW~a$nAQ#%8e5WtBd6UUoKy3Zhy#96` zA8-6hzFPpkTM2xPU&;4q!1q{zukkDSb^^Y$1ir?v4$IMY3o<vRtNAEDim&#o`6xe%ulB3? zD8KCfr5`z7`B^@~kL0WTEFa-V@>PD8kMJY;DnH9d_~rLEe)M?h*YM$fG+*i0@Zo+m zU+LHI;eIq<>DTb#el7ZIKW5zcIee%e!)N>)KGculGky*q>c{XIKZg(XYtvug(|#@= z=Ew1AKbH^l_D!~8ftu|L0kC)B*hhxoC4%Fp9N{8&Ea=kXzaET8i8 z_z*vqPwdZr@v2`M@P&Rn-zmTs`tf{|fG_mp`A!4A(2wU6``-!VE+F>u^$K>i%$ z1t5O~vIk@qa*KLGfi0{ET=_+9|` zUIzH~0KPfEcRj#&Pr&zX!1rFj_i@1Y*|z=p`MU~!2L!*T34SjV{N@C|dkTK<75qLc z_{sfQKXpuu-9L3qjNLzVOpM(>bxe%iKXr_a-9L3qjom+WOpVEfZ#?SCEeuj_ni|bGNmE*Ku$w&K@ be6(N5NBfn0v|q_b`;~mOU&%-NMfU%HI;uk2 literal 0 HcmV?d00001 diff --git a/tools/Hnm0Encoder/CanonicalFrame.cs b/tools/Hnm0Encoder/CanonicalFrame.cs new file mode 100644 index 0000000..dc5cdd7 --- /dev/null +++ b/tools/Hnm0Encoder/CanonicalFrame.cs @@ -0,0 +1,8 @@ +using SixLabors.ImageSharp.PixelFormats; + +namespace Hnm0Encoder; + +internal sealed record CanonicalFrame(int Width, int Height, Rgba32[] Pixels) +{ + public int PixelCount => Pixels.Length; +} diff --git a/tools/Hnm0Encoder/CommandLineParser.cs b/tools/Hnm0Encoder/CommandLineParser.cs new file mode 100644 index 0000000..95c5d7a --- /dev/null +++ b/tools/Hnm0Encoder/CommandLineParser.cs @@ -0,0 +1,145 @@ +using System.Globalization; + +namespace Hnm0Encoder; + +internal static class CommandLineParser +{ + public static EncoderOptions Parse(string[] args) + { + if (args.Length == 0) + { + throw new InvalidOperationException(BuildUsage()); + } + + string? inputDir = null; + string? outputPath = null; + double? fps = null; + int startIndex = 0; + int? maxFrames = null; + bool overwrite = false; + bool verbose = false; + + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + switch (arg) + { + case "--input-dir": + inputDir = ReadValue(args, ref i, "--input-dir"); + break; + case "--output": + outputPath = ReadValue(args, ref i, "--output"); + break; + case "--fps": + fps = ParsePositiveDouble(ReadValue(args, ref i, "--fps"), "--fps"); + break; + case "--start-index": + startIndex = ParseNonNegativeInt(ReadValue(args, ref i, "--start-index"), "--start-index"); + break; + case "--max-frames": + maxFrames = ParsePositiveInt(ReadValue(args, ref i, "--max-frames"), "--max-frames"); + break; + case "--overwrite": + overwrite = true; + break; + case "--verbose": + verbose = true; + break; + case "--help": + case "-h": + throw new InvalidOperationException(BuildUsage()); + default: + throw new InvalidOperationException($"Unknown argument '{arg}'.{Environment.NewLine}{BuildUsage()}"); + } + } + + if (string.IsNullOrWhiteSpace(inputDir)) + { + throw new InvalidOperationException("Missing required argument --input-dir."); + } + + if (string.IsNullOrWhiteSpace(outputPath)) + { + throw new InvalidOperationException("Missing required argument --output."); + } + + if (fps is null) + { + throw new InvalidOperationException("Missing required argument --fps."); + } + + string fullInputDir = Path.GetFullPath(inputDir); + if (!Directory.Exists(fullInputDir)) + { + throw new DirectoryNotFoundException($"Input directory does not exist: {fullInputDir}"); + } + + string fullOutputPath = Path.GetFullPath(outputPath); + if (File.Exists(fullOutputPath) && !overwrite) + { + throw new IOException($"Output file already exists: {fullOutputPath}. Pass --overwrite to replace it."); + } + + return new EncoderOptions( + fullInputDir, + fullOutputPath, + fps.Value, + startIndex, + maxFrames, + overwrite, + verbose); + } + + private static string ReadValue(string[] args, ref int index, string option) + { + if (index + 1 >= args.Length) + { + throw new InvalidOperationException($"Missing value after {option}."); + } + + index++; + return args[index]; + } + + private static double ParsePositiveDouble(string text, string option) + { + double value = double.Parse(text, NumberStyles.Float, CultureInfo.InvariantCulture); + + if (value <= 0 || double.IsNaN(value) || double.IsInfinity(value)) + { + throw new InvalidOperationException($"{option} must be a finite value greater than zero."); + } + + return value; + } + + private static int ParseNonNegativeInt(string text, string option) + { + int value = int.Parse(text, NumberStyles.Integer, CultureInfo.InvariantCulture); + + if (value < 0) + { + throw new InvalidOperationException($"{option} must be >= 0."); + } + + return value; + } + + private static int ParsePositiveInt(string text, string option) + { + int value = ParseNonNegativeInt(text, option); + if (value == 0) + { + throw new InvalidOperationException($"{option} must be > 0."); + } + + return value; + } + + private static string BuildUsage() + { + return "Usage: dotnet run --project tools/Hnm0Encoder -- " + + "--input-dir --output --fps " + + "[--start-index ] [--max-frames ] [--overwrite] [--verbose]"; + } +} diff --git a/tools/Hnm0Encoder/EncoderOptions.cs b/tools/Hnm0Encoder/EncoderOptions.cs new file mode 100644 index 0000000..1042ca6 --- /dev/null +++ b/tools/Hnm0Encoder/EncoderOptions.cs @@ -0,0 +1,10 @@ +namespace Hnm0Encoder; + +internal sealed record EncoderOptions( + string InputDirectory, + string OutputPath, + double FramesPerSecond, + int StartIndex, + int? MaxFrames, + bool Overwrite, + bool Verbose); diff --git a/tools/Hnm0Encoder/FrameDiscovery.cs b/tools/Hnm0Encoder/FrameDiscovery.cs new file mode 100644 index 0000000..e91fd18 --- /dev/null +++ b/tools/Hnm0Encoder/FrameDiscovery.cs @@ -0,0 +1,142 @@ +using System.Globalization; +using System.Text.RegularExpressions; + +namespace Hnm0Encoder; + +internal static class FrameDiscovery +{ + private static readonly Regex SplitRegex = new("(\\d+)", RegexOptions.Compiled); + + public static IReadOnlyList DiscoverPngFrames(string directory) + { + string[] files = Directory.GetFiles(directory, "*.png", SearchOption.TopDirectoryOnly); + if (files.Length == 0) + { + throw new InvalidDataException($"No .png files found in input directory: {directory}"); + } + + Array.Sort(files, NaturalPathComparer.Instance); + + if (HasDuplicateFileNamesCaseInsensitive(files)) + { + throw new InvalidDataException("Input frame list contains case-insensitive duplicate file names, which is not supported."); + } + + return files; + } + + public static IReadOnlyList SelectFrameWindow( + IReadOnlyList orderedFrames, + int startIndex, + int? maxFrames) + { + if (startIndex >= orderedFrames.Count) + { + throw new InvalidDataException($"--start-index {startIndex} is outside the discovered frame count ({orderedFrames.Count})."); + } + + int count = maxFrames ?? (orderedFrames.Count - startIndex); + if (count <= 0) + { + throw new InvalidDataException("Selected frame count must be > 0."); + } + + if (startIndex + count > orderedFrames.Count) + { + throw new InvalidDataException( + $"Requested frame window start={startIndex} count={count} exceeds discovered frame count {orderedFrames.Count}."); + } + + string[] selected = new string[count]; + for (int i = 0; i < count; i++) + { + selected[i] = orderedFrames[startIndex + i]; + } + + return selected; + } + + private static bool HasDuplicateFileNamesCaseInsensitive(IEnumerable files) + { + var names = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (string file in files) + { + if (!names.Add(Path.GetFileName(file))) + { + return true; + } + } + + return false; + } + + private sealed class NaturalPathComparer : IComparer + { + public static NaturalPathComparer Instance { get; } = new(); + + public int Compare(string? x, string? y) + { + if (x is null || y is null) + { + throw new InvalidOperationException("Natural path comparison received a null value."); + } + + string nx = Path.GetFileName(x); + string ny = Path.GetFileName(y); + return CompareNatural(nx, ny); + } + + private static int CompareNatural(string a, string b) + { + string[] ax = SplitRegex.Split(a); + string[] bx = SplitRegex.Split(b); + + int count = Math.Min(ax.Length, bx.Length); + for (int i = 0; i < count; i++) + { + string pa = ax[i]; + string pb = bx[i]; + + bool na = IsDigits(pa); + bool nb = IsDigits(pb); + int cmp; + + if (na && nb) + { + int ia = int.Parse(pa, NumberStyles.Integer, CultureInfo.InvariantCulture); + int ib = int.Parse(pb, NumberStyles.Integer, CultureInfo.InvariantCulture); + cmp = ia.CompareTo(ib); + } + else + { + cmp = string.Compare(pa, pb, StringComparison.OrdinalIgnoreCase); + } + + if (cmp != 0) + { + return cmp; + } + } + + return ax.Length.CompareTo(bx.Length); + } + + private static bool IsDigits(string text) + { + if (text.Length == 0) + { + return false; + } + + for (int i = 0; i < text.Length; i++) + { + if (!char.IsDigit(text[i])) + { + return false; + } + } + + return true; + } + } +} diff --git a/tools/Hnm0Encoder/FrameLoader.cs b/tools/Hnm0Encoder/FrameLoader.cs new file mode 100644 index 0000000..a14f99f --- /dev/null +++ b/tools/Hnm0Encoder/FrameLoader.cs @@ -0,0 +1,43 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; + +namespace Hnm0Encoder; + +internal static class FrameLoader +{ + public static CanonicalFrame LoadCanonicalFrame(string framePath) + { + using Image image = Image.Load(framePath); + NormalizeToPlayerFrame(image); + + var pixels = new Rgba32[image.Width * image.Height]; + image.ProcessPixelRows(accessor => + { + int destinationIndex = 0; + for (int y = 0; y < accessor.Height; y++) + { + Span row = accessor.GetRowSpan(y); + row.CopyTo(pixels.AsSpan(destinationIndex, row.Length)); + destinationIndex += row.Length; + } + }); + + return new CanonicalFrame(image.Width, image.Height, pixels); + } + + private static void NormalizeToPlayerFrame(Image image) + { + if (image.Width == FramePreflight.ExpectedWidth && image.Height == FramePreflight.ExpectedHeight) + { + return; + } + + image.Mutate(context => context.Resize(new ResizeOptions + { + Mode = ResizeMode.Stretch, + Size = new Size(FramePreflight.ExpectedWidth, FramePreflight.ExpectedHeight), + Sampler = KnownResamplers.Lanczos3 + })); + } +} diff --git a/tools/Hnm0Encoder/FramePreflight.cs b/tools/Hnm0Encoder/FramePreflight.cs new file mode 100644 index 0000000..95ded5f --- /dev/null +++ b/tools/Hnm0Encoder/FramePreflight.cs @@ -0,0 +1,56 @@ +using SixLabors.ImageSharp.PixelFormats; + +namespace Hnm0Encoder; + +internal static class FramePreflight +{ + public const int ExpectedWidth = 320; + public const int ExpectedHeight = 200; + + public static FramePreflightReport Analyze(IReadOnlyList framePaths, bool verbose) + { + if (framePaths.Count == 0) + { + throw new InvalidOperationException("Cannot analyze an empty frame list."); + } + + int maxColors = 0; + int minColors = int.MaxValue; + + for (int i = 0; i < framePaths.Count; i++) + { + string framePath = framePaths[i]; + CanonicalFrame frame = FrameLoader.LoadCanonicalFrame(framePath); + + int uniqueColors = CountUniqueColors(frame.Pixels); + QuantizedFrame quantized = FrameQuantizer.Quantize(frame); + int paletteColors = quantized.PaletteLength; + maxColors = Math.Max(maxColors, paletteColors); + minColors = Math.Min(minColors, paletteColors); + + if (verbose) + { + Console.WriteLine($"[preflight] {i:D5} {Path.GetFileName(framePath)} sourceColors={uniqueColors} paletteColors={paletteColors}"); + } + } + + return new FramePreflightReport(framePaths.Count, minColors, maxColors); + } + + private static int CountUniqueColors(ReadOnlySpan pixels) + { + var colors = new HashSet(); + + for (int i = 0; i < pixels.Length; i++) + { + colors.Add(pixels[i]); + } + + return colors.Count; + } +} + +internal sealed record FramePreflightReport( + int FrameCount, + int MinUniqueColorsInFrame, + int MaxUniqueColorsInFrame); diff --git a/tools/Hnm0Encoder/FrameQuantizer.cs b/tools/Hnm0Encoder/FrameQuantizer.cs new file mode 100644 index 0000000..9e16dff --- /dev/null +++ b/tools/Hnm0Encoder/FrameQuantizer.cs @@ -0,0 +1,48 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing.Processors.Quantization; + +namespace Hnm0Encoder; + +internal static class FrameQuantizer +{ + public static QuantizedFrame Quantize(CanonicalFrame frame) + { + if (frame.Width != FramePreflight.ExpectedWidth || frame.Height != FramePreflight.ExpectedHeight) + { + throw new InvalidOperationException( + $"Canonical frame must be normalized to {FramePreflight.ExpectedWidth}x{FramePreflight.ExpectedHeight} before quantization."); + } + + using Image image = Image.LoadPixelData(frame.Pixels, frame.Width, frame.Height); + var options = new QuantizerOptions + { + MaxColors = 256, + Dither = null, + DitherScale = 0, + ColorMatchingMode = ColorMatchingMode.Coarse + }; + + OctreeQuantizer quantizer = new(Configuration.Default, options); + IndexedImageFrame indexed = QuantizerUtilities.BuildPaletteAndQuantizeFrame( + quantizer, + image.Frames.RootFrame, + new Rectangle(0, 0, frame.Width, frame.Height)); + + Rgba32[] palette = indexed.Palette.ToArray(); + byte[] indices = new byte[frame.Width * frame.Height]; + + for (int y = 0; y < frame.Height; y++) + { + ReadOnlySpan row = indexed.DangerousGetRowSpan(y); + row.CopyTo(indices.AsSpan(y * frame.Width, frame.Width)); + } + + if (palette.Length == 0 || palette.Length > 256) + { + throw new InvalidDataException($"Quantized palette size {palette.Length} is outside the supported 0..256 range."); + } + + return new QuantizedFrame(frame.Width, frame.Height, palette, indices); + } +} diff --git a/tools/Hnm0Encoder/Hnm0Encoder.csproj b/tools/Hnm0Encoder/Hnm0Encoder.csproj new file mode 100644 index 0000000..57dcb02 --- /dev/null +++ b/tools/Hnm0Encoder/Hnm0Encoder.csproj @@ -0,0 +1,14 @@ + + + + Exe + net10.0 + enable + enable + + + + + + + diff --git a/tools/Hnm0Encoder/Hnm0Writer.cs b/tools/Hnm0Encoder/Hnm0Writer.cs new file mode 100644 index 0000000..4bba790 --- /dev/null +++ b/tools/Hnm0Encoder/Hnm0Writer.cs @@ -0,0 +1,84 @@ +using System.Buffers.Binary; +using SixLabors.ImageSharp.PixelFormats; + +namespace Hnm0Encoder; + +internal static class Hnm0Writer +{ + public static void Write(string outputPath, IReadOnlyList framePaths) + { + if (framePaths.Count == 0) + { + throw new InvalidOperationException("Cannot encode an empty frame list."); + } + + var chunks = new List(framePaths.Count + 1); + + CanonicalFrame firstFrame = FrameLoader.LoadCanonicalFrame(framePaths[0]); + QuantizedFrame firstQuantizedFrame = FrameQuantizer.Quantize(firstFrame); + chunks.Add(BuildInitialPaletteChunk(firstQuantizedFrame.Palette)); + chunks.Add(BuildFrameChunk(firstQuantizedFrame)); + + for (int i = 1; i < framePaths.Count; i++) + { + CanonicalFrame frame = FrameLoader.LoadCanonicalFrame(framePaths[i]); + QuantizedFrame quantized = FrameQuantizer.Quantize(frame); + chunks.Add(BuildFrameChunk(quantized)); + } + + int totalLength = 0; + foreach (byte[] chunk in chunks) + { + totalLength += chunk.Length; + } + + byte[] encodedBytes = new byte[totalLength]; + int writeOffset = 0; + foreach (byte[] chunk in chunks) + { + Buffer.BlockCopy(chunk, 0, encodedBytes, writeOffset, chunk.Length); + writeOffset += chunk.Length; + } + + File.WriteAllBytes(outputPath, encodedBytes); + HnmStreamValidator.Validate(encodedBytes, framePaths.Count); + } + + private static byte[] BuildInitialPaletteChunk(Rgba32[] palette) + { + byte[] paletteBytes = PaletteRecordWriter.BuildPaletteRecordPayload(palette); + return BuildChunk(paletteBytes); + } + + private static byte[] BuildFrameChunk(QuantizedFrame frame) + { + if (frame.Width != FramePreflight.ExpectedWidth || frame.Height != FramePreflight.ExpectedHeight) + { + throw new InvalidOperationException( + $"Quantized frame must be exactly {FramePreflight.ExpectedWidth}x{FramePreflight.ExpectedHeight}."); + } + + byte[] payload = new byte[8 + frame.Indices.Length]; + BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(0, 2), 0x0140); + BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(2, 2), 0xFEC8); + BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(4, 2), 0x0000); + BinaryPrimitives.WriteUInt16LittleEndian(payload.AsSpan(6, 2), 0x0000); + frame.Indices.CopyTo(payload.AsSpan(8)); + + return BuildChunk(payload); + } + + private static byte[] BuildChunk(ReadOnlySpan payload) + { + int totalLength = payload.Length + 2; + if (totalLength > ushort.MaxValue) + { + throw new InvalidDataException($"Chunk length {totalLength} exceeds the 16-bit HNM size field."); + } + + byte[] chunk = new byte[totalLength]; + BinaryPrimitives.WriteUInt16LittleEndian(chunk.AsSpan(0, 2), (ushort)totalLength); + payload.CopyTo(chunk.AsSpan(2)); + return chunk; + } +} diff --git a/tools/Hnm0Encoder/HnmStreamValidator.cs b/tools/Hnm0Encoder/HnmStreamValidator.cs new file mode 100644 index 0000000..19f4cc0 --- /dev/null +++ b/tools/Hnm0Encoder/HnmStreamValidator.cs @@ -0,0 +1,138 @@ +using System.Buffers.Binary; + +namespace Hnm0Encoder; + +internal static class HnmStreamValidator +{ + private const int FrameWidth = 320; + private const int FrameHeight = 200; + + public static void Validate(byte[] bytes, int expectedFrameCount) + { + if (bytes.Length < 2) + { + throw new InvalidDataException("Encoded stream is too short to contain even one chunk size field."); + } + + int offset = 0; + int chunkIndex = 0; + + while (offset + 2 <= bytes.Length) + { + ushort size = BinaryPrimitives.ReadUInt16LittleEndian(bytes.AsSpan(offset, 2)); + if (size == 0) + { + break; + } + + if (size < 2) + { + throw new InvalidDataException($"Chunk {chunkIndex} at offset 0x{offset:X} has invalid size 0x{size:X}."); + } + + int chunkEnd = offset + size; + if (chunkEnd > bytes.Length) + { + throw new InvalidDataException($"Chunk {chunkIndex} at offset 0x{offset:X} extends beyond encoded length 0x{bytes.Length:X}."); + } + + ReadOnlySpan payload = bytes.AsSpan(offset + 2, size - 2); + if (chunkIndex == 0) + { + ValidatePaletteChunk(payload); + } + else + { + ValidateFrameChunk(payload, chunkIndex - 1); + } + + offset = chunkEnd; + chunkIndex++; + } + + if (chunkIndex != expectedFrameCount + 1) + { + throw new InvalidDataException($"Encoded stream contains {chunkIndex - 1} frame chunk(s) but {expectedFrameCount} were expected."); + } + + if (offset != bytes.Length) + { + throw new InvalidDataException($"Encoded stream has trailing bytes after the final chunk at offset 0x{offset:X}."); + } + } + + private static void ValidatePaletteChunk(ReadOnlySpan payload) + { + if (payload.Length < 3) + { + throw new InvalidDataException("Palette chunk is too short to hold at least one palette record and terminator."); + } + + int position = 0; + bool sawRecord = false; + + while (position < payload.Length) + { + byte index = payload[position]; + if (index == 0xFF) + { + if (!sawRecord) + { + throw new InvalidDataException("Palette chunk terminator appeared before any palette records."); + } + + return; + } + + if (position + 2 > payload.Length) + { + throw new InvalidDataException($"Palette record at offset 0x{position:X} is truncated."); + } + + byte count = payload[position + 1]; + int recordLength = 2 + (count * 3); + if (position + recordLength > payload.Length) + { + throw new InvalidDataException($"Palette record at offset 0x{position:X} extends beyond the chunk payload."); + } + + position += recordLength; + sawRecord = true; + } + + throw new InvalidDataException("Palette chunk is missing the required 0xFF terminator."); + } + + private static void ValidateFrameChunk(ReadOnlySpan payload, int frameIndex) + { + if (payload.Length < 8) + { + throw new InvalidDataException($"Frame chunk {frameIndex} is too short to contain the mandatory frame header."); + } + + ushort flags = BinaryPrimitives.ReadUInt16LittleEndian(payload.Slice(0, 2)); + ushort controlWord = BinaryPrimitives.ReadUInt16LittleEndian(payload.Slice(2, 2)); + ushort dx = BinaryPrimitives.ReadUInt16LittleEndian(payload.Slice(4, 2)); + ushort bx = BinaryPrimitives.ReadUInt16LittleEndian(payload.Slice(6, 2)); + + if ((controlWord >> 8) < 0xFE) + { + throw new InvalidDataException($"Frame chunk {frameIndex} uses unsupported frame mode 0x{(controlWord >> 8):X2}."); + } + + if ((flags & 0x01FF) == 0) + { + throw new InvalidDataException($"Frame chunk {frameIndex} has zero row width."); + } + + if (dx >= FrameWidth) + { + throw new InvalidDataException($"Frame chunk {frameIndex} has DX=0x{dx:X4} outside the visible frame width."); + } + + if (bx >= FrameHeight) + { + throw new InvalidDataException($"Frame chunk {frameIndex} has BX=0x{bx:X4} outside the visible frame height."); + } + } +} diff --git a/tools/Hnm0Encoder/PaletteRecordWriter.cs b/tools/Hnm0Encoder/PaletteRecordWriter.cs new file mode 100644 index 0000000..6a57e75 --- /dev/null +++ b/tools/Hnm0Encoder/PaletteRecordWriter.cs @@ -0,0 +1,47 @@ +using SixLabors.ImageSharp.PixelFormats; + +namespace Hnm0Encoder; + +internal static class PaletteRecordWriter +{ + public static byte[] BuildPaletteRecordPayload(Rgba32[] palette) + { + if (palette.Length == 0) + { + throw new InvalidDataException("Quantized palette must contain at least one color."); + } + + if (palette.Length > 256) + { + throw new InvalidDataException($"Quantized palette length {palette.Length} exceeds the 256-color HNM limit."); + } + + using var buffer = new MemoryStream(); + int position = 0; + while (position < palette.Length) + { + int remaining = palette.Length - position; + int count = remaining > byte.MaxValue ? byte.MaxValue : remaining; + buffer.WriteByte((byte)position); + buffer.WriteByte((byte)count); + + for (int i = 0; i < count; i++) + { + Rgba32 color = palette[position + i]; + buffer.WriteByte(ReduceToVgaDac(color.R)); + buffer.WriteByte(ReduceToVgaDac(color.G)); + buffer.WriteByte(ReduceToVgaDac(color.B)); + } + + position += count; + } + + buffer.WriteByte(0xFF); + return buffer.ToArray(); + } + + private static byte ReduceToVgaDac(byte value) + { + return (byte)(value >> 2); + } +} diff --git a/tools/Hnm0Encoder/Program.cs b/tools/Hnm0Encoder/Program.cs new file mode 100644 index 0000000..e08efc2 --- /dev/null +++ b/tools/Hnm0Encoder/Program.cs @@ -0,0 +1,38 @@ +namespace Hnm0Encoder; + +internal static class Program +{ + public static int Main(string[] args) + { + EncoderOptions options = CommandLineParser.Parse(args); + IReadOnlyList orderedFrames = FrameDiscovery.DiscoverPngFrames(options.InputDirectory); + IReadOnlyList selectedFrames = FrameDiscovery.SelectFrameWindow( + orderedFrames, + options.StartIndex, + options.MaxFrames); + + if (selectedFrames.Count == 0) + { + throw new InvalidDataException("No PNG frames were selected after applying --start-index/--max-frames."); + } + + FramePreflightReport report = FramePreflight.Analyze(selectedFrames, options.Verbose); + PrintSummary(options, report); + + Hnm0Writer.Write(options.OutputPath, selectedFrames); + Console.WriteLine($"Wrote {selectedFrames.Count} frame(s) to {options.OutputPath}"); + return 0; + } + + private static void PrintSummary(EncoderOptions options, FramePreflightReport report) + { + Console.WriteLine("HNM0 encoder preflight"); + Console.WriteLine($"Input directory: {options.InputDirectory}"); + Console.WriteLine($"Output path: {options.OutputPath}"); + Console.WriteLine($"Frames selected: {report.FrameCount}"); + Console.WriteLine($"Width x Height: {FramePreflight.ExpectedWidth}x{FramePreflight.ExpectedHeight}"); + Console.WriteLine($"Max palette colors in a frame: {report.MaxUniqueColorsInFrame}"); + Console.WriteLine($"Min palette colors in a frame: {report.MinUniqueColorsInFrame}"); + Console.WriteLine($"FPS: {options.FramesPerSecond:0.###}"); + } +} diff --git a/tools/Hnm0Encoder/QuantizedFrame.cs b/tools/Hnm0Encoder/QuantizedFrame.cs new file mode 100644 index 0000000..94b9ba8 --- /dev/null +++ b/tools/Hnm0Encoder/QuantizedFrame.cs @@ -0,0 +1,13 @@ +using SixLabors.ImageSharp.PixelFormats; + +namespace Hnm0Encoder; + +internal sealed record QuantizedFrame( + int Width, + int Height, + Rgba32[] Palette, + byte[] Indices) +{ + public int PaletteLength => Palette.Length; + public int IndexCount => Indices.Length; +} From 31bcddf9f1137ab70620abfd9f0fec66c7a71760 Mon Sep 17 00:00:00 2001 From: Maximilien Noal Date: Wed, 5 Aug 2026 14:16:32 +0200 Subject: [PATCH 2/4] feat: Update CI workflow and refactor image handling in tests --- .github/workflows/dotnet.yml | 41 +++++++---- HnmPlayer/HeadlessCaptureWindow.cs | 2 - HnmPlayer/HeadlessPlayerRunner.cs | 35 +-------- HnmPlayer/HnmPlayer.csproj | 1 - tests/HnmEndToEndTests/HnmEncoderE2eTests.cs | 71 ++++++++++--------- .../HnmEndToEndTests/HnmEndToEndTests.csproj | 2 +- 6 files changed, 68 insertions(+), 84 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 10c2791..a07247e 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -1,26 +1,39 @@ name: .NET Build -# Trigger the workflow on push or pull request -on: [push] +on: + push: + branches: + - main + - encoder + pull_request: + branches: + - main jobs: build: - strategy: matrix: os: [macos-latest, windows-latest, ubuntu-latest] fail-fast: false - + runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v1 - - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '10.0.x' - - - name: Build with dotnet - working-directory: ./ - run: dotnet build --configuration Release + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: "10.0.x" + + - name: Restore + working-directory: ./ + run: dotnet restore + + - name: Build + working-directory: ./ + run: dotnet build --configuration Release + + - name: Test + working-directory: ./ + run: dotnet test --configuration Release --no-build diff --git a/HnmPlayer/HeadlessCaptureWindow.cs b/HnmPlayer/HeadlessCaptureWindow.cs index 1b04ab5..a1aee4b 100644 --- a/HnmPlayer/HeadlessCaptureWindow.cs +++ b/HnmPlayer/HeadlessCaptureWindow.cs @@ -2,11 +2,9 @@ using Avalonia.Controls; using Avalonia.Media.Imaging; using System.Diagnostics; -using System.Runtime.Versioning; namespace logo; -[SupportedOSPlatform("windows")] public sealed class HeadlessCaptureWindow : Window { public HeadlessCaptureWindow() diff --git a/HnmPlayer/HeadlessPlayerRunner.cs b/HnmPlayer/HeadlessPlayerRunner.cs index d4468c7..f0ca8ec 100644 --- a/HnmPlayer/HeadlessPlayerRunner.cs +++ b/HnmPlayer/HeadlessPlayerRunner.cs @@ -1,6 +1,3 @@ -using System.Drawing.Imaging; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; using Avalonia; using Avalonia.Media.Imaging; using Avalonia.Platform; @@ -8,7 +5,6 @@ namespace logo; -[SupportedOSPlatform("windows")] internal static class HeadlessPlayerRunner { public static async Task RunAsync(string inputPath, string screenshotDirectory) @@ -53,35 +49,8 @@ private static void SaveScreenshot(HnmPlaybackEngine engine, WriteableBitmap bit private static void WriteableBitmapToPng(WriteableBitmap bitmap, string path) { - if (!OperatingSystem.IsWindows()) - { - throw new PlatformNotSupportedException("Headless screenshot capture requires Windows GDI+ support."); - } - - using var png = new System.Drawing.Bitmap(bitmap.PixelSize.Width, bitmap.PixelSize.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - System.Drawing.Rectangle rect = new(0, 0, png.Width, png.Height); - BitmapData data = png.LockBits(rect, ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - - try - { - using var lockedFramebuffer = bitmap.Lock(); - int rowLength = bitmap.PixelSize.Width * 4; - byte[] rowBuffer = new byte[rowLength]; - - for (int y = 0; y < bitmap.PixelSize.Height; y++) - { - IntPtr sourceRow = IntPtr.Add(lockedFramebuffer.Address, y * lockedFramebuffer.RowBytes); - Marshal.Copy(sourceRow, rowBuffer, 0, rowLength); - IntPtr destinationRow = IntPtr.Add(data.Scan0, y * data.Stride); - Marshal.Copy(rowBuffer, 0, destinationRow, rowLength); - } - } - finally - { - png.UnlockBits(data); - } - - png.Save(path, ImageFormat.Png); + using FileStream stream = File.Create(path); + bitmap.Save(stream); } private static string FormatScreenshotName(int index) diff --git a/HnmPlayer/HnmPlayer.csproj b/HnmPlayer/HnmPlayer.csproj index e960ad5..a61e31f 100644 --- a/HnmPlayer/HnmPlayer.csproj +++ b/HnmPlayer/HnmPlayer.csproj @@ -24,6 +24,5 @@ - \ No newline at end of file diff --git a/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs b/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs index e4f2ba0..03edcb2 100644 --- a/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs +++ b/tests/HnmEndToEndTests/HnmEncoderE2eTests.cs @@ -1,14 +1,11 @@ -using System.Buffers.Binary; using System.Diagnostics; -using System.Runtime.Versioning; -using System.Drawing; -using System.Drawing.Imaging; using logo; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; using Xunit; namespace HnmEndToEndTests; -[SupportedOSPlatform("windows")] public sealed class HnmEncoderE2eTests { [Fact] @@ -62,7 +59,7 @@ public void HeadlessPlayerCli_WritesScreenshots() string[] screenshots = Directory.GetFiles(screenshotDir, "*.png"); Assert.NotEmpty(screenshots); - using System.Drawing.Bitmap firstScreenshot = new(screenshots[0]); + using Image firstScreenshot = Image.Load(screenshots[0]); Assert.Equal(HnmPlaybackEngine.FrameWidth, firstScreenshot.Width); Assert.Equal(HnmPlaybackEngine.FrameHeight, firstScreenshot.Height); } @@ -85,8 +82,8 @@ private static string FindRepoRoot() private static IReadOnlyList CreateSourceFrames(string framesDir) { - Color colorA = Color.FromArgb(64, 128, 192); - Color colorB = Color.FromArgb(192, 64, 128); + Rgba32 colorA = new(64, 128, 192); + Rgba32 colorB = new(192, 64, 128); var paths = new List(2) { @@ -97,26 +94,28 @@ private static IReadOnlyList CreateSourceFrames(string framesDir) return paths; } - private static string DrawCheckerboard(string path, Color colorA, Color colorB, bool swapCells) + private static string DrawCheckerboard(string path, Rgba32 colorA, Rgba32 colorB, bool swapCells) { - using var bitmap = new System.Drawing.Bitmap(HnmPlaybackEngine.FrameWidth, HnmPlaybackEngine.FrameHeight); - using Graphics graphics = Graphics.FromImage(bitmap); - - for (int y = 0; y < HnmPlaybackEngine.FrameHeight; y++) + using Image image = new(HnmPlaybackEngine.FrameWidth, HnmPlaybackEngine.FrameHeight); + image.ProcessPixelRows(accessor => { - for (int x = 0; x < HnmPlaybackEngine.FrameWidth; x++) + for (int y = 0; y < accessor.Height; y++) { - bool useFirst = ((x / 16) + (y / 16)) % 2 == 0; - if (swapCells) + Span row = accessor.GetRowSpan(y); + for (int x = 0; x < row.Length; x++) { - useFirst = !useFirst; - } + bool useFirst = ((x / 16) + (y / 16)) % 2 == 0; + if (swapCells) + { + useFirst = !useFirst; + } - bitmap.SetPixel(x, y, useFirst ? colorA : colorB); + row[x] = useFirst ? colorA : colorB; + } } - } + }); - bitmap.Save(path, ImageFormat.Png); + image.SaveAsPng(path); return path; } @@ -207,23 +206,29 @@ private static string Quote(string value) private static void AssertFrameMatchesPng(string pngPath, byte[] framebuffer, byte[] palette) { - using System.Drawing.Bitmap png = new(pngPath); + using Image png = Image.Load(pngPath); Assert.Equal(HnmPlaybackEngine.FrameWidth, png.Width); Assert.Equal(HnmPlaybackEngine.FrameHeight, png.Height); - for (int y = 0; y < png.Height; y++) + png.ProcessPixelRows(accessor => { - for (int x = 0; x < png.Width; x++) + for (int y = 0; y < accessor.Height; y++) { - Color expected = png.GetPixel(x, y); - byte index = framebuffer[(y * HnmPlaybackEngine.FrameWidth) + x]; - int paletteOffset = index * 3; - Color actual = Color.FromArgb(palette[paletteOffset + 0] << 2, palette[paletteOffset + 1] << 2, palette[paletteOffset + 2] << 2); - - Assert.Equal(expected.R & 0xFC, actual.R); - Assert.Equal(expected.G & 0xFC, actual.G); - Assert.Equal(expected.B & 0xFC, actual.B); + Span row = accessor.GetRowSpan(y); + for (int x = 0; x < row.Length; x++) + { + Rgba32 expected = row[x]; + byte index = framebuffer[(y * HnmPlaybackEngine.FrameWidth) + x]; + int paletteOffset = index * 3; + byte actualR = (byte)(palette[paletteOffset + 0] << 2); + byte actualG = (byte)(palette[paletteOffset + 1] << 2); + byte actualB = (byte)(palette[paletteOffset + 2] << 2); + + Assert.Equal((byte)(expected.R & 0xFC), actualR); + Assert.Equal((byte)(expected.G & 0xFC), actualG); + Assert.Equal((byte)(expected.B & 0xFC), actualB); + } } - } + }); } } \ No newline at end of file diff --git a/tests/HnmEndToEndTests/HnmEndToEndTests.csproj b/tests/HnmEndToEndTests/HnmEndToEndTests.csproj index 4fd1de2..1af82ca 100644 --- a/tests/HnmEndToEndTests/HnmEndToEndTests.csproj +++ b/tests/HnmEndToEndTests/HnmEndToEndTests.csproj @@ -9,7 +9,7 @@ - + all From 8dc510aade6594eff8440a6a7b430b98ecf383d1 Mon Sep 17 00:00:00 2001 From: Maximilien Noal Date: Wed, 5 Aug 2026 14:28:32 +0200 Subject: [PATCH 3/4] feat: Update CI workflows and .NET project references; remove end-to-end tests --- .github/workflows/autorelease.yml | 67 ++--- .github/workflows/dotnet.yml | 13 +- HnmPlayer/HnmPlayer.csproj | 8 +- logo.csproj | 7 +- tests/HnmEndToEndTests/HnmEncoderE2eTests.cs | 234 ------------------ .../HnmEndToEndTests/HnmEndToEndTests.csproj | 11 +- tmp-e2e-check/out-ci-smoke.hnm | Bin 0 -> 128795 bytes 7 files changed, 56 insertions(+), 284 deletions(-) delete mode 100644 tests/HnmEndToEndTests/HnmEncoderE2eTests.cs create mode 100644 tmp-e2e-check/out-ci-smoke.hnm diff --git a/.github/workflows/autorelease.yml b/.github/workflows/autorelease.yml index d134915..ca3b621 100644 --- a/.github/workflows/autorelease.yml +++ b/.github/workflows/autorelease.yml @@ -3,7 +3,7 @@ name: "pre-release" on: push: branches: - - "master" + - "main" jobs: pre-release: @@ -11,33 +11,38 @@ jobs: runs-on: "ubuntu-latest" steps: - - uses: actions/checkout@v1 - - - name: Setup .NET - uses: actions/setup-dotnet@v1 - with: - dotnet-version: '10.0.x' - - - name: Install zip - uses: montudor/action-zip@v1 - - - name: Build with dotnet - working-directory: ./ - run: | - dotnet publish -c Release -r linux-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o linux - dotnet publish -c Release -r win-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o windows - dotnet publish -c Release -r osx-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o macos - - - name: Zip output - run: zip -qq -r Release.zip Release - working-directory: ./ - - - name: Publish GitHub Release - uses: "marvinpinto/action-automatic-releases@latest" - with: - repo_token: "${{ secrets.GITHUB_TOKEN }}" - automatic_release_tag: "latest" - prerelease: true - title: "Development Build" - files: | - ./bin/Release.zip + - uses: actions/checkout@v4 + + - name: Setup .NET + uses: actions/setup-dotnet@v4 + with: + dotnet-version: "10.0.x" + + - name: Install zip + uses: montudor/action-zip@v1 + + - name: Build with dotnet + working-directory: ./ + run: | + dotnet publish logo.csproj -c Release -r linux-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o artifacts/release/linux-x64 + dotnet publish logo.csproj -c Release -r win-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o artifacts/release/win-x64 + dotnet publish logo.csproj -c Release -r osx-x64 --self-contained true -p:PublishReadyToRun=true -p:PublishSingleFile=true -o artifacts/release/osx-x64 + + - name: Zip outputs + run: | + zip -qq -r logo-linux-x64.zip artifacts/release/linux-x64 + zip -qq -r logo-win-x64.zip artifacts/release/win-x64 + zip -qq -r logo-osx-x64.zip artifacts/release/osx-x64 + working-directory: ./ + + - name: Publish GitHub Release + uses: "marvinpinto/action-automatic-releases@latest" + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "latest" + prerelease: true + title: "Development Build" + files: | + ./logo-linux-x64.zip + ./logo-win-x64.zip + ./logo-osx-x64.zip diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index a07247e..6ae919a 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -28,12 +28,17 @@ jobs: - name: Restore working-directory: ./ - run: dotnet restore + run: | + dotnet restore tools/Hnm0Encoder/Hnm0Encoder.csproj + dotnet restore HnmPlayer/HnmPlayer.csproj + dotnet restore tests/HnmEndToEndTests/HnmEndToEndTests.csproj - - name: Build + - name: Build encoder and player working-directory: ./ - run: dotnet build --configuration Release + run: | + dotnet build tools/Hnm0Encoder/Hnm0Encoder.csproj --configuration Release --no-restore + dotnet build HnmPlayer/HnmPlayer.csproj --configuration Release --no-restore - name: Test working-directory: ./ - run: dotnet test --configuration Release --no-build + run: dotnet test tests/HnmEndToEndTests/HnmEndToEndTests.csproj --configuration Release diff --git a/HnmPlayer/HnmPlayer.csproj b/HnmPlayer/HnmPlayer.csproj index a61e31f..40bb312 100644 --- a/HnmPlayer/HnmPlayer.csproj +++ b/HnmPlayer/HnmPlayer.csproj @@ -20,9 +20,9 @@ - - - - + + + + \ No newline at end of file diff --git a/logo.csproj b/logo.csproj index feb0939..7174913 100644 --- a/logo.csproj +++ b/logo.csproj @@ -10,6 +10,7 @@ + @@ -20,9 +21,9 @@ - - - + + +