diff --git a/TestFixtures.Resources/Generate.cs b/TestFixtures.Resources/Generate.cs index a637f1e0e..8fcb9e60c 100644 --- a/TestFixtures.Resources/Generate.cs +++ b/TestFixtures.Resources/Generate.cs @@ -29,24 +29,17 @@ using System.Collections.Generic; using System.IO; using System.Resources; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.Drawing.Processing; -using SixLabors.ImageSharp.Formats; -using SixLabors.ImageSharp.Formats.Bmp; -using SixLabors.ImageSharp.Formats.Gif; -using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.ImageSharp.Formats.Png; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; +using ImageMagick; +using ImageMagick.Drawing; var dir = Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "fixtures"); dir = Path.GetFullPath(dir); Directory.CreateDirectory(dir); -WriteImage(Path.Combine(dir, "logo.png"), new PngEncoder()); -WriteImage(Path.Combine(dir, "logo.bmp"), new BmpEncoder()); -WriteImage(Path.Combine(dir, "logo.jpg"), new JpegEncoder { Quality = 92 }); -WriteImage(Path.Combine(dir, "logo.gif"), new GifEncoder()); +WriteImage(Path.Combine(dir, "logo.png"), MagickFormat.Png); +WriteImage(Path.Combine(dir, "logo.bmp"), MagickFormat.Bmp); +WriteImage(Path.Combine(dir, "logo.jpg"), MagickFormat.Jpeg, quality: 92); +WriteImage(Path.Combine(dir, "logo.gif"), MagickFormat.Gif); // Multi-frame .ico: 16x16, 32x32, 48x48, each PNG-encoded inside the ICO container so Avalonia // can decode the largest frame for preview while a savvy viewer can pick any. @@ -73,29 +66,35 @@ Console.WriteLine($"Wrote fixtures into {dir}"); // --- helpers --- -static void WriteImage(string path, IImageEncoder encoder, int size = 64) +static void WriteImage(string path, MagickFormat format, int size = 64, uint quality = 0) { using var img = RenderShape(size); - using var fs = File.Create(path); - img.Save(fs, encoder); + if (quality > 0) + img.Quality = quality; + img.Write(path, format); } -static Image RenderShape(int size) +static MagickImage RenderShape(int size) { - var img = new Image(size, size, new Rgba32(0xFF, 0xF6, 0xE5)); - img.Mutate(ctx => { + var img = new MagickImage(new MagickColor("#FFF6E5"), (uint)size, (uint)size); + float radius = size * 0.35f; + // Drawables is a single fluent command list: stroke/fill settings persist across the + // primitives that follow, so each shape resets the ones it does not want. + new Drawables() // Filled blue circle in the centre. - ctx.Fill(new Rgba32(0x33, 0x99, 0xCC), - new SixLabors.ImageSharp.Drawing.EllipsePolygon(size / 2f, size / 2f, size * 0.35f)); + .FillColor(new MagickColor("#3399CC")) + .StrokeColor(MagickColors.None) + .Ellipse(size / 2.0, size / 2.0, radius, radius, 0, 360) // Red diagonal stripe. - ctx.DrawLine(new Rgba32(0xCC, 0x33, 0x33), - Math.Max(2, size / 16f), - new PointF(0, size), - new PointF(size, 0)); + .FillColor(MagickColors.None) + .StrokeColor(new MagickColor("#CC3333")) + .StrokeWidth(Math.Max(2, size / 16.0)) + .Line(0, size, size, 0) // 1px dark border so the bounds are obvious against any background. - ctx.Draw(new Rgba32(0x33, 0x33, 0x33), 1, - new RectangleF(0, 0, size - 1, size - 1)); - }); + .StrokeColor(new MagickColor("#333333")) + .StrokeWidth(1) + .Rectangle(0, 0, size - 1, size - 1) + .Draw(img); return img; } @@ -105,13 +104,10 @@ static Image RenderShape(int size) static byte[] BuildIcoOrCur(bool isCursor, int[] sizes) { var frames = new List(sizes.Length); - var pngEncoder = new PngEncoder(); foreach (var sz in sizes) { using var img = RenderShape(sz); - using var ms = new MemoryStream(); - img.Save(ms, pngEncoder); - frames.Add(ms.ToArray()); + frames.Add(img.ToByteArray(MagickFormat.Png)); } var fileMs = new MemoryStream(); var w = new BinaryWriter(fileMs); diff --git a/TestFixtures.Resources/Generate.csproj b/TestFixtures.Resources/Generate.csproj index 3e03171f1..02f4f432d 100644 --- a/TestFixtures.Resources/Generate.csproj +++ b/TestFixtures.Resources/Generate.csproj @@ -5,14 +5,13 @@ TestFixtures.Generate enable false - - - + + diff --git a/TestFixtures.Resources/fixtures/favicon.ico b/TestFixtures.Resources/fixtures/favicon.ico index ed44b57b4..326f8a29e 100644 Binary files a/TestFixtures.Resources/fixtures/favicon.ico and b/TestFixtures.Resources/fixtures/favicon.ico differ diff --git a/TestFixtures.Resources/fixtures/logo.bmp b/TestFixtures.Resources/fixtures/logo.bmp index 7f0f16884..b67bc86bd 100644 Binary files a/TestFixtures.Resources/fixtures/logo.bmp and b/TestFixtures.Resources/fixtures/logo.bmp differ diff --git a/TestFixtures.Resources/fixtures/logo.gif b/TestFixtures.Resources/fixtures/logo.gif index 62d5a70f1..78f26a19d 100644 Binary files a/TestFixtures.Resources/fixtures/logo.gif and b/TestFixtures.Resources/fixtures/logo.gif differ diff --git a/TestFixtures.Resources/fixtures/logo.jpg b/TestFixtures.Resources/fixtures/logo.jpg index 3ea7ef008..558462bfc 100644 Binary files a/TestFixtures.Resources/fixtures/logo.jpg and b/TestFixtures.Resources/fixtures/logo.jpg differ diff --git a/TestFixtures.Resources/fixtures/logo.png b/TestFixtures.Resources/fixtures/logo.png index 8477e4c3c..976bbcf71 100644 Binary files a/TestFixtures.Resources/fixtures/logo.png and b/TestFixtures.Resources/fixtures/logo.png differ diff --git a/TestFixtures.Resources/fixtures/pointer.cur b/TestFixtures.Resources/fixtures/pointer.cur index cdc1187d6..f34d9fc47 100644 Binary files a/TestFixtures.Resources/fixtures/pointer.cur and b/TestFixtures.Resources/fixtures/pointer.cur differ diff --git a/TestFixtures.Resources/packages.lock.json b/TestFixtures.Resources/packages.lock.json index bca89e8ff..d8daa2fe8 100644 --- a/TestFixtures.Resources/packages.lock.json +++ b/TestFixtures.Resources/packages.lock.json @@ -2,26 +2,19 @@ "version": 1, "dependencies": { "net10.0": { - "SixLabors.ImageSharp": { + "Magick.NET-Q8-AnyCPU": { "type": "Direct", - "requested": "[3.1.11, )", - "resolved": "3.1.11", - "contentHash": "JfPLyigLthuE50yi6tMt7Amrenr/fA31t2CvJyhy/kQmfulIBAqo5T/YFUSRHtuYPXRSaUHygFeh6Qd933EoSw==" - }, - "SixLabors.ImageSharp.Drawing": { - "type": "Direct", - "requested": "[2.1.4, )", - "resolved": "2.1.4", - "contentHash": "p4VwtAABggDUhUS5zXldCZHVGfjJl76+SrBHY4biNQ8+890igFK6RL87qIv9GqvEjMcYOar1sPkf2iMQ6uq9/g==", + "requested": "[14.17.2, )", + "resolved": "14.17.2", + "contentHash": "AIvpBH4fvP3/NUwvWsVj9SxAA6hrU4p5/RNfColyrDn4jipl7loR6y4ZgYLXfBQgjmSEc7m2D2DbkWMnZt+brg==", "dependencies": { - "SixLabors.Fonts": "2.0.4", - "SixLabors.ImageSharp": "3.1.5" + "Magick.NET.Core": "14.17.2" } }, - "SixLabors.Fonts": { + "Magick.NET.Core": { "type": "Transitive", - "resolved": "2.0.4", - "contentHash": "4+NKz8W36injp98lmmM07ncp08HAK8c6FZz8vLoKxRPfJeEVWpBHlLYEbQa5rcqKKYqxUv/RVCrb8XcPhfMKUQ==" + "resolved": "14.17.2", + "contentHash": "KKvR6eBUcfgkZpfHfN/UKRcK/FjHW6NXXoRRf5HJdhFk5bYLEEFuKu6op0zfNo6Msah51Yw42p599pz3A0CDQQ==" } } }