From 86b2bfe10028a62b4281ce939b82caf2bc788cf9 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 7 Oct 2018 20:17:59 +0200 Subject: [PATCH] Fix ResizeProcessor Compand UnPremultiply bug + tests --- src/ImageSharp/Common/Helpers/ImageMaths.cs | 3 +- .../Processors/Transforms/ResizeProcessor.cs | 2 +- .../Processors/Transforms/ResizeTests.cs | 64 ++++++------------- tests/Images/External | 2 +- 4 files changed, 24 insertions(+), 47 deletions(-) diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMaths.cs index 8cd34f540..d672cfd5a 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Numerics; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; using SixLabors.Primitives; @@ -33,6 +31,7 @@ namespace SixLabors.ImageSharp /// /// Determine the Least Common Multiple (LCM) of two numbers. + /// TODO: This method might be useful for building a more compact /// public static int LeastCommonMultiple(int a, int b) { diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs index 9481be48b..753863dec 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs @@ -263,7 +263,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms ResizeKernel window = this.horizontalKernelMap.Kernels[x - startX]; Unsafe.Add(ref firstPassBaseRef, x * sourceHeight) = - window.ConvolveExpand(tempRowSpan, sourceX).UnPremultiply(); + window.ConvolveExpand(tempRowSpan, sourceX); } } else diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index c74b40622..ca43432e7 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -18,8 +18,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms { public static readonly string[] CommonTestImages = { TestImages.Png.CalliphoraPartial }; - private static readonly ImageComparer ValidatorComparer = ImageComparer.TolerantPercentage(0.069F); - + private static readonly ImageComparer ValidatorComparer = ImageComparer.TolerantPercentage(0.07F); + public static readonly TheoryData AllReSamplers = new TheoryData { @@ -65,20 +65,16 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms public void Resize_WorksWithAllParallelismLevels(TestImageProvider provider, int maxDegreeOfParallelism) where TPixel : struct, IPixel { - if (maxDegreeOfParallelism >= 0) - { - provider.Configuration.MaxDegreeOfParallelism = maxDegreeOfParallelism; - } + provider.Configuration.MaxDegreeOfParallelism = + maxDegreeOfParallelism > 0 ? maxDegreeOfParallelism : Environment.ProcessorCount; - using (Image image = provider.GetImage()) - { - SizeF newSize = image.Size() * 0.5f; - image.Mutate(x => x.Resize((Size)newSize, false)); - FormattableString details = $"MDP{maxDegreeOfParallelism}"; + FormattableString details = $"MDP{maxDegreeOfParallelism}"; - image.DebugSave(provider, details); - //image.CompareToReferenceOutput(ImageComparer.TolerantPercentage(0.005f), provider, details); - } + provider.RunValidatingProcessorTest( + x => x.Resize(x.GetCurrentSize() / 2), + details, + appendPixelTypeToFileName: false, + appendSourceFileOrDescription: false); } [Theory] @@ -100,16 +96,9 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms public void Resize_IsNotBoundToSinglePixelType(TestImageProvider provider) where TPixel : struct, IPixel { - using (Image image = provider.GetImage()) - { - image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2, true)); - - image.DebugSave(provider); - image.CompareToReferenceOutput(ValidatorComparer, provider); - } + provider.RunValidatingProcessorTest(x => x.Resize(x.GetCurrentSize() / 2), comparer: ValidatorComparer); } - [Theory] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void Resize_ThrowsForWrappedMemoryImage(TestImageProvider provider) @@ -130,32 +119,21 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } } - [Theory] - [WithFile(TestImages.Png.Kaboom, DefaultPixelType)] - public void Resize_DoesNotBleedAlphaPixels(TestImageProvider provider) + [WithFile(TestImages.Png.Kaboom, DefaultPixelType, false)] + [WithFile(TestImages.Png.Kaboom, DefaultPixelType, true)] + public void Resize_DoesNotBleedAlphaPixels(TestImageProvider provider, bool compand) where TPixel : struct, IPixel { - using (Image image = provider.GetImage()) - { - image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2)); - image.DebugSave(provider); - image.CompareToReferenceOutput(ValidatorComparer, provider); - } - } + string details = compand ? "Compand" : ""; - [Theory] - [WithFile(TestImages.Png.Kaboom, DefaultPixelType)] - public void Resize_Compand_DoesNotBleedAlphaPixels(TestImageProvider provider) - where TPixel : struct, IPixel - { - using (Image image = provider.GetImage()) - { - image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2, true)); - image.DebugSave(provider); - } + provider.RunValidatingProcessorTest( + x => x.Resize(x.GetCurrentSize() / 2, compand), + details, + appendPixelTypeToFileName: false, + appendSourceFileOrDescription: false); } - + [Theory] [WithFile(TestImages.Gif.Giphy, DefaultPixelType)] public void Resize_IsAppliedToAllFrames(TestImageProvider provider) diff --git a/tests/Images/External b/tests/Images/External index c0627f384..03c7fa758 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit c0627f384c1d3d2f8d914c9578ae31354c35fd2c +Subproject commit 03c7fa7582dea75cea0d49514ccb7e1b6dc9e780