// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System; using System.Collections.Generic; using System.IO; using ImageMagick; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; using Xunit; namespace SixLabors.ImageSharp.Tests.Formats.Tiff { public static class TiffTestUtils { public static void CompareWithReferenceDecoder( string encodedImagePath, Image image, bool useExactComparer = true, float compareTolerance = 0.01f) where TPixel : unmanaged, ImageSharp.PixelFormats.IPixel { var testFile = TestFile.Create(encodedImagePath); Image magickImage = DecodeWithMagick(Configuration.Default, new FileInfo(testFile.FullPath)); if (useExactComparer) { ImageComparer.Exact.VerifySimilarity(magickImage, image); } else { ImageComparer.Tolerant(compareTolerance).VerifySimilarity(magickImage, image); } } public static Image DecodeWithMagick(Configuration configuration, FileInfo fileInfo) where TPixel : unmanaged, ImageSharp.PixelFormats.IPixel { using var magickImage = new MagickImage(fileInfo); magickImage.AutoOrient(); var result = new Image(configuration, magickImage.Width, magickImage.Height); Assert.True(result.TryGetSinglePixelSpan(out Span resultPixels)); using IUnsafePixelCollection pixels = magickImage.GetPixelsUnsafe(); byte[] data = pixels.ToByteArray(PixelMapping.RGBA); PixelOperations.Instance.FromRgba32Bytes( configuration, data, resultPixels, resultPixels.Length); return result; } } internal class NumberComparer : IEqualityComparer { public bool Equals(Number x, Number y) => x.Equals(y); public int GetHashCode(Number obj) => obj.GetHashCode(); } }