diff --git a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs index eb046165d..a794bc03e 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs @@ -1,22 +1,21 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +// ReSharper disable InconsistentNaming using System.IO; using System.Linq; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Quantization; +using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; using Xunit; -// ReSharper disable InconsistentNaming -namespace SixLabors.ImageSharp.Tests +namespace SixLabors.ImageSharp.Tests.Formats.Png { - using SixLabors.ImageSharp.Processing; - using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; - public class PngEncoderTests { private const float ToleranceThresholdForPaletteEncoder = 0.2f / 100; @@ -70,7 +69,12 @@ namespace SixLabors.ImageSharp.Tests public void WorksWithDifferentSizes(TestImageProvider provider, PngColorType pngColorType) where TPixel : struct, IPixel { - TestPngEncoderCore(provider, pngColorType, PngFilterMethod.Adaptive, appendPngColorType: true); + TestPngEncoderCore( + provider, + pngColorType, + PngFilterMethod.Adaptive, + PngBitDepth.Bit8, + appendPngColorType: true); } [Theory] @@ -78,7 +82,13 @@ namespace SixLabors.ImageSharp.Tests public void IsNotBoundToSinglePixelType(TestImageProvider provider, PngColorType pngColorType) where TPixel : struct, IPixel { - TestPngEncoderCore(provider, pngColorType, PngFilterMethod.Adaptive, appendPixelType: true, appendPngColorType: true); + TestPngEncoderCore( + provider, + pngColorType, + PngFilterMethod.Adaptive, + PngBitDepth.Bit8, + appendPixelType: true, + appendPngColorType: true); } [Theory] @@ -86,7 +96,12 @@ namespace SixLabors.ImageSharp.Tests public void WorksWithAllFilterMethods(TestImageProvider provider, PngFilterMethod pngFilterMethod) where TPixel : struct, IPixel { - TestPngEncoderCore(provider, PngColorType.RgbWithAlpha, pngFilterMethod, appendPngFilterMethod: true); + TestPngEncoderCore( + provider, + PngColorType.RgbWithAlpha, + pngFilterMethod, + PngBitDepth.Bit8, + appendPngFilterMethod: true); } [Theory] @@ -94,7 +109,29 @@ namespace SixLabors.ImageSharp.Tests public void WorksWithAllCompressionLevels(TestImageProvider provider, int compressionLevel) where TPixel : struct, IPixel { - TestPngEncoderCore(provider, PngColorType.RgbWithAlpha, PngFilterMethod.Adaptive, compressionLevel, appendCompressionLevel: true); + TestPngEncoderCore( + provider, + PngColorType.RgbWithAlpha, + PngFilterMethod.Adaptive, + PngBitDepth.Bit8, + compressionLevel, + appendCompressionLevel: true); + } + + [Theory] + [WithTestPatternImages(24, 24, PixelTypes.Rgba64, PngColorType.Rgb)] + [WithTestPatternImages(24, 24, PixelTypes.Rgba64, PngColorType.RgbWithAlpha)] + [WithTestPatternImages(24, 24, PixelTypes.Rgba32, PngColorType.RgbWithAlpha)] + public void WorksWithBitDepth16(TestImageProvider provider, PngColorType pngColorType) + where TPixel : struct, IPixel + { + TestPngEncoderCore( + provider, + pngColorType, + PngFilterMethod.Adaptive, + PngBitDepth.Bit16, + appendPngColorType: true, + appendPixelType: true); } [Theory] @@ -102,7 +139,13 @@ namespace SixLabors.ImageSharp.Tests public void PaletteColorType_WuQuantizer(TestImageProvider provider, int paletteSize) where TPixel : struct, IPixel { - TestPngEncoderCore(provider, PngColorType.Palette, PngFilterMethod.Adaptive, paletteSize: paletteSize, appendPaletteSize: true); + TestPngEncoderCore( + provider, + PngColorType.Palette, + PngFilterMethod.Adaptive, + PngBitDepth.Bit8, + paletteSize: paletteSize, + appendPaletteSize: true); } private static bool HasAlpha(PngColorType pngColorType) => @@ -112,6 +155,7 @@ namespace SixLabors.ImageSharp.Tests TestImageProvider provider, PngColorType pngColorType, PngFilterMethod pngFilterMethod, + PngBitDepth bitDepth, int compressionLevel = 6, int paletteSize = 255, bool appendPngColorType = false, @@ -133,6 +177,7 @@ namespace SixLabors.ImageSharp.Tests ColorType = pngColorType, FilterMethod = pngFilterMethod, CompressionLevel = compressionLevel, + BitDepth = bitDepth, Quantizer = new WuQuantizer(paletteSize) }; @@ -155,16 +200,31 @@ namespace SixLabors.ImageSharp.Tests IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(actualOutputFile); string referenceOutputFile = ((ITestImageProvider)provider).Utility.GetReferenceOutputFileName("png", debugInfo, appendPixelType, true); + bool referenceOutputFileExists = File.Exists(referenceOutputFile); + using (var actualImage = Image.Load(actualOutputFile, referenceDecoder)) - using (var referenceImage = Image.Load(referenceOutputFile, referenceDecoder)) { + // TODO: Do we still need the reference output files? + Image referenceImage = referenceOutputFileExists + ? Image.Load(referenceOutputFile, referenceDecoder) + : image; + float paletteToleranceHack = 80f / paletteSize; paletteToleranceHack = paletteToleranceHack * paletteToleranceHack; ImageComparer comparer = pngColorType == PngColorType.Palette ? ImageComparer.Tolerant(ToleranceThresholdForPaletteEncoder * paletteToleranceHack) : ImageComparer.Exact; - - comparer.VerifySimilarity(referenceImage, actualImage); + try + { + comparer.VerifySimilarity(referenceImage, actualImage); + } + finally + { + if (referenceOutputFileExists) + { + referenceImage.Dispose(); + } + } } } }