// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; using System.IO; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using ImageMagick; using SixLabors.ImageSharp.Advanced; namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs { public class MagickReferenceEncoder : IImageEncoder { public MagickReferenceEncoder(MagickFormat format) { this.Format = format; } public MagickFormat Format { get; } public void Encode(Image image, Stream stream) where TPixel : struct, IPixel { var black = MagickColor.FromRgba(0, 0, 0, 255); using (var magickImage = new MagickImage(black, image.Width, image.Height)) { bool isDeep = Unsafe.SizeOf() > 32; magickImage.Depth = isDeep ? 16 : 8; Span allPixels = image.GetPixelSpan(); using (IPixelCollection magickPixels = magickImage.GetPixelsUnsafe()) { if (isDeep) { ushort[] data = new ushort[allPixels.Length * 4]; Span dataSpan = MemoryMarshal.Cast(data); PixelOperations.Instance.ToRgba64(allPixels, dataSpan, allPixels.Length); magickPixels.SetPixels(data); } else { byte[] data = new byte[allPixels.Length * 4]; PixelOperations.Instance.ToRgba32Bytes(allPixels, data, allPixels.Length); magickPixels.SetPixels(data); } } magickImage.Write(stream, this.Format); } } } }