From 42c71a4c5f3271c31fde37d6286a31cee820b5cb Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 16 Mar 2017 02:21:16 +0100 Subject: [PATCH 01/10] Fixed Sandbox46 test execution --- tests/ImageSharp.Tests/TestFile.cs | 2 +- tests/ImageSharp.Tests/TestFont.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ImageSharp.Tests/TestFile.cs b/tests/ImageSharp.Tests/TestFile.cs index 939b1254e6..701025e871 100644 --- a/tests/ImageSharp.Tests/TestFile.cs +++ b/tests/ImageSharp.Tests/TestFile.cs @@ -153,7 +153,7 @@ namespace ImageSharp.Tests List directories = new List< string > { "TestImages/Formats/", // Here for code coverage tests. "tests/ImageSharp.Tests/TestImages/Formats/", // from travis/build script - "../../../ImageSharp.Tests/TestImages/Formats/", // from Sandbox46 + "../../../../../ImageSharp.Tests/TestImages/Formats/", // from Sandbox46 "../../../../TestImages/Formats/", "../../../TestImages/Formats/" }; diff --git a/tests/ImageSharp.Tests/TestFont.cs b/tests/ImageSharp.Tests/TestFont.cs index e7ef63b891..7e5b6c370d 100644 --- a/tests/ImageSharp.Tests/TestFont.cs +++ b/tests/ImageSharp.Tests/TestFont.cs @@ -47,7 +47,7 @@ namespace ImageSharp.Tests List directories = new List< string > { "TestFonts/", // Here for code coverage tests. "tests/ImageSharp.Tests/TestFonts/", // from travis/build script - "../../../ImageSharp.Tests/TestFonts/", // from Sandbox46 + "../../../../../ImageSharp.Tests/TestFonts/", // from Sandbox46 "../../../../TestFonts/" }; From bf2bcfa85bbed0b45c0356257b9503d2b719d59b Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 16 Mar 2017 02:33:50 +0100 Subject: [PATCH 02/10] Implemented PinnedBuffer.CreateClean() + format DrawText.cs --- .../Common/Memory/PinnedBuffer{T}.cs | 12 ++ .../Common/PinnedBufferTests.cs | 18 ++ .../ImageSharp.Tests/Drawing/Text/DrawText.cs | 185 ++++++++++-------- 3 files changed, 137 insertions(+), 78 deletions(-) diff --git a/src/ImageSharp/Common/Memory/PinnedBuffer{T}.cs b/src/ImageSharp/Common/Memory/PinnedBuffer{T}.cs index 2d3d44dda8..d002e08fbd 100644 --- a/src/ImageSharp/Common/Memory/PinnedBuffer{T}.cs +++ b/src/ImageSharp/Common/Memory/PinnedBuffer{T}.cs @@ -109,6 +109,18 @@ namespace ImageSharp return buffer.Slice(); } + /// + /// Creates a clean instance of initializing it's elements with 'default(T)'. + /// + /// The desired count of elements. (Minimum size for ) + /// The instance + public static PinnedBuffer CreateClean(int count) + { + PinnedBuffer buffer = new PinnedBuffer(count); + buffer.Clear(); + return buffer; + } + /// /// Gets a to the beginning of the raw data of the buffer. /// diff --git a/tests/ImageSharp.Tests/Common/PinnedBufferTests.cs b/tests/ImageSharp.Tests/Common/PinnedBufferTests.cs index 26b529f6a5..d47bd5b94e 100644 --- a/tests/ImageSharp.Tests/Common/PinnedBufferTests.cs +++ b/tests/ImageSharp.Tests/Common/PinnedBufferTests.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; + using System.Threading.Tasks; using Xunit; @@ -62,6 +63,23 @@ } } + [Fact] + public void CreateClean() + { + Parallel.For(0, 100, + i => + { + using (PinnedBuffer buffer = PinnedBuffer.CreateClean(42)) + { + for (int j = 0; j < buffer.Count; j++) + { + Assert.Equal(0, buffer.Array[j]); + buffer.Array[j] = 666; + } + } + }); + } + [Fact] public void Dispose() { diff --git a/tests/ImageSharp.Tests/Drawing/Text/DrawText.cs b/tests/ImageSharp.Tests/Drawing/Text/DrawText.cs index 2a2cb8a075..68db4d9a27 100644 --- a/tests/ImageSharp.Tests/Drawing/Text/DrawText.cs +++ b/tests/ImageSharp.Tests/Drawing/Text/DrawText.cs @@ -1,96 +1,107 @@ - +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + namespace ImageSharp.Tests.Drawing.Text { using System; - using System.IO; - using ImageSharp; - using ImageSharp.Drawing.Brushes; - using Processing; - using System.Collections.Generic; - using Xunit; - using ImageSharp.Drawing; using System.Numerics; - using SixLabors.Shapes; - using ImageSharp.Drawing.Processors; + + using ImageSharp.Drawing; + using ImageSharp.Drawing.Brushes; using ImageSharp.Drawing.Pens; + using ImageSharp.Drawing.Processors; + using ImageSharp.Tests.Drawing.Paths; + using SixLabors.Fonts; - using Paths; + using SixLabors.Shapes; + + using Xunit; public class DrawText : IDisposable { Color color = Color.HotPink; + SolidBrush brush = Brushes.Solid(Color.HotPink); - IPath path = new SixLabors.Shapes.Path(new LinearLineSegment(new Vector2[] { - new Vector2(10,10), - new Vector2(20,10), - new Vector2(20,10), - new Vector2(30,10), - })); + + IPath path = new SixLabors.Shapes.Path( + new LinearLineSegment( + new Vector2[] { new Vector2(10, 10), new Vector2(20, 10), new Vector2(20, 10), new Vector2(30, 10), })); + private ProcessorWatchingImage img; + private readonly FontCollection FontCollection; + private readonly Font Font; public DrawText() { this.FontCollection = new FontCollection(); - this.Font = FontCollection.Install(TestFontUtilities.GetPath("SixLaborsSampleAB.woff")); + this.Font = this.FontCollection.Install(TestFontUtilities.GetPath("SixLaborsSampleAB.woff")); this.img = new ProcessorWatchingImage(10, 10); } public void Dispose() { - img.Dispose(); + this.img.Dispose(); } [Fact] public void FillsForEachACharachterWhenBrushSetAndNotPen() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), null, Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText( + "123", + this.Font, + Brushes.Solid(Color.Red), + null, + Vector2.Zero, + new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void FillsForEachACharachterWhenBrushSetAndNotPenDefaultOptions() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), null, Vector2.Zero); + this.img.DrawText("123", this.Font, Brushes.Solid(Color.Red), null, Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } - [Fact] public void FillsForEachACharachterWhenBrushSet() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Vector2.Zero, new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void FillsForEachACharachterWhenBrushSetDefaultOptions() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Vector2.Zero); + this.img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void FillsForEachACharachterWhenColorSet() { - img.DrawText("123", this.Font, Color.Red, Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText("123", this.Font, Color.Red, Vector2.Zero, new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); - FillRegionProcessor processor = Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); + FillRegionProcessor processor = + Assert.IsType>(this.img.ProcessorApplications[0].processor); SolidBrush brush = Assert.IsType>(processor.Brush); Assert.Equal(Color.Red, brush.Color); @@ -99,12 +110,13 @@ namespace ImageSharp.Tests.Drawing.Text [Fact] public void FillsForEachACharachterWhenColorSetDefaultOptions() { - img.DrawText("123", this.Font, Color.Red, Vector2.Zero); + this.img.DrawText("123", this.Font, Color.Red, Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); - Assert.IsType>(img.ProcessorApplications[0].processor); - FillRegionProcessor processor = Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); + Assert.IsType>(this.img.ProcessorApplications[0].processor); + FillRegionProcessor processor = + Assert.IsType>(this.img.ProcessorApplications[0].processor); SolidBrush brush = Assert.IsType>(processor.Brush); Assert.Equal(Color.Red, brush.Color); @@ -113,82 +125,99 @@ namespace ImageSharp.Tests.Drawing.Text [Fact] public void DrawForEachACharachterWhenPenSetAndNotBrush() { - img.DrawText("123", this.Font, null, Pens.Dash(Color.Red, 1), Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText( + "123", + this.Font, + null, + Pens.Dash(Color.Red, 1), + Vector2.Zero, + new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void DrawForEachACharachterWhenPenSetAndNotBrushDefaultOptions() { - img.DrawText("123", this.Font, null, Pens.Dash(Color.Red, 1), Vector2.Zero); + this.img.DrawText("123", this.Font, null, Pens.Dash(Color.Red, 1), Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } - [Fact] public void DrawForEachACharachterWhenPenSet() { - img.DrawText("123", this.Font, Pens.Dash(Color.Red, 1), Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText("123", this.Font, Pens.Dash(Color.Red, 1), Vector2.Zero, new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void DrawForEachACharachterWhenPenSetDefaultOptions() { - img.DrawText("123", this.Font, Pens.Dash(Color.Red, 1), Vector2.Zero); + this.img.DrawText("123", this.Font, Pens.Dash(Color.Red, 1), Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(3, img.ProcessorApplications.Count); // 3 fills where applied - Assert.IsType>(img.ProcessorApplications[0].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(3, this.img.ProcessorApplications.Count); // 3 fills where applied + Assert.IsType>(this.img.ProcessorApplications[0].processor); } [Fact] public void DrawForEachACharachterWhenPenSetAndFillFroEachWhenBrushSet() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText( + "123", + this.Font, + Brushes.Solid(Color.Red), + Pens.Dash(Color.Red, 1), + Vector2.Zero, + new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(6, img.ProcessorApplications.Count); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(6, this.img.ProcessorApplications.Count); } [Fact] public void DrawForEachACharachterWhenPenSetAndFillFroEachWhenBrushSetDefaultOptions() { - img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero); + this.img.DrawText("123", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(6, img.ProcessorApplications.Count); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(6, this.img.ProcessorApplications.Count); } [Fact] public void BrushAppliesBeforPen() { - img.DrawText("1", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero, new TextGraphicsOptions(true)); + this.img.DrawText( + "1", + this.Font, + Brushes.Solid(Color.Red), + Pens.Dash(Color.Red, 1), + Vector2.Zero, + new TextGraphicsOptions(true)); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(2, img.ProcessorApplications.Count); - Assert.IsType>(img.ProcessorApplications[0].processor); - Assert.IsType>(img.ProcessorApplications[1].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(2, this.img.ProcessorApplications.Count); + Assert.IsType>(this.img.ProcessorApplications[0].processor); + Assert.IsType>(this.img.ProcessorApplications[1].processor); } [Fact] public void BrushAppliesBeforPenDefaultOptions() { - img.DrawText("1", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero); + this.img.DrawText("1", this.Font, Brushes.Solid(Color.Red), Pens.Dash(Color.Red, 1), Vector2.Zero); - Assert.NotEmpty(img.ProcessorApplications); - Assert.Equal(2, img.ProcessorApplications.Count); - Assert.IsType>(img.ProcessorApplications[0].processor); - Assert.IsType>(img.ProcessorApplications[1].processor); + Assert.NotEmpty(this.img.ProcessorApplications); + Assert.Equal(2, this.img.ProcessorApplications.Count); + Assert.IsType>(this.img.ProcessorApplications[0].processor); + Assert.IsType>(this.img.ProcessorApplications[1].processor); } } } From 4b7fe2833693cd784e533a4523764f1b78c4c649 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 16 Mar 2017 02:38:44 +0100 Subject: [PATCH 03/10] Fixed a bug: When a processor "did not cover" the whole output image, there were memory garbage artifacts in the background. --- src/ImageSharp/Image/PixelAccessor{TColor}.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/Image/PixelAccessor{TColor}.cs b/src/ImageSharp/Image/PixelAccessor{TColor}.cs index a106765652..926e9f0558 100644 --- a/src/ImageSharp/Image/PixelAccessor{TColor}.cs +++ b/src/ImageSharp/Image/PixelAccessor{TColor}.cs @@ -59,7 +59,7 @@ namespace ImageSharp /// The width of the image represented by the pixel buffer. /// The height of the image represented by the pixel buffer. public PixelAccessor(int width, int height) - : this(width, height, new PinnedBuffer(width * height)) + : this(width, height, PinnedBuffer.CreateClean(width * height)) { } From 7cc408f5ed6a27416dcd8f702e8dbe5a410cfc4f Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 00:04:27 +1100 Subject: [PATCH 04/10] Add indexed png encoder benchmark [skip ci] --- .../Image/EncodeIndexedPng.cs | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs b/tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs new file mode 100644 index 0000000000..ba383873c2 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs @@ -0,0 +1,104 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Benchmarks.Image +{ + using System.IO; + + using BenchmarkDotNet.Attributes; + + using ImageSharp; + using ImageSharp.Formats; + using ImageSharp.Quantizers; + + /// + /// Benchmarks saving png files using different quantizers. System.Drawing cannot save indexed png files so we cannot compare. + /// + public class EncodeIndexedPng : BenchmarkBase + { + // System.Drawing needs this. + private Stream bmpStream; + private Image bmpCore; + + [Params(false)] + public bool LargeImage { get; set; } + + [Setup] + public void ReadImages() + { + if (this.bmpStream == null) + { + string path = this.LargeImage + ? "../ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg" + : "../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp"; + this.bmpStream = File.OpenRead(path); + this.bmpCore = new Image(this.bmpStream); + this.bmpStream.Position = 0; + } + } + + [Cleanup] + public void Cleanup() + { + this.bmpStream.Dispose(); + this.bmpCore.Dispose(); + } + + [Benchmark(Baseline = true, Description = "ImageSharp Octree Png")] + public void PngCoreOctree() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + PngEncoderOptions options = new PngEncoderOptions() { Quantizer = new OctreeQuantizer(), Quality = 256 }; + + this.bmpCore.SaveAsPng(memoryStream, options); + } + } + + [Benchmark(Description = "ImageSharp Octree NoDither Png")] + public void PngCoreOctreeNoDIther() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + PngEncoderOptions options = new PngEncoderOptions { Quantizer = new OctreeQuantizer { Dither = false }, Quality = 256 }; + + this.bmpCore.SaveAsPng(memoryStream, options); + } + } + + [Benchmark(Description = "ImageSharp Palette Png")] + public void PngCorePalette() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + PngEncoderOptions options = new PngEncoderOptions { Quantizer = new PaletteQuantizer(), Quality = 256 }; + + this.bmpCore.SaveAsPng(memoryStream, options); + } + } + + [Benchmark(Description = "ImageSharp Palette NoDither Png")] + public void PngCorePaletteNoDither() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + PngEncoderOptions options = new PngEncoderOptions { Quantizer = new PaletteQuantizer { Dither = false }, Quality = 256 }; + + this.bmpCore.SaveAsPng(memoryStream, options); + } + } + + [Benchmark(Description = "ImageSharp Wu Png")] + public void PngCoreWu() + { + using (MemoryStream memoryStream = new MemoryStream()) + { + PngEncoderOptions options = new PngEncoderOptions() { Quantizer = new WuQuantizer(), Quality = 256 }; + + this.bmpCore.SaveAsPng(memoryStream, options); + } + } + } +} \ No newline at end of file From b839b2ce62c4bf211d3682e24e27f437f595ddcc Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 00:26:13 +1100 Subject: [PATCH 05/10] Make all processors internal --- src/ImageSharp.Drawing/Processors/DrawImageProcessor.cs | 2 +- src/ImageSharp.Drawing/Processors/DrawPathProcessor.cs | 2 +- src/ImageSharp.Drawing/Processors/FillProcessor.cs | 4 ++-- src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs | 2 +- src/ImageSharp/ImageProcessor.cs | 2 +- .../Processors/Binarization/BinaryThresholdProcessor.cs | 2 +- .../Binarization/ErrorDiffusionDitherProcessor.cs | 2 +- .../Processors/Binarization/OrderedDitherProcessor.cs | 2 +- .../Processors/ColorMatrix/BlackWhiteProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/AchromatomalyProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/AchromatopsiaProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/DeuteranomalyProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/DeuteranopiaProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/ProtanomalyProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/ProtanopiaProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/TritanomalyProcessor.cs | 2 +- .../ColorMatrix/ColorBlindness/TritanopiaProcessor.cs | 2 +- .../{ColorMatrixFilter.cs => ColorMatrixProcessor.cs} | 2 +- .../Processors/ColorMatrix/GrayscaleBt601Processor.cs | 6 +++--- .../Processors/ColorMatrix/GrayscaleBt709Processor.cs | 6 +++--- .../Processing/Processors/ColorMatrix/HueProcessor.cs | 2 +- .../Processing/Processors/ColorMatrix/IColorMatrixFilter.cs | 2 +- .../Processors/ColorMatrix/KodachromeProcessor.cs | 2 +- .../Processing/Processors/ColorMatrix/LomographProcessor.cs | 2 +- .../Processing/Processors/ColorMatrix/PolaroidProcessor.cs | 2 +- .../Processors/ColorMatrix/SaturationProcessor.cs | 2 +- .../Processing/Processors/ColorMatrix/SepiaProcessor.cs | 2 +- .../Processing/Processors/Convolution/BoxBlurProcessor.cs | 2 +- .../Processors/Convolution/Convolution2DProcessor.cs | 2 +- .../Processors/Convolution/Convolution2PassProcessor.cs | 2 +- .../Processors/Convolution/ConvolutionProcessor.cs | 2 +- .../Convolution/EdgeDetection/EdgeDetector2DProcessor.cs | 2 +- .../EdgeDetection/EdgeDetectorCompassProcessor.cs | 2 +- .../Convolution/EdgeDetection/EdgeDetectorProcessor.cs | 2 +- .../Convolution/EdgeDetection/KayyaliProcessor.cs | 2 +- .../Processors/Convolution/EdgeDetection/KirschProcessor.cs | 2 +- .../Convolution/EdgeDetection/Laplacian3X3Processor.cs | 2 +- .../Convolution/EdgeDetection/Laplacian5X5Processor.cs | 2 +- .../EdgeDetection/LaplacianOfGaussianProcessor.cs | 2 +- .../Convolution/EdgeDetection/PrewittProcessor.cs | 2 +- .../Convolution/EdgeDetection/RobertsCrossProcessor.cs | 2 +- .../Convolution/EdgeDetection/RobinsonProcessor.cs | 2 +- .../Processors/Convolution/EdgeDetection/ScharrProcessor.cs | 2 +- .../Processors/Convolution/EdgeDetection/SobelProcessor.cs | 2 +- .../Processors/Convolution/GaussianBlurProcessor.cs | 2 +- .../Processors/Convolution/GaussianSharpenProcessor.cs | 2 +- .../Processing/Processors/Effects/AlphaProcessor.cs | 2 +- .../Processors/Effects/BackgroundColorProcessor.cs | 2 +- .../Processing/Processors/Effects/BrightnessProcessor.cs | 2 +- .../Processing/Processors/Effects/ContrastProcessor.cs | 2 +- .../Processing/Processors/Effects/InvertProcessor.cs | 2 +- .../Processing/Processors/Effects/OilPaintingProcessor.cs | 2 +- .../Processing/Processors/Effects/PixelateProcessor.cs | 2 +- .../Processing/Processors/Overlays/GlowProcessor.cs | 2 +- .../Processing/Processors/Overlays/VignetteProcessor.cs | 2 +- .../Processors/Transforms/CompandingResizeProcessor.cs | 2 +- .../Processing/Processors/Transforms/CropProcessor.cs | 2 +- .../Processors/Transforms/EntropyCropProcessor.cs | 2 +- .../Processing/Processors/Transforms/FlipProcessor.cs | 2 +- .../Processing/Processors/Transforms/Matrix3x2Processor.cs | 2 +- .../Processors/Transforms/ResamplingWeightedProcessor.cs | 2 +- .../Processing/Processors/Transforms/ResizeProcessor.cs | 2 +- .../Processing/Processors/Transforms/RotateProcessor.cs | 2 +- .../Processing/Processors/Transforms/SkewProcessor.cs | 2 +- 64 files changed, 69 insertions(+), 69 deletions(-) rename src/ImageSharp/Processing/Processors/ColorMatrix/{ColorMatrixFilter.cs => ColorMatrixProcessor.cs} (96%) diff --git a/src/ImageSharp.Drawing/Processors/DrawImageProcessor.cs b/src/ImageSharp.Drawing/Processors/DrawImageProcessor.cs index 1c1de45cbc..c67ba0370b 100644 --- a/src/ImageSharp.Drawing/Processors/DrawImageProcessor.cs +++ b/src/ImageSharp.Drawing/Processors/DrawImageProcessor.cs @@ -15,7 +15,7 @@ namespace ImageSharp.Drawing.Processors /// Combines two images together by blending the pixels. /// /// The pixel format. - public class DrawImageProcessor : ImageProcessor + internal class DrawImageProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp.Drawing/Processors/DrawPathProcessor.cs b/src/ImageSharp.Drawing/Processors/DrawPathProcessor.cs index 95f4ab4726..89ba0968bb 100644 --- a/src/ImageSharp.Drawing/Processors/DrawPathProcessor.cs +++ b/src/ImageSharp.Drawing/Processors/DrawPathProcessor.cs @@ -17,7 +17,7 @@ namespace ImageSharp.Drawing.Processors /// /// The type of the color. /// - public class DrawPathProcessor : ImageProcessor + internal class DrawPathProcessor : ImageProcessor where TColor : struct, IPixel { private const float AntialiasFactor = 1f; diff --git a/src/ImageSharp.Drawing/Processors/FillProcessor.cs b/src/ImageSharp.Drawing/Processors/FillProcessor.cs index 9fa01075d4..635829e9f1 100644 --- a/src/ImageSharp.Drawing/Processors/FillProcessor.cs +++ b/src/ImageSharp.Drawing/Processors/FillProcessor.cs @@ -16,8 +16,8 @@ namespace ImageSharp.Drawing.Processors /// Using the bursh as a source of pixels colors blends the brush color with source. /// /// The pixel format. - public class FillProcessor : ImageProcessor - where TColor : struct, IPixel + internal class FillProcessor : ImageProcessor + where TColor : struct, IPixel { /// /// The brush. diff --git a/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs index 4f468c7070..67b4aab5f7 100644 --- a/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs +++ b/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs @@ -17,7 +17,7 @@ namespace ImageSharp.Drawing.Processors /// /// The type of the color. /// - public class FillRegionProcessor : ImageProcessor + internal class FillRegionProcessor : ImageProcessor where TColor : struct, IPixel { private const float AntialiasFactor = 1f; diff --git a/src/ImageSharp/ImageProcessor.cs b/src/ImageSharp/ImageProcessor.cs index a0766d1edf..79525a8e83 100644 --- a/src/ImageSharp/ImageProcessor.cs +++ b/src/ImageSharp/ImageProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing /// Allows the application of processors to images. /// /// The pixel format. - public abstract class ImageProcessor : IImageProcessor + internal abstract class ImageProcessor : IImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs index 2d57957d3f..5555463418 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// . The image will be converted to grayscale before thresholding occurs. /// /// The pixel format. - public class BinaryThresholdProcessor : ImageProcessor + internal class BinaryThresholdProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Binarization/ErrorDiffusionDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/ErrorDiffusionDitherProcessor.cs index ce03c58a8a..50f042bd69 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/ErrorDiffusionDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/ErrorDiffusionDitherProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An that dithers an image using error diffusion. /// /// The pixel format. - public class ErrorDiffusionDitherProcessor : ImageProcessor + internal class ErrorDiffusionDitherProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Binarization/OrderedDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/OrderedDitherProcessor.cs index 4126419f25..c7f4d20ace 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/OrderedDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/OrderedDitherProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// An that dithers an image using error diffusion. /// /// The pixel format. - public class OrderedDitherProcessor : ImageProcessor + internal class OrderedDitherProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/BlackWhiteProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/BlackWhiteProcessor.cs index 0ea821bef6..0214af72de 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/BlackWhiteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/BlackWhiteProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image to their black and white equivalent. /// /// The pixel format. - public class BlackWhiteProcessor : ColorMatrixFilter + internal class BlackWhiteProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatomalyProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatomalyProcessor.cs index 15e7c78da1..d1e986a9df 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatomalyProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatomalyProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Achromatomaly (Color desensitivity) color blindness. /// /// The pixel format. - public class AchromatomalyProcessor : ColorMatrixFilter + internal class AchromatomalyProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatopsiaProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatopsiaProcessor.cs index adca0fe985..d17e28dcaf 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatopsiaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/AchromatopsiaProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Achromatopsia (Monochrome) color blindness. /// /// The pixel format. - public class AchromatopsiaProcessor : ColorMatrixFilter + internal class AchromatopsiaProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranomalyProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranomalyProcessor.cs index 6de54beeae..7f4529ba47 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranomalyProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranomalyProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Deuteranomaly (Green-Weak) color blindness. /// /// The pixel format. - public class DeuteranomalyProcessor : ColorMatrixFilter + internal class DeuteranomalyProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranopiaProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranopiaProcessor.cs index 4729ccc616..493ed2caed 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranopiaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/DeuteranopiaProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Deuteranopia (Green-Blind) color blindness. /// /// The pixel format. - public class DeuteranopiaProcessor : ColorMatrixFilter + internal class DeuteranopiaProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanomalyProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanomalyProcessor.cs index 200fff24d8..ddea24be01 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanomalyProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanomalyProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Protanopia (Red-Weak) color blindness. /// /// The pixel format. - public class ProtanomalyProcessor : ColorMatrixFilter + internal class ProtanomalyProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanopiaProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanopiaProcessor.cs index 7c0f03543f..c5446dbe1a 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanopiaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/ProtanopiaProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Protanopia (Red-Blind) color blindness. /// /// The pixel format. - public class ProtanopiaProcessor : ColorMatrixFilter + internal class ProtanopiaProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanomalyProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanomalyProcessor.cs index 63f1fd9eb1..846e9c61a7 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanomalyProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanomalyProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Tritanomaly (Blue-Weak) color blindness. /// /// The pixel format. - public class TritanomalyProcessor : ColorMatrixFilter + internal class TritanomalyProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanopiaProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanopiaProcessor.cs index 2200414fee..a0094f71f0 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanopiaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorBlindness/TritanopiaProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating Tritanopia (Blue-Blind) color blindness. /// /// The pixel format. - public class TritanopiaProcessor : ColorMatrixFilter + internal class TritanopiaProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixFilter.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixProcessor.cs similarity index 96% rename from src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixFilter.cs rename to src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixProcessor.cs index a37228a9ba..c75da00037 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixFilter.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/ColorMatrixProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// The color matrix filter. Inherit from this class to perform operation involving color matrices. /// /// The pixel format. - public abstract class ColorMatrixFilter : ImageProcessor, IColorMatrixFilter + internal abstract class ColorMatrixProcessor : ImageProcessor, IColorMatrixFilter where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt601Processor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt601Processor.cs index bd14da59e5..1f5a0fa7e9 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt601Processor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt601Processor.cs @@ -9,11 +9,11 @@ namespace ImageSharp.Processing.Processors using System.Numerics; /// - /// Converts the colors of the image to Grayscale applying the formula as specified by - /// ITU-R Recommendation BT.601 . + /// Converts the colors of the image to Grayscale applying the formula as specified by ITU-R Recommendation BT.601 + /// . /// /// The pixel format. - public class GrayscaleBt601Processor : ColorMatrixFilter + internal class GrayscaleBt601Processor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt709Processor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt709Processor.cs index 925a36c754..048462696a 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt709Processor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/GrayscaleBt709Processor.cs @@ -9,11 +9,11 @@ namespace ImageSharp.Processing.Processors using System.Numerics; /// - /// Converts the colors of the image to Grayscale applying the formula as specified by - /// ITU-R Recommendation BT.709 . + /// Converts the colors of the image to Grayscale applying the formula as specified by ITU-R Recommendation BT.709 + /// . /// /// The pixel format. - public class GrayscaleBt709Processor : ColorMatrixFilter + internal class GrayscaleBt709Processor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs index fdf5ffdb44..0d06c58682 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// An to change the hue of an . /// /// The pixel format. - public class HueProcessor : ColorMatrixFilter + internal class HueProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/IColorMatrixFilter.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/IColorMatrixFilter.cs index faee890eb6..57296a0c3b 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/IColorMatrixFilter.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/IColorMatrixFilter.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// alter the image pixels. /// /// The pixel format. - public interface IColorMatrixFilter : IImageProcessor + internal interface IColorMatrixFilter : IImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/KodachromeProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/KodachromeProcessor.cs index fee1684985..8df8efcd19 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/KodachromeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/KodachromeProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating an old Kodachrome camera effect. /// /// The pixel format. - public class KodachromeProcessor : ColorMatrixFilter + internal class KodachromeProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/LomographProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/LomographProcessor.cs index 0e614afe8a..b89caec863 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/LomographProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/LomographProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating an old Lomograph effect. /// /// The pixel format. - public class LomographProcessor : ColorMatrixFilter + internal class LomographProcessor : ColorMatrixProcessor where TColor : struct, IPixel { private static readonly TColor VeryDarkGreen = ColorBuilder.FromRGBA(0, 10, 0, 255); diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/PolaroidProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/PolaroidProcessor.cs index 666fe5bc0c..b5a23f8557 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/PolaroidProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/PolaroidProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Converts the colors of the image recreating an old Polaroid effect. /// /// The pixel format. - public class PolaroidProcessor : ColorMatrixFilter + internal class PolaroidProcessor : ColorMatrixProcessor where TColor : struct, IPixel { private static TColor veryDarkOrange = ColorBuilder.FromRGB(102, 34, 0); diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/SaturationProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/SaturationProcessor.cs index d63326385c..371294dd56 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/SaturationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/SaturationProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// An to change the saturation of an . /// /// The pixel format. - public class SaturationProcessor : ColorMatrixFilter + internal class SaturationProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/SepiaProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/SepiaProcessor.cs index d8fdc6cd1a..49a071bd98 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/SepiaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/SepiaProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// The formula used matches the svg specification. /// /// The pixel format. - public class SepiaProcessor : ColorMatrixFilter + internal class SepiaProcessor : ColorMatrixProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs index 3597ba7de7..7ffca534cd 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs @@ -11,7 +11,7 @@ namespace ImageSharp.Processing.Processors /// Applies a Box blur sampler to the image. /// /// The pixel format. - public class BoxBlurProcessor : ImageProcessor + internal class BoxBlurProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs index d104f5d351..77608e02be 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that uses two one-dimensional matrices to perform convolution against an image. /// /// The pixel format. - public class Convolution2DProcessor : ImageProcessor + internal class Convolution2DProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs index 1d118443c3..45906a46fc 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that uses two one-dimensional matrices to perform two-pass convolution against an image. /// /// The pixel format. - public class Convolution2PassProcessor : ImageProcessor + internal class Convolution2PassProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs index 6b5b6d3fe4..3ab95c4ce9 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that uses a 2 dimensional matrix to perform convolution against an image. /// /// The pixel format. - public class ConvolutionProcessor : ImageProcessor + internal class ConvolutionProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetector2DProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetector2DProcessor.cs index a8c786f712..b5c6816569 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetector2DProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetector2DProcessor.cs @@ -11,7 +11,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that detects edges within an image using two one-dimensional matrices. /// /// The pixel format. - public abstract class EdgeDetector2DProcessor : ImageProcessor, IEdgeDetectorProcessor + internal abstract class EdgeDetector2DProcessor : ImageProcessor, IEdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorCompassProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorCompassProcessor.cs index eb8491d4cd..e92c2d1093 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorCompassProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorCompassProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that detects edges within an image using a eight two dimensional matrices. /// /// The pixel format. - public abstract class EdgeDetectorCompassProcessor : ImageProcessor, IEdgeDetectorProcessor + internal abstract class EdgeDetectorCompassProcessor : ImageProcessor, IEdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorProcessor.cs index a963bb5780..d8b491faf5 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/EdgeDetectorProcessor.cs @@ -11,7 +11,7 @@ namespace ImageSharp.Processing.Processors /// Defines a sampler that detects edges within an image using a single two dimensional matrix. /// /// The pixel format. - public abstract class EdgeDetectorProcessor : ImageProcessor, IEdgeDetectorProcessor + internal abstract class EdgeDetectorProcessor : ImageProcessor, IEdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KayyaliProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KayyaliProcessor.cs index 6456cc073c..20e7b1b176 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KayyaliProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KayyaliProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class KayyaliProcessor : EdgeDetector2DProcessor + internal class KayyaliProcessor : EdgeDetector2DProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KirschProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KirschProcessor.cs index 90b3fc4b4c..1b88a2200e 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KirschProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/KirschProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class KirschProcessor : EdgeDetectorCompassProcessor + internal class KirschProcessor : EdgeDetectorCompassProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian3X3Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian3X3Processor.cs index c8823efee8..ec6963b1ea 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian3X3Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian3X3Processor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class Laplacian3X3Processor : EdgeDetectorProcessor + internal class Laplacian3X3Processor : EdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian5X5Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian5X5Processor.cs index 3aad6d1ef0..cc68c4fb71 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian5X5Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/Laplacian5X5Processor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class Laplacian5X5Processor : EdgeDetectorProcessor + internal class Laplacian5X5Processor : EdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/LaplacianOfGaussianProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/LaplacianOfGaussianProcessor.cs index a7da76e136..f0944e6818 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/LaplacianOfGaussianProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/LaplacianOfGaussianProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class LaplacianOfGaussianProcessor : EdgeDetectorProcessor + internal class LaplacianOfGaussianProcessor : EdgeDetectorProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/PrewittProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/PrewittProcessor.cs index fea9844183..fdb63d837e 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/PrewittProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/PrewittProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class PrewittProcessor : EdgeDetector2DProcessor + internal class PrewittProcessor : EdgeDetector2DProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobertsCrossProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobertsCrossProcessor.cs index 329a995c09..d9c5f5d213 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobertsCrossProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobertsCrossProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class RobertsCrossProcessor : EdgeDetector2DProcessor + internal class RobertsCrossProcessor : EdgeDetector2DProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobinsonProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobinsonProcessor.cs index 60726deab5..681d983c45 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobinsonProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/RobinsonProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class RobinsonProcessor : EdgeDetectorCompassProcessor + internal class RobinsonProcessor : EdgeDetectorCompassProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/ScharrProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/ScharrProcessor.cs index ed45ba0acf..c1e83b7f97 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/ScharrProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/ScharrProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class ScharrProcessor : EdgeDetector2DProcessor + internal class ScharrProcessor : EdgeDetector2DProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/SobelProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/SobelProcessor.cs index 3d2c583a7a..0c13fa3d24 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/SobelProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetection/SobelProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// The pixel format. [SuppressMessage("ReSharper", "StaticMemberInGenericType", Justification = "We want to use only one instance of each array field for each generic type.")] - public class SobelProcessor : EdgeDetector2DProcessor + internal class SobelProcessor : EdgeDetector2DProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs index ddaffc9b48..65a137e359 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs @@ -11,7 +11,7 @@ namespace ImageSharp.Processing.Processors /// Applies a Gaussian blur sampler to the image. /// /// The pixel format. - public class GaussianBlurProcessor : ImageProcessor + internal class GaussianBlurProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs index 6541b73800..bb3dc6f999 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs @@ -11,7 +11,7 @@ namespace ImageSharp.Processing.Processors /// Applies a Gaussian sharpening sampler to the image. /// /// The pixel format. - public class GaussianSharpenProcessor : ImageProcessor + internal class GaussianSharpenProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs index 11af92ea75..ce48aea1ad 100644 --- a/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/AlphaProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An to change the alpha component of an . /// /// The pixel format. - public class AlphaProcessor : ImageProcessor + internal class AlphaProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/BackgroundColorProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/BackgroundColorProcessor.cs index d6d209dc7e..3568afe418 100644 --- a/src/ImageSharp/Processing/Processors/Effects/BackgroundColorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/BackgroundColorProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Sets the background color of the image. /// /// The pixel format. - public class BackgroundColorProcessor : ImageProcessor + internal class BackgroundColorProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/BrightnessProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/BrightnessProcessor.cs index 566f2c6d74..84df5e89e8 100644 --- a/src/ImageSharp/Processing/Processors/Effects/BrightnessProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/BrightnessProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An to change the brightness of an . /// /// The pixel format. - public class BrightnessProcessor : ImageProcessor + internal class BrightnessProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/ContrastProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/ContrastProcessor.cs index f4acc42bfc..042e396996 100644 --- a/src/ImageSharp/Processing/Processors/Effects/ContrastProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/ContrastProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An to change the contrast of an . /// /// The pixel format. - public class ContrastProcessor : ImageProcessor + internal class ContrastProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/InvertProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/InvertProcessor.cs index 641cd1b47d..4358e89460 100644 --- a/src/ImageSharp/Processing/Processors/Effects/InvertProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/InvertProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An to invert the colors of an . /// /// The pixel format. - public class InvertProcessor : ImageProcessor + internal class InvertProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs index 6b9558ad2c..c5302bad03 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// /// Adapted from by Dewald Esterhuizen. /// The pixel format. - public class OilPaintingProcessor : ImageProcessor + internal class OilPaintingProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs index d9d78dfa8c..818b1f5137 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An to pixelate the colors of an . /// /// The pixel format. - public class PixelateProcessor : ImageProcessor + internal class PixelateProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs index 9043b66cb8..bb54c1f98b 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An that applies a radial glow effect an . /// /// The pixel format. - public class GlowProcessor : ImageProcessor + internal class GlowProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs index f1872d0b81..6eda3e42a0 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// An that applies a radial vignette effect to an . /// /// The pixel format. - public class VignetteProcessor : ImageProcessor + internal class VignetteProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/CompandingResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/CompandingResizeProcessor.cs index 2190254f0d..f5314d448d 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CompandingResizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CompandingResizeProcessor.cs @@ -14,7 +14,7 @@ namespace ImageSharp.Processing.Processors /// This version will expand and compress the image to and from a linear color space during processing. /// /// The pixel format. - public class CompandingResizeProcessor : ResamplingWeightedProcessor + internal class CompandingResizeProcessor : ResamplingWeightedProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs index 88f23a7fd6..7d473c55ed 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Provides methods to allow the cropping of an image. /// /// The pixel format. - public class CropProcessor : ImageProcessor + internal class CropProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs index d150c59d49..049fbf2de0 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// entropy. /// /// The pixel format. - public class EntropyCropProcessor : ImageProcessor + internal class EntropyCropProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs index da4f2b3a80..290d81799a 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Provides methods that allow the flipping of an image around its center point. /// /// The pixel format. - public class FlipProcessor : ImageProcessor + internal class FlipProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/Matrix3x2Processor.cs b/src/ImageSharp/Processing/Processors/Transforms/Matrix3x2Processor.cs index 7e87576870..0c290a9b62 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Matrix3x2Processor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Matrix3x2Processor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Provides methods to transform an image using a . /// /// The pixel format. - public abstract class Matrix3x2Processor : ImageProcessor + internal abstract class Matrix3x2Processor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs index 25a7a4efd6..2d6de41545 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ResamplingWeightedProcessor.cs @@ -12,7 +12,7 @@ namespace ImageSharp.Processing.Processors /// Adapted from /// /// The pixel format. - public abstract class ResamplingWeightedProcessor : ImageProcessor + internal abstract class ResamplingWeightedProcessor : ImageProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs index 9ec804aa4f..a43745a057 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ResizeProcessor.cs @@ -16,7 +16,7 @@ namespace ImageSharp.Processing.Processors /// This version and the have been separated out to improve performance. /// /// The pixel format. - public class ResizeProcessor : ResamplingWeightedProcessor + internal class ResizeProcessor : ResamplingWeightedProcessor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs index 22fbb895c1..eb206380c1 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Provides methods that allow the rotating of images. /// /// The pixel format. - public class RotateProcessor : Matrix3x2Processor + internal class RotateProcessor : Matrix3x2Processor where TColor : struct, IPixel { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs index c6afbedcce..5fe3f7d958 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs @@ -13,7 +13,7 @@ namespace ImageSharp.Processing.Processors /// Provides methods that allow the skewing of images. /// /// The pixel format. - public class SkewProcessor : Matrix3x2Processor + internal class SkewProcessor : Matrix3x2Processor where TColor : struct, IPixel { /// From be13c2a54cca4d3437319c10a1be67123faf7e57 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 00:36:25 +1100 Subject: [PATCH 06/10] Internalize memory objects --- .../Common/Memory/PixelDataPool{T}.cs | 2 +- src/ImageSharp/Image/PixelAccessor{TColor}.cs | 68 +++++++++---------- src/ImageSharp/Image/PixelArea{TColor}.cs | 4 +- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/src/ImageSharp/Common/Memory/PixelDataPool{T}.cs b/src/ImageSharp/Common/Memory/PixelDataPool{T}.cs index dcd031f6e2..f5c7871409 100644 --- a/src/ImageSharp/Common/Memory/PixelDataPool{T}.cs +++ b/src/ImageSharp/Common/Memory/PixelDataPool{T}.cs @@ -12,7 +12,7 @@ namespace ImageSharp /// Provides a resource pool that enables reusing instances of value type arrays for image data . /// /// The value type. - public class PixelDataPool + internal class PixelDataPool where T : struct { /// diff --git a/src/ImageSharp/Image/PixelAccessor{TColor}.cs b/src/ImageSharp/Image/PixelAccessor{TColor}.cs index 926e9f0558..25e232cf86 100644 --- a/src/ImageSharp/Image/PixelAccessor{TColor}.cs +++ b/src/ImageSharp/Image/PixelAccessor{TColor}.cs @@ -148,6 +148,37 @@ namespace ImageSharp } } + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + if (this.isDisposed) + { + return; + } + + // Note disposing is done. + this.isDisposed = true; + + this.pixelBuffer.Dispose(); + + // This object will be cleaned up by the Dispose method. + // Therefore, you should call GC.SuppressFinalize to + // take this object off the finalization queue + // and prevent finalization code for this object + // from executing a second time. + GC.SuppressFinalize(this); + } + + /// + /// Resets all the pixels to it's initial value. + /// + public void Reset() + { + Unsafe.InitBlock(this.pixelsBase, 0, (uint)(this.RowStride * this.Height)); + } + /// /// Copy an area of pixels to the image. /// @@ -157,7 +188,7 @@ namespace ImageSharp /// /// Thrown when an unsupported component order value is passed. /// - public void CopyFrom(PixelArea area, int targetY, int targetX = 0) + internal void CopyFrom(PixelArea area, int targetY, int targetX = 0) { this.CheckCoordinates(area, targetX, targetY); @@ -173,7 +204,7 @@ namespace ImageSharp /// /// Thrown when an unsupported component order value is passed. /// - public void CopyTo(PixelArea area, int sourceY, int sourceX = 0) + internal void CopyTo(PixelArea area, int sourceY, int sourceX = 0) { this.CheckCoordinates(area, sourceX, sourceY); @@ -190,7 +221,7 @@ namespace ImageSharp /// /// Thrown when an unsupported component order value is passed. /// - public void SafeCopyTo(PixelArea area, int sourceY, int sourceX = 0) + internal void SafeCopyTo(PixelArea area, int sourceY, int sourceX = 0) { int width = Math.Min(area.Width, this.Width - sourceX); if (width < 1) @@ -207,37 +238,6 @@ namespace ImageSharp this.CopyTo(area, sourceX, sourceY, width, height); } - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - if (this.isDisposed) - { - return; - } - - // Note disposing is done. - this.isDisposed = true; - - this.pixelBuffer.Dispose(); - - // This object will be cleaned up by the Dispose method. - // Therefore, you should call GC.SuppressFinalize to - // take this object off the finalization queue - // and prevent finalization code for this object - // from executing a second time. - GC.SuppressFinalize(this); - } - - /// - /// Resets all the pixels to it's initial value. - /// - public void Reset() - { - Unsafe.InitBlock(this.pixelsBase, 0, (uint)(this.RowStride * this.Height)); - } - /// /// Gets a to the row 'y' beginning from the pixel at 'x'. /// diff --git a/src/ImageSharp/Image/PixelArea{TColor}.cs b/src/ImageSharp/Image/PixelArea{TColor}.cs index be6debba2f..8f2fa5b7a1 100644 --- a/src/ImageSharp/Image/PixelArea{TColor}.cs +++ b/src/ImageSharp/Image/PixelArea{TColor}.cs @@ -5,17 +5,15 @@ namespace ImageSharp { using System; - using System.Buffers; using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; - using System.Runtime.InteropServices; /// /// Represents an area of generic pixels. /// /// The pixel format. - public sealed unsafe class PixelArea : IDisposable + internal sealed unsafe class PixelArea : IDisposable where TColor : struct, IPixel { /// From ac6c5ef39b3310bb52d6b2da206ee4c7f01e5fd0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 00:48:53 +1100 Subject: [PATCH 07/10] Bump version number --- src/ImageSharp.Drawing/ImageSharp.Drawing.csproj | 2 +- src/ImageSharp/ImageSharp.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj index cc1c526ae3..f690dac8d5 100644 --- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj +++ b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj @@ -2,7 +2,7 @@ An extension to ImageSharp that allows the drawing of images, paths, and text. ImageSharp.Drawing - 1.0.0-alpha3 + 1.0.0-alpha4 James Jackson-South and contributors netstandard1.1 true diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index de3e764734..63cb081c33 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -2,7 +2,7 @@ A cross-platform library for the processing of image files; written in C# ImageSharp - 1.0.0-alpha3 + 1.0.0-alpha4 James Jackson-South and contributors netstandard1.3;netstandard1.1 true From 67bfae661900533eb840c8c39aec4a3d0793f8b6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 00:49:49 +1100 Subject: [PATCH 08/10] Update readme --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 967bccf8aa..383cc11f87 100644 --- a/README.md +++ b/README.md @@ -93,12 +93,6 @@ using (Image image = new Image(stream)) } ``` -Individual processors can be initialised and apply processing against images. This allows nesting which brings the potential for powerful combinations of processing methods: - -```csharp -new BrightnessProcessor(50).Apply(sourceImage, sourceImage.Bounds); -``` - Setting individual pixel values is perfomed as follows: ```csharp From fe96988727652bae3e80d6b58301bfcd4db6f50d Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 10:25:37 +1100 Subject: [PATCH 09/10] Make Fast2DArray internal --- .../Common/Memory/Fast2DArray{T}.cs | 2 +- .../Dithering/ErrorDiffusion/ErrorDiffuser.cs | 23 +++++------ .../ErrorDiffusion/IErrorDiffuser.cs | 5 --- src/ImageSharp/Dithering/Ordered/Bayer.cs | 17 +++------ .../Dithering/Ordered/IOrderedDither.cs | 9 +---- src/ImageSharp/Dithering/Ordered/Ordered.cs | 17 +++------ .../Dithering/Ordered/OrderedDither4x4.cs | 38 +++++++++++++++++++ 7 files changed, 64 insertions(+), 47 deletions(-) create mode 100644 src/ImageSharp/Dithering/Ordered/OrderedDither4x4.cs diff --git a/src/ImageSharp/Common/Memory/Fast2DArray{T}.cs b/src/ImageSharp/Common/Memory/Fast2DArray{T}.cs index 3455031fdb..401c83ce61 100644 --- a/src/ImageSharp/Common/Memory/Fast2DArray{T}.cs +++ b/src/ImageSharp/Common/Memory/Fast2DArray{T}.cs @@ -13,7 +13,7 @@ namespace ImageSharp /// Provides fast access to 2D arrays. /// /// The type of elements in the array. - public struct Fast2DArray + internal struct Fast2DArray { /// /// The 1D representation of the 2D array. diff --git a/src/ImageSharp/Dithering/ErrorDiffusion/ErrorDiffuser.cs b/src/ImageSharp/Dithering/ErrorDiffusion/ErrorDiffuser.cs index 20a45d4df6..cde146f1e5 100644 --- a/src/ImageSharp/Dithering/ErrorDiffusion/ErrorDiffuser.cs +++ b/src/ImageSharp/Dithering/ErrorDiffusion/ErrorDiffuser.cs @@ -5,12 +5,11 @@ namespace ImageSharp.Dithering { - using System; using System.Numerics; using System.Runtime.CompilerServices; /// - /// The base class for performing effor diffusion based dithering. + /// The base class for performing error diffusion based dithering. /// public abstract class ErrorDiffuser : IErrorDiffuser { @@ -34,19 +33,24 @@ namespace ImageSharp.Dithering /// private readonly int startingOffset; + /// + /// The diffusion matrix + /// + private readonly Fast2DArray matrix; + /// /// Initializes a new instance of the class. /// /// The dithering matrix. /// The divisor. - protected ErrorDiffuser(Fast2DArray matrix, byte divisor) + internal ErrorDiffuser(Fast2DArray matrix, byte divisor) { Guard.NotNull(matrix, nameof(matrix)); Guard.MustBeGreaterThan(divisor, 0, nameof(divisor)); - this.Matrix = matrix; - this.matrixWidth = this.Matrix.Width; - this.matrixHeight = this.Matrix.Height; + this.matrix = matrix; + this.matrixWidth = this.matrix.Width; + this.matrixHeight = this.matrix.Height; this.divisorVector = new Vector4(divisor); this.startingOffset = 0; @@ -62,9 +66,6 @@ namespace ImageSharp.Dithering } } - /// - public Fast2DArray Matrix { get; } - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Dither(PixelAccessor pixels, TColor source, TColor transformed, int x, int y, int width, int height) @@ -87,9 +88,9 @@ namespace ImageSharp.Dithering if (matrixX > 0 && matrixX < width && matrixY > 0 && matrixY < height) { - float coefficient = this.Matrix[row, col]; + float coefficient = this.matrix[row, col]; - // Good to disable here as we are not comparing matematical output. + // Good to disable here as we are not comparing mathematical output. // ReSharper disable once CompareOfFloatsByEqualityOperator if (coefficient == 0) { diff --git a/src/ImageSharp/Dithering/ErrorDiffusion/IErrorDiffuser.cs b/src/ImageSharp/Dithering/ErrorDiffusion/IErrorDiffuser.cs index 4fb31c13e4..18079b1fb2 100644 --- a/src/ImageSharp/Dithering/ErrorDiffusion/IErrorDiffuser.cs +++ b/src/ImageSharp/Dithering/ErrorDiffusion/IErrorDiffuser.cs @@ -12,11 +12,6 @@ namespace ImageSharp.Dithering /// public interface IErrorDiffuser { - /// - /// Gets the dithering matrix - /// - Fast2DArray Matrix { get; } - /// /// Transforms the image applying the dither matrix. This method alters the input pixels array /// diff --git a/src/ImageSharp/Dithering/Ordered/Bayer.cs b/src/ImageSharp/Dithering/Ordered/Bayer.cs index 1027e51d94..3792c3c023 100644 --- a/src/ImageSharp/Dithering/Ordered/Bayer.cs +++ b/src/ImageSharp/Dithering/Ordered/Bayer.cs @@ -5,13 +5,11 @@ namespace ImageSharp.Dithering.Ordered { - using System; - /// /// Applies error diffusion based dithering using the 4x4 Bayer dithering matrix. /// /// - public class Bayer : IOrderedDither + public sealed class Bayer : OrderedDither4x4 { /// /// The threshold matrix. @@ -26,15 +24,12 @@ namespace ImageSharp.Dithering.Ordered { 255, 127, 223, 95 } }; - /// - public Fast2DArray Matrix { get; } = ThresholdMatrix; - - /// - public void Dither(PixelAccessor pixels, TColor source, TColor upper, TColor lower, byte[] bytes, int index, int x, int y, int width, int height) - where TColor : struct, IPixel + /// + /// Initializes a new instance of the class. + /// + public Bayer() + : base(ThresholdMatrix) { - source.ToXyzwBytes(bytes, 0); - pixels[x, y] = ThresholdMatrix[y % 3, x % 3] >= bytes[index] ? lower : upper; } } } \ No newline at end of file diff --git a/src/ImageSharp/Dithering/Ordered/IOrderedDither.cs b/src/ImageSharp/Dithering/Ordered/IOrderedDither.cs index 162cdb6a18..5c98973747 100644 --- a/src/ImageSharp/Dithering/Ordered/IOrderedDither.cs +++ b/src/ImageSharp/Dithering/Ordered/IOrderedDither.cs @@ -5,18 +5,11 @@ namespace ImageSharp.Dithering { - using System; - /// /// Encapsulates properties and methods required to perfom ordered dithering on an image. /// public interface IOrderedDither { - /// - /// Gets the dithering matrix - /// - Fast2DArray Matrix { get; } - /// /// Transforms the image applying the dither matrix. This method alters the input pixels array /// @@ -34,4 +27,4 @@ namespace ImageSharp.Dithering void Dither(PixelAccessor pixels, TColor source, TColor upper, TColor lower, byte[] bytes, int index, int x, int y, int width, int height) where TColor : struct, IPixel; } -} +} \ No newline at end of file diff --git a/src/ImageSharp/Dithering/Ordered/Ordered.cs b/src/ImageSharp/Dithering/Ordered/Ordered.cs index aabca31aad..ae75b87f21 100644 --- a/src/ImageSharp/Dithering/Ordered/Ordered.cs +++ b/src/ImageSharp/Dithering/Ordered/Ordered.cs @@ -5,13 +5,11 @@ namespace ImageSharp.Dithering.Ordered { - using System; - /// /// Applies error diffusion based dithering using the 4x4 ordered dithering matrix. /// /// - public class Ordered : IOrderedDither + public sealed class Ordered : OrderedDither4x4 { /// /// The threshold matrix. @@ -26,15 +24,12 @@ namespace ImageSharp.Dithering.Ordered { 240, 112, 208, 80 } }; - /// - public Fast2DArray Matrix { get; } = ThresholdMatrix; - - /// - public void Dither(PixelAccessor pixels, TColor source, TColor upper, TColor lower, byte[] bytes, int index, int x, int y, int width, int height) - where TColor : struct, IPixel + /// + /// Initializes a new instance of the class. + /// + public Ordered() + : base(ThresholdMatrix) { - source.ToXyzwBytes(bytes, 0); - pixels[x, y] = ThresholdMatrix[y % 3, x % 3] >= bytes[index] ? lower : upper; } } } \ No newline at end of file diff --git a/src/ImageSharp/Dithering/Ordered/OrderedDither4x4.cs b/src/ImageSharp/Dithering/Ordered/OrderedDither4x4.cs new file mode 100644 index 0000000000..c2b55d98eb --- /dev/null +++ b/src/ImageSharp/Dithering/Ordered/OrderedDither4x4.cs @@ -0,0 +1,38 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageSharp.Dithering.Ordered +{ + /// + /// The base class for performing ordered ditheroing using a 4x4 matrix. + /// + public abstract class OrderedDither4x4 : IOrderedDither + { + /// + /// The dithering matrix + /// + private Fast2DArray matrix; + + /// + /// Initializes a new instance of the class. + /// + /// The thresholding matrix. + internal OrderedDither4x4(Fast2DArray matrix) + { + this.matrix = matrix; + } + + /// + public void Dither(PixelAccessor pixels, TColor source, TColor upper, TColor lower, byte[] bytes, int index, int x, int y, int width, int height) + where TColor : struct, IPixel + { + // TODO: This doesn't really cut it for me. + // I'd rather be using float but we need to add some sort of movalization vector methods to all IPixel implementations + // before we can do that as the vectors all cover different ranges. + source.ToXyzwBytes(bytes, 0); + pixels[x, y] = this.matrix[y % 3, x % 3] >= bytes[index] ? lower : upper; + } + } +} \ No newline at end of file From 8c7cd87c1d0ff034747cf611d4f2050f9080c321 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Mar 2017 17:22:36 +1100 Subject: [PATCH 10/10] Make QuantizePixel non-inheritable --- src/ImageSharp/Quantizers/IQuantizer.cs | 2 - .../Quantizers/Octree/OctreeQuantizer.cs | 94 +++++++++++++++++-- src/ImageSharp/Quantizers/Octree/Quantizer.cs | 55 ++--------- .../Quantizers/Palette/PaletteQuantizer.cs | 67 ++++++++++++- 4 files changed, 158 insertions(+), 60 deletions(-) diff --git a/src/ImageSharp/Quantizers/IQuantizer.cs b/src/ImageSharp/Quantizers/IQuantizer.cs index 9ee3072666..88f273e9b6 100644 --- a/src/ImageSharp/Quantizers/IQuantizer.cs +++ b/src/ImageSharp/Quantizers/IQuantizer.cs @@ -5,8 +5,6 @@ namespace ImageSharp.Quantizers { - using System; - using ImageSharp.Dithering; /// diff --git a/src/ImageSharp/Quantizers/Octree/OctreeQuantizer.cs b/src/ImageSharp/Quantizers/Octree/OctreeQuantizer.cs index c047e1af48..2590f297eb 100644 --- a/src/ImageSharp/Quantizers/Octree/OctreeQuantizer.cs +++ b/src/ImageSharp/Quantizers/Octree/OctreeQuantizer.cs @@ -7,6 +7,7 @@ namespace ImageSharp.Quantizers { using System; using System.Collections.Generic; + using System.Runtime.CompilerServices; /// /// Encapsulates methods to calculate the color palette if an image using an Octree pattern. @@ -16,6 +17,11 @@ namespace ImageSharp.Quantizers public sealed class OctreeQuantizer : Quantizer where TColor : struct, IPixel { + /// + /// A lookup table for colors + /// + private readonly Dictionary colorMap = new Dictionary(); + /// /// The pixel buffer, used to reduce allocations. /// @@ -31,6 +37,11 @@ namespace ImageSharp.Quantizers /// private int colors; + /// + /// The reduced image palette + /// + private TColor[] palette; + /// /// Initializes a new instance of the class. /// @@ -52,6 +63,58 @@ namespace ImageSharp.Quantizers return base.Quantize(image, maxColors); } + /// + /// Execute a second pass through the bitmap + /// + /// The source image. + /// The output pixel array + /// The width in pixels of the image + /// The height in pixels of the image + protected override void SecondPass(PixelAccessor source, byte[] output, int width, int height) + { + // Load up the values for the first pixel. We can use these to speed up the second + // pass of the algorithm by avoiding transforming rows of identical color. + TColor sourcePixel = source[0, 0]; + TColor previousPixel = sourcePixel; + byte pixelValue = this.QuantizePixel(sourcePixel); + TColor[] colorPalette = this.GetPalette(); + TColor transformedPixel = colorPalette[pixelValue]; + + for (int y = 0; y < height; y++) + { + // And loop through each column + for (int x = 0; x < width; x++) + { + // Get the pixel. + sourcePixel = source[x, y]; + + // Check if this is the same as the last pixel. If so use that value + // rather than calculating it again. This is an inexpensive optimization. + if (!previousPixel.Equals(sourcePixel)) + { + // Quantize the pixel + pixelValue = this.QuantizePixel(sourcePixel); + + // And setup the previous pointer + previousPixel = sourcePixel; + + if (this.Dither) + { + transformedPixel = colorPalette[pixelValue]; + } + } + + if (this.Dither) + { + // Apply the dithering matrix. We have to reapply the value now as the original has changed. + this.DitherType.Dither(source, sourcePixel, transformedPixel, x, y, width, height); + } + + output[(y * source.Width) + x] = pixelValue; + } + } + } + /// /// Process the pixel in the first pass of the algorithm /// @@ -69,26 +132,39 @@ namespace ImageSharp.Quantizers } /// - /// Override this to process the pixel in the second pass of the algorithm + /// Retrieve the palette for the quantized image. /// - /// The pixel to quantize /// - /// The quantized value + /// The new color palette /// - protected override byte QuantizePixel(TColor pixel) + protected override TColor[] GetPalette() { - return (byte)this.octree.GetPaletteIndex(pixel, this.pixelBuffer); + if (this.palette == null) + { + this.palette = this.octree.Palletize(Math.Max(this.colors, 1)); + } + + return this.palette; } /// - /// Retrieve the palette for the quantized image. + /// Process the pixel in the second pass of the algorithm /// + /// The pixel to quantize /// - /// The new color palette + /// The quantized value /// - protected override TColor[] GetPalette() + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private byte QuantizePixel(TColor pixel) { - return this.octree.Palletize(Math.Max(this.colors, 1)); + if (this.Dither) + { + // The colors have changed so we need to use Euclidean distance caclulation to find the closest value. + // This palette can never be null here. + return this.GetClosestColor(pixel, this.palette, this.colorMap); + } + + return (byte)this.octree.GetPaletteIndex(pixel, this.pixelBuffer); } /// diff --git a/src/ImageSharp/Quantizers/Octree/Quantizer.cs b/src/ImageSharp/Quantizers/Octree/Quantizer.cs index 8af638de35..0e6540d426 100644 --- a/src/ImageSharp/Quantizers/Octree/Quantizer.cs +++ b/src/ImageSharp/Quantizers/Octree/Quantizer.cs @@ -9,7 +9,6 @@ namespace ImageSharp.Quantizers using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; - using ImageSharp.Dithering; /// @@ -19,21 +18,11 @@ namespace ImageSharp.Quantizers public abstract class Quantizer : IDitheredQuantizer where TColor : struct, IPixel { - /// - /// A lookup table for colors - /// - private readonly Dictionary colorMap = new Dictionary(); - /// /// Flag used to indicate whether a single pass or two passes are needed for quantization. /// private readonly bool singlePass; - /// - /// The reduced image palette - /// - private TColor[] palette; - /// /// Initializes a new instance of the class. /// @@ -65,6 +54,7 @@ namespace ImageSharp.Quantizers int height = image.Height; int width = image.Width; byte[] quantizedPixels = new byte[width * height]; + TColor[] colorPalette; using (PixelAccessor pixels = image.Lock()) { @@ -76,8 +66,8 @@ namespace ImageSharp.Quantizers this.FirstPass(pixels, width, height); } - // Get the palette - this.palette = this.GetPalette(); + // Collect the palette. Octree requires this to be done before the second pass runs. + colorPalette = this.GetPalette(); if (this.Dither) { @@ -94,7 +84,7 @@ namespace ImageSharp.Quantizers } } - return new QuantizedImage(width, height, this.palette, quantizedPixels); + return new QuantizedImage(width, height, colorPalette, quantizedPixels); } /// @@ -124,25 +114,7 @@ namespace ImageSharp.Quantizers /// The output pixel array /// The width in pixels of the image /// The height in pixels of the image - protected virtual void SecondPass(PixelAccessor source, byte[] output, int width, int height) - { - for (int y = 0; y < height; y++) - { - // And loop through each column - for (int x = 0; x < width; x++) - { - if (this.Dither) - { - // Apply the dithering matrix - TColor sourcePixel = source[x, y]; - TColor transformedPixel = this.palette[this.GetClosestColor(sourcePixel, this.palette, this.colorMap)]; - this.DitherType.Dither(source, sourcePixel, transformedPixel, x, y, width, height); - } - - output[(y * source.Width) + x] = this.QuantizePixel(source[x, y]); - } - } - } + protected abstract void SecondPass(PixelAccessor source, byte[] output, int width, int height); /// /// Override this to process the pixel in the first pass of the algorithm @@ -157,16 +129,7 @@ namespace ImageSharp.Quantizers } /// - /// Override this to process the pixel in the second pass of the algorithm - /// - /// The pixel to quantize - /// - /// The quantized value - /// - protected abstract byte QuantizePixel(TColor pixel); - - /// - /// Retrieve the palette for the quantized image + /// Retrieve the palette for the quantized image. Can be called more than once so make sure calls are cached. /// /// /// @@ -184,9 +147,9 @@ namespace ImageSharp.Quantizers protected byte GetClosestColor(TColor pixel, TColor[] colorPalette, Dictionary cache) { // Check if the color is in the lookup table - if (this.colorMap.ContainsKey(pixel)) + if (cache.ContainsKey(pixel)) { - return this.colorMap[pixel]; + return cache[pixel]; } // Not found - loop through the palette and find the nearest match. @@ -215,7 +178,7 @@ namespace ImageSharp.Quantizers } // Now I have the index, pop it into the cache for next time - this.colorMap.Add(pixel, colorIndex); + cache.Add(pixel, colorIndex); return colorIndex; } diff --git a/src/ImageSharp/Quantizers/Palette/PaletteQuantizer.cs b/src/ImageSharp/Quantizers/Palette/PaletteQuantizer.cs index 19f10aabb0..dedb5ca238 100644 --- a/src/ImageSharp/Quantizers/Palette/PaletteQuantizer.cs +++ b/src/ImageSharp/Quantizers/Palette/PaletteQuantizer.cs @@ -7,6 +7,8 @@ namespace ImageSharp.Quantizers { using System; using System.Collections.Generic; + using System.Numerics; + using System.Runtime.CompilerServices; /// /// Encapsulates methods to create a quantized image based upon the given palette. @@ -69,10 +71,56 @@ namespace ImageSharp.Quantizers return base.Quantize(image, maxColors); } - /// - protected override byte QuantizePixel(TColor pixel) + /// + /// Execute a second pass through the bitmap + /// + /// The source image. + /// The output pixel array + /// The width in pixels of the image + /// The height in pixels of the image + protected override void SecondPass(PixelAccessor source, byte[] output, int width, int height) { - return this.GetClosestColor(pixel, this.colors, this.colorMap); + // Load up the values for the first pixel. We can use these to speed up the second + // pass of the algorithm by avoiding transforming rows of identical color. + TColor sourcePixel = source[0, 0]; + TColor previousPixel = sourcePixel; + byte pixelValue = this.QuantizePixel(sourcePixel); + TColor[] colorPalette = this.GetPalette(); + TColor transformedPixel = colorPalette[pixelValue]; + + for (int y = 0; y < height; y++) + { + // And loop through each column + for (int x = 0; x < width; x++) + { + // Get the pixel. + sourcePixel = source[x, y]; + + // Check if this is the same as the last pixel. If so use that value + // rather than calculating it again. This is an inexpensive optimization. + if (!previousPixel.Equals(sourcePixel)) + { + // Quantize the pixel + pixelValue = this.QuantizePixel(sourcePixel); + + // And setup the previous pointer + previousPixel = sourcePixel; + + if (this.Dither) + { + transformedPixel = colorPalette[pixelValue]; + } + } + + if (this.Dither) + { + // Apply the dithering matrix. We have to reapply the value now as the original has changed. + this.DitherType.Dither(source, sourcePixel, transformedPixel, x, y, width, height); + } + + output[(y * source.Width) + x] = pixelValue; + } + } } /// @@ -80,5 +128,18 @@ namespace ImageSharp.Quantizers { return this.colors; } + + /// + /// Process the pixel in the second pass of the algorithm + /// + /// The pixel to quantize + /// + /// The quantized value + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private byte QuantizePixel(TColor pixel) + { + return this.GetClosestColor(pixel, this.GetPalette(), this.colorMap); + } } } \ No newline at end of file