|
|
|
@ -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<TPixel>(TestImageProvider<TPixel> provider, PngColorType pngColorType) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
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<TPixel>(TestImageProvider<TPixel> provider, PngColorType pngColorType) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
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<TPixel>(TestImageProvider<TPixel> provider, PngFilterMethod pngFilterMethod) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
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<TPixel>(TestImageProvider<TPixel> provider, int compressionLevel) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
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<TPixel>(TestImageProvider<TPixel> provider, PngColorType pngColorType) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
TestPngEncoderCore( |
|
|
|
provider, |
|
|
|
pngColorType, |
|
|
|
PngFilterMethod.Adaptive, |
|
|
|
PngBitDepth.Bit16, |
|
|
|
appendPngColorType: true, |
|
|
|
appendPixelType: true); |
|
|
|
} |
|
|
|
|
|
|
|
[Theory] |
|
|
|
@ -102,7 +139,13 @@ namespace SixLabors.ImageSharp.Tests |
|
|
|
public void PaletteColorType_WuQuantizer<TPixel>(TestImageProvider<TPixel> provider, int paletteSize) |
|
|
|
where TPixel : struct, IPixel<TPixel> |
|
|
|
{ |
|
|
|
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<TPixel> 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<TPixel>(actualOutputFile, referenceDecoder)) |
|
|
|
using (var referenceImage = Image.Load<TPixel>(referenceOutputFile, referenceDecoder)) |
|
|
|
{ |
|
|
|
// TODO: Do we still need the reference output files?
|
|
|
|
Image<TPixel> referenceImage = referenceOutputFileExists |
|
|
|
? Image.Load<TPixel>(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(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|