From f3c3cb6413a462a9a8abf02839d72d82209ca475 Mon Sep 17 00:00:00 2001 From: Evangelink Date: Fri, 16 Oct 2020 11:14:19 +0200 Subject: [PATCH 01/61] wip - Add basic structure for the swizzler --- .../Transforms/SwizzleExtensions.cs | 24 ++++++++++++++ .../Processors/Transforms/ISwizzler.cs | 18 ++++++++++ .../SwizzleProcessor{TSwizzler,TPixel}.cs | 33 +++++++++++++++++++ .../Transforms/SwizzleProcessor{TSwizzler}.cs | 32 ++++++++++++++++++ .../Processing/Transforms/SwizzleTests.cs | 31 +++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 src/ImageSharp/Processing/Extensions/Transforms/SwizzleExtensions.cs create mode 100644 src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs create mode 100644 src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs create mode 100644 src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs create mode 100644 tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs diff --git a/src/ImageSharp/Processing/Extensions/Transforms/SwizzleExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/SwizzleExtensions.cs new file mode 100644 index 0000000000..c02b3a00d6 --- /dev/null +++ b/src/ImageSharp/Processing/Extensions/Transforms/SwizzleExtensions.cs @@ -0,0 +1,24 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Processing.Processors.Transforms; + +namespace SixLabors.ImageSharp.Processing.Extensions.Transforms +{ + /// + /// Defines extensions that allow the application of swizzle operations on an + /// + public static class SwizzleExtensions + { + /// + /// Swizzles an image. + /// + /// The image to swizzle. + /// The swizzler function. + /// The swizzler function type. + /// The to allow chaining of operations. + public static IImageProcessingContext Swizzle(this IImageProcessingContext source, TSwizzler swizzler) + where TSwizzler : struct, ISwizzler + => source.ApplyProcessor(new SwizzleProcessor(swizzler)); + } +} diff --git a/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs new file mode 100644 index 0000000000..0230b7a868 --- /dev/null +++ b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs @@ -0,0 +1,18 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.ImageSharp.Processing.Processors.Transforms +{ + /// + /// Encapsulate an algorithm to swizzle pixels in an image. + /// + public interface ISwizzler + { + /// + /// Applies the swizzle transformation to a given point. + /// + /// Point to transform. + /// Transformed point. + Point Transform(Point point); + } +} diff --git a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs new file mode 100644 index 0000000000..a42a4bf773 --- /dev/null +++ b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs @@ -0,0 +1,33 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.PixelFormats; + +namespace SixLabors.ImageSharp.Processing.Processors.Transforms +{ + internal class SwizzleProcessor : ImageProcessor + where TSwizzler : struct, ISwizzler + where TPixel : unmanaged, IPixel + { + private readonly TSwizzler swizzler; + + public SwizzleProcessor(Configuration configuration, TSwizzler swizzler, Image source, Rectangle sourceRectangle) + : base(configuration, source, sourceRectangle) + { + this.swizzler = swizzler; + } + + /// + protected override void OnFrameApply(ImageFrame source) + { + for (int y = 0; y < source.Height; y++) + { + var pixelRowSpan = source.GetPixelRowSpan(y); + for (int x = 0; x < source.Width; x++) + { + var newPoint = this.swizzler.Transform(new Point(x, y)); + } + } + } + } +} diff --git a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs new file mode 100644 index 0000000000..e5b95e673d --- /dev/null +++ b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs @@ -0,0 +1,32 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.PixelFormats; + +namespace SixLabors.ImageSharp.Processing.Processors.Transforms +{ + /// + /// Defines a swizzle operation on an image. + /// + /// The swizzle function type. + public sealed class SwizzleProcessor : IImageProcessor + where TSwizzler : struct, ISwizzler + { + /// + /// Initializes a new instance of the class. + /// + /// The swizzler operation. + public SwizzleProcessor(TSwizzler swizzler) + => this.Swizzler = swizzler; + + /// + /// Gets the swizzler operation. + /// + public TSwizzler Swizzler { get; } + + /// + public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle) + where TPixel : unmanaged, IPixel + => new SwizzleProcessor(configuration, this, source, sourceRectangle); + } +} diff --git a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs new file mode 100644 index 0000000000..2862df2127 --- /dev/null +++ b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs @@ -0,0 +1,31 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Processing.Extensions.Transforms; +using SixLabors.ImageSharp.Processing.Processors.Transforms; +using Xunit; + +namespace SixLabors.ImageSharp.Tests.Processing.Transforms +{ + public class SwizzleTests : BaseImageOperationsExtensionTest + { + private struct InvertXAndYSwizzler : ISwizzler + { + public Point Transform(Point point) => new Point(point.Y, point.X); + } + + [Fact] + public void RotateDegreesFloatRotateProcessorWithAnglesSet() + { + this.operations.Swizzle(default(InvertXAndYSwizzler)); + SwizzleProcessor processor = this.Verify>(); + + // assert that pixels have been changed + + this.operations.Swizzle(default(InvertXAndYSwizzler)); + SwizzleProcessor processor2 = this.Verify>(); + + // assert that pixels have been changed (i.e. back to original) + } + } +} From bc7ea4f8bffeb21e4f39e9cdebc42b8c67aa39ae Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 8 Nov 2020 12:41:38 +0100 Subject: [PATCH 02/61] Use Interlocked.Increment during histogram calculation, fixes issue #1416 --- .../GlobalHistogramEqualizationProcessor{TPixel}.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index 274376671b..0c5a109a62 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -6,6 +6,7 @@ using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Threading; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -51,7 +52,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization using IMemoryOwner histogramBuffer = memoryAllocator.Allocate(this.LuminanceLevels, AllocationOptions.Clean); - // Build the histogram of the grayscale levels + // Build the histogram of the grayscale levels. var grayscaleOperation = new GrayscaleLevelsRowOperation(interest, histogramBuffer, source, this.LuminanceLevels); ParallelRowIterator.IterateRows( this.Configuration, @@ -114,7 +115,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization #endif public void Invoke(int y) { - ref int histogramBase = ref MemoryMarshal.GetReference(this.histogramBuffer.GetSpan()); ref TPixel pixelBase = ref MemoryMarshal.GetReference(this.source.GetPixelRowSpan(y)); int levels = this.luminanceLevels; @@ -123,7 +123,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization // TODO: We should bulk convert here. var vector = Unsafe.Add(ref pixelBase, x).ToVector4(); int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); - Unsafe.Add(ref histogramBase, luminance)++; + ref int histogramAtLuminance = ref MemoryMarshal.GetReference(this.histogramBuffer.Slice(luminance)); + Interlocked.Increment(ref histogramAtLuminance); } } } From 82a5a61f3d1ba11fdc6fae5cbcfebe379bc4686c Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 8 Nov 2020 12:55:53 +0100 Subject: [PATCH 03/61] Add global histogram equalization test which compares result to reference output --- .../HistogramEqualizationTests.cs | 39 ++++++++++++++----- tests/ImageSharp.Tests/TestImages.cs | 1 + tests/Images/External | 2 +- .../640px-Unequalized_Hawkes_Bay_NZ.jpg | 3 ++ 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 tests/Images/Input/Jpg/baseline/640px-Unequalized_Hawkes_Bay_NZ.jpg diff --git a/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs b/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs index 1c1da6f191..4460f04fb1 100644 --- a/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs +++ b/tests/ImageSharp.Tests/Processing/Normalization/HistogramEqualizationTests.cs @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Normalization [Theory] [InlineData(256)] [InlineData(65536)] - public void HistogramEqualizationTest(int luminanceLevels) + public void GlobalHistogramEqualization_WithDifferentLumanceLevels(int luminanceLevels) { // Arrange var pixels = new byte[] @@ -45,20 +45,21 @@ namespace SixLabors.ImageSharp.Tests.Processing.Normalization var expected = new byte[] { - 0, 12, 53, 32, 146, 53, 174, 53, - 57, 32, 12, 227, 219, 202, 32, 154, - 65, 85, 93, 239, 251, 227, 65, 158, - 73, 146, 146, 247, 255, 235, 154, 130, - 97, 166, 117, 231, 243, 210, 117, 117, - 117, 190, 36, 190, 178, 93, 20, 170, - 130, 202, 73, 20, 12, 53, 85, 194, - 146, 206, 130, 117, 85, 166, 182, 215 + 0, 12, 53, 32, 146, 53, 174, 53, + 57, 32, 12, 227, 219, 202, 32, 154, + 65, 85, 93, 239, 251, 227, 65, 158, + 73, 146, 146, 247, 255, 235, 154, 130, + 97, 166, 117, 231, 243, 210, 117, 117, + 117, 190, 36, 190, 178, 93, 20, 170, + 130, 202, 73, 20, 12, 53, 85, 194, + 146, 206, 130, 117, 85, 166, 182, 215 }; // Act image.Mutate(x => x.HistogramEqualization(new HistogramEqualizationOptions { - LuminanceLevels = luminanceLevels + LuminanceLevels = luminanceLevels, + Method = HistogramEqualizationMethod.Global })); // Assert @@ -75,6 +76,24 @@ namespace SixLabors.ImageSharp.Tests.Processing.Normalization } } + [Theory] + [WithFile(TestImages.Jpeg.Baseline.HistogramEqImage, PixelTypes.Rgba32)] + public void GlobalHistogramEqualization_CompareToReferenceOutput(TestImageProvider provider) + where TPixel : unmanaged, IPixel + { + using (Image image = provider.GetImage()) + { + var options = new HistogramEqualizationOptions + { + Method = HistogramEqualizationMethod.Global, + LuminanceLevels = 256, + }; + image.Mutate(x => x.HistogramEqualization(options)); + image.DebugSave(provider); + image.CompareToReferenceOutput(ValidatorComparer, provider, extension: "png"); + } + } + [Theory] [WithFile(TestImages.Jpeg.Baseline.LowContrast, PixelTypes.Rgba32)] public void Adaptive_SlidingWindow_15Tiles_WithClipping(TestImageProvider provider) diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index dce36bb0fb..e4c73928de 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -196,6 +196,7 @@ namespace SixLabors.ImageSharp.Tests public const string YcckSubsample1222 = "Jpg/baseline/ycck-subsample-1222.jpg"; public const string Iptc = "Jpg/baseline/iptc.jpg"; public const string App13WithEmptyIptc = "Jpg/baseline/iptc-psAPP13-wIPTCempty.jpg"; + public const string HistogramEqImage = "Jpg/baseline/640px-Unequalized_Hawkes_Bay_NZ.jpg"; public static readonly string[] All = { diff --git a/tests/Images/External b/tests/Images/External index cc6465910d..8b43d14d21 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit cc6465910d092319ef9bf4e99698a0649996d3c5 +Subproject commit 8b43d14d21ce9b436af3d12a70d38402cdba176b diff --git a/tests/Images/Input/Jpg/baseline/640px-Unequalized_Hawkes_Bay_NZ.jpg b/tests/Images/Input/Jpg/baseline/640px-Unequalized_Hawkes_Bay_NZ.jpg new file mode 100644 index 0000000000..bb89de5895 --- /dev/null +++ b/tests/Images/Input/Jpg/baseline/640px-Unequalized_Hawkes_Bay_NZ.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1fafc61231325c42d94fe163486a6c5144fb6211ccdceb902d5cb4ddebda9e1 +size 32428 From 2222db8e0baf52f46623b0668b356b8e42c37bb9 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 8 Nov 2020 17:45:29 +0100 Subject: [PATCH 04/61] Use Interlocked.Increment(ref Unsafe.Add(ref histogramBase, luminance)); --- .../GlobalHistogramEqualizationProcessor{TPixel}.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index 0c5a109a62..488426f939 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -115,6 +115,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization #endif public void Invoke(int y) { + ref int histogramBase = ref MemoryMarshal.GetReference(this.histogramBuffer.GetSpan()); ref TPixel pixelBase = ref MemoryMarshal.GetReference(this.source.GetPixelRowSpan(y)); int levels = this.luminanceLevels; @@ -123,8 +124,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization // TODO: We should bulk convert here. var vector = Unsafe.Add(ref pixelBase, x).ToVector4(); int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); - ref int histogramAtLuminance = ref MemoryMarshal.GetReference(this.histogramBuffer.Slice(luminance)); - Interlocked.Increment(ref histogramAtLuminance); + Interlocked.Increment(ref Unsafe.Add(ref histogramBase, luminance)); } } } From 6a3411ed6bc309f26843abdcfb6965005f22338c Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 8 Nov 2020 19:48:05 +0000 Subject: [PATCH 05/61] Add new property and implement for TPixel types --- src/ImageSharp/Formats/PixelTypeInfo.cs | 19 +- src/ImageSharp/ImageSharp.csproj | 88 ++- .../PixelFormats/PixelAlphaRepresentation.cs | 32 + .../PixelFormats/PixelImplementations/A8.cs | 4 +- .../PixelImplementations/Bgr565.cs | 4 +- .../PixelImplementations/Bgra4444.cs | 4 +- .../PixelImplementations/Byte4.cs | 4 +- .../PixelImplementations/HalfSingle.cs | 4 +- .../PixelImplementations/HalfVector2.cs | 6 +- .../PixelImplementations/HalfVector4.cs | 4 +- .../PixelImplementations/NormalizedByte2.cs | 4 +- .../PixelImplementations/NormalizedByte4.cs | 4 +- .../PixelImplementations/NormalizedShort2.cs | 4 +- .../PixelImplementations/NormalizedShort4.cs | 4 +- .../PixelOperations/A8.PixelOperations.cs | 22 + .../PixelOperations/Bgr565.PixelOperations.cs | 22 + .../Bgra4444.PixelOperations.cs | 22 + .../PixelOperations/Byte4.PixelOperations.cs | 22 + .../Argb32.PixelOperations.Generated.cs | 64 +- .../Argb32.PixelOperations.Generated.tt | 4 +- .../Bgr24.PixelOperations.Generated.cs | 64 +- .../Bgr24.PixelOperations.Generated.tt | 4 +- .../Bgra32.PixelOperations.Generated.cs | 64 +- .../Bgra32.PixelOperations.Generated.tt | 4 +- .../Bgra5551.PixelOperations.Generated.cs | 66 +- .../Bgra5551.PixelOperations.Generated.tt | 2 +- .../L16.PixelOperations.Generated.cs | 68 +- .../L16.PixelOperations.Generated.tt | 4 +- .../Generated/L8.PixelOperations.Generated.cs | 68 +- .../Generated/L8.PixelOperations.Generated.tt | 4 +- .../La16.PixelOperations.Generated.cs | 66 +- .../La16.PixelOperations.Generated.tt | 2 +- .../La32.PixelOperations.Generated.cs | 66 +- .../La32.PixelOperations.Generated.tt | 2 +- .../Rgb24.PixelOperations.Generated.cs | 63 +- .../Rgb24.PixelOperations.Generated.tt | 4 +- .../Rgb48.PixelOperations.Generated.cs | 68 +- .../Rgb48.PixelOperations.Generated.tt | 4 +- .../Rgba32.PixelOperations.Generated.cs | 52 +- .../Rgba32.PixelOperations.Generated.tt | 4 +- .../Rgba64.PixelOperations.Generated.cs | 68 +- .../Rgba64.PixelOperations.Generated.tt | 4 +- .../Generated/_Common.ttinclude | 101 ++- .../HalfSingle.PixelOperations.cs | 22 + .../HalfVector2.PixelOperations.cs | 22 + .../HalfVector4.PixelOperations.cs | 22 + .../NormalizedByte2.PixelOperations.cs | 22 + .../NormalizedByte4.PixelOperations.cs | 22 + .../NormalizedShort2.PixelOperations.cs | 22 + .../NormalizedShort4.PixelOperations.cs | 22 + .../PixelOperations/Rg32.PixelOperations.cs | 22 + .../Rgba1010102.PixelOperations.cs | 22 + .../Rgba32.PixelOperations.cs | 0 .../RgbaVector.PixelOperations.cs | 15 +- .../PixelOperations/Short2.PixelOperations.cs | 22 + .../PixelOperations/Short4.PixelOperations.cs | 22 + .../PixelFormats/PixelImplementations/Rg32.cs | 4 +- .../PixelImplementations/Rgba1010102.cs | 4 +- .../PixelImplementations/Short2.cs | 4 +- .../PixelImplementations/Short4.cs | 4 +- .../PixelFormats/PixelOperations{TPixel}.cs | 47 +- .../Program.cs | 2 +- .../ImageSharp.Tests/ImageSharp.Tests.csproj | 24 + ...elOperationsTests.Specialized.Generated.cs | 718 ++++++++++++++++++ ...elOperationsTests.Specialized.Generated.tt | 11 + .../Generated/_Common.ttinclude | 117 +++ ...elOperationsTests.Argb32OperationsTests.cs | 24 - ...xelOperationsTests.Bgr24OperationsTests.cs | 25 - ...elOperationsTests.Bgra32OperationsTests.cs | 24 - ...OperationsTests.Bgra5551OperationsTests.cs | 20 - ...PixelOperationsTests.L16OperationsTests.cs | 24 - .../PixelOperationsTests.L8OperationsTests.cs | 24 - ...ixelOperationsTests.La16OperationsTests.cs | 24 - ...ixelOperationsTests.La32OperationsTests.cs | 24 - ...xelOperationsTests.Rgb24OperationsTests.cs | 24 - ...xelOperationsTests.Rgb48OperationsTests.cs | 24 - ...elOperationsTests.Rgba32OperationsTests.cs | 17 +- ...elOperationsTests.Rgba64OperationsTests.cs | 24 - ...erationsTests.RgbaVectorOperationsTests.cs | 24 - tests/Images/External | 2 +- 80 files changed, 2108 insertions(+), 581 deletions(-) create mode 100644 src/ImageSharp/PixelFormats/PixelAlphaRepresentation.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Argb32.PixelOperations.Generated.cs (86%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Argb32.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgr24.PixelOperations.Generated.cs (86%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgr24.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgra32.PixelOperations.Generated.cs (86%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgra32.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgra5551.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Bgra5551.PixelOperations.Generated.tt (90%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/L16.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/L16.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/L8.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/L8.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/La16.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/La16.PixelOperations.Generated.tt (91%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/La32.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/La32.PixelOperations.Generated.tt (91%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgb24.PixelOperations.Generated.cs (86%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgb24.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgb48.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgb48.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgba32.PixelOperations.Generated.cs (88%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgba32.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgba64.PixelOperations.Generated.cs (80%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/Rgba64.PixelOperations.Generated.tt (84%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Generated/_Common.ttinclude (71%) create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/Rgba32.PixelOperations.cs (100%) rename src/ImageSharp/PixelFormats/PixelImplementations/{ => PixelOperations}/RgbaVector.PixelOperations.cs (84%) create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs create mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs create mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.tt create mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Argb32OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra32OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra5551OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L16OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L8OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La16OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La32OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb48OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba64OperationsTests.cs delete mode 100644 tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.RgbaVectorOperationsTests.cs diff --git a/src/ImageSharp/Formats/PixelTypeInfo.cs b/src/ImageSharp/Formats/PixelTypeInfo.cs index d53d496fa5..718b05e33a 100644 --- a/src/ImageSharp/Formats/PixelTypeInfo.cs +++ b/src/ImageSharp/Formats/PixelTypeInfo.cs @@ -1,8 +1,7 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System.Runtime.CompilerServices; - using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp.Formats @@ -16,9 +15,11 @@ namespace SixLabors.ImageSharp.Formats /// Initializes a new instance of the class. /// /// Color depth, in number of bits per pixel. - internal PixelTypeInfo(int bitsPerPixel) + /// Tthe pixel alpha transparency behavior. + internal PixelTypeInfo(int bitsPerPixel, PixelAlphaRepresentation? alpha = null) { this.BitsPerPixel = bitsPerPixel; + this.AlphaRepresentation = alpha; } /// @@ -26,8 +27,20 @@ namespace SixLabors.ImageSharp.Formats /// public int BitsPerPixel { get; } + /// + /// Gets the pixel alpha transparency behavior. + /// means unknown, unspecified. + /// + public PixelAlphaRepresentation? AlphaRepresentation { get; } + internal static PixelTypeInfo Create() where TPixel : unmanaged, IPixel => new PixelTypeInfo(Unsafe.SizeOf() * 8); + + internal static PixelTypeInfo Create(PixelAlphaRepresentation alpha) + where TPixel : unmanaged, IPixel + { + return new PixelTypeInfo(Unsafe.SizeOf() * 8, alpha); + } } } diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index c3d9618c8c..258deb44f2 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -62,62 +62,102 @@ True PixelOperations{TPixel}.Generated.tt - + + True + True + A8.PixelOperations.Generated.tt + + True True Argb32.PixelOperations.Generated.tt - + True True Bgr24.PixelOperations.Generated.tt - + + True + True + Bgr565.PixelOperations.Generated.tt + + True True Bgra32.PixelOperations.Generated.tt - + + True + True + Bgra4444.PixelOperations.Generated.tt + + True True Bgra5551.PixelOperations.Generated.tt - + + True + True + Byte4.PixelOperations.Generated.tt + + + True + True + HalfSingle.PixelOperations.Generated.tt + + + True + True + HalfVector2.PixelOperations.Generated.tt + + + True + True + HalfVector4.PixelOperations.Generated.tt + + True True L8.PixelOperations.Generated.tt - + True True L16.PixelOperations.Generated.tt - + True True La16.PixelOperations.Generated.tt - + True True La32.PixelOperations.Generated.tt - + True True Rgb24.PixelOperations.Generated.tt - + + True + True + Rg32.PixelOperations.Generated.tt + + True True Rgba32.PixelOperations.Generated.tt - + True True Rgb48.PixelOperations.Generated.tt - + True True Rgba64.PixelOperations.Generated.tt @@ -156,51 +196,51 @@ TextTemplatingFileGenerator PixelOperations{TPixel}.Generated.cs - + TextTemplatingFileGenerator Argb32.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Bgr24.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Bgra32.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Bgra5551.PixelOperations.Generated.cs - + TextTemplatingFileGenerator L8.PixelOperations.Generated.cs - + TextTemplatingFileGenerator L16.PixelOperations.Generated.cs - + TextTemplatingFileGenerator La16.PixelOperations.Generated.cs - + TextTemplatingFileGenerator La32.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Rgb24.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Rgba32.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Rgb48.PixelOperations.Generated.cs - + TextTemplatingFileGenerator Rgba64.PixelOperations.Generated.cs diff --git a/src/ImageSharp/PixelFormats/PixelAlphaRepresentation.cs b/src/ImageSharp/PixelFormats/PixelAlphaRepresentation.cs new file mode 100644 index 0000000000..4690fb66ab --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelAlphaRepresentation.cs @@ -0,0 +1,32 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides enumeration of the alpha value transparency behavior of a pixel format. + /// + public enum PixelAlphaRepresentation + { + /// + /// Indicates that the pixel format does not contain an alpha channel. + /// + None, + + /// + /// Indicates that the transparency behavior is premultiplied. + /// Each color is first scaled by the alpha value. The alpha value itself is the same + /// in both straight and premultiplied alpha. Typically, no color channel value is + /// greater than the alpha channel value. + /// If a color channel value in a premultiplied format is greater than the alpha + /// channel, the standard source-over blending math results in an additive blend. + /// + Associated, + + /// + /// Indicates that the transparency behavior is not premultiplied. + /// The alpha channel indicates the transparency of the color. + /// + Unassociated + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs index b19c35a0ab..fc0723e9a7 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 0] to [0, 0, 0, 1] in vector form. /// /// - public struct A8 : IPixel, IPackedVector + public partial struct A8 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(A8 left, A8 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr565.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr565.cs index 21ec24a6e6..fd12b68376 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr565.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr565.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 1] to [1, 1, 1, 1] in vector form. /// /// - public struct Bgr565 : IPixel, IPackedVector + public partial struct Bgr565 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -61,7 +61,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Bgr565 left, Bgr565 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs index b2af3045a3..c8d2a82a84 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 0] to [1, 1, 1, 1] in vector form. /// /// - public struct Bgra4444 : IPixel, IPackedVector + public partial struct Bgra4444 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Bgra4444 left, Bgra4444 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs index 9c5289b86e..ad22a5aa17 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 0] to [255, 255, 255, 255] in vector form. /// /// - public struct Byte4 : IPixel, IPackedVector + public partial struct Byte4 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Byte4 left, Byte4 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/HalfSingle.cs b/src/ImageSharp/PixelFormats/PixelImplementations/HalfSingle.cs index e3e6e1383b..5c4aa1cfb6 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/HalfSingle.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/HalfSingle.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, 0, 0, 1] to [1, 0, 0, 1] in vector form. /// /// - public struct HalfSingle : IPixel, IPackedVector + public partial struct HalfSingle : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -47,7 +47,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(HalfSingle left, HalfSingle right) => !left.Equals(right); /// - public PixelOperations CreatePixelOperations() => new PixelOperations(); + public PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector2.cs b/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector2.cs index 43380eac03..39cb6f7993 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector2.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector2.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, 0, 1] to [1, 1, 0, 1] in vector form. /// /// - public struct HalfVector2 : IPixel, IPackedVector + public partial struct HalfVector2 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -54,13 +54,13 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(HalfVector2 left, HalfVector2 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] public void FromScaledVector4(Vector4 vector) { - var scaled = new Vector2(vector.X, vector.Y) * 2F; + Vector2 scaled = new Vector2(vector.X, vector.Y) * 2F; scaled -= Vector2.One; this.PackedValue = Pack(scaled.X, scaled.Y); } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector4.cs index cb1ae1f404..9826d61a2b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/HalfVector4.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, -1, -1] to [1, 1, 1, 1] in vector form. /// /// - public struct HalfVector4 : IPixel, IPackedVector + public partial struct HalfVector4 : IPixel, IPackedVector { /// /// Initializes a new instance of the struct. @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(HalfVector4 left, HalfVector4 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte2.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte2.cs index 70098b6665..8b244d391c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte2.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte2.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, 0, 1] to [1, 1, 0, 1] in vector form. /// /// - public struct NormalizedByte2 : IPixel, IPackedVector + public partial struct NormalizedByte2 : IPixel, IPackedVector { private static readonly Vector2 Half = new Vector2(127); private static readonly Vector2 MinusOne = new Vector2(-1F); @@ -60,7 +60,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(NormalizedByte2 left, NormalizedByte2 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs index 2762073aa1..1b2ce0904c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, -1, -1] to [1, 1, 1, 1] in vector form. /// /// - public struct NormalizedByte4 : IPixel, IPackedVector + public partial struct NormalizedByte4 : IPixel, IPackedVector { private static readonly Vector4 Half = new Vector4(127); private static readonly Vector4 MinusOne = new Vector4(-1F); @@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(NormalizedByte4 left, NormalizedByte4 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort2.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort2.cs index 8eaec1411c..97bbc1206f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort2.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort2.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, 0, 1] to [1, 1, 0, 1] in vector form. /// /// - public struct NormalizedShort2 : IPixel, IPackedVector + public partial struct NormalizedShort2 : IPixel, IPackedVector { private static readonly Vector2 Max = new Vector2(0x7FFF); private static readonly Vector2 Min = Vector2.Negate(Max); @@ -60,7 +60,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(NormalizedShort2 left, NormalizedShort2 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs index ce7c0035f6..1a5c891740 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-1, -1, -1, -1] to [1, 1, 1, 1] in vector form. /// /// - public struct NormalizedShort4 : IPixel, IPackedVector + public partial struct NormalizedShort4 : IPixel, IPackedVector { private static readonly Vector4 Max = new Vector4(0x7FFF); private static readonly Vector4 Min = Vector4.Negate(Max); @@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(NormalizedShort4 left, NormalizedShort4 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs new file mode 100644 index 0000000000..48c2e145ac --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct A8 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs new file mode 100644 index 0000000000..d62761c617 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Bgr565 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs new file mode 100644 index 0000000000..82113299b7 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Bgra4444 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs new file mode 100644 index 0000000000..73411a9734 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Byte4 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs similarity index 86% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs index d30616997c..ce72eba818 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromArgb32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -42,16 +45,25 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void FromVector4Destructive(Configuration configuration, Span sourceVectors, Span destinationPixels, PixelConversionModifiers modifiers) + public override void FromVector4Destructive( + Configuration configuration, + Span sourceVectors, + Span destinationPixels, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destinationPixels, modifiers.Remove(PixelConversionModifiers.Scale)); } /// - public override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers) + public override void ToVector4( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destVectors, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale)); } + /// public override void ToRgba32( Configuration configuration, @@ -79,6 +91,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToArgb32(source, dest); } + /// public override void ToBgra32( Configuration configuration, @@ -106,6 +119,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToArgb32(source, dest); } + /// public override void ToRgb24( Configuration configuration, @@ -133,6 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToArgb32(source, dest); } + /// public override void ToBgr24( Configuration configuration, @@ -162,7 +177,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -180,7 +198,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -198,7 +219,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -216,7 +240,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -234,7 +261,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -252,7 +282,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -270,7 +303,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -286,6 +322,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } + /// public override void From( Configuration configuration, @@ -294,6 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToArgb32(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt index 3a4c7b459d..1854bcd41c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Argb32"); #> <# GenerateAllDefaultConversionMethods("Argb32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs similarity index 86% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs index 50d4942ecb..7b15a26119 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + /// public override void FromBgr24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -42,16 +45,25 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void FromVector4Destructive(Configuration configuration, Span sourceVectors, Span destinationPixels, PixelConversionModifiers modifiers) + public override void FromVector4Destructive( + Configuration configuration, + Span sourceVectors, + Span destinationPixels, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destinationPixels, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } /// - public override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers) + public override void ToVector4( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destVectors, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } + /// public override void ToRgba32( Configuration configuration, @@ -79,6 +91,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToBgr24(source, dest); } + /// public override void ToArgb32( Configuration configuration, @@ -106,6 +119,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToBgr24(source, dest); } + /// public override void ToBgra32( Configuration configuration, @@ -133,6 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToBgr24(source, dest); } + /// public override void ToRgb24( Configuration configuration, @@ -162,7 +177,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -180,7 +198,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -198,7 +219,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -216,7 +240,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -234,7 +261,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -252,7 +282,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -270,7 +303,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -286,6 +322,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } + /// public override void From( Configuration configuration, @@ -294,6 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToBgr24(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt index cfaefeda9c..01c9fde890 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Bgr24"); #> <# GenerateAllDefaultConversionMethods("Bgr24"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs similarity index 86% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs index b38e5f19d6..8304ad2cae 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromBgra32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -42,16 +45,25 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void FromVector4Destructive(Configuration configuration, Span sourceVectors, Span destinationPixels, PixelConversionModifiers modifiers) + public override void FromVector4Destructive( + Configuration configuration, + Span sourceVectors, + Span destinationPixels, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destinationPixels, modifiers.Remove(PixelConversionModifiers.Scale)); } /// - public override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers) + public override void ToVector4( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destVectors, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale)); } + /// public override void ToRgba32( Configuration configuration, @@ -79,6 +91,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToBgra32(source, dest); } + /// public override void ToArgb32( Configuration configuration, @@ -106,6 +119,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToBgra32(source, dest); } + /// public override void ToRgb24( Configuration configuration, @@ -133,6 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToBgra32(source, dest); } + /// public override void ToBgr24( Configuration configuration, @@ -162,7 +177,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -180,7 +198,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -198,7 +219,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -216,7 +240,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -234,7 +261,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -252,7 +282,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -270,7 +303,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -286,6 +322,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } + /// public override void From( Configuration configuration, @@ -294,6 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToBgra32(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt index 58ecfa5a6c..6066314312 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Bgra32"); #> <# GenerateAllDefaultConversionMethods("Bgra32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs index f9662e0d04..33b9556199 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs @@ -3,13 +3,12 @@ // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromBgra5551(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToBgra5551(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt similarity index 90% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt index c4f2fc8bdd..3c18f47448 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra5551.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ <#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Bgra5551"); #> <# GenerateAllDefaultConversionMethods("Bgra5551"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs index d0c96def18..88dc85f57b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + /// public override void FromL16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToL16(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt index 937902346f..27b9770597 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L16.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("L16"); #> <# GenerateAllDefaultConversionMethods("L16"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs index 31b1c96ec2..2b16851d6c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + /// public override void FromL8(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToL8(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt index d2e802a190..c054d08470 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/L8.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("L8"); #> <# GenerateAllDefaultConversionMethods("L8"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs index 48e7c76e5b..7cc94ecae7 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs @@ -3,13 +3,12 @@ // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromLa16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToLa16(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt similarity index 91% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt index 5d6661631d..06d2ec1abb 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La16.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ <#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("La16"); #> <# GenerateAllDefaultConversionMethods("La16"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs index f8b4bedc22..ccee68190f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs @@ -3,13 +3,12 @@ // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromLa32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToLa32(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt similarity index 91% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt index e2fb4867a9..34f54e77a4 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/La32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ <#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("La32"); #> <# GenerateAllDefaultConversionMethods("La32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs similarity index 86% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs index 9a4173892e..23b9824000 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + /// public override void FromRgb24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -42,16 +45,25 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void FromVector4Destructive(Configuration configuration, Span sourceVectors, Span destinationPixels, PixelConversionModifiers modifiers) + public override void FromVector4Destructive( + Configuration configuration, + Span sourceVectors, + Span destinationPixels, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destinationPixels, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } /// - public override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers) + public override void ToVector4( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destVectors, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } + /// public override void ToRgba32( Configuration configuration, @@ -107,6 +119,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToRgb24(source, dest); } + /// public override void ToBgra32( Configuration configuration, @@ -134,6 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToRgb24(source, dest); } + /// public override void ToBgr24( Configuration configuration, @@ -163,7 +177,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -181,7 +198,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -199,7 +219,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -217,7 +240,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -235,7 +261,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -253,7 +282,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -271,7 +303,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -287,6 +322,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } + /// public override void From( Configuration configuration, @@ -295,6 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToRgb24(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt index fc149b2380..e1d2878caf 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Rgb24"); #> <# GenerateAllDefaultConversionMethods("Rgb24"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs index 9423aa2c8f..ce067906c1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + /// public override void FromRgb48(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToRgb48(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt index 957c8f886c..6d05b4851f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb48.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Rgb48"); #> <# GenerateAllDefaultConversionMethods("Rgb48"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs similarity index 88% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs index 5b60ec10e3..90b05f7865 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromRgba32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -41,6 +44,7 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } + /// public override void ToArgb32( Configuration configuration, @@ -68,6 +72,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToRgba32(source, dest); } + /// public override void ToBgra32( Configuration configuration, @@ -95,6 +100,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToRgba32(source, dest); } + /// public override void ToRgb24( Configuration configuration, @@ -122,6 +128,7 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToRgba32(source, dest); } + /// public override void ToBgr24( Configuration configuration, @@ -151,7 +158,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +179,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +200,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +221,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +242,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -241,7 +263,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba64(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba64( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -259,7 +284,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -275,6 +303,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } + /// public override void From( Configuration configuration, @@ -283,6 +312,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToRgba32(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt index 905e2cc58f..d40af0f4d5 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Rgba32"); #> <# GenerateAllDefaultConversionMethods("Rgba32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs similarity index 80% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs index 3fface03b6..2cd27e8e3e 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs @@ -1,15 +1,14 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats { @@ -23,6 +22,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromRgba64(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -43,7 +46,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// - public override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToArgb32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -61,7 +67,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgr24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgr24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -79,7 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -97,7 +109,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -115,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -133,7 +151,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -151,7 +172,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToLa32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToLa32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -169,7 +193,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb24(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb24( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -187,7 +214,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgba32( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -205,7 +235,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToRgb48(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToRgb48( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -223,7 +256,10 @@ namespace SixLabors.ImageSharp.PixelFormats } /// - public override void ToBgra5551(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToBgra5551( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -239,6 +275,7 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } + /// public override void From( Configuration configuration, @@ -247,6 +284,7 @@ namespace SixLabors.ImageSharp.PixelFormats { PixelOperations.Instance.ToRgba64(configuration, sourcePixels, destinationPixels); } + } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.tt rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt index 03179a3920..d0f4265f3c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgba64.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt @@ -1,6 +1,5 @@ -<#@include file="_Common.ttinclude" #> +<#@include file="_Common.ttinclude" #> <#@ output extension=".cs" #> - namespace SixLabors.ImageSharp.PixelFormats { /// @@ -13,6 +12,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + <# GeneratePixelTypeInfo("Rgba64"); #> <# GenerateAllDefaultConversionMethods("Rgba64"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude similarity index 71% rename from src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude index b728b01152..7a29e46593 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude @@ -8,19 +8,85 @@ // -using SixLabors.ImageSharp.PixelFormats.Utils; using System; -using System.Buffers; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using SixLabors.ImageSharp.Formats; +using SixLabors.ImageSharp.PixelFormats.Utils; <#+ - static readonly string[] CommonPixelTypes = { "Argb32", "Bgr24", "Bgra32", "L8", "L16", "La16", "La32", "Rgb24", "Rgba32", "Rgb48", "Rgba64", "Bgra5551" }; - - static readonly string[] OptimizedPixelTypes = { "Rgba32", "Argb32", "Bgra32", "Rgb24", "Bgr24" }; + private static readonly string[] UnassociatedAlphaPixelTypes = + { + "A8", + "Argb32", + "Bgra32", + "Bgra4444", + "Bgra5551", + "Byte4", + "HalfVector4", + "La16", + "La32", + "NormalizedByte4", + "NormalizedShort4", + "Rgba1010102", + "Rgba32", + "Rgba64", + "RgbaVector", + "Short4" + }; + + private static readonly string[] AssociatedAlphaPixelTypes = Array.Empty(); + + private static readonly string[] CommonPixelTypes = + { + "Argb32", + "Bgr24", + "Bgra32", + "L8", + "L16", + "La16", + "La32", + "Rgb24", + "Rgba32", + "Rgb48", + "Rgba64", + "Bgra5551" + }; + + private static readonly string[] OptimizedPixelTypes = + { + "Rgba32", + "Argb32", + "Bgra32", + "Rgb24", + "Bgr24" + }; + + // Types with Rgba32-combatable to/from Vector4 conversion + private static readonly string[] Rgba32CompatibleTypes = + { + "Argb32", + "Bgra32", + "Rgb24", + "Bgr24" + }; - // Types with Rgba32-combatible to/from Vector4 conversion - static readonly string[] Rgba32CompatibleTypes = { "Argb32", "Bgra32", "Rgb24", "Bgr24" }; + void GeneratePixelTypeInfo(string pixelType) + { + string alpha = "PixelAlphaRepresentation.None"; + if (AssociatedAlphaPixelTypes.Contains(pixelType)) + { + alpha = "PixelAlphaRepresentation.Associated"; + } + else if (UnassociatedAlphaPixelTypes.Contains(pixelType)) + { + alpha = "PixelAlphaRepresentation.Unassociated"; + } +#> + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create<<#=pixelType#>>(<#=alpha#>); +<#+ + } void GenerateGenericConverterMethods(string pixelType) { @@ -33,13 +99,14 @@ using System.Runtime.InteropServices; { PixelOperations.Instance.To<#=pixelType#>(configuration, sourcePixels, destinationPixels); } + <#+ } void GenerateDefaultSelfConversionMethods(string pixelType) { #> -/// + /// public override void From<#=pixelType#>(Configuration configuration, ReadOnlySpan<<#=pixelType#>> source, Span<<#=pixelType#>> destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); @@ -63,9 +130,11 @@ using System.Runtime.InteropServices; void GenerateDefaultConvertToMethod(string fromPixelType, string toPixelType) { #> - /// - public override void To<#=toPixelType#>(Configuration configuration, ReadOnlySpan<<#=fromPixelType#>> sourcePixels, Span<<#=toPixelType#>> destinationPixels) + public override void To<#=toPixelType#>( + Configuration configuration, + ReadOnlySpan<<#=fromPixelType#>> sourcePixels, + Span<<#=toPixelType#>> destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -126,13 +195,21 @@ using System.Runtime.InteropServices; } #> /// - public override void FromVector4Destructive(Configuration configuration, Span sourceVectors, Span<<#=pixelType#>> destinationPixels, PixelConversionModifiers modifiers) + public override void FromVector4Destructive( + Configuration configuration, + Span sourceVectors, + Span<<#=pixelType#>> destinationPixels, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destinationPixels, modifiers.Remove(<#=removeTheseModifiers#>)); } /// - public override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span destVectors, PixelConversionModifiers modifiers) + public override void ToVector4( + Configuration configuration, + ReadOnlySpan<<#=pixelType#>> sourcePixels, + Span destVectors, + PixelConversionModifiers modifiers) { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(<#=removeTheseModifiers#>)); } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs new file mode 100644 index 0000000000..afbd3af4c2 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct HalfSingle + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs new file mode 100644 index 0000000000..e9cc88c15d --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct HalfVector2 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs new file mode 100644 index 0000000000..63b6e3af59 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct HalfVector4 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs new file mode 100644 index 0000000000..f0f513860c --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct NormalizedByte2 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs new file mode 100644 index 0000000000..8874f12416 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct NormalizedByte4 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs new file mode 100644 index 0000000000..a53587a060 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct NormalizedShort2 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs new file mode 100644 index 0000000000..6a3dc505ff --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct NormalizedShort4 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs new file mode 100644 index 0000000000..c079d1e5b1 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Rg32 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs new file mode 100644 index 0000000000..b13fe2ec89 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Rgba1010102 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs similarity index 100% rename from src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs similarity index 84% rename from src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs rename to src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs index aa0791d0cf..b4ba02a95c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs @@ -5,7 +5,7 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,6 +20,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void FromVector4Destructive( Configuration configuration, @@ -46,7 +49,10 @@ namespace SixLabors.ImageSharp.PixelFormats Vector4Converters.ApplyForwardConversionModifiers(destinationVectors, modifiers); } - public override void ToL8(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL8( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); @@ -62,7 +68,10 @@ namespace SixLabors.ImageSharp.PixelFormats } } - public override void ToL16(Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) + public override void ToL16( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) { Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs new file mode 100644 index 0000000000..942e40f94d --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Short2 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs new file mode 100644 index 0000000000..b2d743f87a --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Short4 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rg32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rg32.cs index 7c805f1480..d7e6f53cf2 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rg32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rg32.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 1] to [1, 1, 0, 1] in vector form. /// /// - public struct Rg32 : IPixel, IPackedVector + public partial struct Rg32 : IPixel, IPackedVector { private static readonly Vector2 Max = new Vector2(ushort.MaxValue); @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Rg32 left, Rg32 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs index 2bf9350f8f..60f56fb06f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [0, 0, 0, 0] to [1, 1, 1, 1] in vector form. /// /// - public struct Rgba1010102 : IPixel, IPackedVector + public partial struct Rgba1010102 : IPixel, IPackedVector { private static readonly Vector4 Multiplier = new Vector4(1023F, 1023F, 1023F, 3F); @@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Rgba1010102 left, Rgba1010102 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Short2.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Short2.cs index 91c0e9ab5a..f7a4f99945 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Short2.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Short2.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-32767, -32767, 0, 1] to [32767, 32767, 0, 1] in vector form. /// /// - public struct Short2 : IPixel, IPackedVector + public partial struct Short2 : IPixel, IPackedVector { // Largest two byte positive number 0xFFFF >> 1; private const float MaxPos = 0x7FFF; @@ -66,7 +66,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Short2 left, Short2 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs index 3f74b68453..c67be71e5e 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Ranges from [-37267, -37267, -37267, -37267] to [37267, 37267, 37267, 37267] in vector form. /// /// - public struct Short4 : IPixel, IPackedVector + public partial struct Short4 : IPixel, IPackedVector { // Largest two byte positive number 0xFFFF >> 1; private const float MaxPos = 0x7FFF; @@ -68,7 +68,7 @@ namespace SixLabors.ImageSharp.PixelFormats public static bool operator !=(Short4 left, Short4 right) => !left.Equals(right); /// - public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); + public readonly PixelOperations CreatePixelOperations() => new PixelOperations(); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs index 2fff67b58d..14ad120bf9 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs @@ -4,7 +4,7 @@ using System; using System.Buffers; using System.Numerics; - +using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.PixelFormats @@ -22,6 +22,12 @@ namespace SixLabors.ImageSharp.PixelFormats /// public static PixelOperations Instance { get; } = default(TPixel).CreatePixelOperations(); + /// + /// Gets the pixel type info for the given . + /// + /// The . + public virtual PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(); + /// /// Bulk version of converting 'sourceVectors.Length' pixels into 'destinationColors'. /// The method is DESTRUCTIVE altering the contents of . @@ -108,28 +114,27 @@ namespace SixLabors.ImageSharp.PixelFormats { const int SliceLength = 1024; int numberOfSlices = sourcePixels.Length / SliceLength; - using (IMemoryOwner tempVectors = configuration.MemoryAllocator.Allocate(SliceLength)) + + using IMemoryOwner tempVectors = configuration.MemoryAllocator.Allocate(SliceLength); + Span vectorSpan = tempVectors.GetSpan(); + for (int i = 0; i < numberOfSlices; i++) { - Span vectorSpan = tempVectors.GetSpan(); - for (int i = 0; i < numberOfSlices; i++) - { - int start = i * SliceLength; - ReadOnlySpan s = sourcePixels.Slice(start, SliceLength); - Span d = destinationPixels.Slice(start, SliceLength); - PixelOperations.Instance.ToVector4(configuration, s, vectorSpan); - this.FromVector4Destructive(configuration, vectorSpan, d); - } + int start = i * SliceLength; + ReadOnlySpan s = sourcePixels.Slice(start, SliceLength); + Span d = destinationPixels.Slice(start, SliceLength); + PixelOperations.Instance.ToVector4(configuration, s, vectorSpan); + this.FromVector4Destructive(configuration, vectorSpan, d); + } - int endOfCompleteSlices = numberOfSlices * SliceLength; - int remainder = sourcePixels.Length - endOfCompleteSlices; - if (remainder > 0) - { - ReadOnlySpan s = sourcePixels.Slice(endOfCompleteSlices); - Span d = destinationPixels.Slice(endOfCompleteSlices); - vectorSpan = vectorSpan.Slice(0, remainder); - PixelOperations.Instance.ToVector4(configuration, s, vectorSpan); - this.FromVector4Destructive(configuration, vectorSpan, d); - } + int endOfCompleteSlices = numberOfSlices * SliceLength; + int remainder = sourcePixels.Length - endOfCompleteSlices; + if (remainder > 0) + { + ReadOnlySpan s = sourcePixels.Slice(endOfCompleteSlices); + Span d = destinationPixels.Slice(endOfCompleteSlices); + vectorSpan = vectorSpan.Slice(0, remainder); + PixelOperations.Instance.ToVector4(configuration, s, vectorSpan); + this.FromVector4Destructive(configuration, vectorSpan, d); } } diff --git a/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs b/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs index 8155c6a584..5504a99784 100644 --- a/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs +++ b/tests/ImageSharp.Tests.ProfilingSandbox/Program.cs @@ -53,7 +53,7 @@ namespace SixLabors.ImageSharp.Tests.ProfilingSandbox private static void RunToVector4ProfilingTest() { - var tests = new PixelOperationsTests.Rgba32OperationsTests(new ConsoleOutput()); + var tests = new PixelOperationsTests.Rgba32_OperationsTests(new ConsoleOutput()); tests.Benchmark_ToVector4(); } diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index 07ade97d5d..5e97370ff2 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -17,6 +17,14 @@ + + + True + True + PixelOperationsTests.Specialized.Generated.tt + + + @@ -27,6 +35,10 @@ + + TextTemplatingFileGenerator + PixelOperationsTests.Specialized.Generated.cs + PreserveNewest @@ -38,5 +50,17 @@ + + + True + True + PixelOperationsTests.Specialized.Generated.tt + + + + + + + diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs new file mode 100644 index 0000000000..5566ccd743 --- /dev/null +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs @@ -0,0 +1,718 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +// + +using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; + + +namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations +{ + public partial class PixelOperationsTests + { + + public partial class A8_OperationsTests : PixelOperationsTests + { + public A8_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = A8.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = A8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Argb32_OperationsTests : PixelOperationsTests + { + public Argb32_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Argb32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Argb32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Bgr24_OperationsTests : PixelOperationsTests + { + public Bgr24_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Bgr565_OperationsTests : PixelOperationsTests + { + public Bgr565_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Bgra32_OperationsTests : PixelOperationsTests + { + public Bgra32_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Bgra4444_OperationsTests : PixelOperationsTests + { + public Bgra4444_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Bgra5551_OperationsTests : PixelOperationsTests + { + public Bgra5551_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Byte4_OperationsTests : PixelOperationsTests + { + public Byte4_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Byte4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Byte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class HalfSingle_OperationsTests : PixelOperationsTests + { + public HalfSingle_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class HalfVector2_OperationsTests : PixelOperationsTests + { + public HalfVector2_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class HalfVector4_OperationsTests : PixelOperationsTests + { + public HalfVector4_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class L16_OperationsTests : PixelOperationsTests + { + public L16_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = L16.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = L16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class L8_OperationsTests : PixelOperationsTests + { + public L8_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = L8.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = L8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class La16_OperationsTests : PixelOperationsTests + { + public La16_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = La16.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = La16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class La32_OperationsTests : PixelOperationsTests + { + public La32_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = La32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = La32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class NormalizedByte2_OperationsTests : PixelOperationsTests + { + public NormalizedByte2_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class NormalizedByte4_OperationsTests : PixelOperationsTests + { + public NormalizedByte4_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class NormalizedShort2_OperationsTests : PixelOperationsTests + { + public NormalizedShort2_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class NormalizedShort4_OperationsTests : PixelOperationsTests + { + public NormalizedShort4_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Rg32_OperationsTests : PixelOperationsTests + { + public Rg32_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rg32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rg32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Rgb24_OperationsTests : PixelOperationsTests + { + public Rgb24_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Rgb48_OperationsTests : PixelOperationsTests + { + public Rgb48_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Rgba1010102_OperationsTests : PixelOperationsTests + { + public Rgba1010102_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Rgba32_OperationsTests : PixelOperationsTests + { + public Rgba32_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Rgba64_OperationsTests : PixelOperationsTests + { + public Rgba64_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class RgbaVector_OperationsTests : PixelOperationsTests + { + public RgbaVector_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + + public partial class Short2_OperationsTests : PixelOperationsTests + { + public Short2_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Short2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Short2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); + } + } + + public partial class Short4_OperationsTests : PixelOperationsTests + { + public Short4_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = Short4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = Short4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); + } + } + } +} + diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.tt b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.tt new file mode 100644 index 0000000000..502b66fb51 --- /dev/null +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.tt @@ -0,0 +1,11 @@ +<#@include file="_Common.ttinclude" #> +<#@ output extension=".cs" #> + +namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations +{ + public partial class PixelOperationsTests + { + <# GenerateAllSpecializedClasses(); #> + } +} + diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude new file mode 100644 index 0000000000..cd6e2a09d7 --- /dev/null +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude @@ -0,0 +1,117 @@ +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +// + +using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.PixelFormats; +using Xunit; +using Xunit.Abstractions; +<#+ + private static readonly string[] UnassociatedAlphaPixelTypes = + { + "A8", + "Argb32", + "Bgra32", + "Bgra4444", + "Bgra5551", + "Byte4", + "HalfVector4", + "La16", + "La32", + "NormalizedByte4", + "NormalizedShort4", + "Rgba1010102", + "Rgba32", + "Rgba64", + "RgbaVector", + "Short4" + }; + + private static readonly string[] AssociatedAlphaPixelTypes = Array.Empty(); + + private static readonly string[] CommonPixelTypes = + { + "A8", + "Argb32", + "Bgr24", + "Bgr565", + "Bgra32", + "Bgra4444", + "Bgra5551", + "Byte4", + "HalfSingle", + "HalfVector2", + "HalfVector4", + "L16", + "L8", + "La16", + "La32", + "NormalizedByte2", + "NormalizedByte4", + "NormalizedShort2", + "NormalizedShort4", + "Rg32", + "Rgb24", + "Rgb48", + "Rgba1010102", + "Rgba32", + "Rgba64", + "RgbaVector", + "Short2", + "Short4", + }; + + void GenerateSpecializedClass(string pixelType, string alpha) + { +#> + public partial class <#=pixelType#>_OperationsTests : PixelOperationsTests<<#=pixelType#>> + { + public <#=pixelType#>_OperationsTests(ITestOutputHelper output) + : base(output) + { + } + + [Fact] + public void IsSpecialImplementation() => Assert.IsType<<#=pixelType#>.PixelOperations>(PixelOperations<<#=pixelType#>>.Instance); + + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf<<#=pixelType#>>() * 8, bits); + } + + [Fact] + public void PixelTypeInfoHasCorrectAlphaRepresentation() + { + var alphaRepresentation = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + Assert.Equal(<#=alpha#>, alphaRepresentation); + } + } +<#+ + } + + void GenerateAllSpecializedClasses() + { + foreach (string pixelType in CommonPixelTypes) + { + string alpha = "PixelAlphaRepresentation.None"; + if (AssociatedAlphaPixelTypes.Contains(pixelType)) + { + alpha = "PixelAlphaRepresentation.Associated"; + } + else if (UnassociatedAlphaPixelTypes.Contains(pixelType)) + { + alpha = "PixelAlphaRepresentation.Unassociated"; + } + + GenerateSpecializedClass(pixelType, alpha); + } + } +#> diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Argb32OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Argb32OperationsTests.cs deleted file mode 100644 index 1d4d583411..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Argb32OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Argb32OperationsTests : PixelOperationsTests - { - public Argb32OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs deleted file mode 100644 index 712b1495ba..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Bgr24OperationsTests : PixelOperationsTests - { - public Bgr24OperationsTests(ITestOutputHelper output) - : base(output) - { - this.HasAlpha = false; - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra32OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra32OperationsTests.cs deleted file mode 100644 index 7f248b682d..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra32OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Bgra32OperationsTests : PixelOperationsTests - { - public Bgra32OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra5551OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra5551OperationsTests.cs deleted file mode 100644 index 9a0e51563a..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgra5551OperationsTests.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Bgra5551OperationsTests : PixelOperationsTests - { - public Bgra5551OperationsTests(ITestOutputHelper output) - : base(output) - { - } - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L16OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L16OperationsTests.cs deleted file mode 100644 index 6acd439f21..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L16OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class L16OperationsTests : PixelOperationsTests - { - public L16OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L8OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L8OperationsTests.cs deleted file mode 100644 index a16f8c66d2..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.L8OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class L8OperationsTests : PixelOperationsTests - { - public L8OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La16OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La16OperationsTests.cs deleted file mode 100644 index 07ec79777c..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La16OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class La16OperationsTests : PixelOperationsTests - { - public La16OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La32OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La32OperationsTests.cs deleted file mode 100644 index bd8bb40da2..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.La32OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class La32OperationsTests : PixelOperationsTests - { - public La32OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs deleted file mode 100644 index 07bf838eee..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Rgb24OperationsTests : PixelOperationsTests - { - public Rgb24OperationsTests(ITestOutputHelper output) - : base(output) - { - this.HasAlpha = false; - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb48OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb48OperationsTests.cs deleted file mode 100644 index 7ab6777664..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb48OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Rgb48OperationsTests : PixelOperationsTests - { - public Rgb48OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba32OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba32OperationsTests.cs index e4f1fa4624..85612d602e 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba32OperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba32OperationsTests.cs @@ -1,29 +1,18 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System.Buffers; using System.Numerics; - using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; - using Xunit; -using Xunit.Abstractions; namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { public partial class PixelOperationsTests { - public class Rgba32OperationsTests : PixelOperationsTests + public partial class Rgba32_OperationsTests : PixelOperationsTests { - public Rgba32OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - [Fact(Skip = SkipProfilingBenchmarks)] public void Benchmark_ToVector4() { @@ -43,4 +32,4 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations } } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba64OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba64OperationsTests.cs deleted file mode 100644 index a0ef2f765f..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgba64OperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class Rgba64OperationsTests : PixelOperationsTests - { - public Rgba64OperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.RgbaVectorOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.RgbaVectorOperationsTests.cs deleted file mode 100644 index c552fb3592..0000000000 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.RgbaVectorOperationsTests.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.PixelFormats; - -using Xunit; -using Xunit.Abstractions; - -namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations -{ - public partial class PixelOperationsTests - { - public class RgbaVectorOperationsTests : PixelOperationsTests - { - public RgbaVectorOperationsTests(ITestOutputHelper output) - : base(output) - { - } - - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); - } - } -} \ No newline at end of file diff --git a/tests/Images/External b/tests/Images/External index 8b43d14d21..cc6465910d 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit 8b43d14d21ce9b436af3d12a70d38402cdba176b +Subproject commit cc6465910d092319ef9bf4e99698a0649996d3c5 From 7824852eb44e2db6b78fe744c882dd07cc12ef01 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 8 Nov 2020 19:59:35 +0000 Subject: [PATCH 06/61] Update External --- tests/Images/External | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Images/External b/tests/Images/External index cc6465910d..8b43d14d21 160000 --- a/tests/Images/External +++ b/tests/Images/External @@ -1 +1 @@ -Subproject commit cc6465910d092319ef9bf4e99698a0649996d3c5 +Subproject commit 8b43d14d21ce9b436af3d12a70d38402cdba176b From 36ebc4513db715063632e677b2e249a8a9a1fb0e Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 8 Nov 2020 21:36:39 +0000 Subject: [PATCH 07/61] Fix Short4 and tests --- .../RgbaVector.PixelOperations.cs | 2 +- .../PixelImplementations/Short4.cs | 2 +- ...elOperationsTests.Specialized.Generated.cs | 56 ++++++++++++++++++ .../Generated/_Common.ttinclude | 2 + .../PixelOperations/PixelOperationsTests.cs | 57 +++++++++++++------ 5 files changed, 99 insertions(+), 20 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs index b4ba02a95c..11ef90e49b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs @@ -21,7 +21,7 @@ namespace SixLabors.ImageSharp.PixelFormats internal class PixelOperations : PixelOperations { /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); /// public override void FromVector4Destructive( diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs index c67be71e5e..2e9db245f9 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs @@ -164,7 +164,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public readonly bool Equals(Short4 other) => this.PackedValue.Equals(other); + public readonly bool Equals(Short4 other) => this.PackedValue.Equals(other.PackedValue); /// /// Gets the hash code for the current instance. diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs index 5566ccd743..5b1abb7495 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs @@ -19,6 +19,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public A8_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = A8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -44,6 +46,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Argb32_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Argb32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -69,6 +73,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgr24_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -94,6 +100,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgr565_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -119,6 +127,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra32_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -144,6 +154,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra4444_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -169,6 +181,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra5551_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -194,6 +208,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Byte4_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Byte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -219,6 +235,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfSingle_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -244,6 +262,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfVector2_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -269,6 +289,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfVector4_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -294,6 +316,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public L16_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = L16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -319,6 +343,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public L8_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = L8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -344,6 +370,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public La16_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = La16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -369,6 +397,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public La32_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = La32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -394,6 +424,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedByte2_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -419,6 +451,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedByte4_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -444,6 +478,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedShort2_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -469,6 +505,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedShort4_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -494,6 +532,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rg32_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rg32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -519,6 +559,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgb24_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -544,6 +586,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgb48_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -569,6 +613,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba1010102_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -594,6 +640,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba32_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -619,6 +667,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba64_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -644,6 +694,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public RgbaVector_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -669,6 +721,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Short2_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Short2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] @@ -694,6 +748,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Short4_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = Short4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude index cd6e2a09d7..bc093be85f 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude @@ -75,6 +75,8 @@ using Xunit.Abstractions; public <#=pixelType#>_OperationsTests(ITestOutputHelper output) : base(output) { + var alphaRepresentation = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } [Fact] diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs index 3c4b9dc795..d18c3c860a 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations null; #endif - protected bool HasAlpha { get; set; } = true; + protected bool HasUnassociatedAlpha { get; set; } = true; protected PixelOperationsTests(ITestOutputHelper output) : base(output) @@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.Premultiply(ref v); } @@ -176,7 +176,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations void ExpectedAction(ref Vector4 v) { - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.UnPremultiply(ref v); } @@ -188,7 +188,14 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan(), PixelConversionModifiers.Premultiply)); + (s, d) => + { + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha + ? PixelConversionModifiers.Premultiply + : PixelConversionModifiers.None; + + Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan(), modifiers); + }); } [Theory] @@ -197,7 +204,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.Premultiply(ref v); } @@ -205,7 +212,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations void ExpectedAction(ref Vector4 v) { - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.UnPremultiply(ref v); } @@ -217,11 +224,18 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromVector4Destructive( - this.Configuration, - s, - d.GetSpan(), - PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale)); + (s, d) => + { + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha + ? PixelConversionModifiers.Premultiply + : PixelConversionModifiers.None; + + Operations.FromVector4Destructive( + this.Configuration, + s, + d.GetSpan(), + modifiers | PixelConversionModifiers.Scale); + }); } [Theory] @@ -232,7 +246,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { SRgbCompanding.Expand(ref v); - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.Premultiply(ref v); } @@ -240,7 +254,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations void ExpectedAction(ref Vector4 v) { - if (this.HasAlpha) + if (this.HasUnassociatedAlpha) { Vector4Utilities.UnPremultiply(ref v); } @@ -254,11 +268,18 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromVector4Destructive( - this.Configuration, - s, - d.GetSpan(), - PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale)); + (s, d) => + { + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha + ? PixelConversionModifiers.Premultiply + : PixelConversionModifiers.None; + + Operations.FromVector4Destructive( + this.Configuration, + s, + d.GetSpan(), + modifiers | PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Scale); + }); } [Theory] From fd76f69eb1fb3da17eb45db24a41bd08da03f829 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 11 Nov 2020 19:46:01 +0000 Subject: [PATCH 08/61] Remove bas T4 refs --- src/ImageSharp/ImageSharp.csproj | 48 +++----------------------------- 1 file changed, 4 insertions(+), 44 deletions(-) diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index 258deb44f2..f4e9851986 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -62,11 +62,6 @@ True PixelOperations{TPixel}.Generated.tt - - True - True - A8.PixelOperations.Generated.tt - True True @@ -77,56 +72,26 @@ True Bgr24.PixelOperations.Generated.tt - - True - True - Bgr565.PixelOperations.Generated.tt - True True Bgra32.PixelOperations.Generated.tt - - True - True - Bgra4444.PixelOperations.Generated.tt - True True Bgra5551.PixelOperations.Generated.tt - - True - True - Byte4.PixelOperations.Generated.tt - - - True - True - HalfSingle.PixelOperations.Generated.tt - - + True True - HalfVector2.PixelOperations.Generated.tt + L16.PixelOperations.Generated.tt - - True - True - HalfVector4.PixelOperations.Generated.tt - True True L8.PixelOperations.Generated.tt - - True - True - L16.PixelOperations.Generated.tt - True True @@ -142,21 +107,16 @@ True Rgb24.PixelOperations.Generated.tt - + True True - Rg32.PixelOperations.Generated.tt + Rgb48.PixelOperations.Generated.tt True True Rgba32.PixelOperations.Generated.tt - - True - True - Rgb48.PixelOperations.Generated.tt - True True From 86d4b7214e786fca619e238bba4dc693a32efe8e Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 11 Nov 2020 20:46:45 +0000 Subject: [PATCH 09/61] Don't autogenerate GetPixelTypeInfo --- .../PixelOperations/Argb32.PixelOperations.cs | 22 ++++++++++ .../PixelOperations/Bgr24.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/Bgra32.PixelOperations.cs | 23 +++++++++++ .../Bgra5551.PixelOperations.cs | 23 +++++++++++ .../Argb32.PixelOperations.Generated.cs | 6 +-- .../Argb32.PixelOperations.Generated.tt | 3 +- .../Bgr24.PixelOperations.Generated.cs | 6 +-- .../Bgr24.PixelOperations.Generated.tt | 3 +- .../Bgra32.PixelOperations.Generated.cs | 6 +-- .../Bgra32.PixelOperations.Generated.tt | 3 +- .../Bgra5551.PixelOperations.Generated.cs | 7 +--- .../Bgra5551.PixelOperations.Generated.tt | 3 +- .../L16.PixelOperations.Generated.cs | 7 +--- .../L16.PixelOperations.Generated.tt | 3 +- .../Generated/L8.PixelOperations.Generated.cs | 7 +--- .../Generated/L8.PixelOperations.Generated.tt | 3 +- .../La16.PixelOperations.Generated.cs | 7 +--- .../La16.PixelOperations.Generated.tt | 3 +- .../La32.PixelOperations.Generated.cs | 7 +--- .../La32.PixelOperations.Generated.tt | 3 +- .../Rgb24.PixelOperations.Generated.cs | 6 +-- .../Rgb24.PixelOperations.Generated.tt | 3 +- .../Rgb48.PixelOperations.Generated.cs | 7 +--- .../Rgb48.PixelOperations.Generated.tt | 3 +- .../Rgba32.PixelOperations.Generated.cs | 5 --- .../Rgba32.PixelOperations.Generated.tt | 1 - .../Rgba64.PixelOperations.Generated.cs | 7 +--- .../Rgba64.PixelOperations.Generated.tt | 3 +- .../Generated/_Common.ttinclude | 41 ------------------- .../PixelOperations/L16.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/L8.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/La16.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/La32.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/Rgb24.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/Rgb48.PixelOperations.cs | 23 +++++++++++ .../PixelOperations/Rgba32.PixelOperations.cs | 6 ++- .../PixelOperations/Rgba64.PixelOperations.cs | 23 +++++++++++ 37 files changed, 279 insertions(+), 132 deletions(-) create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs create mode 100644 src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs new file mode 100644 index 0000000000..f819329550 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs @@ -0,0 +1,22 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Argb32 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs new file mode 100644 index 0000000000..cd77f58164 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Bgr24 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs new file mode 100644 index 0000000000..849f538351 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Bgra32 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs new file mode 100644 index 0000000000..4714a8be2a --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Bgra5551 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs index ce72eba818..9df708d44d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromArgb32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt index 1854bcd41c..bbee95f24c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Argb32"); #> <# GenerateAllDefaultConversionMethods("Argb32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs index 7b15a26119..a66a6e12c8 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); - /// public override void FromBgr24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt index 01c9fde890..48b6daa3aa 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Bgr24"); #> <# GenerateAllDefaultConversionMethods("Bgr24"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs index 8304ad2cae..77b665a4c7 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromBgra32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt index 6066314312..7e15979890 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Bgra32"); #> <# GenerateAllDefaultConversionMethods("Bgra32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs index 33b9556199..1d13722e42 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromBgra5551(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt index 3c18f47448..c74dfb4bd1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Bgra5551"); #> <# GenerateAllDefaultConversionMethods("Bgra5551"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs index 88dc85f57b..03b84be5d7 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); - /// public override void FromL16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt index 27b9770597..9c0f725e62 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("L16"); #> <# GenerateAllDefaultConversionMethods("L16"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs index 2b16851d6c..f52e77b1a3 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); - /// public override void FromL8(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt index c054d08470..e6d4a45efc 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("L8"); #> <# GenerateAllDefaultConversionMethods("L8"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs index 7cc94ecae7..e01399b8af 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromLa16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt index 06d2ec1abb..7b88fd4f1a 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("La16"); #> <# GenerateAllDefaultConversionMethods("La16"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs index ccee68190f..0aa2afef52 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromLa32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt index 34f54e77a4..f85652cad9 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("La32"); #> <# GenerateAllDefaultConversionMethods("La32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs index 23b9824000..a9303f9d8a 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); - /// public override void FromRgb24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt index e1d2878caf..056c2a2797 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Rgb24"); #> <# GenerateAllDefaultConversionMethods("Rgb24"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs index ce067906c1..30328366d8 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); - /// public override void FromRgb48(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt index 6d05b4851f..f46493e621 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Rgb48"); #> <# GenerateAllDefaultConversionMethods("Rgb48"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs index 90b05f7865..c23198e760 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -23,9 +22,6 @@ namespace SixLabors.ImageSharp.PixelFormats internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromRgba32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt index d40af0f4d5..6a6cac4e36 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.tt @@ -12,7 +12,6 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Rgba32"); #> <# GenerateAllDefaultConversionMethods("Rgba32"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs index 2cd27e8e3e..129e9ff0b5 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs @@ -7,7 +7,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -20,12 +19,9 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); - /// public override void FromRgba64(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { @@ -44,7 +40,6 @@ namespace SixLabors.ImageSharp.PixelFormats sourcePixels.CopyTo(destinationPixels); } - /// public override void ToArgb32( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt index d0f4265f3c..cf02d38ee0 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.tt @@ -10,9 +10,8 @@ namespace SixLabors.ImageSharp.PixelFormats /// /// Provides optimized overrides for bulk operations. /// - internal class PixelOperations : PixelOperations + internal partial class PixelOperations : PixelOperations { - <# GeneratePixelTypeInfo("Rgba64"); #> <# GenerateAllDefaultConversionMethods("Rgba64"); #> } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude index 7a29e46593..7c2eccedcc 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude @@ -12,31 +12,8 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; <#+ - private static readonly string[] UnassociatedAlphaPixelTypes = - { - "A8", - "Argb32", - "Bgra32", - "Bgra4444", - "Bgra5551", - "Byte4", - "HalfVector4", - "La16", - "La32", - "NormalizedByte4", - "NormalizedShort4", - "Rgba1010102", - "Rgba32", - "Rgba64", - "RgbaVector", - "Short4" - }; - - private static readonly string[] AssociatedAlphaPixelTypes = Array.Empty(); - private static readonly string[] CommonPixelTypes = { "Argb32", @@ -71,23 +48,6 @@ using SixLabors.ImageSharp.PixelFormats.Utils; "Bgr24" }; - void GeneratePixelTypeInfo(string pixelType) - { - string alpha = "PixelAlphaRepresentation.None"; - if (AssociatedAlphaPixelTypes.Contains(pixelType)) - { - alpha = "PixelAlphaRepresentation.Associated"; - } - else if (UnassociatedAlphaPixelTypes.Contains(pixelType)) - { - alpha = "PixelAlphaRepresentation.Unassociated"; - } -#> - /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create<<#=pixelType#>>(<#=alpha#>); -<#+ - } - void GenerateGenericConverterMethods(string pixelType) { #> @@ -123,7 +83,6 @@ using SixLabors.ImageSharp.PixelFormats.Utils; sourcePixels.CopyTo(destinationPixels); } - <#+ } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs new file mode 100644 index 0000000000..62d0e6164b --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct L16 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs new file mode 100644 index 0000000000..5da55ffb43 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct L8 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs new file mode 100644 index 0000000000..feb4b65fd3 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct La16 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs new file mode 100644 index 0000000000..f69e6c185d --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct La32 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs new file mode 100644 index 0000000000..c4c6ac8ad0 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Rgb24 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs new file mode 100644 index 0000000000..bbe12315f3 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Rgb48 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + } + } +} diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs index dcf304e9b0..bc44548590 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs @@ -4,7 +4,7 @@ using System; using System.Numerics; using System.Runtime.InteropServices; - +using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats.Utils; namespace SixLabors.ImageSharp.PixelFormats @@ -19,6 +19,10 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + /// public override void ToVector4( Configuration configuration, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs new file mode 100644 index 0000000000..e953a378e1 --- /dev/null +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs @@ -0,0 +1,23 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.Formats; + +namespace SixLabors.ImageSharp.PixelFormats +{ + /// + /// Provides optimized overrides for bulk operations. + /// + public partial struct Rgba64 + { + /// + /// Provides optimized overrides for bulk operations. + /// + internal partial class PixelOperations : PixelOperations + { + /// + public override PixelTypeInfo GetPixelTypeInfo() + => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + } + } +} From 2871e8ed2e695779aa30b59bd8d3f3204a7a401b Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Mon, 26 Oct 2020 22:17:59 +0200 Subject: [PATCH 10/61] Add support using libgdiplus on macOS --- src/ImageSharp/ImageSharp.csproj | 8 ++++++++ tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj | 4 +++- tests/ImageSharp.Tests/ImageSharp.Tests.csproj | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index c3d9618c8c..2a9b53cbab 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -28,6 +28,14 @@ + + + + + + + + diff --git a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj index 4784a219b2..627e281f6f 100644 --- a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj +++ b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj @@ -26,7 +26,9 @@ - + + + diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index 07ade97d5d..d96d33a5ad 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -22,6 +22,8 @@ + + From 8276bda4f2107da08cd32364d4e70ab07d0098c8 Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Mon, 26 Oct 2020 22:31:16 +0200 Subject: [PATCH 11/61] Fix incompatible package reference for OSX --- src/ImageSharp/ImageSharp.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index 2a9b53cbab..a5e6bbbc7d 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -32,7 +32,7 @@ - + From 2749a25d78c02c2931552766cbb3549c3d81a55f Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Thu, 12 Nov 2020 16:52:56 +0200 Subject: [PATCH 12/61] Move package to build props --- .github/workflows/build-and-test.yml | 4 ++++ src/ImageSharp/ImageSharp.csproj | 8 -------- tests/Directory.Build.targets | 2 ++ tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj | 2 -- tests/ImageSharp.Tests/ImageSharp.Tests.csproj | 2 -- 5 files changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index c8f3997946..b618e1e657 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -18,6 +18,10 @@ jobs: framework: netcoreapp3.1 runtime: -x64 codecov: true + - os: macos-latest + framework: netcoreapp3.1 + runtime: -x64 + codecov: false - os: windows-latest framework: netcoreapp3.1 runtime: -x64 diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index a5e6bbbc7d..c3d9618c8c 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -28,14 +28,6 @@ - - - - - - - - diff --git a/tests/Directory.Build.targets b/tests/Directory.Build.targets index 1f699c9dd1..76759948b2 100644 --- a/tests/Directory.Build.targets +++ b/tests/Directory.Build.targets @@ -35,6 +35,8 @@ + + diff --git a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj index 627e281f6f..e8ad660adf 100644 --- a/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj +++ b/tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj @@ -26,8 +26,6 @@ - - diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index d96d33a5ad..07ade97d5d 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -22,8 +22,6 @@ - - From c00ca80e199aa4b4a043211ee6215ea22822b3bf Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Fri, 30 Oct 2020 11:48:24 +0200 Subject: [PATCH 13/61] Do not run windows specific tests on macOS --- .../TestUtilities/Tests/TestEnvironmentTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs b/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs index e72d953ac1..e3418220b0 100644 --- a/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs +++ b/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs @@ -67,7 +67,7 @@ namespace SixLabors.ImageSharp.Tests [InlineData("lol/Baz.gif", typeof(GifEncoder))] public void GetReferenceEncoder_ReturnsCorrectEncoders_Windows(string fileName, Type expectedEncoderType) { - if (TestEnvironment.IsLinux) + if (!TestEnvironment.IsWindows) { return; } @@ -83,7 +83,7 @@ namespace SixLabors.ImageSharp.Tests [InlineData("lol/Baz.gif", typeof(GifDecoder))] public void GetReferenceDecoder_ReturnsCorrectDecoders_Windows(string fileName, Type expectedDecoderType) { - if (TestEnvironment.IsLinux) + if (!TestEnvironment.IsWindows) { return; } From 7bbd678541894263413ec8634d4b20fcd2fd2d8b Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Fri, 30 Oct 2020 12:15:34 +0200 Subject: [PATCH 14/61] Decorate OSX specific tests --- .../Processing/Processors/Transforms/ResizeTests.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index f40b8d11a0..47d951837d 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -355,6 +355,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] + [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeFromSourceRectangle(TestImageProvider provider) where TPixel : unmanaged, IPixel @@ -437,6 +438,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] + [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeWithBoxPadMode(TestImageProvider provider) where TPixel : unmanaged, IPixel @@ -547,6 +549,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] + [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeWithPadMode(TestImageProvider provider) where TPixel : unmanaged, IPixel From 7de5c591021cc1589b612d2390a256e8edbe5890 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 15 Nov 2020 18:07:37 +0100 Subject: [PATCH 15/61] Use bulk conversion to rgba in Write8BitColor --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index 454440f634..322d08e4c8 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -6,7 +6,6 @@ using System.Buffers; using System.IO; using System.Runtime.InteropServices; using System.Threading; -using System.Threading.Tasks; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Memory; @@ -340,15 +339,15 @@ namespace SixLabors.ImageSharp.Formats.Bmp { using IQuantizer frameQuantizer = this.quantizer.CreatePixelSpecificQuantizer(this.configuration); using IndexedImageFrame quantized = frameQuantizer.BuildPaletteAndQuantizeFrame(image, image.Bounds()); + using IMemoryOwner rgbColorsBuffer = this.memoryAllocator.Allocate(quantized.Palette.Length); + Span rgbColors = rgbColorsBuffer.GetSpan(); ReadOnlySpan quantizedColors = quantized.Palette.Span; - var color = default(Rgba32); + PixelOperations.Instance.ToRgba32(Configuration.Default, quantizedColors, rgbColors); - // TODO: Use bulk conversion here for better perf int idx = 0; - foreach (TPixel quantizedColor in quantizedColors) + foreach (Rgba32 color in rgbColors) { - quantizedColor.ToRgba32(ref color); colorPalette[idx] = color.B; colorPalette[idx + 1] = color.G; colorPalette[idx + 2] = color.R; From 9449f947e2edc88c5a7361b2d774587a3f1e836a Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 15 Nov 2020 18:51:34 +0100 Subject: [PATCH 16/61] Dont use the default config in ToRgba32 --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index 322d08e4c8..c7e7a534b7 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -343,7 +343,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp Span rgbColors = rgbColorsBuffer.GetSpan(); ReadOnlySpan quantizedColors = quantized.Palette.Span; - PixelOperations.Instance.ToRgba32(Configuration.Default, quantizedColors, rgbColors); + PixelOperations.Instance.ToRgba32(this.configuration, quantizedColors, rgbColors); int idx = 0; foreach (Rgba32 color in rgbColors) From 85b65d393ab131ca9afc1e439729ff9d07a8cdff Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 15 Nov 2020 19:20:59 +0100 Subject: [PATCH 17/61] Use colorPalette span as destination of bulk conversion --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index c7e7a534b7..01bdbd1c0b 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -339,22 +339,13 @@ namespace SixLabors.ImageSharp.Formats.Bmp { using IQuantizer frameQuantizer = this.quantizer.CreatePixelSpecificQuantizer(this.configuration); using IndexedImageFrame quantized = frameQuantizer.BuildPaletteAndQuantizeFrame(image, image.Bounds()); - using IMemoryOwner rgbColorsBuffer = this.memoryAllocator.Allocate(quantized.Palette.Length); - Span rgbColors = rgbColorsBuffer.GetSpan(); ReadOnlySpan quantizedColors = quantized.Palette.Span; - PixelOperations.Instance.ToRgba32(this.configuration, quantizedColors, rgbColors); - - int idx = 0; - foreach (Rgba32 color in rgbColors) + PixelOperations.Instance.ToBgra32(this.configuration, quantizedColors, MemoryMarshal.Cast(colorPalette)); + Span colorPaletteAsUInt = MemoryMarshal.Cast(colorPalette); + for (int i = 0; i < colorPaletteAsUInt.Length; i++) { - colorPalette[idx] = color.B; - colorPalette[idx + 1] = color.G; - colorPalette[idx + 2] = color.R; - - // Padding byte, always 0. - colorPalette[idx + 3] = 0; - idx += 4; + colorPaletteAsUInt[i] = colorPaletteAsUInt[i] & 0x00FFFFFF; // Padding byte, always 0. } stream.Write(colorPalette); From 440d8cf11633164995870127abe3b27845325937 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Mon, 16 Nov 2020 14:56:11 +0100 Subject: [PATCH 18/61] Use GetPixelRowSpan to access pixels, fixes #1429 --- ...eHistogramEqualizationProcessor{TPixel}.cs | 70 ++++++++----------- 1 file changed, 30 insertions(+), 40 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs index b5b07d7a87..95626ce1e9 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs @@ -86,42 +86,39 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization new Rectangle(0, 0, sourceWidth, tileYStartPositions.Count), in operation); - ref TPixel pixelsBase = ref source.GetPixelReference(0, 0); - // Fix left column - ProcessBorderColumn(ref pixelsBase, cdfData, 0, sourceWidth, sourceHeight, this.Tiles, tileHeight, xStart: 0, xEnd: halfTileWidth, luminanceLevels); + ProcessBorderColumn(source, cdfData, 0, sourceHeight, this.Tiles, tileHeight, xStart: 0, xEnd: halfTileWidth, luminanceLevels); // Fix right column int rightBorderStartX = ((this.Tiles - 1) * tileWidth) + halfTileWidth; - ProcessBorderColumn(ref pixelsBase, cdfData, this.Tiles - 1, sourceWidth, sourceHeight, this.Tiles, tileHeight, xStart: rightBorderStartX, xEnd: sourceWidth, luminanceLevels); + ProcessBorderColumn(source, cdfData, this.Tiles - 1, sourceHeight, this.Tiles, tileHeight, xStart: rightBorderStartX, xEnd: sourceWidth, luminanceLevels); // Fix top row - ProcessBorderRow(ref pixelsBase, cdfData, 0, sourceWidth, this.Tiles, tileWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); + ProcessBorderRow(source, cdfData, 0, sourceWidth, this.Tiles, tileWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); // Fix bottom row int bottomBorderStartY = ((this.Tiles - 1) * tileHeight) + halfTileHeight; - ProcessBorderRow(ref pixelsBase, cdfData, this.Tiles - 1, sourceWidth, this.Tiles, tileWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); + ProcessBorderRow(source, cdfData, this.Tiles - 1, sourceWidth, this.Tiles, tileWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); // Left top corner - ProcessCornerTile(ref pixelsBase, cdfData, sourceWidth, 0, 0, xStart: 0, xEnd: halfTileWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); + ProcessCornerTile(source, cdfData, 0, 0, xStart: 0, xEnd: halfTileWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); // Left bottom corner - ProcessCornerTile(ref pixelsBase, cdfData, sourceWidth, 0, this.Tiles - 1, xStart: 0, xEnd: halfTileWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); + ProcessCornerTile(source, cdfData, 0, this.Tiles - 1, xStart: 0, xEnd: halfTileWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); // Right top corner - ProcessCornerTile(ref pixelsBase, cdfData, sourceWidth, this.Tiles - 1, 0, xStart: rightBorderStartX, xEnd: sourceWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); + ProcessCornerTile(source, cdfData, this.Tiles - 1, 0, xStart: rightBorderStartX, xEnd: sourceWidth, yStart: 0, yEnd: halfTileHeight, luminanceLevels); // Right bottom corner - ProcessCornerTile(ref pixelsBase, cdfData, sourceWidth, this.Tiles - 1, this.Tiles - 1, xStart: rightBorderStartX, xEnd: sourceWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); + ProcessCornerTile(source, cdfData, this.Tiles - 1, this.Tiles - 1, xStart: rightBorderStartX, xEnd: sourceWidth, yStart: bottomBorderStartY, yEnd: sourceHeight, luminanceLevels); } } /// /// Processes the part of a corner tile which was previously left out. It consists of 1 / 4 of a tile and does not need interpolation. /// - /// The output pixels base reference. + /// The source image. /// The lookup table to remap the grey values. - /// The source image width. /// The x-position in the CDF lookup map. /// The y-position in the CDF lookup map. /// X start position. @@ -133,9 +130,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// or 65536 for 16-bit grayscale images. /// private static void ProcessCornerTile( - ref TPixel pixelsBase, + ImageFrame source, CdfTileData cdfData, - int sourceWidth, int cdfX, int cdfY, int xStart, @@ -146,12 +142,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int dy = yStart; dy < yEnd; dy++) { - int dyOffSet = dy * sourceWidth; + Span rowSpan = source.GetPixelRowSpan(dy); for (int dx = xStart; dx < xEnd; dx++) { - ref TPixel pixel = ref Unsafe.Add(ref pixelsBase, dyOffSet + dx); + TPixel pixel = rowSpan[dx]; float luminanceEqualized = cdfData.RemapGreyValue(cdfX, cdfY, GetLuminance(pixel, luminanceLevels)); - pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); } } } @@ -159,10 +155,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// /// Processes a border column of the image which is half the size of the tile width. /// - /// The output pixels reference. + /// The source image. /// The pre-computed lookup tables to remap the grey values for each tiles. /// The X index of the lookup table to use. - /// The source image width. /// The source image height. /// The number of vertical tiles. /// The height of a tile. @@ -173,10 +168,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// or 65536 for 16-bit grayscale images. /// private static void ProcessBorderColumn( - ref TPixel pixelBase, + ImageFrame source, CdfTileData cdfData, int cdfX, - int sourceWidth, int sourceHeight, int tileCount, int tileHeight, @@ -194,12 +188,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int tileY = 0; for (int dy = y; dy < yLimit; dy++) { - int dyOffSet = dy * sourceWidth; + Span rowSpan = source.GetPixelRowSpan(dy); for (int dx = xStart; dx < xEnd; dx++) { - ref TPixel pixel = ref Unsafe.Add(ref pixelBase, dyOffSet + dx); + TPixel pixel = rowSpan[dx]; float luminanceEqualized = InterpolateBetweenTwoTiles(pixel, cdfData, cdfX, cdfY, cdfX, cdfY + 1, tileY, tileHeight, luminanceLevels); - pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); } tileY++; @@ -213,7 +207,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// /// Processes a border row of the image which is half of the size of the tile height. /// - /// The output pixels base reference. + /// The source image. /// The pre-computed lookup tables to remap the grey values for each tiles. /// The Y index of the lookup table to use. /// The source image width. @@ -226,7 +220,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization /// or 65536 for 16-bit grayscale images. /// private static void ProcessBorderRow( - ref TPixel pixelBase, + ImageFrame source, CdfTileData cdfData, int cdfY, int sourceWidth, @@ -244,14 +238,14 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int dy = yStart; dy < yEnd; dy++) { - int dyOffSet = dy * sourceWidth; + Span rowSpan = source.GetPixelRowSpan(dy); int tileX = 0; int xLimit = Math.Min(x + tileWidth, sourceWidth - 1); for (int dx = x; dx < xLimit; dx++) { - ref TPixel pixel = ref Unsafe.Add(ref pixelBase, dyOffSet + dx); + TPixel pixel = rowSpan[dx]; float luminanceEqualized = InterpolateBetweenTwoTiles(pixel, cdfData, cdfX, cdfY, cdfX + 1, cdfY, tileX, tileWidth, luminanceLevels); - pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); tileX++; } } @@ -410,8 +404,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization [MethodImpl(InliningOptions.ShortMethod)] public void Invoke(in RowInterval rows) { - ref TPixel sourceBase = ref this.source.GetPixelReference(0, 0); - for (int index = rows.Min; index < rows.Max; index++) { (int y, int cdfY) tileYStartPosition = this.tileYStartPositions[index]; @@ -427,11 +419,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int xEnd = Math.Min(x + this.tileWidth, this.sourceWidth); for (int dy = y; dy < yEnd; dy++) { - int dyOffSet = dy * this.sourceWidth; + Span rowSpan = this.source.GetPixelRowSpan(dy); int tileX = 0; for (int dx = x; dx < xEnd; dx++) { - ref TPixel pixel = ref Unsafe.Add(ref sourceBase, dyOffSet + dx); + TPixel pixel = rowSpan[dx]; float luminanceEqualized = InterpolateBetweenFourTiles( pixel, this.cdfData, @@ -445,7 +437,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization this.tileHeight, this.luminanceLevels); - pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); tileX++; } @@ -597,15 +589,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization [MethodImpl(InliningOptions.ShortMethod)] public void Invoke(in RowInterval rows) { - ref TPixel sourceBase = ref this.source.GetPixelReference(0, 0); - for (int index = rows.Min; index < rows.Max; index++) { int cdfX = 0; int cdfY = this.tileYStartPositions[index].cdfY; int y = this.tileYStartPositions[index].y; int endY = Math.Min(y + this.tileHeight, this.sourceHeight); - ref int cdfMinBase = ref MemoryMarshal.GetReference(this.cdfMinBuffer2D.GetRowSpan(cdfY)); + Span cdfMinSpan = this.cdfMinBuffer2D.GetRowSpan(cdfY); using IMemoryOwner histogramBuffer = this.allocator.Allocate(this.luminanceLevels); Span histogram = histogramBuffer.GetSpan(); @@ -620,10 +610,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int xlimit = Math.Min(x + this.tileWidth, this.sourceWidth); for (int dy = y; dy < endY; dy++) { - int dyOffset = dy * this.sourceWidth; + Span rowSpan = this.source.GetPixelRowSpan(dy); for (int dx = x; dx < xlimit; dx++) { - int luminance = GetLuminance(Unsafe.Add(ref sourceBase, dyOffset + dx), this.luminanceLevels); + int luminance = GetLuminance(rowSpan[dx], this.luminanceLevels); histogram[luminance]++; } } @@ -633,7 +623,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization this.processor.ClipHistogram(histogram, this.processor.ClipLimit); } - Unsafe.Add(ref cdfMinBase, cdfX) = this.processor.CalculateCdf(ref cdfBase, ref histogramBase, histogram.Length - 1); + cdfMinSpan[cdfX] += this.processor.CalculateCdf(ref cdfBase, ref histogramBase, histogram.Length - 1); cdfX++; } From 9d8ed6c852a45f07c5c8121b701cc1b53e8a927b Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Mon, 16 Nov 2020 15:06:11 +0100 Subject: [PATCH 19/61] Use GetPixelRowSpan to access pixel data in global hist equalization --- .../GlobalHistogramEqualizationProcessor{TPixel}.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index 488426f939..2aaf8cdcdc 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -116,13 +116,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public void Invoke(int y) { ref int histogramBase = ref MemoryMarshal.GetReference(this.histogramBuffer.GetSpan()); - ref TPixel pixelBase = ref MemoryMarshal.GetReference(this.source.GetPixelRowSpan(y)); + Span pixelRow = this.source.GetPixelRowSpan(y); int levels = this.luminanceLevels; for (int x = 0; x < this.bounds.Width; x++) { // TODO: We should bulk convert here. - var vector = Unsafe.Add(ref pixelBase, x).ToVector4(); + var vector = pixelRow[x].ToVector4(); int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); Interlocked.Increment(ref Unsafe.Add(ref histogramBase, luminance)); } @@ -165,18 +165,18 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public void Invoke(int y) { ref int cdfBase = ref MemoryMarshal.GetReference(this.cdfBuffer.GetSpan()); - ref TPixel pixelBase = ref MemoryMarshal.GetReference(this.source.GetPixelRowSpan(y)); + Span pixelRow = this.source.GetPixelRowSpan(y); int levels = this.luminanceLevels; float noOfPixelsMinusCdfMin = this.numberOfPixelsMinusCdfMin; for (int x = 0; x < this.bounds.Width; x++) { // TODO: We should bulk convert here. - ref TPixel pixel = ref Unsafe.Add(ref pixelBase, x); + TPixel pixel = pixelRow[x]; var vector = pixel.ToVector4(); int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); float luminanceEqualized = Unsafe.Add(ref cdfBase, luminance) / noOfPixelsMinusCdfMin; - pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); + pixelRow[x].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); } } } From 3558e7ef97ddc1e3f8a1b8d7a43241799c97d779 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Mon, 16 Nov 2020 16:04:13 +0100 Subject: [PATCH 20/61] Use ref TPixel pixel = ref rowSpan[dx]; --- ...tiveHistogramEqualizationProcessor{TPixel}.cs | 16 ++++++++-------- ...obalHistogramEqualizationProcessor{TPixel}.cs | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs index 95626ce1e9..14687426d0 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs @@ -145,9 +145,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization Span rowSpan = source.GetPixelRowSpan(dy); for (int dx = xStart; dx < xEnd; dx++) { - TPixel pixel = rowSpan[dx]; + ref TPixel pixel = ref rowSpan[dx]; float luminanceEqualized = cdfData.RemapGreyValue(cdfX, cdfY, GetLuminance(pixel, luminanceLevels)); - rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); } } } @@ -191,9 +191,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization Span rowSpan = source.GetPixelRowSpan(dy); for (int dx = xStart; dx < xEnd; dx++) { - TPixel pixel = rowSpan[dx]; + ref TPixel pixel = ref rowSpan[dx]; float luminanceEqualized = InterpolateBetweenTwoTiles(pixel, cdfData, cdfX, cdfY, cdfX, cdfY + 1, tileY, tileHeight, luminanceLevels); - rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); } tileY++; @@ -243,9 +243,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int xLimit = Math.Min(x + tileWidth, sourceWidth - 1); for (int dx = x; dx < xLimit; dx++) { - TPixel pixel = rowSpan[dx]; + ref TPixel pixel = ref rowSpan[dx]; float luminanceEqualized = InterpolateBetweenTwoTiles(pixel, cdfData, cdfX, cdfY, cdfX + 1, cdfY, tileX, tileWidth, luminanceLevels); - rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); tileX++; } } @@ -423,7 +423,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int tileX = 0; for (int dx = x; dx < xEnd; dx++) { - TPixel pixel = rowSpan[dx]; + ref TPixel pixel = ref rowSpan[dx]; float luminanceEqualized = InterpolateBetweenFourTiles( pixel, this.cdfData, @@ -437,7 +437,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization this.tileHeight, this.luminanceLevels); - rowSpan[dx].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); + pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, pixel.ToVector4().W)); tileX++; } diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index 2aaf8cdcdc..74d293566c 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -172,11 +172,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization for (int x = 0; x < this.bounds.Width; x++) { // TODO: We should bulk convert here. - TPixel pixel = pixelRow[x]; + ref TPixel pixel = ref pixelRow[x]; var vector = pixel.ToVector4(); int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); float luminanceEqualized = Unsafe.Add(ref cdfBase, luminance) / noOfPixelsMinusCdfMin; - pixelRow[x].FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); + pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); } } } From fc4944a2c09f66df6e4eb2727c07b9ed1efd6acf Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Mon, 16 Nov 2020 16:36:25 +0100 Subject: [PATCH 21/61] Add histogram equalization benchmark --- .../Processing/HistogramEqualization.cs | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 tests/ImageSharp.Benchmarks/Processing/HistogramEqualization.cs diff --git a/tests/ImageSharp.Benchmarks/Processing/HistogramEqualization.cs b/tests/ImageSharp.Benchmarks/Processing/HistogramEqualization.cs new file mode 100644 index 0000000000..081d3e8e31 --- /dev/null +++ b/tests/ImageSharp.Benchmarks/Processing/HistogramEqualization.cs @@ -0,0 +1,53 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using System.IO; +using BenchmarkDotNet.Attributes; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; +using SixLabors.ImageSharp.Processing.Processors.Normalization; +using SixLabors.ImageSharp.Tests; + +namespace SixLabors.ImageSharp.Benchmarks.Processing +{ + [Config(typeof(Config.ShortClr))] + public class HistogramEqualization : BenchmarkBase + { + private Image image; + + [GlobalSetup] + public void ReadImages() + { + if (this.image == null) + { + this.image = Image.Load(File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Jpeg.Baseline.HistogramEqImage))); + } + } + + [GlobalCleanup] + public void Cleanup() + { + this.image.Dispose(); + } + + [Benchmark(Description = "Global Histogram Equalization")] + public void GlobalHistogramEqualization() + { + this.image.Mutate(img => img.HistogramEqualization(new HistogramEqualizationOptions() + { + LuminanceLevels = 256, + Method = HistogramEqualizationMethod.Global + })); + } + + [Benchmark(Description = "AdaptiveHistogramEqualization (Tile interpolation)")] + public void AdaptiveHistogramEqualization() + { + this.image.Mutate(img => img.HistogramEqualization(new HistogramEqualizationOptions() + { + LuminanceLevels = 256, + Method = HistogramEqualizationMethod.AdaptiveTileInterpolation + })); + } + } +} From 20c598cb1fdf573293e8b20831b72ffc18ecfcc0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 18 Nov 2020 22:06:56 +0000 Subject: [PATCH 22/61] Update tests --- ...elOperationsTests.Specialized.Generated.cs | 309 +++++------------- .../Generated/_Common.ttinclude | 12 +- .../PixelOperations/PixelOperationsTests.cs | 103 +++--- 3 files changed, 152 insertions(+), 272 deletions(-) diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs index 5b1abb7495..9d6ec89606 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs @@ -3,7 +3,6 @@ // -using System.Runtime.CompilerServices; using SixLabors.ImageSharp.PixelFormats; using Xunit; using Xunit.Abstractions; @@ -23,20 +22,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => A8.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = A8.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = A8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -50,20 +44,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Argb32.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Argb32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Argb32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -77,20 +66,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Bgr24.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -104,20 +88,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Bgr565.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -131,20 +110,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Bgra32.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -158,20 +132,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Bgra4444.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -185,20 +154,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Bgra5551.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -212,20 +176,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Byte4.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Byte4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Byte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -239,20 +198,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => HalfSingle.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -266,20 +220,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => HalfVector2.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -293,20 +242,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => HalfVector4.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -320,20 +264,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => L16.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = L16.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = L16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -347,20 +286,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => L8.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = L8.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = L8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -374,20 +308,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => La16.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = La16.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = La16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -401,20 +330,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => La32.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = La32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = La32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -428,20 +352,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => NormalizedByte2.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -455,20 +374,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => NormalizedByte4.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -482,20 +396,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => NormalizedShort2.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -509,20 +418,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => NormalizedShort4.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -536,20 +440,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rg32.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rg32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rg32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -563,20 +462,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rgb24.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -590,20 +484,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rgb48.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -617,20 +506,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rgba1010102.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -644,20 +528,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rgba32.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -671,20 +550,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Rgba64.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -698,20 +572,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => RgbaVector.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } @@ -725,20 +594,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Short2.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Short2.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Short2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.None, alphaRepresentation); } } @@ -752,20 +616,15 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); + protected override PixelOperations Operations => Short4.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = Short4.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType(PixelOperations.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = Short4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(PixelAlphaRepresentation.Unassociated, alphaRepresentation); } } diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude index bc093be85f..50026b3f86 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude @@ -8,7 +8,6 @@ // -using System.Runtime.CompilerServices; using SixLabors.ImageSharp.PixelFormats; using Xunit; using Xunit.Abstractions; @@ -79,20 +78,15 @@ using Xunit.Abstractions; this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } - [Fact] - public void IsSpecialImplementation() => Assert.IsType<<#=pixelType#>.PixelOperations>(PixelOperations<<#=pixelType#>>.Instance); + protected override PixelOperations<<#=pixelType#>> Operations => <#=pixelType#>.PixelOperations.Instance; [Fact] - public void PixelTypeInfoHasCorrectBitsPerPixel() - { - var bits = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().BitsPerPixel; - Assert.Equal(Unsafe.SizeOf<<#=pixelType#>>() * 8, bits); - } + public void IsSpecialImplementation() => Assert.IsType<<#=pixelType#>.PixelOperations>(PixelOperations<<#=pixelType#>>.Instance); [Fact] public void PixelTypeInfoHasCorrectAlphaRepresentation() { - var alphaRepresentation = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; + var alphaRepresentation = this.Operations.GetPixelTypeInfo().AlphaRepresentation; Assert.Equal(<#=alpha#>, alphaRepresentation); } } diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs index d18c3c860a..543184e34b 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs @@ -73,7 +73,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations protected Configuration Configuration => Configuration.Default; - internal static PixelOperations Operations => PixelOperations.Instance; + protected virtual PixelOperations Operations => PixelOperations.Instance; internal static TPixel[] CreateExpectedPixelData(Vector4[] source, RefAction vectorModifier = null) { @@ -105,6 +105,33 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations return expected; } + [Fact] + public void PixelTypeInfoHasCorrectBitsPerPixel() + { + var bits = this.Operations.GetPixelTypeInfo().BitsPerPixel; + Assert.Equal(Unsafe.SizeOf() * 8, bits); + } + + [Fact] + public void PixelAlphaRepresentation_DefinesPresenceOfAlphaChannel() + { + // We use 0 - 255 as we have pixel formats that store + // the alpha component in less than 8 bits. + const byte Alpha = byte.MinValue; + const byte NoAlpha = byte.MaxValue; + + TPixel pixel = default; + pixel.FromRgba32(new Rgba32(0, 0, 0, Alpha)); + + Rgba32 dest = default; + pixel.ToRgba32(ref dest); + + bool hasAlpha = this.Operations.GetPixelTypeInfo().AlphaRepresentation != PixelAlphaRepresentation.None; + + byte expectedAlpha = hasAlpha ? Alpha : NoAlpha; + Assert.Equal(expectedAlpha, dest.A); + } + [Theory] [MemberData(nameof(ArraySizesData))] public void FromVector4(int count) @@ -115,7 +142,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan())); } [Theory] @@ -131,7 +158,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations (s, d) => { Span destPixels = d.GetSpan(); - Operations.FromVector4Destructive(this.Configuration, (Span)s, destPixels, PixelConversionModifiers.Scale); + this.Operations.FromVector4Destructive(this.Configuration, (Span)s, destPixels, PixelConversionModifiers.Scale); }); } @@ -155,7 +182,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromVector4Destructive( + (s, d) => this.Operations.FromVector4Destructive( this.Configuration, s, d.GetSpan(), @@ -194,7 +221,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; - Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan(), modifiers); + this.Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan(), modifiers); }); } @@ -230,7 +257,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; - Operations.FromVector4Destructive( + this.Operations.FromVector4Destructive( this.Configuration, s, d.GetSpan(), @@ -274,7 +301,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; - Operations.FromVector4Destructive( + this.Operations.FromVector4Destructive( this.Configuration, s, d.GetSpan(), @@ -292,7 +319,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToVector4(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.ToVector4(this.Configuration, s, d.GetSpan())); } public static readonly TheoryData Generic_To_Data = new TheoryData @@ -317,7 +344,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations PixelConverterTests.ReferenceImplementations.To(this.Configuration, source, expected); - TestOperation(source, expected, (s, d) => Operations.To(this.Configuration, (ReadOnlySpan)s, d.GetSpan())); + TestOperation(source, expected, (s, d) => this.Operations.To(this.Configuration, (ReadOnlySpan)s, d.GetSpan())); } [Theory] @@ -333,7 +360,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations (s, d) => { Span destVectors = d.GetSpan(); - Operations.ToVector4(this.Configuration, (ReadOnlySpan)s, destVectors, PixelConversionModifiers.Scale); + this.Operations.ToVector4(this.Configuration, (ReadOnlySpan)s, destVectors, PixelConversionModifiers.Scale); }); } @@ -357,7 +384,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToVector4( + (s, d) => this.Operations.ToVector4( this.Configuration, s, d.GetSpan(), @@ -384,7 +411,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToVector4(this.Configuration, s, d.GetSpan(), PixelConversionModifiers.Premultiply)); + (s, d) => this.Operations.ToVector4(this.Configuration, s, d.GetSpan(), PixelConversionModifiers.Premultiply)); } [Theory] @@ -407,7 +434,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToVector4( + (s, d) => this.Operations.ToVector4( this.Configuration, s, d.GetSpan(), @@ -436,7 +463,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToVector4( + (s, d) => this.Operations.ToVector4( this.Configuration, s, d.GetSpan(), @@ -460,7 +487,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromArgb32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromArgb32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -485,7 +512,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToArgb32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToArgb32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -505,7 +532,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromBgr24Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromBgr24Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -528,7 +555,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToBgr24Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToBgr24Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -548,7 +575,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromBgra32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromBgra32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -572,7 +599,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToBgra32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToBgra32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -594,7 +621,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromBgra5551Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromBgra5551Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -618,7 +645,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToBgra5551Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToBgra5551Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -637,7 +664,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromL8(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.FromL8(this.Configuration, s, d.GetSpan())); } [Theory] @@ -655,7 +682,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToL8(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.ToL8(this.Configuration, s, d.GetSpan())); } [Theory] @@ -679,7 +706,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromL16(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.FromL16(this.Configuration, s, d.GetSpan())); } [Theory] @@ -697,7 +724,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToL16(this.Configuration, s, d.GetSpan())); + (s, d) => this.Operations.ToL16(this.Configuration, s, d.GetSpan())); } [Theory] @@ -719,7 +746,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromLa16Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromLa16Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -743,7 +770,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToLa16Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToLa16Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -765,7 +792,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromLa32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromLa32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -791,7 +818,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToLa32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToLa32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -811,7 +838,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromRgb24Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromRgb24Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -834,7 +861,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToRgb24Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToRgb24Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -854,7 +881,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromRgba32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromRgba32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -878,7 +905,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToRgba32Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToRgba32Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -898,7 +925,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromRgb48Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromRgb48Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -925,7 +952,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToRgb48Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToRgb48Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -945,7 +972,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.FromRgba64Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.FromRgba64Bytes(this.Configuration, s, d.GetSpan(), count)); } [Theory] @@ -974,7 +1001,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations TestOperation( source, expected, - (s, d) => Operations.ToRgba64Bytes(this.Configuration, s, d.GetSpan(), count)); + (s, d) => this.Operations.ToRgba64Bytes(this.Configuration, s, d.GetSpan(), count)); } public delegate void RefAction(ref T1 arg1); From 65909fcf5a712a539894b76ed59eb2aad526143a Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 18 Nov 2020 23:05:34 +0000 Subject: [PATCH 23/61] Make PixelTypeInfo lazy --- .../PixelOperations/A8.PixelOperations.cs | 6 +++++- .../PixelOperations/Argb32.PixelOperations.cs | 6 +++++- .../PixelOperations/Bgr24.PixelOperations.cs | 7 +++++-- .../PixelOperations/Bgr565.PixelOperations.cs | 6 +++++- .../PixelOperations/Bgra32.PixelOperations.cs | 7 +++++-- .../PixelOperations/Bgra4444.PixelOperations.cs | 6 +++++- .../PixelOperations/Bgra5551.PixelOperations.cs | 7 +++++-- .../PixelOperations/Byte4.PixelOperations.cs | 6 +++++- .../PixelOperations/HalfSingle.PixelOperations.cs | 6 +++++- .../PixelOperations/HalfVector2.PixelOperations.cs | 6 +++++- .../PixelOperations/HalfVector4.PixelOperations.cs | 6 +++++- .../PixelOperations/L16.PixelOperations.cs | 7 +++++-- .../PixelOperations/L8.PixelOperations.cs | 7 +++++-- .../PixelOperations/La16.PixelOperations.cs | 7 +++++-- .../PixelOperations/La32.PixelOperations.cs | 7 +++++-- .../PixelOperations/NormalizedByte2.PixelOperations.cs | 6 +++++- .../PixelOperations/NormalizedByte4.PixelOperations.cs | 6 +++++- .../PixelOperations/NormalizedShort2.PixelOperations.cs | 6 +++++- .../PixelOperations/NormalizedShort4.PixelOperations.cs | 6 +++++- .../PixelOperations/Rg32.PixelOperations.cs | 6 +++++- .../PixelOperations/Rgb24.PixelOperations.cs | 7 +++++-- .../PixelOperations/Rgb48.PixelOperations.cs | 7 +++++-- .../PixelOperations/Rgba1010102.PixelOperations.cs | 6 +++++- .../PixelOperations/Rgba32.PixelOperations.cs | 6 ++++-- .../PixelOperations/Rgba64.PixelOperations.cs | 7 +++++-- .../PixelOperations/RgbaVector.PixelOperations.cs | 5 ++++- .../PixelOperations/Short2.PixelOperations.cs | 6 +++++- .../PixelOperations/Short4.PixelOperations.cs | 6 +++++- src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs | 4 +++- 29 files changed, 141 insertions(+), 40 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs index 48c2e145ac..7482a2e251 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/A8.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs index f819329550..f8f5715bd4 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Argb32.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs index cd77f58164..adae64d5de 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr24.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs index d62761c617..d75b79f5dd 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgr565.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs index 849f538351..5f7e516e59 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra32.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs index 82113299b7..eac8e4f170 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra4444.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs index 4714a8be2a..d0470b7a1f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Bgra5551.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs index 73411a9734..0a2fa10b2d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Byte4.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs index afbd3af4c2..81b5f76b30 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfSingle.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs index e9cc88c15d..228bb5c04c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector2.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs index 63b6e3af59..9ef132077b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/HalfVector4.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs index 62d0e6164b..3a9c24f46f 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L16.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs index 5da55ffb43..18a9a4c8a1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/L8.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs index feb4b65fd3..bd7ddaebbc 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La16.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs index f69e6c185d..c0e6cdd4f0 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/La32.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs index f0f513860c..8d2739b2c5 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte2.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs index 8874f12416..7825d16790 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedByte4.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs index a53587a060..35cf605c1c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort2.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs index 6a3dc505ff..d298c85f58 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/NormalizedShort4.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs index c079d1e5b1..c0a5ae920a 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rg32.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs index c4c6ac8ad0..73b656f363 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb24.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs index bbe12315f3..4c26f1b0ff 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgb48.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs index b13fe2ec89..60fa98ed16 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba1010102.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs index bc44548590..d8322e37d4 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba32.PixelOperations.cs @@ -19,9 +19,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; /// public override void ToVector4( diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs index e953a378e1..055b87286d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Rgba64.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,9 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() - => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs index 11ef90e49b..1605d862ee 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs @@ -20,8 +20,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; /// public override void FromVector4Destructive( diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs index 942e40f94d..e8a6bac3a1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short2.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.None), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.None); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs index b2d743f87a..8b99713d6e 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Short4.PixelOperations.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.Formats; namespace SixLabors.ImageSharp.PixelFormats @@ -15,8 +16,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal class PixelOperations : PixelOperations { + private static readonly Lazy LazyInfo = + new Lazy(() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated), true); + /// - public override PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(PixelAlphaRepresentation.Unassociated); + public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; } } } diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs index 14ad120bf9..dbe06702d9 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs @@ -17,6 +17,8 @@ namespace SixLabors.ImageSharp.PixelFormats public partial class PixelOperations where TPixel : unmanaged, IPixel { + private static readonly Lazy LazyInfo = new Lazy(() => PixelTypeInfo.Create(), true); + /// /// Gets the global instance for the pixel type /// @@ -26,7 +28,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// Gets the pixel type info for the given . /// /// The . - public virtual PixelTypeInfo GetPixelTypeInfo() => PixelTypeInfo.Create(); + public virtual PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; /// /// Bulk version of converting 'sourceVectors.Length' pixels into 'destinationColors'. From b1eb8fac002d248680fa70e23582c691ad74414f Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 18 Nov 2020 23:32:51 +0000 Subject: [PATCH 24/61] Move property to base. --- ...elOperationsTests.Specialized.Generated.cs | 56 ------------------- .../Generated/_Common.ttinclude | 2 - .../PixelOperations/PixelOperationsTests.cs | 15 ++--- 3 files changed, 6 insertions(+), 67 deletions(-) diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs index 9d6ec89606..1069eb9aca 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/PixelOperationsTests.Specialized.Generated.cs @@ -18,8 +18,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public A8_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = A8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => A8.PixelOperations.Instance; @@ -40,8 +38,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Argb32_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Argb32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Argb32.PixelOperations.Instance; @@ -62,8 +58,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgr24_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Bgr24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Bgr24.PixelOperations.Instance; @@ -84,8 +78,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgr565_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Bgr565.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Bgr565.PixelOperations.Instance; @@ -106,8 +98,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra32_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Bgra32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Bgra32.PixelOperations.Instance; @@ -128,8 +118,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra4444_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Bgra4444.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Bgra4444.PixelOperations.Instance; @@ -150,8 +138,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Bgra5551_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Bgra5551.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Bgra5551.PixelOperations.Instance; @@ -172,8 +158,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Byte4_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Byte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Byte4.PixelOperations.Instance; @@ -194,8 +178,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfSingle_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = HalfSingle.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => HalfSingle.PixelOperations.Instance; @@ -216,8 +198,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfVector2_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = HalfVector2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => HalfVector2.PixelOperations.Instance; @@ -238,8 +218,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public HalfVector4_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = HalfVector4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => HalfVector4.PixelOperations.Instance; @@ -260,8 +238,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public L16_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = L16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => L16.PixelOperations.Instance; @@ -282,8 +258,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public L8_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = L8.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => L8.PixelOperations.Instance; @@ -304,8 +278,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public La16_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = La16.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => La16.PixelOperations.Instance; @@ -326,8 +298,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public La32_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = La32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => La32.PixelOperations.Instance; @@ -348,8 +318,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedByte2_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = NormalizedByte2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => NormalizedByte2.PixelOperations.Instance; @@ -370,8 +338,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedByte4_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = NormalizedByte4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => NormalizedByte4.PixelOperations.Instance; @@ -392,8 +358,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedShort2_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = NormalizedShort2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => NormalizedShort2.PixelOperations.Instance; @@ -414,8 +378,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public NormalizedShort4_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = NormalizedShort4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => NormalizedShort4.PixelOperations.Instance; @@ -436,8 +398,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rg32_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rg32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rg32.PixelOperations.Instance; @@ -458,8 +418,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgb24_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rgb24.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rgb24.PixelOperations.Instance; @@ -480,8 +438,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgb48_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rgb48.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rgb48.PixelOperations.Instance; @@ -502,8 +458,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba1010102_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rgba1010102.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rgba1010102.PixelOperations.Instance; @@ -524,8 +478,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba32_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rgba32.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rgba32.PixelOperations.Instance; @@ -546,8 +498,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Rgba64_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Rgba64.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Rgba64.PixelOperations.Instance; @@ -568,8 +518,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public RgbaVector_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = RgbaVector.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => RgbaVector.PixelOperations.Instance; @@ -590,8 +538,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Short2_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Short2.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Short2.PixelOperations.Instance; @@ -612,8 +558,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations public Short4_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = Short4.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations Operations => Short4.PixelOperations.Instance; diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude index 50026b3f86..8c436eecca 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/Generated/_Common.ttinclude @@ -74,8 +74,6 @@ using Xunit.Abstractions; public <#=pixelType#>_OperationsTests(ITestOutputHelper output) : base(output) { - var alphaRepresentation = <#=pixelType#>.PixelOperations.Instance.GetPixelTypeInfo().AlphaRepresentation; - this.HasUnassociatedAlpha = alphaRepresentation == PixelAlphaRepresentation.Unassociated; } protected override PixelOperations<<#=pixelType#>> Operations => <#=pixelType#>.PixelOperations.Instance; diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs index 543184e34b..059a218031 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs @@ -36,8 +36,6 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations null; #endif - protected bool HasUnassociatedAlpha { get; set; } = true; - protected PixelOperationsTests(ITestOutputHelper output) : base(output) { @@ -73,7 +71,9 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations protected Configuration Configuration => Configuration.Default; - protected virtual PixelOperations Operations => PixelOperations.Instance; + protected virtual PixelOperations Operations { get; } = PixelOperations.Instance; + + protected bool HasUnassociatedAlpha => this.Operations.GetPixelTypeInfo().AlphaRepresentation == PixelAlphaRepresentation.Unassociated; internal static TPixel[] CreateExpectedPixelData(Vector4[] source, RefAction vectorModifier = null) { @@ -217,8 +217,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations expected, (s, d) => { - PixelConversionModifiers modifiers = this.HasUnassociatedAlpha - ? PixelConversionModifiers.Premultiply + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; this.Operations.FromVector4Destructive(this.Configuration, s, d.GetSpan(), modifiers); @@ -253,8 +252,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations expected, (s, d) => { - PixelConversionModifiers modifiers = this.HasUnassociatedAlpha - ? PixelConversionModifiers.Premultiply + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; this.Operations.FromVector4Destructive( @@ -297,8 +295,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations expected, (s, d) => { - PixelConversionModifiers modifiers = this.HasUnassociatedAlpha - ? PixelConversionModifiers.Premultiply + PixelConversionModifiers modifiers = this.HasUnassociatedAlpha ? PixelConversionModifiers.Premultiply : PixelConversionModifiers.None; this.Operations.FromVector4Destructive( From 204951d4db9e03114f114815c254f1f7965fa515 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 20 Nov 2020 21:44:38 +0000 Subject: [PATCH 25/61] Enable resize tests --- .gitignore | 1 + .../Processing/Processors/Transforms/ResizeTests.cs | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index a89cfcf104..475d6e76b0 100644 --- a/.gitignore +++ b/.gitignore @@ -221,3 +221,4 @@ artifacts/ # Tests **/Images/ActualOutput **/Images/ReferenceOutput +.DS_Store diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index 47d951837d..f40b8d11a0 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -355,7 +355,6 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] - [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeFromSourceRectangle(TestImageProvider provider) where TPixel : unmanaged, IPixel @@ -438,7 +437,6 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] - [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeWithBoxPadMode(TestImageProvider provider) where TPixel : unmanaged, IPixel @@ -549,7 +547,6 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms } [Theory] - [PlatformSpecific(~TestPlatforms.OSX)] [WithFileCollection(nameof(CommonTestImages), DefaultPixelType)] public void ResizeWithPadMode(TestImageProvider provider) where TPixel : unmanaged, IPixel From c719148a43e1ff6a87ade71b7c308635415cf5f7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 21 Nov 2020 00:14:40 +0000 Subject: [PATCH 26/61] Use doubles in ResizeHelper --- .../Transforms/Resize/ResizeHelper.cs | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs index 5ff82a096f..2414305b85 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs @@ -47,12 +47,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms const int Min = 1; if (width == 0 && height > 0) { - width = (int)MathF.Max(Min, MathF.Round(sourceSize.Width * height / (float)sourceSize.Height)); + width = (int)Math.Max(Min, Math.Round(sourceSize.Width * height / (double)sourceSize.Height)); } if (height == 0 && width > 0) { - height = (int)MathF.Max(Min, MathF.Round(sourceSize.Height * width / (float)sourceSize.Width)); + height = (int)Math.Max(Min, Math.Round(sourceSize.Height * width / (double)sourceSize.Width)); } switch (options.Mode) @@ -86,11 +86,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int sourceHeight = source.Height; // Fractional variants for preserving aspect ratio. - float percentHeight = MathF.Abs(height / (float)sourceHeight); - float percentWidth = MathF.Abs(width / (float)sourceWidth); + double percentHeight = Math.Abs(height / (double)sourceHeight); + double percentWidth = Math.Abs(width / (double)sourceWidth); - int boxPadHeight = height > 0 ? height : (int)MathF.Round(sourceHeight * percentWidth); - int boxPadWidth = width > 0 ? width : (int)MathF.Round(sourceWidth * percentHeight); + int boxPadHeight = height > 0 ? height : (int)Math.Round(sourceHeight * percentWidth); + int boxPadWidth = width > 0 ? width : (int)Math.Round(sourceWidth * percentHeight); // Only calculate if upscaling. if (sourceWidth < boxPadWidth && sourceHeight < boxPadHeight) @@ -156,7 +156,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int width, int height) { - float ratio; + double ratio; int sourceWidth = source.Width; int sourceHeight = source.Height; @@ -166,8 +166,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - float percentHeight = MathF.Abs(height / (float)sourceHeight); - float percentWidth = MathF.Abs(width / (float)sourceWidth); + double percentHeight = Math.Abs(height / (double)sourceHeight); + double percentWidth = Math.Abs(width / (double)sourceWidth); if (percentHeight < percentWidth) { @@ -175,17 +175,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (options.CenterCoordinates.HasValue) { - float center = -(ratio * sourceHeight) * options.CenterCoordinates.Value.Y; - targetY = (int)MathF.Round(center + (height / 2F)); + double center = -(ratio * sourceHeight) * options.CenterCoordinates.Value.Y; + targetY = (int)Math.Round(center + (height / 2F)); if (targetY > 0) { targetY = 0; } - if (targetY < (int)MathF.Round(height - (sourceHeight * ratio))) + if (targetY < (int)Math.Round(height - (sourceHeight * ratio))) { - targetY = (int)MathF.Round(height - (sourceHeight * ratio)); + targetY = (int)Math.Round(height - (sourceHeight * ratio)); } } else @@ -200,15 +200,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Bottom: case AnchorPositionMode.BottomLeft: case AnchorPositionMode.BottomRight: - targetY = (int)MathF.Round(height - (sourceHeight * ratio)); + targetY = (int)Math.Round(height - (sourceHeight * ratio)); break; default: - targetY = (int)MathF.Round((height - (sourceHeight * ratio)) / 2F); + targetY = (int)Math.Round((height - (sourceHeight * ratio)) / 2F); break; } } - targetHeight = (int)MathF.Ceiling(sourceHeight * percentWidth); + targetHeight = (int)Math.Ceiling(sourceHeight * percentWidth); } else { @@ -216,17 +216,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (options.CenterCoordinates.HasValue) { - float center = -(ratio * sourceWidth) * options.CenterCoordinates.Value.X; - targetX = (int)MathF.Round(center + (width / 2F)); + double center = -(ratio * sourceWidth) * options.CenterCoordinates.Value.X; + targetX = (int)Math.Round(center + (width / 2F)); if (targetX > 0) { targetX = 0; } - if (targetX < (int)MathF.Round(width - (sourceWidth * ratio))) + if (targetX < (int)Math.Round(width - (sourceWidth * ratio))) { - targetX = (int)MathF.Round(width - (sourceWidth * ratio)); + targetX = (int)Math.Round(width - (sourceWidth * ratio)); } } else @@ -241,15 +241,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Right: case AnchorPositionMode.TopRight: case AnchorPositionMode.BottomRight: - targetX = (int)MathF.Round(width - (sourceWidth * ratio)); + targetX = (int)Math.Round(width - (sourceWidth * ratio)); break; default: - targetX = (int)MathF.Round((width - (sourceWidth * ratio)) / 2F); + targetX = (int)Math.Round((width - (sourceWidth * ratio)) / 2F); break; } } - targetWidth = (int)MathF.Ceiling(sourceWidth * percentHeight); + targetWidth = (int)Math.Ceiling(sourceWidth * percentHeight); } // Target image width and height can be different to the rectangle width and height. @@ -265,20 +265,20 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - float percentHeight = MathF.Abs(height / (float)source.Height); - float percentWidth = MathF.Abs(width / (float)source.Width); + double percentHeight = Math.Abs(height / (double)source.Height); + double percentWidth = Math.Abs(width / (double)source.Width); - // Integers must be cast to floats to get needed precision - float ratio = height / (float)width; - float sourceRatio = source.Height / (float)source.Width; + // Integers must be cast to doubles to get needed precision + double ratio = height / (double)width; + double sourceRatio = source.Height / (double)source.Width; if (sourceRatio < ratio) { - targetHeight = (int)MathF.Round(source.Height * percentWidth); + targetHeight = (int)Math.Round(source.Height * percentWidth); } else { - targetWidth = (int)MathF.Round(source.Width * percentHeight); + targetWidth = (int)Math.Round(source.Width * percentHeight); } // Replace the size to match the rectangle. @@ -307,25 +307,25 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (widthDiff < heightDiff) { - float sourceRatio = (float)sourceHeight / sourceWidth; - targetHeight = (int)MathF.Round(width * sourceRatio); + double sourceRatio = (double)sourceHeight / sourceWidth; + targetHeight = (int)Math.Round(width * sourceRatio); } else if (widthDiff > heightDiff) { - float sourceRatioInverse = (float)sourceWidth / sourceHeight; - targetWidth = (int)MathF.Round(height * sourceRatioInverse); + double sourceRatioInverse = (double)sourceWidth / sourceHeight; + targetWidth = (int)Math.Round(height * sourceRatioInverse); } else { if (height > width) { - float percentWidth = MathF.Abs(width / (float)sourceWidth); - targetHeight = (int)MathF.Round(sourceHeight * percentWidth); + double percentWidth = Math.Abs(width / (double)sourceWidth); + targetHeight = (int)Math.Round(sourceHeight * percentWidth); } else { - float percentHeight = MathF.Abs(height / (float)sourceHeight); - targetWidth = (int)MathF.Round(sourceWidth * percentHeight); + double percentHeight = Math.Abs(height / (double)sourceHeight); + targetWidth = (int)Math.Round(sourceWidth * percentHeight); } } @@ -339,7 +339,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int width, int height) { - float ratio; + double ratio; int sourceWidth = sourceSize.Width; int sourceHeight = sourceSize.Height; @@ -349,13 +349,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - float percentHeight = MathF.Abs(height / (float)sourceHeight); - float percentWidth = MathF.Abs(width / (float)sourceWidth); + double percentHeight = Math.Abs(height / (double)sourceHeight); + double percentWidth = Math.Abs(width / (double)sourceWidth); if (percentHeight < percentWidth) { ratio = percentHeight; - targetWidth = (int)MathF.Round(sourceWidth * percentHeight); + targetWidth = (int)Math.Round(sourceWidth * percentHeight); switch (options.Position) { @@ -367,17 +367,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Right: case AnchorPositionMode.TopRight: case AnchorPositionMode.BottomRight: - targetX = (int)MathF.Round(width - (sourceWidth * ratio)); + targetX = (int)Math.Round(width - (sourceWidth * ratio)); break; default: - targetX = (int)MathF.Round((width - (sourceWidth * ratio)) / 2F); + targetX = (int)Math.Round((width - (sourceWidth * ratio)) / 2F); break; } } else { ratio = percentWidth; - targetHeight = (int)MathF.Round(sourceHeight * percentWidth); + targetHeight = (int)Math.Round(sourceHeight * percentWidth); switch (options.Position) { @@ -389,10 +389,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Bottom: case AnchorPositionMode.BottomLeft: case AnchorPositionMode.BottomRight: - targetY = (int)MathF.Round(height - (sourceHeight * ratio)); + targetY = (int)Math.Round(height - (sourceHeight * ratio)); break; default: - targetY = (int)MathF.Round((height - (sourceHeight * ratio)) / 2F); + targetY = (int)Math.Round((height - (sourceHeight * ratio)) / 2F); break; } } From 3cc5f81a79c6b7bbf8cbd5b10fb642ae491be483 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 21 Nov 2020 00:21:44 +0000 Subject: [PATCH 27/61] Revert "Use doubles in ResizeHelper" This reverts commit 2e3f3c1e390df3be2fe547b524fa6ea9200b2d0b. --- .../Transforms/Resize/ResizeHelper.cs | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs index 2414305b85..5ff82a096f 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs @@ -47,12 +47,12 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms const int Min = 1; if (width == 0 && height > 0) { - width = (int)Math.Max(Min, Math.Round(sourceSize.Width * height / (double)sourceSize.Height)); + width = (int)MathF.Max(Min, MathF.Round(sourceSize.Width * height / (float)sourceSize.Height)); } if (height == 0 && width > 0) { - height = (int)Math.Max(Min, Math.Round(sourceSize.Height * width / (double)sourceSize.Width)); + height = (int)MathF.Max(Min, MathF.Round(sourceSize.Height * width / (float)sourceSize.Width)); } switch (options.Mode) @@ -86,11 +86,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int sourceHeight = source.Height; // Fractional variants for preserving aspect ratio. - double percentHeight = Math.Abs(height / (double)sourceHeight); - double percentWidth = Math.Abs(width / (double)sourceWidth); + float percentHeight = MathF.Abs(height / (float)sourceHeight); + float percentWidth = MathF.Abs(width / (float)sourceWidth); - int boxPadHeight = height > 0 ? height : (int)Math.Round(sourceHeight * percentWidth); - int boxPadWidth = width > 0 ? width : (int)Math.Round(sourceWidth * percentHeight); + int boxPadHeight = height > 0 ? height : (int)MathF.Round(sourceHeight * percentWidth); + int boxPadWidth = width > 0 ? width : (int)MathF.Round(sourceWidth * percentHeight); // Only calculate if upscaling. if (sourceWidth < boxPadWidth && sourceHeight < boxPadHeight) @@ -156,7 +156,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int width, int height) { - double ratio; + float ratio; int sourceWidth = source.Width; int sourceHeight = source.Height; @@ -166,8 +166,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - double percentHeight = Math.Abs(height / (double)sourceHeight); - double percentWidth = Math.Abs(width / (double)sourceWidth); + float percentHeight = MathF.Abs(height / (float)sourceHeight); + float percentWidth = MathF.Abs(width / (float)sourceWidth); if (percentHeight < percentWidth) { @@ -175,17 +175,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (options.CenterCoordinates.HasValue) { - double center = -(ratio * sourceHeight) * options.CenterCoordinates.Value.Y; - targetY = (int)Math.Round(center + (height / 2F)); + float center = -(ratio * sourceHeight) * options.CenterCoordinates.Value.Y; + targetY = (int)MathF.Round(center + (height / 2F)); if (targetY > 0) { targetY = 0; } - if (targetY < (int)Math.Round(height - (sourceHeight * ratio))) + if (targetY < (int)MathF.Round(height - (sourceHeight * ratio))) { - targetY = (int)Math.Round(height - (sourceHeight * ratio)); + targetY = (int)MathF.Round(height - (sourceHeight * ratio)); } } else @@ -200,15 +200,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Bottom: case AnchorPositionMode.BottomLeft: case AnchorPositionMode.BottomRight: - targetY = (int)Math.Round(height - (sourceHeight * ratio)); + targetY = (int)MathF.Round(height - (sourceHeight * ratio)); break; default: - targetY = (int)Math.Round((height - (sourceHeight * ratio)) / 2F); + targetY = (int)MathF.Round((height - (sourceHeight * ratio)) / 2F); break; } } - targetHeight = (int)Math.Ceiling(sourceHeight * percentWidth); + targetHeight = (int)MathF.Ceiling(sourceHeight * percentWidth); } else { @@ -216,17 +216,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (options.CenterCoordinates.HasValue) { - double center = -(ratio * sourceWidth) * options.CenterCoordinates.Value.X; - targetX = (int)Math.Round(center + (width / 2F)); + float center = -(ratio * sourceWidth) * options.CenterCoordinates.Value.X; + targetX = (int)MathF.Round(center + (width / 2F)); if (targetX > 0) { targetX = 0; } - if (targetX < (int)Math.Round(width - (sourceWidth * ratio))) + if (targetX < (int)MathF.Round(width - (sourceWidth * ratio))) { - targetX = (int)Math.Round(width - (sourceWidth * ratio)); + targetX = (int)MathF.Round(width - (sourceWidth * ratio)); } } else @@ -241,15 +241,15 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Right: case AnchorPositionMode.TopRight: case AnchorPositionMode.BottomRight: - targetX = (int)Math.Round(width - (sourceWidth * ratio)); + targetX = (int)MathF.Round(width - (sourceWidth * ratio)); break; default: - targetX = (int)Math.Round((width - (sourceWidth * ratio)) / 2F); + targetX = (int)MathF.Round((width - (sourceWidth * ratio)) / 2F); break; } } - targetWidth = (int)Math.Ceiling(sourceWidth * percentHeight); + targetWidth = (int)MathF.Ceiling(sourceWidth * percentHeight); } // Target image width and height can be different to the rectangle width and height. @@ -265,20 +265,20 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - double percentHeight = Math.Abs(height / (double)source.Height); - double percentWidth = Math.Abs(width / (double)source.Width); + float percentHeight = MathF.Abs(height / (float)source.Height); + float percentWidth = MathF.Abs(width / (float)source.Width); - // Integers must be cast to doubles to get needed precision - double ratio = height / (double)width; - double sourceRatio = source.Height / (double)source.Width; + // Integers must be cast to floats to get needed precision + float ratio = height / (float)width; + float sourceRatio = source.Height / (float)source.Width; if (sourceRatio < ratio) { - targetHeight = (int)Math.Round(source.Height * percentWidth); + targetHeight = (int)MathF.Round(source.Height * percentWidth); } else { - targetWidth = (int)Math.Round(source.Width * percentHeight); + targetWidth = (int)MathF.Round(source.Width * percentHeight); } // Replace the size to match the rectangle. @@ -307,25 +307,25 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (widthDiff < heightDiff) { - double sourceRatio = (double)sourceHeight / sourceWidth; - targetHeight = (int)Math.Round(width * sourceRatio); + float sourceRatio = (float)sourceHeight / sourceWidth; + targetHeight = (int)MathF.Round(width * sourceRatio); } else if (widthDiff > heightDiff) { - double sourceRatioInverse = (double)sourceWidth / sourceHeight; - targetWidth = (int)Math.Round(height * sourceRatioInverse); + float sourceRatioInverse = (float)sourceWidth / sourceHeight; + targetWidth = (int)MathF.Round(height * sourceRatioInverse); } else { if (height > width) { - double percentWidth = Math.Abs(width / (double)sourceWidth); - targetHeight = (int)Math.Round(sourceHeight * percentWidth); + float percentWidth = MathF.Abs(width / (float)sourceWidth); + targetHeight = (int)MathF.Round(sourceHeight * percentWidth); } else { - double percentHeight = Math.Abs(height / (double)sourceHeight); - targetWidth = (int)Math.Round(sourceWidth * percentHeight); + float percentHeight = MathF.Abs(height / (float)sourceHeight); + targetWidth = (int)MathF.Round(sourceWidth * percentHeight); } } @@ -339,7 +339,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int width, int height) { - double ratio; + float ratio; int sourceWidth = sourceSize.Width; int sourceHeight = sourceSize.Height; @@ -349,13 +349,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms int targetHeight = height; // Fractional variants for preserving aspect ratio. - double percentHeight = Math.Abs(height / (double)sourceHeight); - double percentWidth = Math.Abs(width / (double)sourceWidth); + float percentHeight = MathF.Abs(height / (float)sourceHeight); + float percentWidth = MathF.Abs(width / (float)sourceWidth); if (percentHeight < percentWidth) { ratio = percentHeight; - targetWidth = (int)Math.Round(sourceWidth * percentHeight); + targetWidth = (int)MathF.Round(sourceWidth * percentHeight); switch (options.Position) { @@ -367,17 +367,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Right: case AnchorPositionMode.TopRight: case AnchorPositionMode.BottomRight: - targetX = (int)Math.Round(width - (sourceWidth * ratio)); + targetX = (int)MathF.Round(width - (sourceWidth * ratio)); break; default: - targetX = (int)Math.Round((width - (sourceWidth * ratio)) / 2F); + targetX = (int)MathF.Round((width - (sourceWidth * ratio)) / 2F); break; } } else { ratio = percentWidth; - targetHeight = (int)Math.Round(sourceHeight * percentWidth); + targetHeight = (int)MathF.Round(sourceHeight * percentWidth); switch (options.Position) { @@ -389,10 +389,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms case AnchorPositionMode.Bottom: case AnchorPositionMode.BottomLeft: case AnchorPositionMode.BottomRight: - targetY = (int)Math.Round(height - (sourceHeight * ratio)); + targetY = (int)MathF.Round(height - (sourceHeight * ratio)); break; default: - targetY = (int)Math.Round((height - (sourceHeight * ratio)) / 2F); + targetY = (int)MathF.Round((height - (sourceHeight * ratio)) / 2F); break; } } From 46f47eb97b2dac86f9b79f4eaed2c8c2c0e026ce Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 21 Nov 2020 00:26:38 +0000 Subject: [PATCH 28/61] Use higher tolerance on macOS CI runs --- .../Processing/Processors/Transforms/ResizeTests.cs | 3 ++- tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index f40b8d11a0..daf217a5ae 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -35,7 +35,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms nameof(KnownResamplers.Lanczos5), }; - private static readonly ImageComparer ValidatorComparer = ImageComparer.TolerantPercentage(0.07F); + private static readonly ImageComparer ValidatorComparer = + ImageComparer.TolerantPercentage(TestEnvironment.IsOSX && TestEnvironment.RunsOnCI ? 0.2595F : 0.07F); [Fact] public void Resize_PixelAgnostic() diff --git a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs index 48728faf0e..b80a29646c 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestEnvironment.cs @@ -108,6 +108,8 @@ namespace SixLabors.ImageSharp.Tests internal static bool IsLinux => RuntimeInformation.IsOSPlatform(OSPlatform.Linux); + internal static bool IsOSX => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); + internal static bool IsMono => Type.GetType("Mono.Runtime") != null; // https://stackoverflow.com/a/721194 internal static bool IsWindows => RuntimeInformation.IsOSPlatform(OSPlatform.Windows); From 12a62739f3866742e79a7ecd349ae5686cdf1b5d Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 21 Nov 2020 00:31:52 +0000 Subject: [PATCH 29/61] Bump tolerance --- .../Processing/Processors/Transforms/ResizeTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index daf217a5ae..4a20f4e568 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms }; private static readonly ImageComparer ValidatorComparer = - ImageComparer.TolerantPercentage(TestEnvironment.IsOSX && TestEnvironment.RunsOnCI ? 0.2595F : 0.07F); + ImageComparer.TolerantPercentage(TestEnvironment.IsOSX && TestEnvironment.RunsOnCI ? 0.26F : 0.07F); [Fact] public void Resize_PixelAgnostic() From 9236cb1269a02deb05ab7d19ea6ee2877be40edc Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Sat, 21 Nov 2020 16:50:58 +0100 Subject: [PATCH 30/61] Added missing RgbaVector conversion override --- .../PixelOperations/RgbaVector.PixelOperations.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs index 1605d862ee..c66526bbe5 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/RgbaVector.PixelOperations.cs @@ -26,6 +26,17 @@ namespace SixLabors.ImageSharp.PixelFormats /// public override PixelTypeInfo GetPixelTypeInfo() => LazyInfo.Value; + /// + public override void From( + Configuration configuration, + ReadOnlySpan sourcePixels, + Span destinationPixels) + { + Span destinationVectors = MemoryMarshal.Cast(destinationPixels); + + PixelOperations.Instance.ToVector4(configuration, sourcePixels, destinationVectors); + } + /// public override void FromVector4Destructive( Configuration configuration, From e9f734a9439924c2ec1ff4caf360dd4a959f9b71 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 22 Nov 2020 23:48:31 +0000 Subject: [PATCH 31/61] Introduce Numerics and migrate ImageMaths methods --- .../ColorSpaces/Companding/LCompanding.cs | 2 +- .../Converters/CieLabToCieXyzConverter.cs | 6 +- .../Converters/CieLuvToCieXyzConverter.cs | 6 +- .../Converters/HunterLabToCieXyzConverter.cs | 2 +- src/ImageSharp/Common/Helpers/ImageMaths.cs | 124 +----- src/ImageSharp/Common/Helpers/Numerics.cs | 417 ++++++++++++++++++ .../Common/Helpers/Shuffle/IShuffle4Slice3.cs | 2 +- .../Helpers/SimdUtils.BasicIntrinsics256.cs | 4 +- .../Helpers/SimdUtils.ExtendedIntrinsics.cs | 4 +- .../SimdUtils.FallbackIntrinsics128.cs | 4 +- .../Common/Helpers/SimdUtils.HwIntrinsics.cs | 24 +- src/ImageSharp/Common/Helpers/SimdUtils.cs | 4 +- .../Common/Helpers/Vector4Utilities.cs | 4 +- .../Formats/Png/Filters/AverageFilter.cs | 8 +- .../Formats/Png/Filters/PaethFilter.cs | 14 +- .../Formats/Png/Filters/SubFilter.cs | 4 +- .../Formats/Png/Filters/UpFilter.cs | 2 +- src/ImageSharp/Primitives/ComplexVector4.cs | 2 +- .../ConvolutionProcessorHelpers.cs | 6 +- ...alizationSlidingWindowProcessor{TPixel}.cs | 4 +- .../Transforms/Resamplers/LanczosResampler.cs | 2 +- .../Transforms/Resamplers/WelchResampler.cs | 2 +- .../Transforms/Resize/ResizeKernelMap.cs | 2 +- .../General/BasicMath/ClampSpan.cs | 42 ++ .../BasicMath/ModuloPowerOfTwoConstant.cs | 2 +- .../BasicMath/ModuloPowerOfTwoVariable.cs | 2 +- .../Helpers/ImageMathsTests.cs | 138 ------ .../ImageSharp.Tests/Helpers/NumericsTests.cs | 265 +++++++++++ 28 files changed, 781 insertions(+), 317 deletions(-) create mode 100644 src/ImageSharp/Common/Helpers/Numerics.cs create mode 100644 tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs create mode 100644 tests/ImageSharp.Tests/Helpers/NumericsTests.cs diff --git a/src/ImageSharp/ColorSpaces/Companding/LCompanding.cs b/src/ImageSharp/ColorSpaces/Companding/LCompanding.cs index 719565fd81..5cd89abfd6 100644 --- a/src/ImageSharp/ColorSpaces/Companding/LCompanding.cs +++ b/src/ImageSharp/ColorSpaces/Companding/LCompanding.cs @@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding /// The representing the linear channel value. [MethodImpl(InliningOptions.ShortMethod)] public static float Expand(float channel) - => channel <= 0.08F ? (100F * channel) / CieConstants.Kappa : ImageMaths.Pow3((channel + 0.16F) / 1.16F); + => channel <= 0.08F ? (100F * channel) / CieConstants.Kappa : Numerics.Pow3((channel + 0.16F) / 1.16F); /// /// Compresses an uncompanded channel (linear) to its nonlinear equivalent. diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs index 31c3f46330..34354efe54 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs @@ -25,11 +25,11 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion float fx = (a / 500F) + fy; float fz = fy - (b / 200F); - float fx3 = ImageMaths.Pow3(fx); - float fz3 = ImageMaths.Pow3(fz); + float fx3 = Numerics.Pow3(fx); + float fz3 = Numerics.Pow3(fz); float xr = fx3 > CieConstants.Epsilon ? fx3 : ((116F * fx) - 16F) / CieConstants.Kappa; - float yr = l > CieConstants.Kappa * CieConstants.Epsilon ? ImageMaths.Pow3((l + 16F) / 116F) : l / CieConstants.Kappa; + float yr = l > CieConstants.Kappa * CieConstants.Epsilon ? Numerics.Pow3((l + 16F) / 116F) : l / CieConstants.Kappa; float zr = fz3 > CieConstants.Epsilon ? fz3 : ((116F * fz) - 16F) / CieConstants.Kappa; var wxyz = new Vector3(input.WhitePoint.X, input.WhitePoint.Y, input.WhitePoint.Z); diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs index 7f15fc77d8..12c65105fc 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System.Runtime.CompilerServices; @@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion float v0 = ComputeV0(input.WhitePoint); float y = l > CieConstants.Kappa * CieConstants.Epsilon - ? ImageMaths.Pow3((l + 16) / 116) + ? Numerics.Pow3((l + 16) / 116) : l / CieConstants.Kappa; float a = ((52 * l / (u + (13 * l * u0))) - 1) / 3; @@ -71,4 +71,4 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion private static float ComputeV0(in CieXyz input) => (9 * input.Y) / (input.X + (15 * input.Y) + (3 * input.Z)); } -} \ No newline at end of file +} diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs index 4c3cdba224..f120d6f3dd 100644 --- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs +++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion float ka = ComputeKa(input.WhitePoint); float kb = ComputeKb(input.WhitePoint); - float pow = ImageMaths.Pow2(l / 100F); + float pow = Numerics.Pow2(l / 100F); float sqrtPow = MathF.Sqrt(pow); float y = pow * yn; diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMaths.cs index d24230fe18..55ac6f8227 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs @@ -4,13 +4,12 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; - using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp { /// - /// Provides common mathematical methods. + /// Provides common mathematical methods used for image processing. /// internal static class ImageMaths { @@ -108,85 +107,6 @@ namespace SixLabors.ImageSharp [MethodImpl(InliningOptions.ShortMethod)] public static ushort UpscaleFrom8BitTo16Bit(byte component) => (ushort)(component * 257); - /// - /// Determine the Greatest CommonDivisor (GCD) of two numbers. - /// - public static int GreatestCommonDivisor(int a, int b) - { - while (b != 0) - { - int temp = b; - b = a % b; - a = temp; - } - - return a; - } - - /// - /// Determine the Least Common Multiple (LCM) of two numbers. - /// - public static int LeastCommonMultiple(int a, int b) - { - // https://en.wikipedia.org/wiki/Least_common_multiple#Reduction_by_the_greatest_common_divisor - return (a / GreatestCommonDivisor(a, b)) * b; - } - - /// - /// Calculates % 2 - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int Modulo2(int x) => x & 1; - - /// - /// Calculates % 4 - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int Modulo4(int x) => x & 3; - - /// - /// Calculates % 8 - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int Modulo8(int x) => x & 7; - - /// - /// Fast (x mod m) calculator, with the restriction that - /// should be power of 2. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int ModuloP2(int x, int m) => x & (m - 1); - - /// - /// Returns the absolute value of a 32-bit signed integer. Uses bit shifting to speed up the operation. - /// - /// - /// A number that is greater than , but less than or equal to - /// - /// The - [MethodImpl(InliningOptions.ShortMethod)] - public static int FastAbs(int x) - { - int y = x >> 31; - return (x ^ y) - y; - } - - /// - /// Returns a specified number raised to the power of 2 - /// - /// A single-precision floating-point number - /// The number raised to the power of 2. - [MethodImpl(InliningOptions.ShortMethod)] - public static float Pow2(float x) => x * x; - - /// - /// Returns a specified number raised to the power of 3 - /// - /// A single-precision floating-point number - /// The number raised to the power of 3. - [MethodImpl(InliningOptions.ShortMethod)] - public static float Pow3(float x) => x * x * x; - /// /// Returns how many bits are required to store the specified number of colors. /// Performs a Log2() on the value. @@ -206,48 +126,6 @@ namespace SixLabors.ImageSharp [MethodImpl(InliningOptions.ShortMethod)] public static int GetColorCountForBitDepth(int bitDepth) => 1 << bitDepth; - /// - /// Implementation of 1D Gaussian G(x) function - /// - /// The x provided to G(x). - /// The spread of the blur. - /// The Gaussian G(x) - [MethodImpl(InliningOptions.ShortMethod)] - public static float Gaussian(float x, float sigma) - { - const float Numerator = 1.0f; - float denominator = MathF.Sqrt(2 * MathF.PI) * sigma; - - float exponentNumerator = -x * x; - float exponentDenominator = 2 * Pow2(sigma); - - float left = Numerator / denominator; - float right = MathF.Exp(exponentNumerator / exponentDenominator); - - return left * right; - } - - /// - /// Returns the result of a normalized sine cardinal function for the given value. - /// SinC(x) = sin(pi*x)/(pi*x). - /// - /// A single-precision floating-point number to calculate the result for. - /// - /// The sine cardinal of . - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static float SinC(float f) - { - if (MathF.Abs(f) > Constants.Epsilon) - { - f *= MathF.PI; - float result = MathF.Sin(f) / f; - return MathF.Abs(result) < Constants.Epsilon ? 0F : result; - } - - return 1F; - } - /// /// Gets the bounding from the given points. /// diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs new file mode 100644 index 0000000000..d4dfa12024 --- /dev/null +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -0,0 +1,417 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace SixLabors.ImageSharp +{ + /// + /// Provides optimized static methods for trigonometric, logarithmic, + /// and other common mathematical functions. + /// + internal static class Numerics + { + /// + /// Determine the Greatest CommonDivisor (GCD) of two numbers. + /// + public static int GreatestCommonDivisor(int a, int b) + { + while (b != 0) + { + int temp = b; + b = a % b; + a = temp; + } + + return a; + } + + /// + /// Determine the Least Common Multiple (LCM) of two numbers. + /// + public static int LeastCommonMultiple(int a, int b) + { + // https://en.wikipedia.org/wiki/Least_common_multiple#Reduction_by_the_greatest_common_divisor + return (a / GreatestCommonDivisor(a, b)) * b; + } + + /// + /// Calculates % 2 + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Modulo2(int x) => x & 1; + + /// + /// Calculates % 4 + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Modulo4(int x) => x & 3; + + /// + /// Calculates % 8 + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Modulo8(int x) => x & 7; + + /// + /// Fast (x mod m) calculator, with the restriction that + /// should be power of 2. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int ModuloP2(int x, int m) => x & (m - 1); + + /// + /// Returns the absolute value of a 32-bit signed integer. + /// Uses bit shifting to speed up the operation compared to . + /// + /// + /// A number that is greater than , but less than + /// or equal to + /// + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Abs(int x) + { + int y = x >> 31; + return (x ^ y) - y; + } + + /// + /// Returns a specified number raised to the power of 2 + /// + /// A single-precision floating-point number + /// The number raised to the power of 2. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Pow2(float x) => x * x; + + /// + /// Returns a specified number raised to the power of 3 + /// + /// A single-precision floating-point number + /// The number raised to the power of 3. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Pow3(float x) => x * x * x; + + /// + /// Implementation of 1D Gaussian G(x) function + /// + /// The x provided to G(x). + /// The spread of the blur. + /// The Gaussian G(x) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Gaussian(float x, float sigma) + { + const float Numerator = 1.0f; + float denominator = MathF.Sqrt(2 * MathF.PI) * sigma; + + float exponentNumerator = -x * x; + float exponentDenominator = 2 * Pow2(sigma); + + float left = Numerator / denominator; + float right = MathF.Exp(exponentNumerator / exponentDenominator); + + return left * right; + } + + /// + /// Returns the result of a normalized sine cardinal function for the given value. + /// SinC(x) = sin(pi*x)/(pi*x). + /// + /// A single-precision floating-point number to calculate the result for. + /// + /// The sine cardinal of . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float SinC(float f) + { + if (MathF.Abs(f) > Constants.Epsilon) + { + f *= MathF.PI; + float result = MathF.Sin(f) / f; + return MathF.Abs(result) < Constants.Epsilon ? 0F : result; + } + + return 1F; + } + + /// + /// Returns the value clamped to the inclusive range of min and max. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte Clamp(byte value, byte min, byte max) + { + // Order is important here as someone might set min to higher than max. + if (value > max) + { + return max; + } + + if (value < min) + { + return min; + } + + return value; + } + + /// + /// Returns the value clamped to the inclusive range of min and max. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static uint Clamp(uint value, uint min, uint max) + { + if (value > max) + { + return max; + } + + if (value < min) + { + return min; + } + + return value; + } + + /// + /// Returns the value clamped to the inclusive range of min and max. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Clamp(int value, int min, int max) + { + if (value > max) + { + return max; + } + + if (value < min) + { + return min; + } + + return value; + } + + /// + /// Returns the value clamped to the inclusive range of min and max. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Clamp(float value, float min, float max) + { + if (value > max) + { + return max; + } + + if (value < min) + { + return min; + } + + return value; + } + + /// + /// Returns the value clamped to the inclusive range of min and max. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static double Clamp(double value, double min, double max) + { + if (value > max) + { + return max; + } + + if (value < min) + { + return min; + } + + return value; + } + + /// + /// Clamps the span values to the inclusive range of min and max. + /// + /// The span containing the values to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clamp(Span span, byte min, byte max) + { + int reduced = ClampReduce(span, min, max); + + if (reduced > 0) + { + for (int i = reduced; i < span.Length; i++) + { + ref byte v = ref span[i]; + v = Clamp(v, min, max); + } + } + } + + /// + /// Clamps the span values to the inclusive range of min and max. + /// + /// The span containing the values to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clamp(Span span, uint min, uint max) + { + int reduced = ClampReduce(span, min, max); + + if (reduced > 0) + { + for (int i = reduced; i < span.Length; i++) + { + ref uint v = ref span[i]; + v = Clamp(v, min, max); + } + } + } + + /// + /// Clamps the span values to the inclusive range of min and max. + /// + /// The span containing the values to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clamp(Span span, int min, int max) + { + int reduced = ClampReduce(span, min, max); + + if (reduced > 0) + { + for (int i = reduced; i < span.Length; i++) + { + ref int v = ref span[i]; + v = Clamp(v, min, max); + } + } + } + + /// + /// Clamps the span values to the inclusive range of min and max. + /// + /// The span containing the values to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clamp(Span span, float min, float max) + { + int reduced = ClampReduce(span, min, max); + + if (reduced > 0) + { + for (int i = reduced; i < span.Length; i++) + { + ref float v = ref span[i]; + v = Clamp(v, min, max); + } + } + } + + /// + /// Clamps the span values to the inclusive range of min and max. + /// + /// The span containing the values to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Clamp(Span span, double min, double max) + { + int reduced = ClampReduce(span, min, max); + + if (reduced > 0) + { + for (int i = reduced; i < span.Length; i++) + { + ref double v = ref span[i]; + v = Clamp(v, min, max); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static int ClampReduce(Span span, T min, T max) + where T : unmanaged + { + if (Vector.IsHardwareAccelerated && span.Length >= Vector.Count) + { + int remainder = ModuloP2(span.Length, Vector.Count); + int adjustedCount = span.Length - remainder; + + if (adjustedCount > 0) + { + ClampImpl(span.Slice(0, adjustedCount), min, max); + } + + return adjustedCount; + } + + return 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void ClampImpl(Span span, T min, T max) + where T : unmanaged + { + ref T sRef = ref MemoryMarshal.GetReference(span); + ref Vector vsBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(span)); + var vmin = new Vector(min); + var vmax = new Vector(max); + + int n = span.Length / Vector.Count; + int m = Modulo4(n); + int u = n - m; + + for (int i = 0; i < u; i += 4) + { + ref Vector vs0 = ref Unsafe.Add(ref vsBase, i); + ref Vector vs1 = ref Unsafe.Add(ref vs0, 1); + ref Vector vs2 = ref Unsafe.Add(ref vs0, 2); + ref Vector vs3 = ref Unsafe.Add(ref vs0, 3); + + vs0 = Vector.Min(Vector.Max(vmin, vs0), vmax); + vs1 = Vector.Min(Vector.Max(vmin, vs1), vmax); + vs2 = Vector.Min(Vector.Max(vmin, vs2), vmax); + vs3 = Vector.Min(Vector.Max(vmin, vs3), vmax); + } + + if (m > 0) + { + for (int i = u; i < n; i++) + { + ref Vector vs0 = ref Unsafe.Add(ref vsBase, i); + vs0 = Vector.Min(Vector.Max(vmin, vs0), vmax); + } + } + } + } +} diff --git a/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs b/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs index 86e4174f11..3ecad3c5d9 100644 --- a/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs +++ b/src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs @@ -67,7 +67,7 @@ namespace SixLabors.ImageSharp ref Byte3 dBase = ref Unsafe.As(ref MemoryMarshal.GetReference(dest)); int n = source.Length / 4; - int m = ImageMaths.Modulo4(n); + int m = Numerics.Modulo4(n); int u = n - m; ref uint sLoopEnd = ref Unsafe.Add(ref sBase, u); diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.BasicIntrinsics256.cs b/src/ImageSharp/Common/Helpers/SimdUtils.BasicIntrinsics256.cs index de6990db5b..75555f88a5 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.BasicIntrinsics256.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.BasicIntrinsics256.cs @@ -35,7 +35,7 @@ namespace SixLabors.ImageSharp return; } - int remainder = ImageMaths.Modulo8(source.Length); + int remainder = Numerics.Modulo8(source.Length); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) @@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp return; } - int remainder = ImageMaths.Modulo8(source.Length); + int remainder = Numerics.Modulo8(source.Length); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs b/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs index bd35d1583e..0abc0e26da 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.ExtendedIntrinsics.cs @@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp return; } - int remainder = ImageMaths.ModuloP2(source.Length, Vector.Count); + int remainder = Numerics.ModuloP2(source.Length, Vector.Count); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) @@ -84,7 +84,7 @@ namespace SixLabors.ImageSharp return; } - int remainder = ImageMaths.ModuloP2(source.Length, Vector.Count); + int remainder = Numerics.ModuloP2(source.Length, Vector.Count); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs index 1e89aaeb83..a97510113c 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs @@ -28,7 +28,7 @@ namespace SixLabors.ImageSharp { DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!"); - int remainder = ImageMaths.Modulo4(source.Length); + int remainder = Numerics.Modulo4(source.Length); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) @@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp { DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!"); - int remainder = ImageMaths.Modulo4(source.Length); + int remainder = Numerics.Modulo4(source.Length); int adjustedCount = source.Length - remainder; if (adjustedCount > 0) diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs b/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs index 2ea7f2c9bd..b760301167 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs @@ -38,8 +38,8 @@ namespace SixLabors.ImageSharp if (Avx.IsSupported || Sse.IsSupported) { int remainder = Avx.IsSupported - ? ImageMaths.ModuloP2(source.Length, Vector256.Count) - : ImageMaths.ModuloP2(source.Length, Vector128.Count); + ? Numerics.ModuloP2(source.Length, Vector256.Count) + : Numerics.ModuloP2(source.Length, Vector128.Count); int adjustedCount = source.Length - remainder; @@ -72,8 +72,8 @@ namespace SixLabors.ImageSharp if (Avx2.IsSupported || Ssse3.IsSupported) { int remainder = Avx2.IsSupported - ? ImageMaths.ModuloP2(source.Length, Vector256.Count) - : ImageMaths.ModuloP2(source.Length, Vector128.Count); + ? Numerics.ModuloP2(source.Length, Vector256.Count) + : Numerics.ModuloP2(source.Length, Vector128.Count); int adjustedCount = source.Length - remainder; @@ -203,7 +203,7 @@ namespace SixLabors.ImageSharp ref Unsafe.As>(ref MemoryMarshal.GetReference(dest)); int n = dest.Length / Vector256.Count; - int m = ImageMaths.Modulo4(n); + int m = Numerics.Modulo4(n); int u = n - m; for (int i = 0; i < u; i += 4) @@ -235,7 +235,7 @@ namespace SixLabors.ImageSharp ref Unsafe.As>(ref MemoryMarshal.GetReference(dest)); int n = dest.Length / Vector128.Count; - int m = ImageMaths.Modulo4(n); + int m = Numerics.Modulo4(n); int u = n - m; for (int i = 0; i < u; i += 4) @@ -288,7 +288,7 @@ namespace SixLabors.ImageSharp ref Unsafe.As>(ref MemoryMarshal.GetReference(dest)); int n = dest.Length / Vector256.Count; - int m = ImageMaths.Modulo4(n); + int m = Numerics.Modulo4(n); int u = n - m; for (int i = 0; i < u; i += 4) @@ -324,7 +324,7 @@ namespace SixLabors.ImageSharp ref Unsafe.As>(ref MemoryMarshal.GetReference(dest)); int n = dest.Length / Vector128.Count; - int m = ImageMaths.Modulo4(n); + int m = Numerics.Modulo4(n); int u = n - m; for (int i = 0; i < u; i += 4) @@ -550,11 +550,11 @@ namespace SixLabors.ImageSharp int remainder; if (Avx2.IsSupported) { - remainder = ImageMaths.ModuloP2(source.Length, Vector256.Count); + remainder = Numerics.ModuloP2(source.Length, Vector256.Count); } else { - remainder = ImageMaths.ModuloP2(source.Length, Vector128.Count); + remainder = Numerics.ModuloP2(source.Length, Vector128.Count); } int adjustedCount = source.Length - remainder; @@ -683,11 +683,11 @@ namespace SixLabors.ImageSharp int remainder; if (Avx2.IsSupported) { - remainder = ImageMaths.ModuloP2(source.Length, Vector256.Count); + remainder = Numerics.ModuloP2(source.Length, Vector256.Count); } else { - remainder = ImageMaths.ModuloP2(source.Length, Vector128.Count); + remainder = Numerics.ModuloP2(source.Length, Vector128.Count); } int adjustedCount = source.Length - remainder; diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.cs b/src/ImageSharp/Common/Helpers/SimdUtils.cs index 7cbb5bfe35..7691cb9ad0 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.cs @@ -206,7 +206,7 @@ namespace SixLabors.ImageSharp { DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!"); DebugGuard.IsTrue( - ImageMaths.ModuloP2(dest.Length, shouldBeDivisibleBy) == 0, + Numerics.ModuloP2(dest.Length, shouldBeDivisibleBy) == 0, nameof(source), $"length should be divisible by {shouldBeDivisibleBy}!"); } @@ -216,7 +216,7 @@ namespace SixLabors.ImageSharp { DebugGuard.IsTrue(source.Length == dest.Length, nameof(source), "Input spans must be of same length!"); DebugGuard.IsTrue( - ImageMaths.ModuloP2(dest.Length, shouldBeDivisibleBy) == 0, + Numerics.ModuloP2(dest.Length, shouldBeDivisibleBy) == 0, nameof(source), $"length should be divisible by {shouldBeDivisibleBy}!"); } diff --git a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs b/src/ImageSharp/Common/Helpers/Vector4Utilities.cs index f617e9a3ea..464006570a 100644 --- a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs +++ b/src/ImageSharp/Common/Helpers/Vector4Utilities.cs @@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); } - if (ImageMaths.Modulo2(vectors.Length) != 0) + if (Numerics.Modulo2(vectors.Length) != 0) { // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. Premultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); @@ -123,7 +123,7 @@ namespace SixLabors.ImageSharp vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); } - if (ImageMaths.Modulo2(vectors.Length) != 0) + if (Numerics.Modulo2(vectors.Length) != 0) { // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. UnPremultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); diff --git a/src/ImageSharp/Formats/Png/Filters/AverageFilter.cs b/src/ImageSharp/Formats/Png/Filters/AverageFilter.cs index 8d9f6e4156..d1c214e3d6 100644 --- a/src/ImageSharp/Formats/Png/Filters/AverageFilter.cs +++ b/src/ImageSharp/Formats/Png/Filters/AverageFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System; @@ -76,7 +76,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - (above >> 1)); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } for (int xLeft = x - bytesPerPixel; x < scanline.Length; ++xLeft /* Note: ++x happens in the body to avoid one add operation */) @@ -87,7 +87,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - Average(left, above)); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } sum -= 3; @@ -102,4 +102,4 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters [MethodImpl(MethodImplOptions.AggressiveInlining)] private static int Average(byte left, byte above) => (left + above) >> 1; } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs b/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs index 7b5c71a010..fab6788061 100644 --- a/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs +++ b/src/ImageSharp/Formats/Png/Filters/PaethFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System; @@ -79,7 +79,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - PaethPredictor(0, above, 0)); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } for (int xLeft = x - bytesPerPixel; x < scanline.Length; ++xLeft /* Note: ++x happens in the body to avoid one add operation */) @@ -91,7 +91,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - PaethPredictor(left, above, upperLeft)); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } sum -= 4; @@ -111,9 +111,9 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters private static byte PaethPredictor(byte left, byte above, byte upperLeft) { int p = left + above - upperLeft; - int pa = ImageMaths.FastAbs(p - left); - int pb = ImageMaths.FastAbs(p - above); - int pc = ImageMaths.FastAbs(p - upperLeft); + int pa = Numerics.Abs(p - left); + int pb = Numerics.Abs(p - above); + int pc = Numerics.Abs(p - upperLeft); if (pa <= pb && pa <= pc) { @@ -128,4 +128,4 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters return upperLeft; } } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Formats/Png/Filters/SubFilter.cs b/src/ImageSharp/Formats/Png/Filters/SubFilter.cs index c448e71f43..cb4cfb471f 100644 --- a/src/ImageSharp/Formats/Png/Filters/SubFilter.cs +++ b/src/ImageSharp/Formats/Png/Filters/SubFilter.cs @@ -61,7 +61,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = scan; - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } for (int xLeft = x - bytesPerPixel; x < scanline.Length; ++xLeft /* Note: ++x happens in the body to avoid one add operation */) @@ -71,7 +71,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - prev); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } sum -= 1; diff --git a/src/ImageSharp/Formats/Png/Filters/UpFilter.cs b/src/ImageSharp/Formats/Png/Filters/UpFilter.cs index 2a77bccb97..cf553cbb68 100644 --- a/src/ImageSharp/Formats/Png/Filters/UpFilter.cs +++ b/src/ImageSharp/Formats/Png/Filters/UpFilter.cs @@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Filters ++x; ref byte res = ref Unsafe.Add(ref resultBaseRef, x); res = (byte)(scan - above); - sum += ImageMaths.FastAbs(unchecked((sbyte)res)); + sum += Numerics.Abs(unchecked((sbyte)res)); } sum -= 2; diff --git a/src/ImageSharp/Primitives/ComplexVector4.cs b/src/ImageSharp/Primitives/ComplexVector4.cs index 3a1d4ac460..07f074502f 100644 --- a/src/ImageSharp/Primitives/ComplexVector4.cs +++ b/src/ImageSharp/Primitives/ComplexVector4.cs @@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp /// /// The input to sum [MethodImpl(InliningOptions.ShortMethod)] - public void Sum(in ComplexVector4 value) + public void Sum(ComplexVector4 value) { this.Real += value.Real; this.Imaginary += value.Imaginary; diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs index 7b1ceff276..9844f99563 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs @@ -30,7 +30,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution for (int i = 0; i < size; i++) { float x = i - midpoint; - float gx = ImageMaths.Gaussian(x, weight); + float gx = Numerics.Gaussian(x, weight); sum += gx; kernel[0, i] = gx; } @@ -58,7 +58,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution for (int i = 0; i < size; i++) { float x = i - midpoint; - float gx = ImageMaths.Gaussian(x, weight); + float gx = Numerics.Gaussian(x, weight); sum += gx; kernel[0, i] = gx; } @@ -88,4 +88,4 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution return kernel; } } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs index a61c68de3b..007a9a05de 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs @@ -182,7 +182,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { if (y < 0) { - y = ImageMaths.FastAbs(y); + y = Numerics.Abs(y); } else if (y >= source.Height) { @@ -197,7 +197,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization int idx = 0; for (int dx = x; dx < x + tileWidth; dx++) { - rowPixels[idx] = source[ImageMaths.FastAbs(dx), y].ToVector4(); + rowPixels[idx] = source[Numerics.Abs(dx), y].ToVector4(); idx++; } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resamplers/LanczosResampler.cs b/src/ImageSharp/Processing/Processors/Transforms/Resamplers/LanczosResampler.cs index 7aefd8f6f1..8742db580a 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resamplers/LanczosResampler.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resamplers/LanczosResampler.cs @@ -53,7 +53,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms float radius = this.Radius; if (x < radius) { - return ImageMaths.SinC(x) * ImageMaths.SinC(x / radius); + return Numerics.SinC(x) * Numerics.SinC(x / radius); } return 0F; diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resamplers/WelchResampler.cs b/src/ImageSharp/Processing/Processors/Transforms/Resamplers/WelchResampler.cs index 93c50af132..18859d1ada 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resamplers/WelchResampler.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resamplers/WelchResampler.cs @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms if (x < 3F) { - return ImageMaths.SinC(x) * (1F - (x * x / 9F)); + return Numerics.SinC(x) * (1F - (x * x / 9F)); } return 0F; diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs index 7cbda76a54..ab6040c17b 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs @@ -132,7 +132,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // 'ratio' is a rational number. // Multiplying it by LCM(sourceSize, destSize)/sourceSize will result in a whole number "again". // This value is determining the length of the periods in repeating kernel map rows. - int period = ImageMaths.LeastCommonMultiple(sourceSize, destinationSize) / sourceSize; + int period = Numerics.LeastCommonMultiple(sourceSize, destinationSize) / sourceSize; // the center position at i == 0: double center0 = (ratio - 1) * 0.5; diff --git a/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs new file mode 100644 index 0000000000..a5b49721da --- /dev/null +++ b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs @@ -0,0 +1,42 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using System; +using BenchmarkDotNet.Attributes; + +namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath +{ + public class ClampSpan + { + private static readonly int[] A = new int[2048]; + private static readonly int[] B = new int[2048]; + + public void Setup() + { + var r = new Random(); + + for (int i = 0; i < A.Length; i++) + { + int x = r.Next(); + A[i] = x; + B[i] = x; + } + } + + [Benchmark(Baseline = true)] + public void ClampNoIntrinsics() + { + for (int i = 0; i < A.Length; i++) + { + ref int x = ref A[i]; + x = x.Clamp(64, 128); + } + } + + [Benchmark] + public void ClampVectorIntrinsics() + { + Numerics.Clamp(B, 64, 128); + } + } +} diff --git a/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs b/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs index 55e26372b0..27ae787bca 100644 --- a/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs +++ b/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoConstant.cs @@ -19,7 +19,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath [Benchmark] public int Bitwise() { - return ImageMaths.Modulo8(this.value); + return Numerics.Modulo8(this.value); } } } diff --git a/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs b/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs index 9da7b9fdf3..d336015a0a 100644 --- a/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs +++ b/tests/ImageSharp.Benchmarks/General/BasicMath/ModuloPowerOfTwoVariable.cs @@ -21,7 +21,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath [Benchmark] public int Bitwise() { - return ImageMaths.ModuloP2(this.value, this.m); + return Numerics.ModuloP2(this.value, this.m); } // RESULTS: diff --git a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs index 7d16623877..656d8ce3b2 100644 --- a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs @@ -10,144 +10,6 @@ namespace SixLabors.ImageSharp.Tests.Helpers { public class ImageMathsTests { - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - [InlineData(3)] - [InlineData(4)] - [InlineData(100)] - [InlineData(123)] - [InlineData(53436353)] - public void Modulo2(int x) - { - int actual = ImageMaths.Modulo2(x); - Assert.Equal(x % 2, actual); - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - [InlineData(3)] - [InlineData(4)] - [InlineData(100)] - [InlineData(123)] - [InlineData(53436353)] - public void Modulo4(int x) - { - int actual = ImageMaths.Modulo4(x); - Assert.Equal(x % 4, actual); - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(2)] - [InlineData(6)] - [InlineData(7)] - [InlineData(8)] - [InlineData(100)] - [InlineData(123)] - [InlineData(53436353)] - [InlineData(975)] - public void Modulo8(int x) - { - int actual = ImageMaths.Modulo8(x); - Assert.Equal(x % 8, actual); - } - - [Theory] - [InlineData(0, 2)] - [InlineData(1, 2)] - [InlineData(2, 2)] - [InlineData(0, 4)] - [InlineData(3, 4)] - [InlineData(5, 4)] - [InlineData(5, 8)] - [InlineData(8, 8)] - [InlineData(8, 16)] - [InlineData(15, 16)] - [InlineData(17, 16)] - [InlineData(17, 32)] - [InlineData(31, 32)] - [InlineData(32, 32)] - [InlineData(33, 32)] - public void Modulo2P(int x, int m) - { - int actual = ImageMaths.ModuloP2(x, m); - Assert.Equal(x % m, actual); - } - - [Theory] - [InlineData(0, 0, 0, 0)] - [InlineData(0.5f, 0, 1, 0.5f)] - [InlineData(-0.5f, -0.1f, 10, -0.1f)] - [InlineData(-0.05f, -0.1f, 10, -0.05f)] - [InlineData(9.9f, -0.1f, 10, 9.9f)] - [InlineData(10f, -0.1f, 10, 10f)] - [InlineData(10.1f, -0.1f, 10, 10f)] - public void Clamp(float x, float min, float max, float expected) - { - float actual = x.Clamp(min, max); - Assert.Equal(expected, actual); - } - - [Fact] - public void FasAbsResultMatchesMath() - { - const int X = -33; - int expected = Math.Abs(X); - - Assert.Equal(expected, ImageMaths.FastAbs(X)); - } - - [Fact] - public void Pow2ResultMatchesMath() - { - const float X = -33; - float expected = (float)Math.Pow(X, 2); - - Assert.Equal(expected, ImageMaths.Pow2(X)); - } - - [Fact] - public void Pow3ResultMatchesMath() - { - const float X = -33; - float expected = (float)Math.Pow(X, 3); - - Assert.Equal(expected, ImageMaths.Pow3(X)); - } - - [Theory] - [InlineData(1, 1, 1)] - [InlineData(1, 42, 1)] - [InlineData(10, 8, 2)] - [InlineData(12, 18, 6)] - [InlineData(4536, 1000, 8)] - [InlineData(1600, 1024, 64)] - public void GreatestCommonDivisor(int a, int b, int expected) - { - int actual = ImageMaths.GreatestCommonDivisor(a, b); - - Assert.Equal(expected, actual); - } - - [Theory] - [InlineData(1, 1, 1)] - [InlineData(1, 42, 42)] - [InlineData(3, 4, 12)] - [InlineData(6, 4, 12)] - [InlineData(1600, 1024, 25600)] - [InlineData(3264, 100, 81600)] - public void LeastCommonMultiple(int a, int b, int expected) - { - int actual = ImageMaths.LeastCommonMultiple(a, b); - - Assert.Equal(expected, actual); - } - [Theory] [InlineData(0.2f, 0.7f, 0.1f, 256, 140)] [InlineData(0.5f, 0.5f, 0.5f, 256, 128)] diff --git a/tests/ImageSharp.Tests/Helpers/NumericsTests.cs b/tests/ImageSharp.Tests/Helpers/NumericsTests.cs new file mode 100644 index 0000000000..f1678cfa1d --- /dev/null +++ b/tests/ImageSharp.Tests/Helpers/NumericsTests.cs @@ -0,0 +1,265 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using System; +using Xunit; + +namespace SixLabors.ImageSharp.Tests.Helpers +{ + public class NumericsTests + { + public delegate void SpanAction(Span span, TArg arg, TArg1 arg1); + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + [InlineData(4)] + [InlineData(100)] + [InlineData(123)] + [InlineData(53436353)] + public void Modulo2(int x) + { + int actual = Numerics.Modulo2(x); + Assert.Equal(x % 2, actual); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(3)] + [InlineData(4)] + [InlineData(100)] + [InlineData(123)] + [InlineData(53436353)] + public void Modulo4(int x) + { + int actual = Numerics.Modulo4(x); + Assert.Equal(x % 4, actual); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(2)] + [InlineData(6)] + [InlineData(7)] + [InlineData(8)] + [InlineData(100)] + [InlineData(123)] + [InlineData(53436353)] + [InlineData(975)] + public void Modulo8(int x) + { + int actual = Numerics.Modulo8(x); + Assert.Equal(x % 8, actual); + } + + [Theory] + [InlineData(0, 2)] + [InlineData(1, 2)] + [InlineData(2, 2)] + [InlineData(0, 4)] + [InlineData(3, 4)] + [InlineData(5, 4)] + [InlineData(5, 8)] + [InlineData(8, 8)] + [InlineData(8, 16)] + [InlineData(15, 16)] + [InlineData(17, 16)] + [InlineData(17, 32)] + [InlineData(31, 32)] + [InlineData(32, 32)] + [InlineData(33, 32)] + public void Modulo2P(int x, int m) + { + int actual = Numerics.ModuloP2(x, m); + Assert.Equal(x % m, actual); + } + + [Theory] + [InlineData(-5)] + [InlineData(-17)] + [InlineData(-12856)] + [InlineData(-32)] + [InlineData(-7425)] + [InlineData(5)] + [InlineData(17)] + [InlineData(12856)] + [InlineData(32)] + [InlineData(7425)] + public void Abs(int x) + { + int expected = Math.Abs(x); + Assert.Equal(expected, Numerics.Abs(x)); + } + + [Theory] + [InlineData(-5)] + [InlineData(-17)] + [InlineData(-12856)] + [InlineData(-32)] + [InlineData(-7425)] + [InlineData(5)] + [InlineData(17)] + [InlineData(12856)] + [InlineData(32)] + [InlineData(7425)] + public void Pow2(float x) + { + float expected = (float)Math.Pow(x, 2); + Assert.Equal(expected, Numerics.Pow2(x)); + } + + [Theory] + [InlineData(-5)] + [InlineData(-17)] + [InlineData(-12856)] + [InlineData(-32)] + [InlineData(5)] + [InlineData(17)] + [InlineData(12856)] + [InlineData(32)] + public void Pow3(float x) + { + float expected = (float)Math.Pow(x, 3); + Assert.Equal(expected, Numerics.Pow3(x)); + } + + [Theory] + [InlineData(1, 1, 1)] + [InlineData(1, 42, 1)] + [InlineData(10, 8, 2)] + [InlineData(12, 18, 6)] + [InlineData(4536, 1000, 8)] + [InlineData(1600, 1024, 64)] + public void GreatestCommonDivisor(int a, int b, int expected) + { + int actual = Numerics.GreatestCommonDivisor(a, b); + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(1, 1, 1)] + [InlineData(1, 42, 42)] + [InlineData(3, 4, 12)] + [InlineData(6, 4, 12)] + [InlineData(1600, 1024, 25600)] + [InlineData(3264, 100, 81600)] + public void LeastCommonMultiple(int a, int b, int expected) + { + int actual = Numerics.LeastCommonMultiple(a, b); + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(64, 36, 96)] + [InlineData(128, 16, 196)] + [InlineData(567, 18, 142)] + [InlineData(1024, 0, 255)] + public void ClampByte(int length, byte min, byte max) + { + TestClampSpan( + length, + min, + max, + (s, m1, m2) => Numerics.Clamp(s, m1, m2), + (v, m1, m2) => Numerics.Clamp(v, m1, m2)); + } + + [Theory] + [InlineData(64, 36, 96)] + [InlineData(128, 16, 196)] + [InlineData(567, 18, 142)] + [InlineData(1024, 0, 255)] + public void ClampInt(int length, int min, int max) + { + TestClampSpan( + length, + min, + max, + (s, m1, m2) => Numerics.Clamp(s, m1, m2), + (v, m1, m2) => Numerics.Clamp(v, m1, m2)); + } + + [Theory] + [InlineData(64, 36, 96)] + [InlineData(128, 16, 196)] + [InlineData(567, 18, 142)] + [InlineData(1024, 0, 255)] + public void ClampUInt(int length, uint min, uint max) + { + TestClampSpan( + length, + min, + max, + (s, m1, m2) => Numerics.Clamp(s, m1, m2), + (v, m1, m2) => Numerics.Clamp(v, m1, m2)); + } + + [Theory] + [InlineData(64, 36, 96)] + [InlineData(128, 16, 196)] + [InlineData(567, 18, 142)] + [InlineData(1024, 0, 255)] + public void ClampFloat(int length, float min, float max) + { + TestClampSpan( + length, + min, + max, + (s, m1, m2) => Numerics.Clamp(s, m1, m2), + (v, m1, m2) => Numerics.Clamp(v, m1, m2)); + } + + [Theory] + [InlineData(64, 36, 96)] + [InlineData(128, 16, 196)] + [InlineData(567, 18, 142)] + [InlineData(1024, 0, 255)] + public void ClampDouble(int length, double min, double max) + { + TestClampSpan( + length, + min, + max, + (s, m1, m2) => Numerics.Clamp(s, m1, m2), + (v, m1, m2) => Numerics.Clamp(v, m1, m2)); + } + + private static void TestClampSpan( + int length, + T min, + T max, + SpanAction clampAction, + Func refClampFunc) + where T : unmanaged, IComparable + { + Span actual = new T[length]; + + var r = new Random(); + for (int i = 0; i < length; i++) + { + actual[i] = (T)Convert.ChangeType(r.Next(byte.MinValue, byte.MaxValue), typeof(T)); + } + + Span expected = new T[length]; + actual.CopyTo(expected); + + for (int i = 0; i < expected.Length; i++) + { + ref T v = ref expected[i]; + v = refClampFunc(v, min, max); + } + + clampAction(actual, min, max); + + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(expected[i], actual[i]); + } + } + } +} From 124a54c5ad8ab54ddcdfac3e4ac1e4c00b7537f3 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 22 Nov 2020 23:56:09 +0000 Subject: [PATCH 32/61] ImageMaths => ImageMath --- src/ImageSharp/Color/Color.cs | 14 +- .../Helpers/{ImageMaths.cs => ImageMath.cs} | 2 +- src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs | 4 +- src/ImageSharp/Formats/Gif/GifEncoderCore.cs | 6 +- src/ImageSharp/Formats/Png/PngEncoderCore.cs | 6 +- .../Formats/Png/PngEncoderOptionsHelpers.cs | 4 +- .../Formats/Png/PngScanlineProcessor.cs | 4 +- src/ImageSharp/Formats/Tga/TgaEncoderCore.cs | 2 +- .../PixelFormats/PixelImplementations/A8.cs | 2 +- .../PixelImplementations/Argb32.cs | 20 +-- .../PixelImplementations/Bgr24.cs | 16 +-- .../PixelImplementations/Bgra32.cs | 20 +-- .../PixelFormats/PixelImplementations/L16.cs | 52 ++++---- .../PixelFormats/PixelImplementations/L8.cs | 32 ++--- .../PixelFormats/PixelImplementations/La16.cs | 36 +++--- .../PixelFormats/PixelImplementations/La32.cs | 62 ++++----- .../PixelImplementations/Rgb24.cs | 16 +-- .../PixelImplementations/Rgb48.cs | 40 +++--- .../PixelImplementations/Rgba32.cs | 20 +-- .../PixelImplementations/Rgba64.cs | 122 +++++++++--------- .../BinaryThresholdProcessor{TPixel}.cs | 2 +- .../Processors/Dithering/OrderedDither.cs | 4 +- ...alizationSlidingWindowProcessor{TPixel}.cs | 4 +- ...lHistogramEqualizationProcessor{TPixel}.cs | 4 +- .../HistogramEqualizationProcessor{TPixel}.cs | 2 +- .../Quantization/OctreeQuantizer{TPixel}.cs | 2 +- .../EntropyCropProcessor{TPixel}.cs | 2 +- .../Formats/Png/PngEncoderTests.cs | 2 +- .../{ImageMathsTests.cs => ImageMathTests.cs} | 5 +- .../ImageSharp.Tests/PixelFormats/L16Tests.cs | 6 +- .../ImageSharp.Tests/PixelFormats/L8Tests.cs | 2 +- .../PixelFormats/La16Tests.cs | 2 +- .../PixelFormats/La32Tests.cs | 6 +- 33 files changed, 261 insertions(+), 262 deletions(-) rename src/ImageSharp/Common/Helpers/{ImageMaths.cs => ImageMath.cs} (99%) rename tests/ImageSharp.Tests/Helpers/{ImageMathsTests.cs => ImageMathTests.cs} (85%) diff --git a/src/ImageSharp/Color/Color.cs b/src/ImageSharp/Color/Color.cs index 554fcb8354..424329863d 100644 --- a/src/ImageSharp/Color/Color.cs +++ b/src/ImageSharp/Color/Color.cs @@ -27,19 +27,19 @@ namespace SixLabors.ImageSharp private Color(byte r, byte g, byte b, byte a) { this.data = new Rgba64( - ImageMaths.UpscaleFrom8BitTo16Bit(r), - ImageMaths.UpscaleFrom8BitTo16Bit(g), - ImageMaths.UpscaleFrom8BitTo16Bit(b), - ImageMaths.UpscaleFrom8BitTo16Bit(a)); + ImageMath.UpscaleFrom8BitTo16Bit(r), + ImageMath.UpscaleFrom8BitTo16Bit(g), + ImageMath.UpscaleFrom8BitTo16Bit(b), + ImageMath.UpscaleFrom8BitTo16Bit(a)); } [MethodImpl(InliningOptions.ShortMethod)] private Color(byte r, byte g, byte b) { this.data = new Rgba64( - ImageMaths.UpscaleFrom8BitTo16Bit(r), - ImageMaths.UpscaleFrom8BitTo16Bit(g), - ImageMaths.UpscaleFrom8BitTo16Bit(b), + ImageMath.UpscaleFrom8BitTo16Bit(r), + ImageMath.UpscaleFrom8BitTo16Bit(g), + ImageMath.UpscaleFrom8BitTo16Bit(b), ushort.MaxValue); } diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMath.cs similarity index 99% rename from src/ImageSharp/Common/Helpers/ImageMaths.cs rename to src/ImageSharp/Common/Helpers/ImageMath.cs index 55ac6f8227..11fb60209d 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMath.cs @@ -11,7 +11,7 @@ namespace SixLabors.ImageSharp /// /// Provides common mathematical methods used for image processing. /// - internal static class ImageMaths + internal static class ImageMath { /// /// Vector for converting pixel to gray value as specified by ITU-R Recommendation BT.709. diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs index 6f92236372..0dd6678502 100644 --- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs @@ -1385,7 +1385,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp { case BmpFileMarkerType.Bitmap: colorMapSizeBytes = this.fileHeader.Offset - BmpFileHeader.Size - this.infoHeader.HeaderSize; - int colorCountForBitDepth = ImageMaths.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel); + int colorCountForBitDepth = ImageMath.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel); bytesPerColorMapEntry = colorMapSizeBytes / colorCountForBitDepth; // Edge case for less-than-full-sized palette: bytesPerColorMapEntry should be at least 3. @@ -1399,7 +1399,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp case BmpFileMarkerType.Pointer: // OS/2 bitmaps always have 3 colors per color palette entry. bytesPerColorMapEntry = 3; - colorMapSizeBytes = ImageMaths.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel) * bytesPerColorMapEntry; + colorMapSizeBytes = ImageMath.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel) * bytesPerColorMapEntry; break; } } diff --git a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs index 070864e603..f4288e97f3 100644 --- a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.Formats.Gif } // Get the number of bits. - this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(quantized.Palette.Length); + this.bitDepth = ImageMath.GetBitsNeededForColorDepth(quantized.Palette.Length); // Write the header. this.WriteHeader(stream); @@ -212,7 +212,7 @@ namespace SixLabors.ImageSharp.Formats.Gif } } - this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(quantized.Palette.Length); + this.bitDepth = ImageMath.GetBitsNeededForColorDepth(quantized.Palette.Length); this.WriteGraphicalControlExtension(frameMetadata, this.GetTransparentIndex(quantized), stream); this.WriteImageDescriptor(frame, true, stream); this.WriteColorTable(quantized, stream); @@ -468,7 +468,7 @@ namespace SixLabors.ImageSharp.Formats.Gif where TPixel : unmanaged, IPixel { // The maximum number of colors for the bit depth - int colorTableLength = ImageMaths.GetColorCountForBitDepth(this.bitDepth) * Unsafe.SizeOf(); + int colorTableLength = ImageMath.GetColorCountForBitDepth(this.bitDepth) * Unsafe.SizeOf(); using IManagedByteBuffer colorTable = this.memoryAllocator.AllocateManagedByteBuffer(colorTableLength, AllocationOptions.Clean); PixelOperations.Instance.ToRgb24Bytes( diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs index 5cf11099cd..4e05f459f6 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs @@ -284,7 +284,7 @@ namespace SixLabors.ImageSharp.Formats.Png rowSpan.Length, AllocationOptions.Clean)) { - int scaleFactor = 255 / (ImageMaths.GetColorCountForBitDepth(this.bitDepth) - 1); + int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(this.bitDepth) - 1); Span tempSpan = temp.GetSpan(); // We need to first create an array of luminance bytes then scale them down to the correct bit depth. @@ -314,7 +314,7 @@ namespace SixLabors.ImageSharp.Formats.Png for (int x = 0, o = 0; x < rgbaSpan.Length; x++, o += 4) { Rgba64 rgba = Unsafe.Add(ref rgbaRef, x); - ushort luminance = ImageMaths.Get16BitBT709Luminance(rgba.R, rgba.G, rgba.B); + ushort luminance = ImageMath.Get16BitBT709Luminance(rgba.R, rgba.G, rgba.B); BinaryPrimitives.WriteUInt16BigEndian(rawScanlineSpan.Slice(o, 2), luminance); BinaryPrimitives.WriteUInt16BigEndian(rawScanlineSpan.Slice(o + 2, 2), rgba.A); } @@ -329,7 +329,7 @@ namespace SixLabors.ImageSharp.Formats.Png { Unsafe.Add(ref rowSpanRef, x).ToRgba32(ref rgba); Unsafe.Add(ref rawScanlineSpanRef, o) = - ImageMaths.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); + ImageMath.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); Unsafe.Add(ref rawScanlineSpanRef, o + 1) = rgba.A; } } diff --git a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs index 9342e09dfe..3343923b7a 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs @@ -75,7 +75,7 @@ namespace SixLabors.ImageSharp.Formats.Png if (options.Quantizer is null) { byte bits = (byte)options.BitDepth; - var maxColors = ImageMaths.GetColorCountForBitDepth(bits); + var maxColors = ImageMath.GetColorCountForBitDepth(bits); options.Quantizer = new WuQuantizer(new QuantizerOptions { MaxColors = maxColors }); } @@ -101,7 +101,7 @@ namespace SixLabors.ImageSharp.Formats.Png byte bitDepth; if (options.ColorType == PngColorType.Palette) { - byte quantizedBits = (byte)ImageMaths.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length).Clamp(1, 8); + byte quantizedBits = (byte)ImageMath.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length).Clamp(1, 8); byte bits = Math.Max((byte)options.BitDepth, quantizedBits); // Png only supports in four pixel depths: 1, 2, 4, and 8 bits when using the PLTE chunk diff --git a/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs b/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs index 48ec9bdcdc..16d6aa19f4 100644 --- a/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs +++ b/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs @@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp.Formats.Png TPixel pixel = default; ref byte scanlineSpanRef = ref MemoryMarshal.GetReference(scanlineSpan); ref TPixel rowSpanRef = ref MemoryMarshal.GetReference(rowSpan); - int scaleFactor = 255 / (ImageMaths.GetColorCountForBitDepth(header.BitDepth) - 1); + int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(header.BitDepth) - 1); if (!hasTrans) { @@ -96,7 +96,7 @@ namespace SixLabors.ImageSharp.Formats.Png TPixel pixel = default; ref byte scanlineSpanRef = ref MemoryMarshal.GetReference(scanlineSpan); ref TPixel rowSpanRef = ref MemoryMarshal.GetReference(rowSpan); - int scaleFactor = 255 / (ImageMaths.GetColorCountForBitDepth(header.BitDepth) - 1); + int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(header.BitDepth) - 1); if (!hasTrans) { diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs index d3a628531e..92474b6fc8 100644 --- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs @@ -365,7 +365,7 @@ namespace SixLabors.ImageSharp.Formats.Tga where TPixel : unmanaged, IPixel { var vector = sourcePixel.ToVector4(); - return ImageMaths.GetBT709Luminance(ref vector, 256); + return ImageMath.GetBT709Luminance(ref vector, 256); } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs index fc0723e9a7..c293d181a5 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa32(La32 source) => this.PackedValue = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + public void FromLa32(La32 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.A); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs index 914b31672b..a42be24828 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs @@ -244,7 +244,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -265,11 +265,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -306,9 +306,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -316,10 +316,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs index a2ec185be2..9063516a3b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs @@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -170,7 +170,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -203,18 +203,18 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs index 68dcd8287b..fea5643a85 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs @@ -197,7 +197,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -218,11 +218,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -259,9 +259,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -269,10 +269,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs index 087becaf2c..5d91486a62 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs @@ -74,30 +74,30 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.PackedValue = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.PackedValue = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.PackedValue = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); } /// @@ -106,7 +106,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromL8(L8 source) => this.PackedValue = ImageMaths.UpscaleFrom8BitTo16Bit(source.PackedValue); + public void FromL8(L8 source) => this.PackedValue = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -114,7 +114,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa16(La16 source) => this.PackedValue = ImageMaths.UpscaleFrom8BitTo16Bit(source.L); + public void FromLa16(La16 source) => this.PackedValue = ImageMath.UpscaleFrom8BitTo16Bit(source.L); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -124,27 +124,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.PackedValue = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.PackedValue = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(this.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(this.PackedValue); dest.R = rgb; dest.G = rgb; dest.B = rgb; @@ -153,11 +153,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgb48(Rgb48 source) => this.PackedValue = ImageMaths.Get16BitBT709Luminance(source.R, source.G, source.B); + public void FromRgb48(Rgb48 source) => this.PackedValue = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgba64(Rgba64 source) => this.PackedValue = ImageMaths.Get16BitBT709Luminance(source.R, source.G, source.B); + public void FromRgba64(Rgba64 source) => this.PackedValue = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); /// public override readonly bool Equals(object obj) => obj is L16 other && this.Equals(other); @@ -177,7 +177,7 @@ namespace SixLabors.ImageSharp.PixelFormats internal void ConvertFromRgbaScaledVector4(Vector4 vector) { vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; - this.PackedValue = ImageMaths.Get16BitBT709Luminance( + this.PackedValue = ImageMath.Get16BitBT709Luminance( vector.X, vector.Y, vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs index 32f963795b..f395a5dfb0 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs @@ -73,15 +73,15 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromArgb32(Argb32 source) => this.PackedValue = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromArgb32(Argb32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromBgr24(Bgr24 source) => this.PackedValue = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromBgr24(Bgr24 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromBgra32(Bgra32 source) => this.PackedValue = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromBgra32(Bgra32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -93,7 +93,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromL16(L16 source) => this.PackedValue = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + public void FromL16(L16 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -101,15 +101,15 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa32(La32 source) => this.PackedValue = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + public void FromLa32(La32 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.L); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgb24(Rgb24 source) => this.PackedValue = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromRgb24(Rgb24 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgba32(Rgba32 source) => this.PackedValue = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromRgba32(Rgba32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -124,18 +124,18 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) - => this.PackedValue = ImageMaths.Get8BitBT709Luminance( - ImageMaths.DownScaleFrom16BitTo8Bit(source.R), - ImageMaths.DownScaleFrom16BitTo8Bit(source.G), - ImageMaths.DownScaleFrom16BitTo8Bit(source.B)); + => this.PackedValue = ImageMath.Get8BitBT709Luminance( + ImageMath.DownScaleFrom16BitTo8Bit(source.R), + ImageMath.DownScaleFrom16BitTo8Bit(source.G), + ImageMath.DownScaleFrom16BitTo8Bit(source.B)); /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) - => this.PackedValue = ImageMaths.Get8BitBT709Luminance( - ImageMaths.DownScaleFrom16BitTo8Bit(source.R), - ImageMaths.DownScaleFrom16BitTo8Bit(source.G), - ImageMaths.DownScaleFrom16BitTo8Bit(source.B)); + => this.PackedValue = ImageMath.Get8BitBT709Luminance( + ImageMath.DownScaleFrom16BitTo8Bit(source.R), + ImageMath.DownScaleFrom16BitTo8Bit(source.G), + ImageMath.DownScaleFrom16BitTo8Bit(source.B)); /// public override readonly bool Equals(object obj) => obj is L8 other && this.Equals(other); @@ -157,7 +157,7 @@ namespace SixLabors.ImageSharp.PixelFormats vector *= MaxBytes; vector += Half; vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); - this.PackedValue = ImageMaths.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); + this.PackedValue = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs index bcfe67249d..bf94843992 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs @@ -92,7 +92,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.L = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -100,7 +100,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.L = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = byte.MaxValue; } @@ -108,7 +108,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.L = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -120,7 +120,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - this.L = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + this.L = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.A = byte.MaxValue; } @@ -140,15 +140,15 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - this.L = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.L = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.L = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = byte.MaxValue; } @@ -156,10 +156,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.L = ImageMaths.Get8BitBT709Luminance( - ImageMaths.DownScaleFrom16BitTo8Bit(source.R), - ImageMaths.DownScaleFrom16BitTo8Bit(source.G), - ImageMaths.DownScaleFrom16BitTo8Bit(source.B)); + this.L = ImageMath.Get8BitBT709Luminance( + ImageMath.DownScaleFrom16BitTo8Bit(source.R), + ImageMath.DownScaleFrom16BitTo8Bit(source.G), + ImageMath.DownScaleFrom16BitTo8Bit(source.B)); this.A = byte.MaxValue; } @@ -168,19 +168,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.L = ImageMaths.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } /// public void FromRgba64(Rgba64 source) { - this.L = ImageMaths.Get8BitBT709Luminance( - ImageMaths.DownScaleFrom16BitTo8Bit(source.R), - ImageMaths.DownScaleFrom16BitTo8Bit(source.G), - ImageMaths.DownScaleFrom16BitTo8Bit(source.B)); + this.L = ImageMath.Get8BitBT709Luminance( + ImageMath.DownScaleFrom16BitTo8Bit(source.R), + ImageMath.DownScaleFrom16BitTo8Bit(source.G), + ImageMath.DownScaleFrom16BitTo8Bit(source.B)); - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -220,7 +220,7 @@ namespace SixLabors.ImageSharp.PixelFormats vector *= MaxBytes; vector += Half; vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); - this.L = ImageMaths.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); + this.L = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); this.A = (byte)vector.W; } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs index 23f4b8e17a..102d1b7cd9 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs @@ -95,22 +95,22 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.L = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.L = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); this.A = ushort.MaxValue; } @@ -119,12 +119,12 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.L = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -143,7 +143,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - this.L = ImageMaths.UpscaleFrom8BitTo16Bit(source.PackedValue); + this.L = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); this.A = ushort.MaxValue; } @@ -151,8 +151,8 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - this.L = ImageMaths.UpscaleFrom8BitTo16Bit(source.L); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.L = ImageMath.UpscaleFrom8BitTo16Bit(source.L); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -163,10 +163,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.L = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); this.A = ushort.MaxValue; } @@ -175,7 +175,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.L = ImageMaths.Get16BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); this.A = ushort.MaxValue; } @@ -183,19 +183,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.L = ImageMaths.Get16BitBT709Luminance( - ImageMaths.UpscaleFrom8BitTo16Bit(source.R), - ImageMaths.UpscaleFrom8BitTo16Bit(source.G), - ImageMaths.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ImageMath.Get16BitBT709Luminance( + ImageMath.UpscaleFrom8BitTo16Bit(source.R), + ImageMath.UpscaleFrom8BitTo16Bit(source.G), + ImageMath.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.L = ImageMaths.Get16BitBT709Luminance(source.R, source.G, source.B); + this.L = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -211,11 +211,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(this.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(this.L); dest.R = rgb; dest.G = rgb; dest.B = rgb; - dest.A = ImageMaths.DownScaleFrom16BitTo8Bit(this.A); + dest.A = ImageMath.DownScaleFrom16BitTo8Bit(this.A); } /// @@ -234,7 +234,7 @@ namespace SixLabors.ImageSharp.PixelFormats internal void ConvertFromRgbaScaledVector4(Vector4 vector) { vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; - this.L = ImageMaths.Get16BitBT709Luminance( + this.L = ImageMath.Get16BitBT709Luminance( vector.X, vector.Y, vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs index a50c18d42c..fd9ed12d7d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs @@ -166,7 +166,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -185,7 +185,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -227,18 +227,18 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs index 08f3bcc712..280044cebd 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs @@ -99,27 +99,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); } /// @@ -134,7 +134,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - ushort rgb = ImageMaths.UpscaleFrom8BitTo16Bit(source.PackedValue); + ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -153,7 +153,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - ushort rgb = ImageMaths.UpscaleFrom8BitTo16Bit(source.L); + ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -172,27 +172,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - dest.R = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - dest.G = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - dest.B = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); + dest.R = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + dest.G = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + dest.B = ImageMath.DownScaleFrom16BitTo8Bit(this.B); dest.A = byte.MaxValue; } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs index 0b42351011..2c74dc8784 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs @@ -351,7 +351,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -372,11 +372,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMaths.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -402,9 +402,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -412,10 +412,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMaths.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMaths.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMaths.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMaths.DownScaleFrom16BitTo8Bit(source.A); + this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); + this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); + this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs index 22f58ca4ad..7e84c6e5bd 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs @@ -62,10 +62,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Rgba32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -75,10 +75,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Bgra32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -88,10 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Argb32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -101,9 +101,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Rgb24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -114,9 +114,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Bgr24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -224,19 +224,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -244,10 +244,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -258,7 +258,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - ushort rgb = ImageMaths.UpscaleFrom8BitTo16Bit(source.PackedValue); + ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -279,11 +279,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - ushort rgb = ImageMaths.UpscaleFrom8BitTo16Bit(source.L); + ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -300,9 +300,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -310,20 +310,20 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.R = ImageMaths.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMaths.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMaths.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMaths.UpscaleFrom8BitTo16Bit(source.A); + this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); + this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); + this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - dest.R = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - dest.G = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - dest.B = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); - dest.A = ImageMaths.DownScaleFrom16BitTo8Bit(this.A); + dest.R = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + dest.G = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + dest.B = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + dest.A = ImageMath.DownScaleFrom16BitTo8Bit(this.A); } /// @@ -345,10 +345,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Rgba32 ToRgba32() { - byte r = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMaths.DownScaleFrom16BitTo8Bit(this.A); + byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); return new Rgba32(r, g, b, a); } @@ -359,10 +359,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Bgra32 ToBgra32() { - byte r = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMaths.DownScaleFrom16BitTo8Bit(this.A); + byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); return new Bgra32(r, g, b, a); } @@ -373,10 +373,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Argb32 ToArgb32() { - byte r = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMaths.DownScaleFrom16BitTo8Bit(this.A); + byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); return new Argb32(r, g, b, a); } @@ -387,9 +387,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Rgb24 ToRgb24() { - byte r = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); + byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); return new Rgb24(r, g, b); } @@ -400,9 +400,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Bgr24 ToBgr24() { - byte r = ImageMaths.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMaths.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMaths.DownScaleFrom16BitTo8Bit(this.B); + byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); + byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); + byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); return new Bgr24(r, g, b); } diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs index e5672ee9df..a47937baf1 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs @@ -96,7 +96,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Binarization color.ToRgba32(ref rgba); // Convert to grayscale using ITU-R Recommendation BT.709 if required - byte luminance = this.isAlphaOnly ? rgba.A : ImageMaths.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); + byte luminance = this.isAlphaOnly ? rgba.A : ImageMath.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); color = luminance >= this.threshold ? this.upper : this.lower; } } diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs index 448eb3833b..80c777cd78 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs @@ -218,7 +218,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering this.source = source; this.destination = destination; this.bounds = bounds; - this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(destination.Palette.Length); + this.bitDepth = ImageMath.GetBitsNeededForColorDepth(destination.Palette.Length); } [MethodImpl(InliningOptions.ShortMethod)] @@ -262,7 +262,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering this.source = source; this.bounds = bounds; this.scale = processor.DitherScale; - this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(processor.Palette.Length); + this.bitDepth = ImageMath.GetBitsNeededForColorDepth(processor.Palette.Length); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs index 007a9a05de..2558120786 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs @@ -259,7 +259,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int idx = 0; idx < length; idx++) { - int luminance = ImageMaths.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); + int luminance = ImageMath.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); Unsafe.Add(ref histogramBase, luminance)++; } } @@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int idx = 0; idx < length; idx++) { - int luminance = ImageMaths.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); + int luminance = ImageMath.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); Unsafe.Add(ref histogramBase, luminance)--; } } diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index 74d293566c..b45773e9ab 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -123,7 +123,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { // TODO: We should bulk convert here. var vector = pixelRow[x].ToVector4(); - int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); + int luminance = ImageMath.GetBT709Luminance(ref vector, levels); Interlocked.Increment(ref Unsafe.Add(ref histogramBase, luminance)); } } @@ -174,7 +174,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization // TODO: We should bulk convert here. ref TPixel pixel = ref pixelRow[x]; var vector = pixel.ToVector4(); - int luminance = ImageMaths.GetBT709Luminance(ref vector, levels); + int luminance = ImageMath.GetBT709Luminance(ref vector, levels); float luminanceEqualized = Unsafe.Add(ref cdfBase, luminance) / noOfPixelsMinusCdfMin; pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); } diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs index 2849574bc2..3bba95bc68 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs @@ -143,7 +143,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public static int GetLuminance(TPixel sourcePixel, int luminanceLevels) { var vector = sourcePixel.ToVector4(); - return ImageMaths.GetBT709Luminance(ref vector, luminanceLevels); + return ImageMath.GetBT709Luminance(ref vector, luminanceLevels); } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs index f4d55ebeb3..50eeef8ca6 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs @@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization this.Options = options; this.maxColors = this.Options.MaxColors; - this.octree = new Octree(ImageMaths.GetBitsNeededForColorDepth(this.maxColors).Clamp(1, 8)); + this.octree = new Octree(ImageMath.GetBitsNeededForColorDepth(this.maxColors).Clamp(1, 8)); this.paletteOwner = configuration.MemoryAllocator.Allocate(this.maxColors, AllocationOptions.Clean); this.palette = default; this.pixelMap = default; diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs index dd9c069385..27d40e77b4 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs @@ -48,7 +48,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms new BinaryThresholdProcessor(this.definition.Threshold).Execute(this.Configuration, temp, this.SourceRectangle); // Search for the first white pixels - rectangle = ImageMaths.GetFilteredBoundingRectangle(temp.Frames.RootFrame, 0); + rectangle = ImageMath.GetFilteredBoundingRectangle(temp.Frames.RootFrame, 0); } new CropProcessor(rectangle, this.Source.Size()).Execute(this.Configuration, this.Source, this.SourceRectangle); diff --git a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs index b4670cb5d4..cd5e3a5e4d 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs @@ -435,7 +435,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png Rgba32 expectedColor = Color.Blue; if (colorType == PngColorType.Grayscale || colorType == PngColorType.GrayscaleWithAlpha) { - var luminance = ImageMaths.Get8BitBT709Luminance(expectedColor.R, expectedColor.G, expectedColor.B); + var luminance = ImageMath.Get8BitBT709Luminance(expectedColor.R, expectedColor.G, expectedColor.B); expectedColor = new Rgba32(luminance, luminance, luminance); } diff --git a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs b/tests/ImageSharp.Tests/Helpers/ImageMathTests.cs similarity index 85% rename from tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs rename to tests/ImageSharp.Tests/Helpers/ImageMathTests.cs index 656d8ce3b2..687c13fd55 100644 --- a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ImageMathTests.cs @@ -1,14 +1,13 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. -using System; using System.Numerics; using Xunit; namespace SixLabors.ImageSharp.Tests.Helpers { - public class ImageMathsTests + public class ImageMathTests { [Theory] [InlineData(0.2f, 0.7f, 0.1f, 256, 140)] @@ -21,7 +20,7 @@ namespace SixLabors.ImageSharp.Tests.Helpers var vector = new Vector4(x, y, z, 0.0f); // act - int actual = ImageMaths.GetBT709Luminance(ref vector, luminanceLevels); + int actual = ImageMath.GetBT709Luminance(ref vector, luminanceLevels); // assert Assert.Equal(expected, actual); diff --git a/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs b/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs index 4204fc2f70..113a39bff8 100644 --- a/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs @@ -113,8 +113,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats // Arrange L16 gray = default; const byte rgb = 128; - ushort scaledRgb = ImageMaths.UpscaleFrom8BitTo16Bit(rgb); - ushort expected = ImageMaths.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); + ushort scaledRgb = ImageMath.UpscaleFrom8BitTo16Bit(rgb); + ushort expected = ImageMath.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); @@ -131,7 +131,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats public void L16_ToRgba32(ushort input) { // Arrange - ushort expected = ImageMaths.DownScaleFrom16BitTo8Bit(input); + ushort expected = ImageMath.DownScaleFrom16BitTo8Bit(input); var gray = new L16(input); // Act diff --git a/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs b/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs index 09d67ab9ab..798eb3b1a5 100644 --- a/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs @@ -136,7 +136,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats { // Arrange L8 gray = default; - byte expected = ImageMaths.Get8BitBT709Luminance(rgb, rgb, rgb); + byte expected = ImageMath.Get8BitBT709Luminance(rgb, rgb, rgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); diff --git a/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs b/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs index f36d9765c9..46d7d09b4c 100644 --- a/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs @@ -138,7 +138,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats { // Arrange La16 gray = default; - byte expected = ImageMaths.Get8BitBT709Luminance(rgb, rgb, rgb); + byte expected = ImageMath.Get8BitBT709Luminance(rgb, rgb, rgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); diff --git a/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs b/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs index d3fdbd085d..159abac4ad 100644 --- a/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs @@ -117,8 +117,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats // Arrange La32 gray = default; const byte rgb = 128; - ushort scaledRgb = ImageMaths.UpscaleFrom8BitTo16Bit(rgb); - ushort expected = ImageMaths.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); + ushort scaledRgb = ImageMath.UpscaleFrom8BitTo16Bit(rgb); + ushort expected = ImageMath.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); @@ -136,7 +136,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats public void La32_ToRgba32(ushort input) { // Arrange - ushort expected = ImageMaths.DownScaleFrom16BitTo8Bit(input); + ushort expected = ImageMath.DownScaleFrom16BitTo8Bit(input); var gray = new La32(input, ushort.MaxValue); // Act From 3bdbfe620e16b7c9d45d260d475861982ce3b3c6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 00:44:32 +0000 Subject: [PATCH 33/61] Replace clamp extensions --- .../Common/Extensions/ComparableExtensions.cs | 140 ---- .../Common/Helpers/Buffer2DUtils.cs | 8 +- .../Common/Helpers/DenseMatrixUtils.cs | 8 +- src/ImageSharp/Common/Helpers/ImageMath.cs | 4 +- src/ImageSharp/Common/Helpers/SimdUtils.cs | 2 +- .../Formats/Jpeg/JpegEncoderCore.cs | 4 +- .../Formats/Png/PngEncoderOptionsHelpers.cs | 2 +- .../Profiles/ICC/DataReader/IccDataReader.cs | 2 +- .../ICC/DataWriter/IccDataWriter.Lut.cs | 10 +- .../DataWriter/IccDataWriter.NonPrimitives.cs | 6 +- .../DataWriter/IccDataWriter.Primitives.cs | 10 +- .../DataWriter/IccDataWriter.TagDataEntry.cs | 2 +- .../DefaultPixelBlenders.Generated.cs | 648 +++++++++--------- .../DefaultPixelBlenders.Generated.tt | 6 +- .../PorterDuffFunctions.Generated.cs | 216 +++--- .../PorterDuffFunctions.Generated.tt | 2 +- .../PixelFormats/PixelImplementations/A8.cs | 2 +- src/ImageSharp/Primitives/Number.cs | 8 +- .../Processors/Dithering/OrderedDither.cs | 8 +- .../Dithering/PaletteDitherProcessor.cs | 2 +- .../Effects/OilPaintingProcessor{TPixel}.cs | 5 +- .../Overlays/GlowProcessor{TPixel}.cs | 2 +- .../Overlays/VignetteProcessor{TPixel}.cs | 2 +- .../Quantization/OctreeQuantizer{TPixel}.cs | 2 +- .../Quantization/QuantizerOptions.cs | 4 +- .../ImageSharp.Benchmarks/Color/YcbCrToRgb.cs | 19 +- .../General/BasicMath/ClampSpan.cs | 2 +- 27 files changed, 492 insertions(+), 634 deletions(-) delete mode 100644 src/ImageSharp/Common/Extensions/ComparableExtensions.cs diff --git a/src/ImageSharp/Common/Extensions/ComparableExtensions.cs b/src/ImageSharp/Common/Extensions/ComparableExtensions.cs deleted file mode 100644 index ef3d1deac3..0000000000 --- a/src/ImageSharp/Common/Extensions/ComparableExtensions.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Runtime.CompilerServices; - -namespace SixLabors.ImageSharp -{ - /// - /// Extension methods for classes that implement . - /// - internal static class ComparableExtensions - { - /// - /// Restricts a to be within a specified range. - /// - /// The value to clamp. - /// The minimum value. If value is less than min, min will be returned. - /// The maximum value. If value is greater than max, max will be returned. - /// - /// The representing the clamped value. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static byte Clamp(this byte value, byte min, byte max) - { - // Order is important here as someone might set min to higher than max. - if (value >= max) - { - return max; - } - - if (value <= min) - { - return min; - } - - return value; - } - - /// - /// Restricts a to be within a specified range. - /// - /// The The value to clamp. - /// The minimum value. If value is less than min, min will be returned. - /// The maximum value. If value is greater than max, max will be returned. - /// - /// The representing the clamped value. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static uint Clamp(this uint value, uint min, uint max) - { - if (value >= max) - { - return max; - } - - if (value <= min) - { - return min; - } - - return value; - } - - /// - /// Restricts a to be within a specified range. - /// - /// The The value to clamp. - /// The minimum value. If value is less than min, min will be returned. - /// The maximum value. If value is greater than max, max will be returned. - /// - /// The representing the clamped value. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int Clamp(this int value, int min, int max) - { - if (value >= max) - { - return max; - } - - if (value <= min) - { - return min; - } - - return value; - } - - /// - /// Restricts a to be within a specified range. - /// - /// The The value to clamp. - /// The minimum value. If value is less than min, min will be returned. - /// The maximum value. If value is greater than max, max will be returned. - /// - /// The representing the clamped value. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static float Clamp(this float value, float min, float max) - { - if (value >= max) - { - return max; - } - - if (value <= min) - { - return min; - } - - return value; - } - - /// - /// Restricts a to be within a specified range. - /// - /// The The value to clamp. - /// The minimum value. If value is less than min, min will be returned. - /// The maximum value. If value is greater than max, max will be returned. - /// - /// The representing the clamped value. - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static double Clamp(this double value, double min, double max) - { - if (value >= max) - { - return max; - } - - if (value <= min) - { - return min; - } - - return value; - } - } -} diff --git a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs index f4811d6ca8..02a5afff7e 100644 --- a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs +++ b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs @@ -50,8 +50,8 @@ namespace SixLabors.ImageSharp for (int i = 0; i < kernelLength; i++) { - int offsetY = (row + i - radiusY).Clamp(minRow, maxRow); - int offsetX = sourceOffsetColumnBase.Clamp(minColumn, maxColumn); + int offsetY = Numerics.Clamp(row + i - radiusY, minRow, maxRow); + int offsetX = Numerics.Clamp(sourceOffsetColumnBase, minColumn, maxColumn); Span sourceRowSpan = sourcePixels.GetRowSpan(offsetY); var currentColor = sourceRowSpan[offsetX].ToVector4(); @@ -93,13 +93,13 @@ namespace SixLabors.ImageSharp int radiusX = kernelLength >> 1; int sourceOffsetColumnBase = column + minColumn; - int offsetY = row.Clamp(minRow, maxRow); + int offsetY = Numerics.Clamp(row, minRow, maxRow); ref ComplexVector4 sourceRef = ref MemoryMarshal.GetReference(sourceValues.GetRowSpan(offsetY)); ref Complex64 baseRef = ref MemoryMarshal.GetReference(kernel); for (int x = 0; x < kernelLength; x++) { - int offsetX = (sourceOffsetColumnBase + x - radiusX).Clamp(minColumn, maxColumn); + int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); vector.Sum(Unsafe.Add(ref baseRef, x) * Unsafe.Add(ref sourceRef, offsetX)); } diff --git a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs index 61f90e23e1..69c50573f8 100644 --- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs +++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs @@ -133,12 +133,12 @@ namespace SixLabors.ImageSharp for (int y = 0; y < matrixHeight; y++) { - int offsetY = (row + y - radiusY).Clamp(minRow, maxRow); + int offsetY = Numerics.Clamp(row + y - radiusY, minRow, maxRow); Span sourceRowSpan = sourcePixels.GetRowSpan(offsetY); for (int x = 0; x < matrixWidth; x++) { - int offsetX = (sourceOffsetColumnBase + x - radiusX).Clamp(minColumn, maxColumn); + int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); Vector4Utilities.Premultiply(ref currentColor); @@ -263,12 +263,12 @@ namespace SixLabors.ImageSharp for (int y = 0; y < matrixHeight; y++) { - int offsetY = (row + y - radiusY).Clamp(minRow, maxRow); + int offsetY = Numerics.Clamp(row + y - radiusY, minRow, maxRow); Span sourceRowSpan = sourcePixels.GetRowSpan(offsetY); for (int x = 0; x < matrixWidth; x++) { - int offsetX = (sourceOffsetColumnBase + x - radiusX).Clamp(minColumn, maxColumn); + int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); Vector4Utilities.Premultiply(ref currentColor); vector += matrix[y, x] * currentColor; diff --git a/src/ImageSharp/Common/Helpers/ImageMath.cs b/src/ImageSharp/Common/Helpers/ImageMath.cs index 11fb60209d..59f9ad0216 100644 --- a/src/ImageSharp/Common/Helpers/ImageMath.cs +++ b/src/ImageSharp/Common/Helpers/ImageMath.cs @@ -248,8 +248,8 @@ namespace SixLabors.ImageSharp topLeft.Y = GetMinY(bitmap); topLeft.X = GetMinX(bitmap); - bottomRight.Y = (GetMaxY(bitmap) + 1).Clamp(0, height); - bottomRight.X = (GetMaxX(bitmap) + 1).Clamp(0, width); + bottomRight.Y = Numerics.Clamp(GetMaxY(bitmap) + 1, 0, height); + bottomRight.X = Numerics.Clamp(GetMaxX(bitmap) + 1, 0, width); return GetBoundingRectangle(topLeft, bottomRight); } diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.cs b/src/ImageSharp/Common/Helpers/SimdUtils.cs index 7691cb9ad0..a0cb513ef6 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.cs @@ -190,7 +190,7 @@ namespace SixLabors.ImageSharp } [MethodImpl(InliningOptions.ShortMethod)] - private static byte ConvertToByte(float f) => (byte)ComparableExtensions.Clamp((f * 255f) + 0.5f, 0, 255f); + private static byte ConvertToByte(float f) => (byte)Numerics.Clamp((f * 255F) + 0.5F, 0, 255F); [Conditional("DEBUG")] private static void VerifyHasVector8(string operation) diff --git a/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs index c4ff1c0360..36766d05f0 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegEncoderCore.cs @@ -212,8 +212,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg ImageMetadata metadata = image.Metadata; // System.Drawing produces identical output for jpegs with a quality parameter of 0 and 1. - int qlty = (this.quality ?? metadata.GetJpegMetadata().Quality).Clamp(1, 100); - this.subsample = this.subsample ?? (qlty >= 91 ? JpegSubsample.Ratio444 : JpegSubsample.Ratio420); + int qlty = Numerics.Clamp(this.quality ?? metadata.GetJpegMetadata().Quality, 1, 100); + this.subsample ??= qlty >= 91 ? JpegSubsample.Ratio444 : JpegSubsample.Ratio420; // Convert from a quality rating to a scaling factor. int scale; diff --git a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs index 3343923b7a..f1f5145ca2 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs @@ -101,7 +101,7 @@ namespace SixLabors.ImageSharp.Formats.Png byte bitDepth; if (options.ColorType == PngColorType.Palette) { - byte quantizedBits = (byte)ImageMath.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length).Clamp(1, 8); + byte quantizedBits = (byte)Numerics.Clamp(ImageMath.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length), 1, 8); byte bits = Math.Max((byte)options.BitDepth, quantizedBits); // Png only supports in four pixel depths: 1, 2, 4, and 8 bits when using the PLTE chunk diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.cs index 925a86ac20..8e9cad5636 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataReader/IccDataReader.cs @@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc /// The new index position public void SetIndex(int index) { - this.currentIndex = index.Clamp(0, this.data.Length); + this.currentIndex = Numerics.Clamp(index, 0, this.data.Length); } /// diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Lut.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Lut.cs index a5eef3d237..40a1792e2d 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Lut.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Lut.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. namespace SixLabors.ImageSharp.Metadata.Profiles.Icc @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { foreach (float item in value.Values) { - this.WriteByte((byte)((item * byte.MaxValue) + 0.5f).Clamp(0, byte.MaxValue)); + this.WriteByte((byte)Numerics.Clamp((item * byte.MaxValue) + 0.5F, 0, byte.MaxValue)); } return value.Values.Length; @@ -32,7 +32,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { foreach (float item in value.Values) { - this.WriteUInt16((ushort)((item * ushort.MaxValue) + 0.5f).Clamp(0, ushort.MaxValue)); + this.WriteUInt16((ushort)Numerics.Clamp((item * ushort.MaxValue) + 0.5F, 0, ushort.MaxValue)); } return value.Values.Length * 2; @@ -78,7 +78,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { foreach (float item in inArray) { - count += this.WriteByte((byte)((item * byte.MaxValue) + 0.5f).Clamp(0, byte.MaxValue)); + count += this.WriteByte((byte)Numerics.Clamp((item * byte.MaxValue) + 0.5F, 0, byte.MaxValue)); } } @@ -97,7 +97,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { foreach (float item in inArray) { - count += this.WriteUInt16((ushort)((item * ushort.MaxValue) + 0.5f).Clamp(0, ushort.MaxValue)); + count += this.WriteUInt16((ushort)Numerics.Clamp((item * ushort.MaxValue) + 0.5F, 0, ushort.MaxValue)); } } diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs index 53dd5f008b..305fe47fd5 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.NonPrimitives.cs @@ -33,9 +33,9 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc /// the number of bytes written public int WriteVersionNumber(in IccVersion value) { - int major = value.Major.Clamp(0, byte.MaxValue); - int minor = value.Minor.Clamp(0, 15); - int bugfix = value.Patch.Clamp(0, 15); + int major = Numerics.Clamp(value.Major, 0, byte.MaxValue); + int minor = Numerics.Clamp(value.Minor, 0, 15); + int bugfix = Numerics.Clamp(value.Patch, 0, 15); int version = (major << 24) | (minor << 20) | (bugfix << 16); return this.WriteInt32(version); diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs index 5fb8e57d2f..c58dd96565 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Primitives.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors. +// Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. using System; @@ -112,7 +112,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc const double Max = short.MaxValue + (65535d / 65536d); const double Min = short.MinValue; - value = value.Clamp(Min, Max); + value = Numerics.Clamp(value, Min, Max); value *= 65536d; return this.WriteInt32((int)Math.Round(value, MidpointRounding.AwayFromZero)); @@ -128,7 +128,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc const double Max = ushort.MaxValue + (65535d / 65536d); const double Min = ushort.MinValue; - value = value.Clamp(Min, Max); + value = Numerics.Clamp(value, Min, Max); value *= 65536d; return this.WriteUInt32((uint)Math.Round(value, MidpointRounding.AwayFromZero)); @@ -144,7 +144,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc const double Max = 1 + (32767d / 32768d); const double Min = 0; - value = value.Clamp(Min, Max); + value = Numerics.Clamp(value, Min, Max); value *= 32768d; return this.WriteUInt16((ushort)Math.Round(value, MidpointRounding.AwayFromZero)); @@ -160,7 +160,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc const double Max = byte.MaxValue + (255d / 256d); const double Min = byte.MinValue; - value = value.Clamp(Min, Max); + value = Numerics.Clamp(value, Min, Max); value *= 256d; return this.WriteUInt16((ushort)Math.Round(value, MidpointRounding.AwayFromZero)); diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs index fdbf2a4778..25454fa951 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.TagDataEntry.cs @@ -240,7 +240,7 @@ namespace SixLabors.ImageSharp.Metadata.Profiles.Icc count += this.WriteUInt32((uint)value.CurveData.Length); for (int i = 0; i < value.CurveData.Length; i++) { - count += this.WriteUInt16((ushort)((value.CurveData[i] * ushort.MaxValue) + 0.5f).Clamp(0, ushort.MaxValue)); + count += this.WriteUInt16((ushort)Numerics.Clamp((value.CurveData[i] * ushort.MaxValue) + 0.5F, 0, ushort.MaxValue)); } } diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs index 2cb528a036..db61d9383a 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs @@ -36,14 +36,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalSrc(background[i], source[i], amount); @@ -55,7 +55,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -74,14 +74,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplySrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplySrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplySrc(background[i], source[i], amount); @@ -93,7 +93,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplySrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplySrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -112,14 +112,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddSrc(background[i], source[i], amount); @@ -131,7 +131,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -150,14 +150,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractSrc(background[i], source[i], amount); @@ -169,7 +169,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -188,14 +188,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenSrc(background[i], source[i], amount); @@ -207,7 +207,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -226,14 +226,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenSrc(background[i], source[i], amount); @@ -245,7 +245,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -264,14 +264,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenSrc(background[i], source[i], amount); @@ -283,7 +283,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -302,14 +302,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlaySrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlaySrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlaySrc(background[i], source[i], amount); @@ -321,7 +321,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlaySrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlaySrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -340,14 +340,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightSrc(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightSrc(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightSrc(background[i], source[i], amount); @@ -359,7 +359,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightSrc(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightSrc(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -378,14 +378,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalSrcAtop(background[i], source[i], amount); @@ -397,7 +397,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -416,14 +416,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplySrcAtop(background[i], source[i], amount); @@ -435,7 +435,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplySrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplySrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -454,14 +454,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddSrcAtop(background[i], source[i], amount); @@ -473,7 +473,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -492,14 +492,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractSrcAtop(background[i], source[i], amount); @@ -511,7 +511,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -530,14 +530,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenSrcAtop(background[i], source[i], amount); @@ -549,7 +549,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -568,14 +568,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenSrcAtop(background[i], source[i], amount); @@ -587,7 +587,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -606,14 +606,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenSrcAtop(background[i], source[i], amount); @@ -625,7 +625,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -644,14 +644,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlaySrcAtop(background[i], source[i], amount); @@ -663,7 +663,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlaySrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlaySrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -682,14 +682,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightSrcAtop(background[i], source[i], amount); @@ -701,7 +701,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightSrcAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightSrcAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -720,14 +720,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalSrcOver(background[i], source[i], amount); @@ -739,7 +739,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -758,14 +758,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplySrcOver(background[i], source[i], amount); @@ -777,7 +777,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplySrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplySrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -796,14 +796,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddSrcOver(background[i], source[i], amount); @@ -815,7 +815,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -834,14 +834,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractSrcOver(background[i], source[i], amount); @@ -853,7 +853,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -872,14 +872,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenSrcOver(background[i], source[i], amount); @@ -891,7 +891,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -910,14 +910,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenSrcOver(background[i], source[i], amount); @@ -929,7 +929,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -948,14 +948,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenSrcOver(background[i], source[i], amount); @@ -967,7 +967,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -986,14 +986,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlaySrcOver(background[i], source[i], amount); @@ -1005,7 +1005,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlaySrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlaySrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1024,14 +1024,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightSrcOver(background[i], source[i], amount); @@ -1043,7 +1043,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightSrcOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightSrcOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1062,14 +1062,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalSrcIn(background[i], source[i], amount); @@ -1081,7 +1081,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1100,14 +1100,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplySrcIn(background[i], source[i], amount); @@ -1119,7 +1119,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplySrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplySrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1138,14 +1138,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddSrcIn(background[i], source[i], amount); @@ -1157,7 +1157,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1176,14 +1176,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractSrcIn(background[i], source[i], amount); @@ -1195,7 +1195,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1214,14 +1214,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenSrcIn(background[i], source[i], amount); @@ -1233,7 +1233,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1252,14 +1252,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenSrcIn(background[i], source[i], amount); @@ -1271,7 +1271,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1290,14 +1290,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenSrcIn(background[i], source[i], amount); @@ -1309,7 +1309,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1328,14 +1328,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlaySrcIn(background[i], source[i], amount); @@ -1347,7 +1347,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlaySrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlaySrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1366,14 +1366,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightSrcIn(background[i], source[i], amount); @@ -1385,7 +1385,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightSrcIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightSrcIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1404,14 +1404,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalSrcOut(background[i], source[i], amount); @@ -1423,7 +1423,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1442,14 +1442,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplySrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplySrcOut(background[i], source[i], amount); @@ -1461,7 +1461,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplySrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplySrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1480,14 +1480,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddSrcOut(background[i], source[i], amount); @@ -1499,7 +1499,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1518,14 +1518,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractSrcOut(background[i], source[i], amount); @@ -1537,7 +1537,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1556,14 +1556,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenSrcOut(background[i], source[i], amount); @@ -1575,7 +1575,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1594,14 +1594,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenSrcOut(background[i], source[i], amount); @@ -1613,7 +1613,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1632,14 +1632,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenSrcOut(background[i], source[i], amount); @@ -1651,7 +1651,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1670,14 +1670,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlaySrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlaySrcOut(background[i], source[i], amount); @@ -1689,7 +1689,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlaySrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlaySrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1708,14 +1708,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightSrcOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightSrcOut(background[i], source[i], amount); @@ -1727,7 +1727,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightSrcOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightSrcOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1746,14 +1746,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalDest(background[i], source[i], amount); @@ -1765,7 +1765,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1784,14 +1784,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyDest(background[i], source[i], amount); @@ -1803,7 +1803,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1822,14 +1822,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddDest(background[i], source[i], amount); @@ -1841,7 +1841,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1860,14 +1860,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractDest(background[i], source[i], amount); @@ -1879,7 +1879,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1898,14 +1898,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenDest(background[i], source[i], amount); @@ -1917,7 +1917,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1936,14 +1936,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenDest(background[i], source[i], amount); @@ -1955,7 +1955,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -1974,14 +1974,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenDest(background[i], source[i], amount); @@ -1993,7 +1993,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2012,14 +2012,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayDest(background[i], source[i], amount); @@ -2031,7 +2031,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2050,14 +2050,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightDest(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightDest(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightDest(background[i], source[i], amount); @@ -2069,7 +2069,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightDest(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightDest(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2088,14 +2088,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalDestAtop(background[i], source[i], amount); @@ -2107,7 +2107,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2126,14 +2126,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyDestAtop(background[i], source[i], amount); @@ -2145,7 +2145,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2164,14 +2164,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddDestAtop(background[i], source[i], amount); @@ -2183,7 +2183,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2202,14 +2202,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractDestAtop(background[i], source[i], amount); @@ -2221,7 +2221,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2240,14 +2240,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenDestAtop(background[i], source[i], amount); @@ -2259,7 +2259,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2278,14 +2278,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenDestAtop(background[i], source[i], amount); @@ -2297,7 +2297,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2316,14 +2316,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenDestAtop(background[i], source[i], amount); @@ -2335,7 +2335,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2354,14 +2354,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayDestAtop(background[i], source[i], amount); @@ -2373,7 +2373,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2392,14 +2392,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightDestAtop(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightDestAtop(background[i], source[i], amount); @@ -2411,7 +2411,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightDestAtop(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightDestAtop(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2430,14 +2430,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalDestOver(background[i], source[i], amount); @@ -2449,7 +2449,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2468,14 +2468,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyDestOver(background[i], source[i], amount); @@ -2487,7 +2487,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2506,14 +2506,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddDestOver(background[i], source[i], amount); @@ -2525,7 +2525,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2544,14 +2544,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractDestOver(background[i], source[i], amount); @@ -2563,7 +2563,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2582,14 +2582,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenDestOver(background[i], source[i], amount); @@ -2601,7 +2601,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2620,14 +2620,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenDestOver(background[i], source[i], amount); @@ -2639,7 +2639,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2658,14 +2658,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenDestOver(background[i], source[i], amount); @@ -2677,7 +2677,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2696,14 +2696,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayDestOver(background[i], source[i], amount); @@ -2715,7 +2715,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2734,14 +2734,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightDestOver(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightDestOver(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightDestOver(background[i], source[i], amount); @@ -2753,7 +2753,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightDestOver(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightDestOver(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2772,14 +2772,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalDestIn(background[i], source[i], amount); @@ -2791,7 +2791,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2810,14 +2810,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyDestIn(background[i], source[i], amount); @@ -2829,7 +2829,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2848,14 +2848,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddDestIn(background[i], source[i], amount); @@ -2867,7 +2867,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2886,14 +2886,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractDestIn(background[i], source[i], amount); @@ -2905,7 +2905,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2924,14 +2924,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenDestIn(background[i], source[i], amount); @@ -2943,7 +2943,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -2962,14 +2962,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenDestIn(background[i], source[i], amount); @@ -2981,7 +2981,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3000,14 +3000,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenDestIn(background[i], source[i], amount); @@ -3019,7 +3019,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3038,14 +3038,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayDestIn(background[i], source[i], amount); @@ -3057,7 +3057,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3076,14 +3076,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightDestIn(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightDestIn(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightDestIn(background[i], source[i], amount); @@ -3095,7 +3095,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightDestIn(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightDestIn(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3114,14 +3114,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalDestOut(background[i], source[i], amount); @@ -3133,7 +3133,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3152,14 +3152,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyDestOut(background[i], source[i], amount); @@ -3171,7 +3171,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3190,14 +3190,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddDestOut(background[i], source[i], amount); @@ -3209,7 +3209,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3228,14 +3228,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractDestOut(background[i], source[i], amount); @@ -3247,7 +3247,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3266,14 +3266,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenDestOut(background[i], source[i], amount); @@ -3285,7 +3285,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3304,14 +3304,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenDestOut(background[i], source[i], amount); @@ -3323,7 +3323,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3342,14 +3342,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenDestOut(background[i], source[i], amount); @@ -3361,7 +3361,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3380,14 +3380,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayDestOut(background[i], source[i], amount); @@ -3399,7 +3399,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3418,14 +3418,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightDestOut(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightDestOut(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightDestOut(background[i], source[i], amount); @@ -3437,7 +3437,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightDestOut(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightDestOut(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3456,14 +3456,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalClear(background[i], source[i], amount); @@ -3475,7 +3475,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3494,14 +3494,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyClear(background[i], source[i], amount); @@ -3513,7 +3513,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3532,14 +3532,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddClear(background[i], source[i], amount); @@ -3551,7 +3551,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3570,14 +3570,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractClear(background[i], source[i], amount); @@ -3589,7 +3589,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3608,14 +3608,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenClear(background[i], source[i], amount); @@ -3627,7 +3627,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3646,14 +3646,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenClear(background[i], source[i], amount); @@ -3665,7 +3665,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3684,14 +3684,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenClear(background[i], source[i], amount); @@ -3703,7 +3703,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3722,14 +3722,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayClear(background[i], source[i], amount); @@ -3741,7 +3741,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3760,14 +3760,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightClear(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightClear(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightClear(background[i], source[i], amount); @@ -3779,7 +3779,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightClear(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightClear(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3798,14 +3798,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.NormalXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.NormalXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.NormalXor(background[i], source[i], amount); @@ -3817,7 +3817,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.NormalXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.NormalXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3836,14 +3836,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.MultiplyXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.MultiplyXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.MultiplyXor(background[i], source[i], amount); @@ -3855,7 +3855,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.MultiplyXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.MultiplyXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3874,14 +3874,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.AddXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.AddXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.AddXor(background[i], source[i], amount); @@ -3893,7 +3893,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.AddXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.AddXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3912,14 +3912,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.SubtractXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.SubtractXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.SubtractXor(background[i], source[i], amount); @@ -3931,7 +3931,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.SubtractXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.SubtractXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3950,14 +3950,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.ScreenXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.ScreenXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.ScreenXor(background[i], source[i], amount); @@ -3969,7 +3969,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.ScreenXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.ScreenXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -3988,14 +3988,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.DarkenXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.DarkenXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.DarkenXor(background[i], source[i], amount); @@ -4007,7 +4007,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.DarkenXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.DarkenXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -4026,14 +4026,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.LightenXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.LightenXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.LightenXor(background[i], source[i], amount); @@ -4045,7 +4045,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.LightenXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.LightenXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -4064,14 +4064,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.OverlayXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.OverlayXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.OverlayXor(background[i], source[i], amount); @@ -4083,7 +4083,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.OverlayXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.OverlayXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } @@ -4102,14 +4102,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.HardLightXor(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.HardLightXor(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.HardLightXor(background[i], source[i], amount); @@ -4121,7 +4121,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.HardLightXor(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.HardLightXor(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt index 46990b53c9..694931fe7d 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt @@ -79,14 +79,14 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public override TPixel Blend(TPixel background, TPixel source, float amount) { TPixel dest = default; - dest.FromScaledVector4(PorterDuffFunctions.<#=blender_composer#>(background.ToScaledVector4(), source.ToScaledVector4(), amount.Clamp(0, 1))); + dest.FromScaledVector4(PorterDuffFunctions.<#=blender_composer#>(background.ToScaledVector4(), source.ToScaledVector4(), Numerics.Clamp(amount, 0, 1))); return dest; } /// protected override void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount) { - amount = amount.Clamp(0, 1); + amount = Numerics.Clamp(amount, 0, 1); for (int i = 0; i < destination.Length; i++) { destination[i] = PorterDuffFunctions.<#=blender_composer#>(background[i], source[i], amount); @@ -98,7 +98,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { for (int i = 0; i < destination.Length; i++) { - destination[i] = PorterDuffFunctions.<#=blender_composer#>(background[i], source[i], amount[i].Clamp(0, 1)); + destination[i] = PorterDuffFunctions.<#=blender_composer#>(background[i], source[i], Numerics.Clamp(amount[i], 0, 1)); } } } diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs index 5fccb1fa68..cd67db32bb 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs @@ -203,7 +203,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -222,7 +222,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -241,7 +241,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -260,7 +260,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -279,7 +279,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -298,7 +298,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -317,7 +317,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -336,7 +336,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -355,7 +355,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -374,7 +374,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -393,7 +393,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -412,7 +412,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel NormalXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(NormalXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -608,7 +608,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplySrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplySrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -627,7 +627,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplySrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplySrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -646,7 +646,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplySrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplySrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -665,7 +665,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplySrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplySrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -684,7 +684,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplySrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplySrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -703,7 +703,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -722,7 +722,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -741,7 +741,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -760,7 +760,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -779,7 +779,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -798,7 +798,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -817,7 +817,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel MultiplyXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(MultiplyXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1013,7 +1013,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1032,7 +1032,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1051,7 +1051,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1070,7 +1070,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1089,7 +1089,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1108,7 +1108,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1127,7 +1127,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1146,7 +1146,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1165,7 +1165,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1184,7 +1184,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1203,7 +1203,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1222,7 +1222,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel AddXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(AddXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1418,7 +1418,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1437,7 +1437,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1456,7 +1456,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1475,7 +1475,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1494,7 +1494,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1513,7 +1513,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1532,7 +1532,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1551,7 +1551,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1570,7 +1570,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1589,7 +1589,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1608,7 +1608,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1627,7 +1627,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel SubtractXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(SubtractXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1823,7 +1823,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1842,7 +1842,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1861,7 +1861,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1880,7 +1880,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1899,7 +1899,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1918,7 +1918,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1937,7 +1937,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1956,7 +1956,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1975,7 +1975,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -1994,7 +1994,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2013,7 +2013,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2032,7 +2032,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel ScreenXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(ScreenXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2228,7 +2228,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2247,7 +2247,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2266,7 +2266,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2285,7 +2285,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2304,7 +2304,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2323,7 +2323,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2342,7 +2342,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2361,7 +2361,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2380,7 +2380,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2399,7 +2399,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2418,7 +2418,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2437,7 +2437,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel DarkenXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(DarkenXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2633,7 +2633,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2652,7 +2652,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2671,7 +2671,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2690,7 +2690,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2709,7 +2709,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2728,7 +2728,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2747,7 +2747,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2766,7 +2766,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2785,7 +2785,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2804,7 +2804,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2823,7 +2823,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -2842,7 +2842,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel LightenXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(LightenXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3038,7 +3038,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlaySrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlaySrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3057,7 +3057,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlaySrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlaySrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3076,7 +3076,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlaySrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlaySrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3095,7 +3095,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlaySrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlaySrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3114,7 +3114,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlaySrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlaySrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3133,7 +3133,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3152,7 +3152,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3171,7 +3171,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3190,7 +3190,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3209,7 +3209,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3228,7 +3228,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3247,7 +3247,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel OverlayXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(OverlayXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3443,7 +3443,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightSrc(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightSrc(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3462,7 +3462,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightSrcAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightSrcAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3481,7 +3481,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightSrcOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightSrcOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3500,7 +3500,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightSrcIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightSrcIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3519,7 +3519,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightSrcOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightSrcOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3538,7 +3538,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightDest(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightDest(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3557,7 +3557,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightDestAtop(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightDestAtop(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3576,7 +3576,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightDestOver(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightDestOver(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3595,7 +3595,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightDestIn(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightDestIn(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3614,7 +3614,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightDestOut(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightDestOut(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3633,7 +3633,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightClear(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightClear(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; @@ -3652,7 +3652,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel HardLightXor(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(HardLightXor(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt index 31b5029080..3ce185e7d4 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt @@ -219,7 +219,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static TPixel <#=blender#><#=composer#>(TPixel backdrop, TPixel source, float opacity) where TPixel : unmanaged, IPixel { - opacity = opacity.Clamp(0, 1); + opacity = Numerics.Clamp(opacity, 0, 1); TPixel dest = default; dest.FromScaledVector4(<#=blender#><#=composer#>(backdrop.ToScaledVector4(), source.ToScaledVector4(), opacity)); return dest; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs index c293d181a5..fa08bbe625 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs @@ -162,6 +162,6 @@ namespace SixLabors.ImageSharp.PixelFormats /// The float containing the value to pack. /// The containing the packed values. [MethodImpl(InliningOptions.ShortMethod)] - private static byte Pack(float alpha) => (byte)Math.Round(alpha.Clamp(0, 1F) * 255F); + private static byte Pack(float alpha) => (byte)Math.Round(Numerics.Clamp(alpha, 0, 1F) * 255F); } } diff --git a/src/ImageSharp/Primitives/Number.cs b/src/ImageSharp/Primitives/Number.cs index f6748d8565..e33d2344a9 100644 --- a/src/ImageSharp/Primitives/Number.cs +++ b/src/ImageSharp/Primitives/Number.cs @@ -70,7 +70,7 @@ namespace SixLabors.ImageSharp { return number.isSigned ? number.signedValue - : (int)number.unsignedValue.Clamp(0, int.MaxValue); + : (int)Numerics.Clamp(number.unsignedValue, 0, int.MaxValue); } /// @@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp public static explicit operator uint(Number number) { return number.isSigned - ? (uint)number.signedValue.Clamp(0, int.MaxValue) + ? (uint)Numerics.Clamp(number.signedValue, 0, int.MaxValue) : number.unsignedValue; } @@ -91,8 +91,8 @@ namespace SixLabors.ImageSharp public static explicit operator ushort(Number number) { return number.isSigned - ? (ushort)number.signedValue.Clamp(ushort.MinValue, ushort.MaxValue) - : (ushort)number.unsignedValue.Clamp(ushort.MinValue, ushort.MaxValue); + ? (ushort)Numerics.Clamp(number.signedValue, ushort.MinValue, ushort.MaxValue) + : (ushort)Numerics.Clamp(number.unsignedValue, ushort.MinValue, ushort.MaxValue); } /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs index 80c777cd78..0f3c20f5e1 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs @@ -165,10 +165,10 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering int spread = 256 / bitDepth; float factor = spread * this.thresholdMatrix[y % this.modulusY, x % this.modulusX] * scale; - attempt.R = (byte)(rgba.R + factor).Clamp(byte.MinValue, byte.MaxValue); - attempt.G = (byte)(rgba.G + factor).Clamp(byte.MinValue, byte.MaxValue); - attempt.B = (byte)(rgba.B + factor).Clamp(byte.MinValue, byte.MaxValue); - attempt.A = (byte)(rgba.A + factor).Clamp(byte.MinValue, byte.MaxValue); + attempt.R = (byte)Numerics.Clamp(rgba.R + factor, byte.MinValue, byte.MaxValue); + attempt.G = (byte)Numerics.Clamp(rgba.G + factor, byte.MinValue, byte.MaxValue); + attempt.B = (byte)Numerics.Clamp(rgba.B + factor, byte.MinValue, byte.MaxValue); + attempt.A = (byte)Numerics.Clamp(rgba.A + factor, byte.MinValue, byte.MaxValue); TPixel result = default; result.FromRgba32(attempt); diff --git a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs index bb6614a7e0..1b321a99f1 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs @@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering Guard.MustBeGreaterThan(palette.Length, 0, nameof(palette)); Guard.NotNull(dither, nameof(dither)); this.Dither = dither; - this.DitherScale = ditherScale.Clamp(QuantizerConstants.MinDitherScale, QuantizerConstants.MaxDitherScale); + this.DitherScale = Numerics.Clamp(ditherScale, QuantizerConstants.MinDitherScale, QuantizerConstants.MaxDitherScale); this.Palette = palette; } diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs index 21ec8a9c74..42216417ee 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs @@ -137,8 +137,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Effects { int fyr = fy - this.radius; int offsetY = y + fyr; - - offsetY = offsetY.Clamp(0, maxY); + offsetY = Numerics.Clamp(offsetY, 0, maxY); Span sourceOffsetRow = this.source.GetPixelRowSpan(offsetY); @@ -146,7 +145,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Effects { int fxr = fx - this.radius; int offsetX = x + fxr; - offsetX = offsetX.Clamp(0, maxX); + offsetX = Numerics.Clamp(offsetX, 0, maxX); var vector = sourceOffsetRow[offsetX].ToVector4(); diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs index c028903f41..78cf7f3c61 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs @@ -102,7 +102,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays for (int i = 0; i < this.bounds.Width; i++) { float distance = Vector2.Distance(this.center, new Vector2(i + this.bounds.X, y)); - span[i] = (this.blendPercent * (1 - (.95F * (distance / this.maxDistance)))).Clamp(0, 1); + span[i] = Numerics.Clamp(this.blendPercent * (1 - (.95F * (distance / this.maxDistance))), 0, 1F); } Span destination = this.source.GetPixelRowSpan(y).Slice(this.bounds.X, this.bounds.Width); diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs index d09e3b22a9..c853377adc 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs @@ -110,7 +110,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Overlays for (int i = 0; i < this.bounds.Width; i++) { float distance = Vector2.Distance(this.center, new Vector2(i + this.bounds.X, y)); - span[i] = (this.blendPercent * (.9F * (distance / this.maxDistance))).Clamp(0, 1); + span[i] = Numerics.Clamp(this.blendPercent * (.9F * (distance / this.maxDistance)), 0, 1F); } Span destination = this.source.GetPixelRowSpan(y).Slice(this.bounds.X, this.bounds.Width); diff --git a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs index 50eeef8ca6..1e1d1c953d 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs @@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization this.Options = options; this.maxColors = this.Options.MaxColors; - this.octree = new Octree(ImageMath.GetBitsNeededForColorDepth(this.maxColors).Clamp(1, 8)); + this.octree = new Octree(Numerics.Clamp(ImageMath.GetBitsNeededForColorDepth(this.maxColors), 1, 8)); this.paletteOwner = configuration.MemoryAllocator.Allocate(this.maxColors, AllocationOptions.Clean); this.palette = default; this.pixelMap = default; diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizerOptions.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizerOptions.cs index d304810437..b983904d28 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizerOptions.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizerOptions.cs @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization public float DitherScale { get { return this.ditherScale; } - set { this.ditherScale = value.Clamp(QuantizerConstants.MinDitherScale, QuantizerConstants.MaxDitherScale); } + set { this.ditherScale = Numerics.Clamp(value, QuantizerConstants.MinDitherScale, QuantizerConstants.MaxDitherScale); } } /// @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization public int MaxColors { get { return this.maxColors; } - set { this.maxColors = value.Clamp(QuantizerConstants.MinColors, QuantizerConstants.MaxColors); } + set { this.maxColors = Numerics.Clamp(value, QuantizerConstants.MinColors, QuantizerConstants.MaxColors); } } } } diff --git a/tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs b/tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs index c962886d1c..07707029a0 100644 --- a/tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs +++ b/tests/ImageSharp.Benchmarks/Color/YcbCrToRgb.cs @@ -1,12 +1,11 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System.Numerics; +using BenchmarkDotNet.Attributes; + namespace SixLabors.ImageSharp.Benchmarks { - using System.Numerics; - - using BenchmarkDotNet.Attributes; - public class YcbCrToRgb { [Benchmark(Baseline = true, Description = "Floating Point Conversion")] @@ -19,9 +18,9 @@ namespace SixLabors.ImageSharp.Benchmarks int ccb = cb - 128; int ccr = cr - 128; - byte r = (byte)(y + (1.402F * ccr)).Clamp(0, 255); - byte g = (byte)(y - (0.34414F * ccb) - (0.71414F * ccr)).Clamp(0, 255); - byte b = (byte)(y + (1.772F * ccb)).Clamp(0, 255); + byte r = (byte)Numerics.Clamp(y + (1.402F * ccr), 0, 255); + byte g = (byte)Numerics.Clamp(y - (0.34414F * ccb) - (0.71414F * ccr), 0, 255); + byte b = (byte)Numerics.Clamp(y + (1.772F * ccb), 0, 255); return new Vector3(r, g, b); } @@ -42,9 +41,9 @@ namespace SixLabors.ImageSharp.Benchmarks int g1 = 731 * ccr; // (0.71414F * 1024) + .5F int b0 = 1815 * ccb; // (1.772F * 1024) + .5F - byte r = (byte)(y + (r0 >> 10)).Clamp(0, 255); - byte g = (byte)(y - (g0 >> 10) - (g1 >> 10)).Clamp(0, 255); - byte b = (byte)(y + (b0 >> 10)).Clamp(0, 255); + byte r = (byte)Numerics.Clamp(y + (r0 >> 10), 0, 255); + byte g = (byte)Numerics.Clamp(y - (g0 >> 10) - (g1 >> 10), 0, 255); + byte b = (byte)Numerics.Clamp(y + (b0 >> 10), 0, 255); return new Vector3(r, g, b); } diff --git a/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs index a5b49721da..f69dca26ec 100644 --- a/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs +++ b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath for (int i = 0; i < A.Length; i++) { ref int x = ref A[i]; - x = x.Clamp(64, 128); + x = Numerics.Clamp(x, 64, 128); } } From 289b5326c132169bab79ffe25f0828a3034c3ec0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 00:53:21 +0000 Subject: [PATCH 34/61] Move FastClamp to Numerics --- src/ImageSharp/ColorSpaces/Cmyk.cs | 2 +- src/ImageSharp/Common/Helpers/Numerics.cs | 13 ++++++++ .../SimdUtils.FallbackIntrinsics128.cs | 2 +- src/ImageSharp/Common/Helpers/SimdUtils.cs | 2 +- .../Common/Helpers/Vector4Utilities.cs | 12 ------- .../Jpeg/Components/Block8x8F.Generated.cs | 32 +++++++++---------- .../Jpeg/Components/Block8x8F.Generated.tt | 2 +- .../Formats/Jpeg/Components/Block8x8F.cs | 2 +- .../PixelImplementations/Argb32.cs | 2 +- .../PixelImplementations/Bgra32.cs | 2 +- .../PixelImplementations/Bgra4444.cs | 2 +- .../PixelImplementations/Bgra5551.cs | 2 +- .../PixelImplementations/Byte4.cs | 2 +- .../PixelFormats/PixelImplementations/L16.cs | 2 +- .../PixelFormats/PixelImplementations/L8.cs | 2 +- .../PixelFormats/PixelImplementations/La16.cs | 2 +- .../PixelFormats/PixelImplementations/La32.cs | 2 +- .../PixelImplementations/NormalizedByte4.cs | 2 +- .../PixelImplementations/NormalizedShort4.cs | 2 +- .../PixelImplementations/Rgb24.cs | 2 +- .../PixelImplementations/Rgb48.cs | 2 +- .../PixelImplementations/Rgba1010102.cs | 2 +- .../PixelImplementations/Rgba32.cs | 4 +-- .../PixelImplementations/Rgba64.cs | 4 +-- .../PixelImplementations/RgbaVector.cs | 2 +- .../PixelImplementations/Short4.cs | 2 +- .../Convolution/BokehBlurProcessor{TPixel}.cs | 2 +- .../Linear/LinearTransformUtilities.cs | 2 +- 28 files changed, 56 insertions(+), 55 deletions(-) diff --git a/src/ImageSharp/ColorSpaces/Cmyk.cs b/src/ImageSharp/ColorSpaces/Cmyk.cs index 0aab295548..675f1f814c 100644 --- a/src/ImageSharp/ColorSpaces/Cmyk.cs +++ b/src/ImageSharp/ColorSpaces/Cmyk.cs @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp.ColorSpaces [MethodImpl(InliningOptions.ShortMethod)] public Cmyk(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Min, Max); + vector = Numerics.Clamp(vector, Min, Max); this.C = vector.X; this.M = vector.Y; this.Y = vector.Z; diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index d4dfa12024..da226db111 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -253,6 +253,19 @@ namespace SixLabors.ImageSharp return value; } + /// + /// Returns the value clamped to the inclusive range of min and max. + /// 5x Faster than + /// on platforms < NET 5. + /// + /// The value to clamp. + /// The minimum inclusive value. + /// The maximum inclusive value. + /// The clamped . + [MethodImpl(InliningOptions.ShortMethod)] + public static Vector4 Clamp(Vector4 value, Vector4 min, Vector4 max) + => Vector4.Min(Vector4.Max(value, min), max); + /// /// Clamps the span values to the inclusive range of min and max. /// diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs index a97510113c..15133770f6 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.FallbackIntrinsics128.cs @@ -125,7 +125,7 @@ namespace SixLabors.ImageSharp Vector4 s = Unsafe.Add(ref sBase, i); s *= maxBytes; s += half; - s = Vector4Utilities.FastClamp(s, Vector4.Zero, maxBytes); + s = Numerics.Clamp(s, Vector4.Zero, maxBytes); ref ByteVector4 d = ref Unsafe.Add(ref dBase, i); d.X = (byte)s.X; diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.cs b/src/ImageSharp/Common/Helpers/SimdUtils.cs index a0cb513ef6..aaf6d405cf 100644 --- a/src/ImageSharp/Common/Helpers/SimdUtils.cs +++ b/src/ImageSharp/Common/Helpers/SimdUtils.cs @@ -51,7 +51,7 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Vector4 PseudoRound(this Vector4 v) { - Vector4 sign = Vector4Utilities.FastClamp(v, new Vector4(-1), new Vector4(1)); + Vector4 sign = Numerics.Clamp(v, new Vector4(-1), new Vector4(1)); return v + (sign * 0.5f); } diff --git a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs b/src/ImageSharp/Common/Helpers/Vector4Utilities.cs index 464006570a..cab5d5675a 100644 --- a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs +++ b/src/ImageSharp/Common/Helpers/Vector4Utilities.cs @@ -20,18 +20,6 @@ namespace SixLabors.ImageSharp private const int BlendAlphaControl = 0b_10_00_10_00; private const int ShuffleAlphaControl = 0b_11_11_11_11; - /// - /// Restricts a vector between a minimum and a maximum value. - /// 5x Faster then . - /// - /// The vector to restrict. - /// The minimum value. - /// The maximum value. - /// The . - [MethodImpl(InliningOptions.ShortMethod)] - public static Vector4 FastClamp(Vector4 x, Vector4 min, Vector4 max) - => Vector4.Min(Vector4.Max(x, min), max); - /// /// Pre-multiplies the "x", "y", "z" components of a vector by its "w" component leaving the "w" component intact. /// diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.cs index 0efefc06b5..dd5d3f1960 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.cs @@ -19,22 +19,22 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components var CMax4 = new Vector4(maximum); var COff4 = new Vector4(MathF.Ceiling(maximum / 2)); - this.V0L = Vector4Utilities.FastClamp(this.V0L + COff4, CMin4, CMax4); - this.V0R = Vector4Utilities.FastClamp(this.V0R + COff4, CMin4, CMax4); - this.V1L = Vector4Utilities.FastClamp(this.V1L + COff4, CMin4, CMax4); - this.V1R = Vector4Utilities.FastClamp(this.V1R + COff4, CMin4, CMax4); - this.V2L = Vector4Utilities.FastClamp(this.V2L + COff4, CMin4, CMax4); - this.V2R = Vector4Utilities.FastClamp(this.V2R + COff4, CMin4, CMax4); - this.V3L = Vector4Utilities.FastClamp(this.V3L + COff4, CMin4, CMax4); - this.V3R = Vector4Utilities.FastClamp(this.V3R + COff4, CMin4, CMax4); - this.V4L = Vector4Utilities.FastClamp(this.V4L + COff4, CMin4, CMax4); - this.V4R = Vector4Utilities.FastClamp(this.V4R + COff4, CMin4, CMax4); - this.V5L = Vector4Utilities.FastClamp(this.V5L + COff4, CMin4, CMax4); - this.V5R = Vector4Utilities.FastClamp(this.V5R + COff4, CMin4, CMax4); - this.V6L = Vector4Utilities.FastClamp(this.V6L + COff4, CMin4, CMax4); - this.V6R = Vector4Utilities.FastClamp(this.V6R + COff4, CMin4, CMax4); - this.V7L = Vector4Utilities.FastClamp(this.V7L + COff4, CMin4, CMax4); - this.V7R = Vector4Utilities.FastClamp(this.V7R + COff4, CMin4, CMax4); + this.V0L = Numerics.Clamp(this.V0L + COff4, CMin4, CMax4); + this.V0R = Numerics.Clamp(this.V0R + COff4, CMin4, CMax4); + this.V1L = Numerics.Clamp(this.V1L + COff4, CMin4, CMax4); + this.V1R = Numerics.Clamp(this.V1R + COff4, CMin4, CMax4); + this.V2L = Numerics.Clamp(this.V2L + COff4, CMin4, CMax4); + this.V2R = Numerics.Clamp(this.V2R + COff4, CMin4, CMax4); + this.V3L = Numerics.Clamp(this.V3L + COff4, CMin4, CMax4); + this.V3R = Numerics.Clamp(this.V3R + COff4, CMin4, CMax4); + this.V4L = Numerics.Clamp(this.V4L + COff4, CMin4, CMax4); + this.V4R = Numerics.Clamp(this.V4R + COff4, CMin4, CMax4); + this.V5L = Numerics.Clamp(this.V5L + COff4, CMin4, CMax4); + this.V5R = Numerics.Clamp(this.V5R + COff4, CMin4, CMax4); + this.V6L = Numerics.Clamp(this.V6L + COff4, CMin4, CMax4); + this.V6R = Numerics.Clamp(this.V6R + COff4, CMin4, CMax4); + this.V7L = Numerics.Clamp(this.V7L + COff4, CMin4, CMax4); + this.V7R = Numerics.Clamp(this.V7R + COff4, CMin4, CMax4); } /// diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.tt b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.tt index e5a62dc075..8897efbe00 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.tt +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.Generated.tt @@ -41,7 +41,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components for (int j = 0; j < 2; j++) { char side = j == 0 ? 'L' : 'R'; - Write($"this.V{i}{side} = Vector4Utilities.FastClamp(this.V{i}{side} + COff4, CMin4, CMax4);\r\n"); + Write($"this.V{i}{side} = Numerics.Clamp(this.V{i}{side} + COff4, CMin4, CMax4);\r\n"); } } PopIndent(); diff --git a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs index 0dbdadbeb4..fd4748fa9d 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Block8x8F.cs @@ -671,7 +671,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components private static Vector4 DivideRound(Vector4 dividend, Vector4 divisor) { // sign(dividend) = max(min(dividend, 1), -1) - Vector4 sign = Vector4Utilities.FastClamp(dividend, NegativeOne, Vector4.One); + Vector4 sign = Numerics.Clamp(dividend, NegativeOne, Vector4.One); // AlmostRound(dividend/divisor) = dividend/divisor + 0.5*sign(dividend) return (dividend / divisor) + (sign * Offset); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs index a42be24828..9e6db8b700 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs @@ -373,7 +373,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.R = (byte)vector.X; this.G = (byte)vector.Y; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs index fea5643a85..2058c4e003 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs @@ -296,7 +296,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.R = (byte)vector.X; this.G = (byte)vector.Y; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs index c8d2a82a84..8fa5219d53 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra4444.cs @@ -162,7 +162,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] private static ushort Pack(ref Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One); + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One); return (ushort)((((int)Math.Round(vector.W * 15F) & 0x0F) << 12) | (((int)Math.Round(vector.X * 15F) & 0x0F) << 8) | (((int)Math.Round(vector.Y * 15F) & 0x0F) << 4) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra5551.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra5551.cs index 31fa0c29ce..b3a0d08960 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra5551.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra5551.cs @@ -163,7 +163,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] private static ushort Pack(ref Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One); + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One); return (ushort)( (((int)Math.Round(vector.X * 31F) & 0x1F) << 10) | (((int)Math.Round(vector.Y * 31F) & 0x1F) << 5) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs index ad22a5aa17..e261212918 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Byte4.cs @@ -171,7 +171,7 @@ namespace SixLabors.ImageSharp.PixelFormats const float Max = 255F; // Clamp the value between min and max values - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, new Vector4(Max)); + vector = Numerics.Clamp(vector, Vector4.Zero, new Vector4(Max)); uint byte4 = (uint)Math.Round(vector.X) & 0xFF; uint byte3 = ((uint)Math.Round(vector.Y) & 0xFF) << 0x8; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs index 5d91486a62..cda2f32e8b 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs @@ -176,7 +176,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] internal void ConvertFromRgbaScaledVector4(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; this.PackedValue = ImageMath.Get16BitBT709Luminance( vector.X, vector.Y, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs index f395a5dfb0..938d83feb4 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs @@ -156,7 +156,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.PackedValue = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs index bf94843992..21d9834947 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs @@ -219,7 +219,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.L = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); this.A = (byte)vector.W; } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs index 102d1b7cd9..319775061c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs @@ -233,7 +233,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] internal void ConvertFromRgbaScaledVector4(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; this.L = ImageMath.Get16BitBT709Luminance( vector.X, vector.Y, diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs index 1b2ce0904c..84f0bb0224 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedByte4.cs @@ -174,7 +174,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] private static uint Pack(ref Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, MinusOne, Vector4.One) * Half; + vector = Numerics.Clamp(vector, MinusOne, Vector4.One) * Half; uint byte4 = ((uint)MathF.Round(vector.X) & 0xFF) << 0; uint byte3 = ((uint)MathF.Round(vector.Y) & 0xFF) << 8; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs index 1a5c891740..a3fd8989ce 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/NormalizedShort4.cs @@ -177,7 +177,7 @@ namespace SixLabors.ImageSharp.PixelFormats private static ulong Pack(ref Vector4 vector) { vector *= Max; - vector = Vector4Utilities.FastClamp(vector, Min, Max); + vector = Numerics.Clamp(vector, Min, Max); // Round rather than truncate. ulong word4 = ((ulong)MathF.Round(vector.X) & 0xFFFF) << 0x00; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs index fd9ed12d7d..b7e831cfa7 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs @@ -264,7 +264,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.R = (byte)vector.X; this.G = (byte)vector.Y; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs index 280044cebd..23297806de 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs @@ -85,7 +85,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromVector4(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; this.R = (ushort)MathF.Round(vector.X); this.G = (ushort)MathF.Round(vector.Y); this.B = (ushort)MathF.Round(vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs index 60f56fb06f..dee2f9fcb6 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba1010102.cs @@ -163,7 +163,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] private static uint Pack(ref Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Multiplier; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Multiplier; return (uint)( (((int)Math.Round(vector.X) & 0x03FF) << 0) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs index 2c74dc8784..19c1bd0839 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs @@ -452,7 +452,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); return new Rgba32((byte)vector.X, (byte)vector.Y, (byte)vector.Z, (byte)vector.W); } @@ -491,7 +491,7 @@ namespace SixLabors.ImageSharp.PixelFormats { vector *= MaxBytes; vector += Half; - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, MaxBytes); + vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); this.R = (byte)vector.X; this.G = (byte)vector.Y; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs index 7e84c6e5bd..f8b40d7e0d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs @@ -127,7 +127,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; this.R = (ushort)MathF.Round(vector.X); this.G = (ushort)MathF.Round(vector.Y); this.B = (ushort)MathF.Round(vector.Z); @@ -209,7 +209,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromVector4(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One) * Max; + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; this.R = (ushort)MathF.Round(vector.X); this.G = (ushort)MathF.Round(vector.Y); this.B = (ushort)MathF.Round(vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.cs b/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.cs index 6ea80ca3b9..97e103d0f2 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.cs @@ -111,7 +111,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromVector4(Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Vector4.Zero, Vector4.One); + vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One); this.R = vector.X; this.G = vector.Y; this.B = vector.Z; diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs index 2e9db245f9..409f46c721 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Short4.cs @@ -183,7 +183,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] private static ulong Pack(ref Vector4 vector) { - vector = Vector4Utilities.FastClamp(vector, Min, Max); + vector = Numerics.Clamp(vector, Min, Max); // Clamp the value between min and max values ulong word4 = ((ulong)Math.Round(vector.X) & 0xFFFF) << 0x00; diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs index a3b3665900..cf5367343b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs @@ -304,7 +304,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution for (int x = 0; x < this.bounds.Width; x++) { ref Vector4 v = ref Unsafe.Add(ref sourceRef, x); - var clamp = Vector4Utilities.FastClamp(v, low, high); + var clamp = Numerics.Clamp(v, low, high); v.X = MathF.Pow(clamp.X, this.inverseGamma); v.Y = MathF.Pow(clamp.Y, this.inverseGamma); v.Z = MathF.Pow(clamp.Z, this.inverseGamma); diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs index e198541474..5c2f66a94b 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs @@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms MathF.Floor(maxXY.X), MathF.Floor(maxXY.Y)); - sourceExtents = Vector4Utilities.FastClamp(sourceExtents, Vector4.Zero, maxSourceExtents); + sourceExtents = Numerics.Clamp(sourceExtents, Vector4.Zero, maxSourceExtents); int left = (int)sourceExtents.X; int top = (int)sourceExtents.Y; From f66fe45ac1d21eefd4e77282d8ac927e807c9398 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 00:59:46 +0000 Subject: [PATCH 35/61] Utils FTW --- .../Common/Helpers/DenseMatrixUtils.cs | 12 +++++----- .../{Vector4Utilities.cs => Vector4Utils.cs} | 2 +- .../PixelFormats/Utils/Vector4Converters.cs | 4 ++-- .../Filters/FilterProcessor{TPixel}.cs | 2 +- .../AffineTransformProcessor{TPixel}.cs | 6 ++--- ...rmUtilities.cs => LinearTransformUtils.cs} | 6 ++--- .../ProjectiveTransformProcessor{TPixel}.cs | 6 ++--- .../Color/Bulk/PremultiplyVector4.cs | 2 +- .../Color/Bulk/UnPremultiplyVector4.cs | 2 +- .../Helpers/Vector4UtilsTests.cs | 8 +++---- .../PixelOperations/PixelOperationsTests.cs | 24 +++++++++---------- 11 files changed, 37 insertions(+), 37 deletions(-) rename src/ImageSharp/Common/Helpers/{Vector4Utilities.cs => Vector4Utils.cs} (99%) rename src/ImageSharp/Processing/Processors/Transforms/Linear/{LinearTransformUtilities.cs => LinearTransformUtils.cs} (95%) diff --git a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs index 69c50573f8..7da2528fa1 100644 --- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs +++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); vector.W = target.W; - Vector4Utilities.UnPremultiply(ref vector); + Vector4Utils.UnPremultiply(ref vector); target = vector; } @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp out Vector4 vector); ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); - Vector4Utilities.UnPremultiply(ref vector); + Vector4Utils.UnPremultiply(ref vector); target = vector; } @@ -140,7 +140,7 @@ namespace SixLabors.ImageSharp { int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); - Vector4Utilities.Premultiply(ref currentColor); + Vector4Utils.Premultiply(ref currentColor); vectorX += matrixX[y, x] * currentColor; vectorY += matrixY[y, x] * currentColor; @@ -193,7 +193,7 @@ namespace SixLabors.ImageSharp ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); vector.W = target.W; - Vector4Utilities.UnPremultiply(ref vector); + Vector4Utils.UnPremultiply(ref vector); target = vector; } @@ -238,7 +238,7 @@ namespace SixLabors.ImageSharp ref vector); ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); - Vector4Utilities.UnPremultiply(ref vector); + Vector4Utils.UnPremultiply(ref vector); target = vector; } @@ -270,7 +270,7 @@ namespace SixLabors.ImageSharp { int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); - Vector4Utilities.Premultiply(ref currentColor); + Vector4Utils.Premultiply(ref currentColor); vector += matrix[y, x] * currentColor; } } diff --git a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs b/src/ImageSharp/Common/Helpers/Vector4Utils.cs similarity index 99% rename from src/ImageSharp/Common/Helpers/Vector4Utilities.cs rename to src/ImageSharp/Common/Helpers/Vector4Utils.cs index cab5d5675a..05661991a3 100644 --- a/src/ImageSharp/Common/Helpers/Vector4Utilities.cs +++ b/src/ImageSharp/Common/Helpers/Vector4Utils.cs @@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp /// /// Utility methods for the struct. /// - internal static class Vector4Utilities + internal static class Vector4Utils { private const int BlendAlphaControl = 0b_10_00_10_00; private const int ShuffleAlphaControl = 0b_11_11_11_11; diff --git a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs index 2dca8f2c14..977722b819 100644 --- a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs +++ b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs @@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils if (modifiers.IsDefined(PixelConversionModifiers.Premultiply)) { - Vector4Utilities.Premultiply(vectors); + Vector4Utils.Premultiply(vectors); } } @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils { if (modifiers.IsDefined(PixelConversionModifiers.Premultiply)) { - Vector4Utilities.UnPremultiply(vectors); + Vector4Utils.UnPremultiply(vectors); } if (modifiers.IsDefined(PixelConversionModifiers.SRgbCompand)) diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs index 584ba072c8..e28d4add72 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs @@ -74,7 +74,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters Span rowSpan = this.source.GetPixelRowSpan(y).Slice(this.startX, span.Length); PixelOperations.Instance.ToVector4(this.configuration, rowSpan, span); - Vector4Utilities.Transform(span, ref Unsafe.AsRef(this.matrix)); + Vector4Utils.Transform(span, ref Unsafe.AsRef(this.matrix)); PixelOperations.Instance.FromVector4Destructive(this.configuration, span, rowSpan); } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/AffineTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/AffineTransformProcessor{TPixel}.cs index cd7f46d926..c08f5d3d3b 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/AffineTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/AffineTransformProcessor{TPixel}.cs @@ -80,8 +80,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms return; } - int yRadius = LinearTransformUtilities.GetSamplingRadius(in sampler, source.Height, destination.Height); - int xRadius = LinearTransformUtilities.GetSamplingRadius(in sampler, source.Width, destination.Width); + int yRadius = LinearTransformUtils.GetSamplingRadius(in sampler, source.Height, destination.Height); + int xRadius = LinearTransformUtils.GetSamplingRadius(in sampler, source.Width, destination.Width); var radialExtents = new Vector2(xRadius, yRadius); int yLength = (yRadius * 2) + 1; int xLength = (xRadius * 2) + 1; @@ -207,7 +207,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Use the single precision position to calculate correct bounding pixels // otherwise we get rogue pixels outside of the bounds. var point = Vector2.Transform(new Vector2(x, y), this.matrix); - LinearTransformUtilities.Convolve( + LinearTransformUtils.Convolve( in this.sampler, point, sourceBuffer, diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs similarity index 95% rename from src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs rename to src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs index 5c2f66a94b..07e784ec53 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtilities.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs @@ -12,7 +12,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// /// Utility methods for affine and projective transforms. /// - internal static class LinearTransformUtilities + internal static class LinearTransformUtils { [MethodImpl(InliningOptions.ShortMethod)] internal static int GetSamplingRadius(in TResampler sampler, int sourceSize, int destinationSize) @@ -78,13 +78,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Values are first premultiplied to prevent darkening of edge pixels. var current = sourcePixels[x, y].ToVector4(); - Vector4Utilities.Premultiply(ref current); + Vector4Utils.Premultiply(ref current); sum += current * xWeight * yWeight; } } // Reverse the premultiplication - Vector4Utilities.UnPremultiply(ref sum); + Vector4Utils.UnPremultiply(ref sum); targetRow[column] = sum; } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs index 4f75377964..811bb1a888 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs @@ -80,8 +80,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms return; } - int yRadius = LinearTransformUtilities.GetSamplingRadius(in sampler, source.Height, destination.Height); - int xRadius = LinearTransformUtilities.GetSamplingRadius(in sampler, source.Width, destination.Width); + int yRadius = LinearTransformUtils.GetSamplingRadius(in sampler, source.Height, destination.Height); + int xRadius = LinearTransformUtils.GetSamplingRadius(in sampler, source.Width, destination.Width); var radialExtents = new Vector2(xRadius, yRadius); int yLength = (yRadius * 2) + 1; int xLength = (xRadius * 2) + 1; @@ -207,7 +207,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Use the single precision position to calculate correct bounding pixels // otherwise we get rogue pixels outside of the bounds. Vector2 point = TransformUtilities.ProjectiveTransform2D(x, y, this.matrix); - LinearTransformUtilities.Convolve( + LinearTransformUtils.Convolve( in this.sampler, point, sourceBuffer, diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs index 2a886c6879..d441b5e0bd 100644 --- a/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs +++ b/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk [Benchmark] public void Premultiply() { - Vector4Utilities.Premultiply(Vectors); + Vector4Utils.Premultiply(Vectors); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs index 1312c767be..819f34b924 100644 --- a/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs +++ b/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk [Benchmark] public void UnPremultiply() { - Vector4Utilities.UnPremultiply(Vectors); + Vector4Utils.UnPremultiply(Vectors); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs b/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs index 2bb43c440b..605aa7d5a4 100644 --- a/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs @@ -24,11 +24,11 @@ namespace SixLabors.ImageSharp.Tests.Helpers Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); Vector4[] expected = source.Select(v => { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); return v; }).ToArray(); - Vector4Utilities.Premultiply(source); + Vector4Utils.Premultiply(source); Assert.Equal(expected, source, this.approximateFloatComparer); } @@ -44,11 +44,11 @@ namespace SixLabors.ImageSharp.Tests.Helpers Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); Vector4[] expected = source.Select(v => { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); return v; }).ToArray(); - Vector4Utilities.UnPremultiply(source); + Vector4Utils.UnPremultiply(source); Assert.Equal(expected, source, this.approximateFloatComparer); } diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs index 059a218031..e56cfe2260 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs @@ -197,7 +197,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } } @@ -205,7 +205,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); } } @@ -232,7 +232,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } } @@ -240,7 +240,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); } } @@ -273,7 +273,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations if (this.HasUnassociatedAlpha) { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } } @@ -281,7 +281,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); } SRgbCompanding.Compress(ref v); @@ -394,12 +394,12 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); } void ExpectedAction(ref Vector4 v) { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } TPixel[] source = CreatePixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); @@ -417,12 +417,12 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); } void ExpectedAction(ref Vector4 v) { - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } TPixel[] source = CreateScaledPixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); @@ -444,14 +444,14 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utilities.UnPremultiply(ref v); + Vector4Utils.UnPremultiply(ref v); SRgbCompanding.Compress(ref v); } void ExpectedAction(ref Vector4 v) { SRgbCompanding.Expand(ref v); - Vector4Utilities.Premultiply(ref v); + Vector4Utils.Premultiply(ref v); } TPixel[] source = CreateScaledPixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); From ddacec2b419a1ca44d376fd0d3ea5d70a799d2b0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 01:04:38 +0000 Subject: [PATCH 36/61] Moar Utils --- .../Processing/AffineTransformBuilder.cs | 14 +++++++------- .../Extensions/Transforms/TransformExtensions.cs | 4 ++-- .../Linear/ProjectiveTransformProcessor{TPixel}.cs | 4 ++-- .../Transforms/Linear/RotateProcessor.cs | 4 ++-- .../Processors/Transforms/Linear/SkewProcessor.cs | 4 ++-- .../{TransformUtilities.cs => TransformUtils.cs} | 2 +- .../Processing/ProjectiveTransformBuilder.cs | 14 +++++++------- .../Transforms/TransformBuilderTestBase.cs | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) rename src/ImageSharp/Processing/Processors/Transforms/{TransformUtilities.cs => TransformUtils.cs} (99%) diff --git a/src/ImageSharp/Processing/AffineTransformBuilder.cs b/src/ImageSharp/Processing/AffineTransformBuilder.cs index 75f23c6b42..ed3483dc4c 100644 --- a/src/ImageSharp/Processing/AffineTransformBuilder.cs +++ b/src/ImageSharp/Processing/AffineTransformBuilder.cs @@ -31,7 +31,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount of rotation, in radians. /// The . public AffineTransformBuilder PrependRotationRadians(float radians) - => this.Prepend(size => TransformUtilities.CreateRotationMatrixRadians(radians, size)); + => this.Prepend(size => TransformUtils.CreateRotationMatrixRadians(radians, size)); /// /// Prepends a rotation matrix using the given rotation in degrees at the given origin. @@ -67,7 +67,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount of rotation, in radians. /// The . public AffineTransformBuilder AppendRotationRadians(float radians) - => this.Append(size => TransformUtilities.CreateRotationMatrixRadians(radians, size)); + => this.Append(size => TransformUtils.CreateRotationMatrixRadians(radians, size)); /// /// Appends a rotation matrix using the given rotation in degrees at the given origin. @@ -142,7 +142,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in degrees. /// The . public AffineTransformBuilder PrependSkewDegrees(float degreesX, float degreesY) - => this.Prepend(size => TransformUtilities.CreateSkewMatrixDegrees(degreesX, degreesY, size)); + => this.Prepend(size => TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size)); /// /// Prepends a centered skew matrix from the give angles in radians. @@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in radians. /// The . public AffineTransformBuilder PrependSkewRadians(float radiansX, float radiansY) - => this.Prepend(size => TransformUtilities.CreateSkewMatrixRadians(radiansX, radiansY, size)); + => this.Prepend(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)); /// /// Prepends a skew matrix using the given angles in degrees at the given origin. @@ -180,7 +180,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in degrees. /// The . public AffineTransformBuilder AppendSkewDegrees(float degreesX, float degreesY) - => this.Append(size => TransformUtilities.CreateSkewMatrixDegrees(degreesX, degreesY, size)); + => this.Append(size => TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size)); /// /// Appends a centered skew matrix from the give angles in radians. @@ -189,7 +189,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in radians. /// The . public AffineTransformBuilder AppendSkewRadians(float radiansX, float radiansY) - => this.Append(size => TransformUtilities.CreateSkewMatrixRadians(radiansX, radiansY, size)); + => this.Append(size => TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size)); /// /// Appends a skew matrix using the given angles in degrees at the given origin. @@ -314,7 +314,7 @@ namespace SixLabors.ImageSharp.Processing private static void CheckDegenerate(Matrix3x2 matrix) { - if (TransformUtilities.IsDegenerate(matrix)) + if (TransformUtils.IsDegenerate(matrix)) { throw new DegenerateTransformException("Matrix is degenerate. Check input values."); } diff --git a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs index 15430b28f3..57acf78ee3 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs @@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.Processing IResampler sampler) { Matrix3x2 transform = builder.BuildMatrix(sourceRectangle); - Size targetDimensions = TransformUtilities.GetTransformedSize(sourceRectangle.Size, transform); + Size targetDimensions = TransformUtils.GetTransformedSize(sourceRectangle.Size, transform); return ctx.Transform(sourceRectangle, transform, targetDimensions, sampler); } @@ -116,7 +116,7 @@ namespace SixLabors.ImageSharp.Processing IResampler sampler) { Matrix4x4 transform = builder.BuildMatrix(sourceRectangle); - Size targetDimensions = TransformUtilities.GetTransformedSize(sourceRectangle.Size, transform); + Size targetDimensions = TransformUtils.GetTransformedSize(sourceRectangle.Size, transform); return ctx.Transform(sourceRectangle, transform, targetDimensions, sampler); } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs index 811bb1a888..f16a495b14 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/ProjectiveTransformProcessor{TPixel}.cs @@ -139,7 +139,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms for (int x = 0; x < this.maxX; x++) { - Vector2 point = TransformUtilities.ProjectiveTransform2D(x, y, this.matrix); + Vector2 point = TransformUtils.ProjectiveTransform2D(x, y, this.matrix); int px = (int)MathF.Round(point.X); int py = (int)MathF.Round(point.Y); @@ -206,7 +206,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms { // Use the single precision position to calculate correct bounding pixels // otherwise we get rogue pixels outside of the bounds. - Vector2 point = TransformUtilities.ProjectiveTransform2D(x, y, this.matrix); + Vector2 point = TransformUtils.ProjectiveTransform2D(x, y, this.matrix); LinearTransformUtils.Convolve( in this.sampler, point, diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/RotateProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/RotateProcessor.cs index 3b46040751..6414668476 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/RotateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/RotateProcessor.cs @@ -28,14 +28,14 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// The source image size public RotateProcessor(float degrees, IResampler sampler, Size sourceSize) : this( - TransformUtilities.CreateRotationMatrixDegrees(degrees, sourceSize), + TransformUtils.CreateRotationMatrixDegrees(degrees, sourceSize), sampler, sourceSize) => this.Degrees = degrees; // Helper constructor private RotateProcessor(Matrix3x2 rotationMatrix, IResampler sampler, Size sourceSize) - : base(rotationMatrix, sampler, TransformUtilities.GetTransformedSize(sourceSize, rotationMatrix)) + : base(rotationMatrix, sampler, TransformUtils.GetTransformedSize(sourceSize, rotationMatrix)) { } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/SkewProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/SkewProcessor.cs index e5791b82f8..0d82d145e2 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/SkewProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/SkewProcessor.cs @@ -30,7 +30,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// The source image size public SkewProcessor(float degreesX, float degreesY, IResampler sampler, Size sourceSize) : this( - TransformUtilities.CreateSkewMatrixDegrees(degreesX, degreesY, sourceSize), + TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, sourceSize), sampler, sourceSize) { @@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Helper constructor: private SkewProcessor(Matrix3x2 skewMatrix, IResampler sampler, Size sourceSize) - : base(skewMatrix, sampler, TransformUtilities.GetTransformedSize(sourceSize, skewMatrix)) + : base(skewMatrix, sampler, TransformUtils.GetTransformedSize(sourceSize, skewMatrix)) { } diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformUtilities.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs similarity index 99% rename from src/ImageSharp/Processing/Processors/Transforms/TransformUtilities.cs rename to src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs index 2b4c2ff149..a92aa54a59 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformUtilities.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs @@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// /// Contains utility methods for working with transforms. /// - internal static class TransformUtilities + internal static class TransformUtils { /// /// Returns a value that indicates whether the specified matrix is degenerate diff --git a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs index d81ce2890b..d1469d43ef 100644 --- a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs +++ b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs @@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount to taper. /// The . public ProjectiveTransformBuilder PrependTaper(TaperSide side, TaperCorner corner, float fraction) - => this.Prepend(size => TransformUtilities.CreateTaperMatrix(size, side, corner, fraction)); + => this.Prepend(size => TransformUtils.CreateTaperMatrix(size, side, corner, fraction)); /// /// Appends a matrix that performs a tapering projective transform. @@ -34,7 +34,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount to taper. /// The . public ProjectiveTransformBuilder AppendTaper(TaperSide side, TaperCorner corner, float fraction) - => this.Append(size => TransformUtilities.CreateTaperMatrix(size, side, corner, fraction)); + => this.Append(size => TransformUtils.CreateTaperMatrix(size, side, corner, fraction)); /// /// Prepends a centered rotation matrix using the given rotation in degrees. @@ -50,7 +50,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount of rotation, in radians. /// The . public ProjectiveTransformBuilder PrependRotationRadians(float radians) - => this.Prepend(size => new Matrix4x4(TransformUtilities.CreateRotationMatrixRadians(radians, size))); + => this.Prepend(size => new Matrix4x4(TransformUtils.CreateRotationMatrixRadians(radians, size))); /// /// Prepends a centered rotation matrix using the given rotation in degrees at the given origin. @@ -84,7 +84,7 @@ namespace SixLabors.ImageSharp.Processing /// The amount of rotation, in radians. /// The . public ProjectiveTransformBuilder AppendRotationRadians(float radians) - => this.Append(size => new Matrix4x4(TransformUtilities.CreateRotationMatrixRadians(radians, size))); + => this.Append(size => new Matrix4x4(TransformUtils.CreateRotationMatrixRadians(radians, size))); /// /// Appends a centered rotation matrix using the given rotation in degrees at the given origin. @@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in radians. /// The . public ProjectiveTransformBuilder PrependSkewRadians(float radiansX, float radiansY) - => this.Prepend(size => new Matrix4x4(TransformUtilities.CreateSkewMatrixRadians(radiansX, radiansY, size))); + => this.Prepend(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size))); /// /// Prepends a skew matrix using the given angles in degrees at the given origin. @@ -206,7 +206,7 @@ namespace SixLabors.ImageSharp.Processing /// The Y angle, in radians. /// The . public ProjectiveTransformBuilder AppendSkewRadians(float radiansX, float radiansY) - => this.Append(size => new Matrix4x4(TransformUtilities.CreateSkewMatrixRadians(radiansX, radiansY, size))); + => this.Append(size => new Matrix4x4(TransformUtils.CreateSkewMatrixRadians(radiansX, radiansY, size))); /// /// Appends a skew matrix using the given angles in degrees at the given origin. @@ -332,7 +332,7 @@ namespace SixLabors.ImageSharp.Processing private static void CheckDegenerate(Matrix4x4 matrix) { - if (TransformUtilities.IsDegenerate(matrix)) + if (TransformUtils.IsDegenerate(matrix)) { throw new DegenerateTransformException("Matrix is degenerate. Check input values."); } diff --git a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs index 4306732e8a..2e0dfd59e7 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs @@ -99,7 +99,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms this.AppendRotationDegrees(builder, degrees); // TODO: We should also test CreateRotationMatrixDegrees() (and all TransformUtils stuff!) for correctness - Matrix3x2 matrix = TransformUtilities.CreateRotationMatrixDegrees(degrees, size); + Matrix3x2 matrix = TransformUtils.CreateRotationMatrixDegrees(degrees, size); var position = new Vector2(x, y); var expected = Vector2.Transform(position, matrix); @@ -153,7 +153,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms this.AppendSkewDegrees(builder, degreesX, degreesY); - Matrix3x2 matrix = TransformUtilities.CreateSkewMatrixDegrees(degreesX, degreesY, size); + Matrix3x2 matrix = TransformUtils.CreateSkewMatrixDegrees(degreesX, degreesY, size); var position = new Vector2(x, y); var expected = Vector2.Transform(position, matrix); From 8799ca53d67d17c464e6b3456282433ac58673e9 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 01:19:26 +0000 Subject: [PATCH 37/61] Add benchmark results. --- .../General/BasicMath/ClampSpan.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs index f69dca26ec..59e2d68c9d 100644 --- a/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs +++ b/tests/ImageSharp.Benchmarks/General/BasicMath/ClampSpan.cs @@ -40,3 +40,18 @@ namespace SixLabors.ImageSharp.Benchmarks.General.BasicMath } } } + +// 23-11-2020 +// ########## +// +// BenchmarkDotNet = v0.12.1, OS = Windows 10.0.19041.630(2004 /?/ 20H1) +// Intel Core i7-8650U CPU 1.90GHz (Kaby Lake R), 1 CPU, 8 logical and 4 physical cores +// .NET Core SDK=5.0.100 +// [Host] : .NET Core 3.1.10 (CoreCLR 4.700.20.51601, CoreFX 4.700.20.51901), X64 RyuJIT +// DefaultJob : .NET Core 3.1.10 (CoreCLR 4.700.20.51601, CoreFX 4.700.20.51901), X64 RyuJIT +// +// +// | Method | Mean | Error | StdDev | Ratio | +// |---------------------- |-----------:| ---------:| ----------:| ------:| +// | ClampNoIntrinsics | 3,629.9 ns | 70.80 ns | 129.47 ns | 1.00 | +// | ClampVectorIntrinsics | 131.9 ns | 2.68 ns | 6.66 ns | 0.04 | From 5e0ceaa593c4a8b9c3f400a7b6c4d691c2796000 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 01:48:39 +0000 Subject: [PATCH 38/61] Fix Numerics fallback logic for 32 bit --- src/ImageSharp/Common/Helpers/Numerics.cs | 40 +++++++++++------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index da226db111..2a9b5ca08b 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -275,13 +275,13 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Clamp(Span span, byte min, byte max) { - int reduced = ClampReduce(span, min, max); + Span remainder = span.Slice(ClampReduce(span, min, max)); - if (reduced > 0) + if (remainder.Length > 0) { - for (int i = reduced; i < span.Length; i++) + for (int i = 0; i < remainder.Length; i++) { - ref byte v = ref span[i]; + ref byte v = ref remainder[i]; v = Clamp(v, min, max); } } @@ -296,13 +296,13 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Clamp(Span span, uint min, uint max) { - int reduced = ClampReduce(span, min, max); + Span remainder = span.Slice(ClampReduce(span, min, max)); - if (reduced > 0) + if (remainder.Length > 0) { - for (int i = reduced; i < span.Length; i++) + for (int i = 0; i < remainder.Length; i++) { - ref uint v = ref span[i]; + ref uint v = ref remainder[i]; v = Clamp(v, min, max); } } @@ -317,13 +317,13 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Clamp(Span span, int min, int max) { - int reduced = ClampReduce(span, min, max); + Span remainder = span.Slice(ClampReduce(span, min, max)); - if (reduced > 0) + if (remainder.Length > 0) { - for (int i = reduced; i < span.Length; i++) + for (int i = 0; i < remainder.Length; i++) { - ref int v = ref span[i]; + ref int v = ref remainder[i]; v = Clamp(v, min, max); } } @@ -338,13 +338,13 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Clamp(Span span, float min, float max) { - int reduced = ClampReduce(span, min, max); + Span remainder = span.Slice(ClampReduce(span, min, max)); - if (reduced > 0) + if (remainder.Length > 0) { - for (int i = reduced; i < span.Length; i++) + for (int i = 0; i < remainder.Length; i++) { - ref float v = ref span[i]; + ref float v = ref remainder[i]; v = Clamp(v, min, max); } } @@ -359,13 +359,13 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Clamp(Span span, double min, double max) { - int reduced = ClampReduce(span, min, max); + Span remainder = span.Slice(ClampReduce(span, min, max)); - if (reduced > 0) + if (remainder.Length > 0) { - for (int i = reduced; i < span.Length; i++) + for (int i = 0; i < remainder.Length; i++) { - ref double v = ref span[i]; + ref double v = ref remainder[i]; v = Clamp(v, min, max); } } From e342e2c0d27fa2e949705c131f750db4101a5c74 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 12:54:13 +0000 Subject: [PATCH 39/61] Update src/ImageSharp/Common/Helpers/Numerics.cs Co-authored-by: Anton Firszov --- src/ImageSharp/Common/Helpers/Numerics.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index 2a9b5ca08b..c1e564781c 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -393,7 +393,7 @@ namespace SixLabors.ImageSharp [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void ClampImpl(Span span, T min, T max) - where T : unmanaged + where T : unmanaged { ref T sRef = ref MemoryMarshal.GetReference(span); ref Vector vsBase = ref Unsafe.As>(ref MemoryMarshal.GetReference(span)); From 8d3cddab3069568e0a9e3cb79f5dcfdc94df2a9e Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 23 Nov 2020 13:36:23 +0000 Subject: [PATCH 40/61] No more Vector4Utils & ImageMath --- src/ImageSharp/Color/Color.cs | 14 +- .../Common/Helpers/ColorNumerics.cs | 177 ++++++++++++ .../Common/Helpers/DenseMatrixUtils.cs | 12 +- src/ImageSharp/Common/Helpers/ImageMath.cs | 257 ------------------ src/ImageSharp/Common/Helpers/Numerics.cs | 123 ++++++++- src/ImageSharp/Common/Helpers/Vector4Utils.cs | 169 ------------ src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs | 4 +- src/ImageSharp/Formats/Gif/GifEncoderCore.cs | 6 +- src/ImageSharp/Formats/Png/PngEncoderCore.cs | 6 +- .../Formats/Png/PngEncoderOptionsHelpers.cs | 4 +- .../Formats/Png/PngScanlineProcessor.cs | 4 +- src/ImageSharp/Formats/Tga/TgaEncoderCore.cs | 2 +- .../PixelFormats/PixelImplementations/A8.cs | 2 +- .../PixelImplementations/Argb32.cs | 20 +- .../PixelImplementations/Bgr24.cs | 16 +- .../PixelImplementations/Bgra32.cs | 20 +- .../PixelFormats/PixelImplementations/L16.cs | 52 ++-- .../PixelFormats/PixelImplementations/L8.cs | 32 +-- .../PixelFormats/PixelImplementations/La16.cs | 36 +-- .../PixelFormats/PixelImplementations/La32.cs | 62 ++--- .../PixelImplementations/Rgb24.cs | 16 +- .../PixelImplementations/Rgb48.cs | 40 +-- .../PixelImplementations/Rgba32.cs | 20 +- .../PixelImplementations/Rgba64.cs | 122 ++++----- .../PixelFormats/Utils/Vector4Converters.cs | 4 +- .../BinaryThresholdProcessor{TPixel}.cs | 2 +- .../Processors/Dithering/OrderedDither.cs | 4 +- .../Filters/FilterProcessor{TPixel}.cs | 2 +- ...alizationSlidingWindowProcessor{TPixel}.cs | 4 +- ...lHistogramEqualizationProcessor{TPixel}.cs | 4 +- .../HistogramEqualizationProcessor{TPixel}.cs | 2 +- .../Quantization/OctreeQuantizer{TPixel}.cs | 2 +- .../EntropyCropProcessor{TPixel}.cs | 135 ++++++++- .../Transforms/Linear/LinearTransformUtils.cs | 4 +- .../Color/Bulk/PremultiplyVector4.cs | 2 +- .../Color/Bulk/UnPremultiplyVector4.cs | 2 +- .../Formats/Png/PngEncoderTests.cs | 2 +- ...mageMathTests.cs => ColorNumericsTests.cs} | 6 +- .../ImageSharp.Tests/Helpers/NumericsTests.cs | 46 +++- .../Helpers/Vector4UtilsTests.cs | 56 ---- .../ImageSharp.Tests/PixelFormats/L16Tests.cs | 6 +- .../ImageSharp.Tests/PixelFormats/L8Tests.cs | 2 +- .../PixelFormats/La16Tests.cs | 2 +- .../PixelFormats/La32Tests.cs | 6 +- .../PixelOperations/PixelOperationsTests.cs | 24 +- 45 files changed, 763 insertions(+), 770 deletions(-) create mode 100644 src/ImageSharp/Common/Helpers/ColorNumerics.cs delete mode 100644 src/ImageSharp/Common/Helpers/ImageMath.cs delete mode 100644 src/ImageSharp/Common/Helpers/Vector4Utils.cs rename tests/ImageSharp.Tests/Helpers/{ImageMathTests.cs => ColorNumericsTests.cs} (79%) delete mode 100644 tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs diff --git a/src/ImageSharp/Color/Color.cs b/src/ImageSharp/Color/Color.cs index 424329863d..72f16528a6 100644 --- a/src/ImageSharp/Color/Color.cs +++ b/src/ImageSharp/Color/Color.cs @@ -27,19 +27,19 @@ namespace SixLabors.ImageSharp private Color(byte r, byte g, byte b, byte a) { this.data = new Rgba64( - ImageMath.UpscaleFrom8BitTo16Bit(r), - ImageMath.UpscaleFrom8BitTo16Bit(g), - ImageMath.UpscaleFrom8BitTo16Bit(b), - ImageMath.UpscaleFrom8BitTo16Bit(a)); + ColorNumerics.UpscaleFrom8BitTo16Bit(r), + ColorNumerics.UpscaleFrom8BitTo16Bit(g), + ColorNumerics.UpscaleFrom8BitTo16Bit(b), + ColorNumerics.UpscaleFrom8BitTo16Bit(a)); } [MethodImpl(InliningOptions.ShortMethod)] private Color(byte r, byte g, byte b) { this.data = new Rgba64( - ImageMath.UpscaleFrom8BitTo16Bit(r), - ImageMath.UpscaleFrom8BitTo16Bit(g), - ImageMath.UpscaleFrom8BitTo16Bit(b), + ColorNumerics.UpscaleFrom8BitTo16Bit(r), + ColorNumerics.UpscaleFrom8BitTo16Bit(g), + ColorNumerics.UpscaleFrom8BitTo16Bit(b), ushort.MaxValue); } diff --git a/src/ImageSharp/Common/Helpers/ColorNumerics.cs b/src/ImageSharp/Common/Helpers/ColorNumerics.cs new file mode 100644 index 0000000000..6f225b1109 --- /dev/null +++ b/src/ImageSharp/Common/Helpers/ColorNumerics.cs @@ -0,0 +1,177 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace SixLabors.ImageSharp +{ + /// + /// Provides optimized static methods for common mathematical functions specific + /// to color processing. + /// + internal static class ColorNumerics + { + /// + /// Vector for converting pixel to gray value as specified by + /// ITU-R Recommendation BT.709. + /// + private static readonly Vector4 Bt709 = new Vector4(.2126f, .7152f, .0722f, 0.0f); + + /// + /// Convert a pixel value to grayscale using ITU-R Recommendation BT.709. + /// + /// The vector to get the luminance from. + /// + /// The number of luminance levels (256 for 8 bit, 65536 for 16 bit grayscale images). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetBT709Luminance(ref Vector4 vector, int luminanceLevels) + => (int)MathF.Round(Vector4.Dot(vector, Bt709) * (luminanceLevels - 1)); + + /// + /// Gets the luminance from the rgb components using the formula + /// as specified by ITU-R Recommendation BT.709. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte Get8BitBT709Luminance(byte r, byte g, byte b) + => (byte)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); + + /// + /// Gets the luminance from the rgb components using the formula as + /// specified by ITU-R Recommendation BT.709. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ushort Get16BitBT709Luminance(ushort r, ushort g, ushort b) + => (ushort)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); + + /// + /// Gets the luminance from the rgb components using the formula as specified + /// by ITU-R Recommendation BT.709. + /// + /// The red component. + /// The green component. + /// The blue component. + /// The . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ushort Get16BitBT709Luminance(float r, float g, float b) + => (ushort)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); + + /// + /// Scales a value from a 16 bit to an + /// 8 bit equivalent. + /// + /// The 8 bit component value. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte DownScaleFrom16BitTo8Bit(ushort component) + { + // To scale to 8 bits From a 16-bit value V the required value (from the PNG specification) is: + // + // (V * 255) / 65535 + // + // This reduces to round(V / 257), or floor((V + 128.5)/257) + // + // Represent V as the two byte value vhi.vlo. Make a guess that the + // result is the top byte of V, vhi, then the correction to this value + // is: + // + // error = floor(((V-vhi.vhi) + 128.5) / 257) + // = floor(((vlo-vhi) + 128.5) / 257) + // + // This can be approximated using integer arithmetic (and a signed + // shift): + // + // error = (vlo-vhi+128) >> 8; + // + // The approximate differs from the exact answer only when (vlo-vhi) is + // 128; it then gives a correction of +1 when the exact correction is + // 0. This gives 128 errors. The exact answer (correct for all 16-bit + // input values) is: + // + // error = (vlo-vhi+128)*65535 >> 24; + // + // An alternative arithmetic calculation which also gives no errors is: + // + // (V * 255 + 32895) >> 16 + return (byte)(((component * 255) + 32895) >> 16); + } + + /// + /// Scales a value from an 8 bit to + /// an 16 bit equivalent. + /// + /// The 8 bit component value. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ushort UpscaleFrom8BitTo16Bit(byte component) + => (ushort)(component * 257); + + /// + /// Returns how many bits are required to store the specified number of colors. + /// Performs a Log2() on the value. + /// + /// The number of colors. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetBitsNeededForColorDepth(int colors) + => Math.Max(1, (int)Math.Ceiling(Math.Log(colors, 2))); + + /// + /// Returns how many colors will be created by the specified number of bits. + /// + /// The bit depth. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int GetColorCountForBitDepth(int bitDepth) + => 1 << bitDepth; + + /// + /// Transforms a vector by the given color matrix. + /// + /// The source vector. + /// The transformation color matrix. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Transform(ref Vector4 vector, ref ColorMatrix matrix) + { + float x = vector.X; + float y = vector.Y; + float z = vector.Z; + float w = vector.W; + + vector.X = (x * matrix.M11) + (y * matrix.M21) + (z * matrix.M31) + (w * matrix.M41) + matrix.M51; + vector.Y = (x * matrix.M12) + (y * matrix.M22) + (z * matrix.M32) + (w * matrix.M42) + matrix.M52; + vector.Z = (x * matrix.M13) + (y * matrix.M23) + (z * matrix.M33) + (w * matrix.M43) + matrix.M53; + vector.W = (x * matrix.M14) + (y * matrix.M24) + (z * matrix.M34) + (w * matrix.M44) + matrix.M54; + } + + /// + /// Bulk variant of . + /// + /// The span of vectors + /// The transformation color matrix. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Transform(Span vectors, ref ColorMatrix matrix) + { + ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); + + for (int i = 0; i < vectors.Length; i++) + { + ref Vector4 v = ref Unsafe.Add(ref baseRef, i); + Transform(ref v, ref matrix); + } + } + } +} diff --git a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs index 7da2528fa1..f265bdd517 100644 --- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs +++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs @@ -59,7 +59,7 @@ namespace SixLabors.ImageSharp ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); vector.W = target.W; - Vector4Utils.UnPremultiply(ref vector); + Numerics.UnPremultiply(ref vector); target = vector; } @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp out Vector4 vector); ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); - Vector4Utils.UnPremultiply(ref vector); + Numerics.UnPremultiply(ref vector); target = vector; } @@ -140,7 +140,7 @@ namespace SixLabors.ImageSharp { int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); - Vector4Utils.Premultiply(ref currentColor); + Numerics.Premultiply(ref currentColor); vectorX += matrixX[y, x] * currentColor; vectorY += matrixY[y, x] * currentColor; @@ -193,7 +193,7 @@ namespace SixLabors.ImageSharp ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); vector.W = target.W; - Vector4Utils.UnPremultiply(ref vector); + Numerics.UnPremultiply(ref vector); target = vector; } @@ -238,7 +238,7 @@ namespace SixLabors.ImageSharp ref vector); ref Vector4 target = ref Unsafe.Add(ref targetRowRef, column); - Vector4Utils.UnPremultiply(ref vector); + Numerics.UnPremultiply(ref vector); target = vector; } @@ -270,7 +270,7 @@ namespace SixLabors.ImageSharp { int offsetX = Numerics.Clamp(sourceOffsetColumnBase + x - radiusX, minColumn, maxColumn); var currentColor = sourceRowSpan[offsetX].ToVector4(); - Vector4Utils.Premultiply(ref currentColor); + Numerics.Premultiply(ref currentColor); vector += matrix[y, x] * currentColor; } } diff --git a/src/ImageSharp/Common/Helpers/ImageMath.cs b/src/ImageSharp/Common/Helpers/ImageMath.cs deleted file mode 100644 index 59f9ad0216..0000000000 --- a/src/ImageSharp/Common/Helpers/ImageMath.cs +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Numerics; -using System.Runtime.CompilerServices; -using SixLabors.ImageSharp.PixelFormats; - -namespace SixLabors.ImageSharp -{ - /// - /// Provides common mathematical methods used for image processing. - /// - internal static class ImageMath - { - /// - /// Vector for converting pixel to gray value as specified by ITU-R Recommendation BT.709. - /// - private static readonly Vector4 Bt709 = new Vector4(.2126f, .7152f, .0722f, 0.0f); - - /// - /// Convert a pixel value to grayscale using ITU-R Recommendation BT.709. - /// - /// The vector to get the luminance from. - /// The number of luminance levels (256 for 8 bit, 65536 for 16 bit grayscale images) - [MethodImpl(InliningOptions.ShortMethod)] - public static int GetBT709Luminance(ref Vector4 vector, int luminanceLevels) - => (int)MathF.Round(Vector4.Dot(vector, Bt709) * (luminanceLevels - 1)); - - /// - /// Gets the luminance from the rgb components using the formula as specified by ITU-R Recommendation BT.709. - /// - /// The red component. - /// The green component. - /// The blue component. - /// The . - [MethodImpl(InliningOptions.ShortMethod)] - public static byte Get8BitBT709Luminance(byte r, byte g, byte b) => - (byte)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); - - /// - /// Gets the luminance from the rgb components using the formula as specified by ITU-R Recommendation BT.709. - /// - /// The red component. - /// The green component. - /// The blue component. - /// The . - [MethodImpl(InliningOptions.ShortMethod)] - public static ushort Get16BitBT709Luminance(ushort r, ushort g, ushort b) => - (ushort)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); - - /// - /// Gets the luminance from the rgb components using the formula as specified by ITU-R Recommendation BT.709. - /// - /// The red component. - /// The green component. - /// The blue component. - /// The . - [MethodImpl(InliningOptions.ShortMethod)] - public static ushort Get16BitBT709Luminance(float r, float g, float b) => - (ushort)((r * .2126F) + (g * .7152F) + (b * .0722F) + 0.5F); - - /// - /// Scales a value from a 16 bit to it's 8 bit equivalent. - /// - /// The 8 bit component value. - /// The - [MethodImpl(InliningOptions.ShortMethod)] - public static byte DownScaleFrom16BitTo8Bit(ushort component) - { - // To scale to 8 bits From a 16-bit value V the required value (from the PNG specification) is: - // - // (V * 255) / 65535 - // - // This reduces to round(V / 257), or floor((V + 128.5)/257) - // - // Represent V as the two byte value vhi.vlo. Make a guess that the - // result is the top byte of V, vhi, then the correction to this value - // is: - // - // error = floor(((V-vhi.vhi) + 128.5) / 257) - // = floor(((vlo-vhi) + 128.5) / 257) - // - // This can be approximated using integer arithmetic (and a signed - // shift): - // - // error = (vlo-vhi+128) >> 8; - // - // The approximate differs from the exact answer only when (vlo-vhi) is - // 128; it then gives a correction of +1 when the exact correction is - // 0. This gives 128 errors. The exact answer (correct for all 16-bit - // input values) is: - // - // error = (vlo-vhi+128)*65535 >> 24; - // - // An alternative arithmetic calculation which also gives no errors is: - // - // (V * 255 + 32895) >> 16 - return (byte)(((component * 255) + 32895) >> 16); - } - - /// - /// Scales a value from an 8 bit to it's 16 bit equivalent. - /// - /// The 8 bit component value. - /// The - [MethodImpl(InliningOptions.ShortMethod)] - public static ushort UpscaleFrom8BitTo16Bit(byte component) => (ushort)(component * 257); - - /// - /// Returns how many bits are required to store the specified number of colors. - /// Performs a Log2() on the value. - /// - /// The number of colors. - /// - /// The - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static int GetBitsNeededForColorDepth(int colors) => Math.Max(1, (int)Math.Ceiling(Math.Log(colors, 2))); - - /// - /// Returns how many colors will be created by the specified number of bits. - /// - /// The bit depth. - /// The - [MethodImpl(InliningOptions.ShortMethod)] - public static int GetColorCountForBitDepth(int bitDepth) => 1 << bitDepth; - - /// - /// Gets the bounding from the given points. - /// - /// - /// The designating the top left position. - /// - /// - /// The designating the bottom right position. - /// - /// - /// The bounding . - /// - [MethodImpl(InliningOptions.ShortMethod)] - public static Rectangle GetBoundingRectangle(Point topLeft, Point bottomRight) => new Rectangle(topLeft.X, topLeft.Y, bottomRight.X - topLeft.X, bottomRight.Y - topLeft.Y); - - /// - /// Finds the bounding rectangle based on the first instance of any color component other - /// than the given one. - /// - /// The pixel format. - /// The to search within. - /// The color component value to remove. - /// The channel to test against. - /// - /// The . - /// - public static Rectangle GetFilteredBoundingRectangle(ImageFrame bitmap, float componentValue, RgbaComponent channel = RgbaComponent.B) - where TPixel : unmanaged, IPixel - { - int width = bitmap.Width; - int height = bitmap.Height; - Point topLeft = default; - Point bottomRight = default; - - Func, int, int, float, bool> delegateFunc; - - // Determine which channel to check against - switch (channel) - { - case RgbaComponent.R: - delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().X - b) > Constants.Epsilon; - break; - - case RgbaComponent.G: - delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().Y - b) > Constants.Epsilon; - break; - - case RgbaComponent.B: - delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().Z - b) > Constants.Epsilon; - break; - - default: - delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().W - b) > Constants.Epsilon; - break; - } - - int GetMinY(ImageFrame pixels) - { - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - if (delegateFunc(pixels, x, y, componentValue)) - { - return y; - } - } - } - - return 0; - } - - int GetMaxY(ImageFrame pixels) - { - for (int y = height - 1; y > -1; y--) - { - for (int x = 0; x < width; x++) - { - if (delegateFunc(pixels, x, y, componentValue)) - { - return y; - } - } - } - - return height; - } - - int GetMinX(ImageFrame pixels) - { - for (int x = 0; x < width; x++) - { - for (int y = 0; y < height; y++) - { - if (delegateFunc(pixels, x, y, componentValue)) - { - return x; - } - } - } - - return 0; - } - - int GetMaxX(ImageFrame pixels) - { - for (int x = width - 1; x > -1; x--) - { - for (int y = 0; y < height; y++) - { - if (delegateFunc(pixels, x, y, componentValue)) - { - return x; - } - } - } - - return width; - } - - topLeft.Y = GetMinY(bitmap); - topLeft.X = GetMinX(bitmap); - bottomRight.Y = Numerics.Clamp(GetMaxY(bitmap) + 1, 0, height); - bottomRight.X = Numerics.Clamp(GetMaxX(bitmap) + 1, 0, width); - - return GetBoundingRectangle(topLeft, bottomRight); - } - } -} diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs index c1e564781c..b2bedb87b4 100644 --- a/src/ImageSharp/Common/Helpers/Numerics.cs +++ b/src/ImageSharp/Common/Helpers/Numerics.cs @@ -5,6 +5,10 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +#if SUPPORTS_RUNTIME_INTRINSICS +using System.Runtime.Intrinsics; +using System.Runtime.Intrinsics.X86; +#endif namespace SixLabors.ImageSharp { @@ -14,9 +18,15 @@ namespace SixLabors.ImageSharp /// internal static class Numerics { +#if SUPPORTS_RUNTIME_INTRINSICS + private const int BlendAlphaControl = 0b_10_00_10_00; + private const int ShuffleAlphaControl = 0b_11_11_11_11; +#endif + /// /// Determine the Greatest CommonDivisor (GCD) of two numbers. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int GreatestCommonDivisor(int a, int b) { while (b != 0) @@ -32,6 +42,7 @@ namespace SixLabors.ImageSharp /// /// Determine the Least Common Multiple (LCM) of two numbers. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int LeastCommonMultiple(int a, int b) { // https://en.wikipedia.org/wiki/Least_common_multiple#Reduction_by_the_greatest_common_divisor @@ -262,7 +273,7 @@ namespace SixLabors.ImageSharp /// The minimum inclusive value. /// The maximum inclusive value. /// The clamped . - [MethodImpl(InliningOptions.ShortMethod)] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Vector4 Clamp(Vector4 value, Vector4 min, Vector4 max) => Vector4.Min(Vector4.Max(value, min), max); @@ -426,5 +437,115 @@ namespace SixLabors.ImageSharp } } } + + /// + /// Pre-multiplies the "x", "y", "z" components of a vector by its "w" component leaving the "w" component intact. + /// + /// The to premultiply + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Premultiply(ref Vector4 source) + { + float w = source.W; + source *= w; + source.W = w; + } + + /// + /// Reverses the result of premultiplying a vector via . + /// + /// The to premultiply + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void UnPremultiply(ref Vector4 source) + { + float w = source.W; + source /= w; + source.W = w; + } + + /// + /// Bulk variant of + /// + /// The span of vectors + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Premultiply(Span vectors) + { +#if SUPPORTS_RUNTIME_INTRINSICS + if (Avx2.IsSupported && vectors.Length >= 2) + { + ref Vector256 vectorsBase = + ref Unsafe.As>(ref MemoryMarshal.GetReference(vectors)); + + // Divide by 2 as 4 elements per Vector4 and 8 per Vector256 + ref Vector256 vectorsLast = ref Unsafe.Add(ref vectorsBase, (IntPtr)((uint)vectors.Length / 2u)); + + while (Unsafe.IsAddressLessThan(ref vectorsBase, ref vectorsLast)) + { + Vector256 source = vectorsBase; + Vector256 multiply = Avx.Shuffle(source, source, ShuffleAlphaControl); + vectorsBase = Avx.Blend(Avx.Multiply(source, multiply), source, BlendAlphaControl); + vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); + } + + if (Modulo2(vectors.Length) != 0) + { + // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. + Premultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); + } + } + else +#endif + { + ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); + + for (int i = 0; i < vectors.Length; i++) + { + ref Vector4 v = ref Unsafe.Add(ref baseRef, i); + Premultiply(ref v); + } + } + } + + /// + /// Bulk variant of + /// + /// The span of vectors + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void UnPremultiply(Span vectors) + { +#if SUPPORTS_RUNTIME_INTRINSICS + if (Avx2.IsSupported && vectors.Length >= 2) + { + ref Vector256 vectorsBase = + ref Unsafe.As>(ref MemoryMarshal.GetReference(vectors)); + + // Divide by 2 as 4 elements per Vector4 and 8 per Vector256 + ref Vector256 vectorsLast = ref Unsafe.Add(ref vectorsBase, (IntPtr)((uint)vectors.Length / 2u)); + + while (Unsafe.IsAddressLessThan(ref vectorsBase, ref vectorsLast)) + { + Vector256 source = vectorsBase; + Vector256 multiply = Avx.Shuffle(source, source, ShuffleAlphaControl); + vectorsBase = Avx.Blend(Avx.Divide(source, multiply), source, BlendAlphaControl); + vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); + } + + if (Modulo2(vectors.Length) != 0) + { + // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. + UnPremultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); + } + } + else +#endif + { + ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); + + for (int i = 0; i < vectors.Length; i++) + { + ref Vector4 v = ref Unsafe.Add(ref baseRef, i); + UnPremultiply(ref v); + } + } + } } } diff --git a/src/ImageSharp/Common/Helpers/Vector4Utils.cs b/src/ImageSharp/Common/Helpers/Vector4Utils.cs deleted file mode 100644 index 05661991a3..0000000000 --- a/src/ImageSharp/Common/Helpers/Vector4Utils.cs +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -#if SUPPORTS_RUNTIME_INTRINSICS -using System.Runtime.Intrinsics; -using System.Runtime.Intrinsics.X86; -#endif - -namespace SixLabors.ImageSharp -{ - /// - /// Utility methods for the struct. - /// - internal static class Vector4Utils - { - private const int BlendAlphaControl = 0b_10_00_10_00; - private const int ShuffleAlphaControl = 0b_11_11_11_11; - - /// - /// Pre-multiplies the "x", "y", "z" components of a vector by its "w" component leaving the "w" component intact. - /// - /// The to premultiply - [MethodImpl(InliningOptions.ShortMethod)] - public static void Premultiply(ref Vector4 source) - { - float w = source.W; - source *= w; - source.W = w; - } - - /// - /// Reverses the result of premultiplying a vector via . - /// - /// The to premultiply - [MethodImpl(InliningOptions.ShortMethod)] - public static void UnPremultiply(ref Vector4 source) - { - float w = source.W; - source /= w; - source.W = w; - } - - /// - /// Bulk variant of - /// - /// The span of vectors - [MethodImpl(InliningOptions.ShortMethod)] - public static void Premultiply(Span vectors) - { -#if SUPPORTS_RUNTIME_INTRINSICS - if (Avx2.IsSupported && vectors.Length >= 2) - { - ref Vector256 vectorsBase = - ref Unsafe.As>(ref MemoryMarshal.GetReference(vectors)); - - // Divide by 2 as 4 elements per Vector4 and 8 per Vector256 - ref Vector256 vectorsLast = ref Unsafe.Add(ref vectorsBase, (IntPtr)((uint)vectors.Length / 2u)); - - while (Unsafe.IsAddressLessThan(ref vectorsBase, ref vectorsLast)) - { - Vector256 source = vectorsBase; - Vector256 multiply = Avx.Shuffle(source, source, ShuffleAlphaControl); - vectorsBase = Avx.Blend(Avx.Multiply(source, multiply), source, BlendAlphaControl); - vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); - } - - if (Numerics.Modulo2(vectors.Length) != 0) - { - // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. - Premultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); - } - } - else -#endif - { - ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); - - for (int i = 0; i < vectors.Length; i++) - { - ref Vector4 v = ref Unsafe.Add(ref baseRef, i); - Premultiply(ref v); - } - } - } - - /// - /// Bulk variant of - /// - /// The span of vectors - [MethodImpl(InliningOptions.ShortMethod)] - public static void UnPremultiply(Span vectors) - { -#if SUPPORTS_RUNTIME_INTRINSICS - if (Avx2.IsSupported && vectors.Length >= 2) - { - ref Vector256 vectorsBase = - ref Unsafe.As>(ref MemoryMarshal.GetReference(vectors)); - - // Divide by 2 as 4 elements per Vector4 and 8 per Vector256 - ref Vector256 vectorsLast = ref Unsafe.Add(ref vectorsBase, (IntPtr)((uint)vectors.Length / 2u)); - - while (Unsafe.IsAddressLessThan(ref vectorsBase, ref vectorsLast)) - { - Vector256 source = vectorsBase; - Vector256 multiply = Avx.Shuffle(source, source, ShuffleAlphaControl); - vectorsBase = Avx.Blend(Avx.Divide(source, multiply), source, BlendAlphaControl); - vectorsBase = ref Unsafe.Add(ref vectorsBase, 1); - } - - if (Numerics.Modulo2(vectors.Length) != 0) - { - // Vector4 fits neatly in pairs. Any overlap has to be equal to 1. - UnPremultiply(ref MemoryMarshal.GetReference(vectors.Slice(vectors.Length - 1))); - } - } - else -#endif - { - ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); - - for (int i = 0; i < vectors.Length; i++) - { - ref Vector4 v = ref Unsafe.Add(ref baseRef, i); - UnPremultiply(ref v); - } - } - } - - /// - /// Transforms a vector by the given matrix. - /// - /// The source vector. - /// The transformation matrix. - [MethodImpl(InliningOptions.ShortMethod)] - public static void Transform(ref Vector4 vector, ref ColorMatrix matrix) - { - float x = vector.X; - float y = vector.Y; - float z = vector.Z; - float w = vector.W; - - vector.X = (x * matrix.M11) + (y * matrix.M21) + (z * matrix.M31) + (w * matrix.M41) + matrix.M51; - vector.Y = (x * matrix.M12) + (y * matrix.M22) + (z * matrix.M32) + (w * matrix.M42) + matrix.M52; - vector.Z = (x * matrix.M13) + (y * matrix.M23) + (z * matrix.M33) + (w * matrix.M43) + matrix.M53; - vector.W = (x * matrix.M14) + (y * matrix.M24) + (z * matrix.M34) + (w * matrix.M44) + matrix.M54; - } - - /// - /// Bulk variant of . - /// - /// The span of vectors - /// The transformation matrix. - [MethodImpl(InliningOptions.ShortMethod)] - public static void Transform(Span vectors, ref ColorMatrix matrix) - { - ref Vector4 baseRef = ref MemoryMarshal.GetReference(vectors); - - for (int i = 0; i < vectors.Length; i++) - { - ref Vector4 v = ref Unsafe.Add(ref baseRef, i); - Transform(ref v, ref matrix); - } - } - } -} diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs index 0dd6678502..0be0385725 100644 --- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs @@ -1385,7 +1385,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp { case BmpFileMarkerType.Bitmap: colorMapSizeBytes = this.fileHeader.Offset - BmpFileHeader.Size - this.infoHeader.HeaderSize; - int colorCountForBitDepth = ImageMath.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel); + int colorCountForBitDepth = ColorNumerics.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel); bytesPerColorMapEntry = colorMapSizeBytes / colorCountForBitDepth; // Edge case for less-than-full-sized palette: bytesPerColorMapEntry should be at least 3. @@ -1399,7 +1399,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp case BmpFileMarkerType.Pointer: // OS/2 bitmaps always have 3 colors per color palette entry. bytesPerColorMapEntry = 3; - colorMapSizeBytes = ImageMath.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel) * bytesPerColorMapEntry; + colorMapSizeBytes = ColorNumerics.GetColorCountForBitDepth(this.infoHeader.BitsPerPixel) * bytesPerColorMapEntry; break; } } diff --git a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs index f4288e97f3..9c1e95285c 100644 --- a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.Formats.Gif } // Get the number of bits. - this.bitDepth = ImageMath.GetBitsNeededForColorDepth(quantized.Palette.Length); + this.bitDepth = ColorNumerics.GetBitsNeededForColorDepth(quantized.Palette.Length); // Write the header. this.WriteHeader(stream); @@ -212,7 +212,7 @@ namespace SixLabors.ImageSharp.Formats.Gif } } - this.bitDepth = ImageMath.GetBitsNeededForColorDepth(quantized.Palette.Length); + this.bitDepth = ColorNumerics.GetBitsNeededForColorDepth(quantized.Palette.Length); this.WriteGraphicalControlExtension(frameMetadata, this.GetTransparentIndex(quantized), stream); this.WriteImageDescriptor(frame, true, stream); this.WriteColorTable(quantized, stream); @@ -468,7 +468,7 @@ namespace SixLabors.ImageSharp.Formats.Gif where TPixel : unmanaged, IPixel { // The maximum number of colors for the bit depth - int colorTableLength = ImageMath.GetColorCountForBitDepth(this.bitDepth) * Unsafe.SizeOf(); + int colorTableLength = ColorNumerics.GetColorCountForBitDepth(this.bitDepth) * Unsafe.SizeOf(); using IManagedByteBuffer colorTable = this.memoryAllocator.AllocateManagedByteBuffer(colorTableLength, AllocationOptions.Clean); PixelOperations.Instance.ToRgb24Bytes( diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs index 4e05f459f6..5d2af8ec6a 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs @@ -284,7 +284,7 @@ namespace SixLabors.ImageSharp.Formats.Png rowSpan.Length, AllocationOptions.Clean)) { - int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(this.bitDepth) - 1); + int scaleFactor = 255 / (ColorNumerics.GetColorCountForBitDepth(this.bitDepth) - 1); Span tempSpan = temp.GetSpan(); // We need to first create an array of luminance bytes then scale them down to the correct bit depth. @@ -314,7 +314,7 @@ namespace SixLabors.ImageSharp.Formats.Png for (int x = 0, o = 0; x < rgbaSpan.Length; x++, o += 4) { Rgba64 rgba = Unsafe.Add(ref rgbaRef, x); - ushort luminance = ImageMath.Get16BitBT709Luminance(rgba.R, rgba.G, rgba.B); + ushort luminance = ColorNumerics.Get16BitBT709Luminance(rgba.R, rgba.G, rgba.B); BinaryPrimitives.WriteUInt16BigEndian(rawScanlineSpan.Slice(o, 2), luminance); BinaryPrimitives.WriteUInt16BigEndian(rawScanlineSpan.Slice(o + 2, 2), rgba.A); } @@ -329,7 +329,7 @@ namespace SixLabors.ImageSharp.Formats.Png { Unsafe.Add(ref rowSpanRef, x).ToRgba32(ref rgba); Unsafe.Add(ref rawScanlineSpanRef, o) = - ImageMath.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); + ColorNumerics.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); Unsafe.Add(ref rawScanlineSpanRef, o + 1) = rgba.A; } } diff --git a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs index f1f5145ca2..23ca869936 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderOptionsHelpers.cs @@ -75,7 +75,7 @@ namespace SixLabors.ImageSharp.Formats.Png if (options.Quantizer is null) { byte bits = (byte)options.BitDepth; - var maxColors = ImageMath.GetColorCountForBitDepth(bits); + var maxColors = ColorNumerics.GetColorCountForBitDepth(bits); options.Quantizer = new WuQuantizer(new QuantizerOptions { MaxColors = maxColors }); } @@ -101,7 +101,7 @@ namespace SixLabors.ImageSharp.Formats.Png byte bitDepth; if (options.ColorType == PngColorType.Palette) { - byte quantizedBits = (byte)Numerics.Clamp(ImageMath.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length), 1, 8); + byte quantizedBits = (byte)Numerics.Clamp(ColorNumerics.GetBitsNeededForColorDepth(quantizedFrame.Palette.Length), 1, 8); byte bits = Math.Max((byte)options.BitDepth, quantizedBits); // Png only supports in four pixel depths: 1, 2, 4, and 8 bits when using the PLTE chunk diff --git a/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs b/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs index 16d6aa19f4..58fa5aca82 100644 --- a/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs +++ b/src/ImageSharp/Formats/Png/PngScanlineProcessor.cs @@ -27,7 +27,7 @@ namespace SixLabors.ImageSharp.Formats.Png TPixel pixel = default; ref byte scanlineSpanRef = ref MemoryMarshal.GetReference(scanlineSpan); ref TPixel rowSpanRef = ref MemoryMarshal.GetReference(rowSpan); - int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(header.BitDepth) - 1); + int scaleFactor = 255 / (ColorNumerics.GetColorCountForBitDepth(header.BitDepth) - 1); if (!hasTrans) { @@ -96,7 +96,7 @@ namespace SixLabors.ImageSharp.Formats.Png TPixel pixel = default; ref byte scanlineSpanRef = ref MemoryMarshal.GetReference(scanlineSpan); ref TPixel rowSpanRef = ref MemoryMarshal.GetReference(rowSpan); - int scaleFactor = 255 / (ImageMath.GetColorCountForBitDepth(header.BitDepth) - 1); + int scaleFactor = 255 / (ColorNumerics.GetColorCountForBitDepth(header.BitDepth) - 1); if (!hasTrans) { diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs index 92474b6fc8..1d31ea9f4e 100644 --- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs @@ -365,7 +365,7 @@ namespace SixLabors.ImageSharp.Formats.Tga where TPixel : unmanaged, IPixel { var vector = sourcePixel.ToVector4(); - return ImageMath.GetBT709Luminance(ref vector, 256); + return ColorNumerics.GetBT709Luminance(ref vector, 256); } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs index fa08bbe625..77df2bc800 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/A8.cs @@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa32(La32 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + public void FromLa32(La32 source) => this.PackedValue = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); /// [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs index 9e6db8b700..3ac9b523f3 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Argb32.cs @@ -244,7 +244,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -265,11 +265,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -306,9 +306,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -316,10 +316,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs index 9063516a3b..6cff5fd772 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgr24.cs @@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -170,7 +170,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -203,18 +203,18 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs index 2058c4e003..190345ddaf 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Bgra32.cs @@ -197,7 +197,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -218,11 +218,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -259,9 +259,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -269,10 +269,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs index cda2f32e8b..dd31aae2fc 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L16.cs @@ -74,30 +74,30 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.PackedValue = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.PackedValue = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.PackedValue = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); } /// @@ -106,7 +106,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromL8(L8 source) => this.PackedValue = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); + public void FromL8(L8 source) => this.PackedValue = ColorNumerics.UpscaleFrom8BitTo16Bit(source.PackedValue); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -114,7 +114,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa16(La16 source) => this.PackedValue = ImageMath.UpscaleFrom8BitTo16Bit(source.L); + public void FromLa16(La16 source) => this.PackedValue = ColorNumerics.UpscaleFrom8BitTo16Bit(source.L); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -124,27 +124,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.PackedValue = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.PackedValue = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(this.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(this.PackedValue); dest.R = rgb; dest.G = rgb; dest.B = rgb; @@ -153,11 +153,11 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgb48(Rgb48 source) => this.PackedValue = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); + public void FromRgb48(Rgb48 source) => this.PackedValue = ColorNumerics.Get16BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgba64(Rgba64 source) => this.PackedValue = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); + public void FromRgba64(Rgba64 source) => this.PackedValue = ColorNumerics.Get16BitBT709Luminance(source.R, source.G, source.B); /// public override readonly bool Equals(object obj) => obj is L16 other && this.Equals(other); @@ -177,7 +177,7 @@ namespace SixLabors.ImageSharp.PixelFormats internal void ConvertFromRgbaScaledVector4(Vector4 vector) { vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; - this.PackedValue = ImageMath.Get16BitBT709Luminance( + this.PackedValue = ColorNumerics.Get16BitBT709Luminance( vector.X, vector.Y, vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs index 938d83feb4..c570c33a19 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/L8.cs @@ -73,15 +73,15 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromArgb32(Argb32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromArgb32(Argb32 source) => this.PackedValue = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromBgr24(Bgr24 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromBgr24(Bgr24 source) => this.PackedValue = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromBgra32(Bgra32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromBgra32(Bgra32 source) => this.PackedValue = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -93,7 +93,7 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromL16(L16 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + public void FromL16(L16 source) => this.PackedValue = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -101,15 +101,15 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromLa32(La32 source) => this.PackedValue = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + public void FromLa32(La32 source) => this.PackedValue = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgb24(Rgb24 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromRgb24(Rgb24 source) => this.PackedValue = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] - public void FromRgba32(Rgba32 source) => this.PackedValue = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + public void FromRgba32(Rgba32 source) => this.PackedValue = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); /// [MethodImpl(InliningOptions.ShortMethod)] @@ -124,18 +124,18 @@ namespace SixLabors.ImageSharp.PixelFormats /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) - => this.PackedValue = ImageMath.Get8BitBT709Luminance( - ImageMath.DownScaleFrom16BitTo8Bit(source.R), - ImageMath.DownScaleFrom16BitTo8Bit(source.G), - ImageMath.DownScaleFrom16BitTo8Bit(source.B)); + => this.PackedValue = ColorNumerics.Get8BitBT709Luminance( + ColorNumerics.DownScaleFrom16BitTo8Bit(source.R), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.G), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.B)); /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) - => this.PackedValue = ImageMath.Get8BitBT709Luminance( - ImageMath.DownScaleFrom16BitTo8Bit(source.R), - ImageMath.DownScaleFrom16BitTo8Bit(source.G), - ImageMath.DownScaleFrom16BitTo8Bit(source.B)); + => this.PackedValue = ColorNumerics.Get8BitBT709Luminance( + ColorNumerics.DownScaleFrom16BitTo8Bit(source.R), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.G), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.B)); /// public override readonly bool Equals(object obj) => obj is L8 other && this.Equals(other); @@ -157,7 +157,7 @@ namespace SixLabors.ImageSharp.PixelFormats vector *= MaxBytes; vector += Half; vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); - this.PackedValue = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); + this.PackedValue = ColorNumerics.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); } } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs index 21d9834947..5a69431a1d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La16.cs @@ -92,7 +92,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -100,7 +100,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = byte.MaxValue; } @@ -108,7 +108,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -120,7 +120,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - this.L = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + this.L = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.A = byte.MaxValue; } @@ -140,15 +140,15 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - this.L = ImageMath.DownScaleFrom16BitTo8Bit(source.L); - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.L = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = byte.MaxValue; } @@ -156,10 +156,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.L = ImageMath.Get8BitBT709Luminance( - ImageMath.DownScaleFrom16BitTo8Bit(source.R), - ImageMath.DownScaleFrom16BitTo8Bit(source.G), - ImageMath.DownScaleFrom16BitTo8Bit(source.B)); + this.L = ColorNumerics.Get8BitBT709Luminance( + ColorNumerics.DownScaleFrom16BitTo8Bit(source.R), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.G), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.B)); this.A = byte.MaxValue; } @@ -168,19 +168,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.L = ImageMath.Get8BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get8BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } /// public void FromRgba64(Rgba64 source) { - this.L = ImageMath.Get8BitBT709Luminance( - ImageMath.DownScaleFrom16BitTo8Bit(source.R), - ImageMath.DownScaleFrom16BitTo8Bit(source.G), - ImageMath.DownScaleFrom16BitTo8Bit(source.B)); + this.L = ColorNumerics.Get8BitBT709Luminance( + ColorNumerics.DownScaleFrom16BitTo8Bit(source.R), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.G), + ColorNumerics.DownScaleFrom16BitTo8Bit(source.B)); - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -220,7 +220,7 @@ namespace SixLabors.ImageSharp.PixelFormats vector *= MaxBytes; vector += Half; vector = Numerics.Clamp(vector, Vector4.Zero, MaxBytes); - this.L = ImageMath.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); + this.L = ColorNumerics.Get8BitBT709Luminance((byte)vector.X, (byte)vector.Y, (byte)vector.Z); this.A = (byte)vector.W; } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs index 319775061c..66d0e38c79 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/La32.cs @@ -95,22 +95,22 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.L = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.L = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); this.A = ushort.MaxValue; } @@ -119,12 +119,12 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.L = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -143,7 +143,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - this.L = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); + this.L = ColorNumerics.UpscaleFrom8BitTo16Bit(source.PackedValue); this.A = ushort.MaxValue; } @@ -151,8 +151,8 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - this.L = ImageMath.UpscaleFrom8BitTo16Bit(source.L); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.L = ColorNumerics.UpscaleFrom8BitTo16Bit(source.L); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -163,10 +163,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.L = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); this.A = ushort.MaxValue; } @@ -175,7 +175,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.L = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get16BitBT709Luminance(source.R, source.G, source.B); this.A = ushort.MaxValue; } @@ -183,19 +183,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.L = ImageMath.Get16BitBT709Luminance( - ImageMath.UpscaleFrom8BitTo16Bit(source.R), - ImageMath.UpscaleFrom8BitTo16Bit(source.G), - ImageMath.UpscaleFrom8BitTo16Bit(source.B)); + this.L = ColorNumerics.Get16BitBT709Luminance( + ColorNumerics.UpscaleFrom8BitTo16Bit(source.R), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.G), + ColorNumerics.UpscaleFrom8BitTo16Bit(source.B)); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.L = ImageMath.Get16BitBT709Luminance(source.R, source.G, source.B); + this.L = ColorNumerics.Get16BitBT709Luminance(source.R, source.G, source.B); this.A = source.A; } @@ -211,11 +211,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(this.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(this.L); dest.R = rgb; dest.G = rgb; dest.B = rgb; - dest.A = ImageMath.DownScaleFrom16BitTo8Bit(this.A); + dest.A = ColorNumerics.DownScaleFrom16BitTo8Bit(this.A); } /// @@ -234,7 +234,7 @@ namespace SixLabors.ImageSharp.PixelFormats internal void ConvertFromRgbaScaledVector4(Vector4 vector) { vector = Numerics.Clamp(vector, Vector4.Zero, Vector4.One) * Max; - this.L = ImageMath.Get16BitBT709Luminance( + this.L = ColorNumerics.Get16BitBT709Luminance( vector.X, vector.Y, vector.Z); diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs index b7e831cfa7..7fd63c6766 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb24.cs @@ -166,7 +166,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -185,7 +185,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -227,18 +227,18 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs index 23297806de..e3738b70c1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgb48.cs @@ -99,27 +99,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); } /// @@ -134,7 +134,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); + ushort rgb = ColorNumerics.UpscaleFrom8BitTo16Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -153,7 +153,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.L); + ushort rgb = ColorNumerics.UpscaleFrom8BitTo16Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; @@ -172,27 +172,27 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - dest.R = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - dest.G = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - dest.B = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + dest.R = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + dest.G = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + dest.B = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); dest.A = byte.MaxValue; } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs index 19c1bd0839..868165e9c4 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.cs @@ -351,7 +351,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL16(L16 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.PackedValue); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -372,11 +372,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa32(La32 source) { - byte rgb = ImageMath.DownScaleFrom16BitTo8Bit(source.L); + byte rgb = ColorNumerics.DownScaleFrom16BitTo8Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// @@ -402,9 +402,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb48(Rgb48 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); this.A = byte.MaxValue; } @@ -412,10 +412,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba64(Rgba64 source) { - this.R = ImageMath.DownScaleFrom16BitTo8Bit(source.R); - this.G = ImageMath.DownScaleFrom16BitTo8Bit(source.G); - this.B = ImageMath.DownScaleFrom16BitTo8Bit(source.B); - this.A = ImageMath.DownScaleFrom16BitTo8Bit(source.A); + this.R = ColorNumerics.DownScaleFrom16BitTo8Bit(source.R); + this.G = ColorNumerics.DownScaleFrom16BitTo8Bit(source.G); + this.B = ColorNumerics.DownScaleFrom16BitTo8Bit(source.B); + this.A = ColorNumerics.DownScaleFrom16BitTo8Bit(source.A); } /// diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs index f8b40d7e0d..9add3d7180 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba64.cs @@ -62,10 +62,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Rgba32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -75,10 +75,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Bgra32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -88,10 +88,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Argb32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -101,9 +101,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Rgb24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -114,9 +114,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public Rgba64(Bgr24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -224,19 +224,19 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromArgb32(Argb32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void FromBgr24(Bgr24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -244,10 +244,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromBgra32(Bgra32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -258,7 +258,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromL8(L8 source) { - ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.PackedValue); + ushort rgb = ColorNumerics.UpscaleFrom8BitTo16Bit(source.PackedValue); this.R = rgb; this.G = rgb; this.B = rgb; @@ -279,11 +279,11 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromLa16(La16 source) { - ushort rgb = ImageMath.UpscaleFrom8BitTo16Bit(source.L); + ushort rgb = ColorNumerics.UpscaleFrom8BitTo16Bit(source.L); this.R = rgb; this.G = rgb; this.B = rgb; - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// @@ -300,9 +300,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgb24(Rgb24 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); this.A = ushort.MaxValue; } @@ -310,20 +310,20 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public void FromRgba32(Rgba32 source) { - this.R = ImageMath.UpscaleFrom8BitTo16Bit(source.R); - this.G = ImageMath.UpscaleFrom8BitTo16Bit(source.G); - this.B = ImageMath.UpscaleFrom8BitTo16Bit(source.B); - this.A = ImageMath.UpscaleFrom8BitTo16Bit(source.A); + this.R = ColorNumerics.UpscaleFrom8BitTo16Bit(source.R); + this.G = ColorNumerics.UpscaleFrom8BitTo16Bit(source.G); + this.B = ColorNumerics.UpscaleFrom8BitTo16Bit(source.B); + this.A = ColorNumerics.UpscaleFrom8BitTo16Bit(source.A); } /// [MethodImpl(InliningOptions.ShortMethod)] public void ToRgba32(ref Rgba32 dest) { - dest.R = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - dest.G = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - dest.B = ImageMath.DownScaleFrom16BitTo8Bit(this.B); - dest.A = ImageMath.DownScaleFrom16BitTo8Bit(this.A); + dest.R = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + dest.G = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + dest.B = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); + dest.A = ColorNumerics.DownScaleFrom16BitTo8Bit(this.A); } /// @@ -345,10 +345,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Rgba32 ToRgba32() { - byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); + byte r = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + byte g = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + byte b = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); + byte a = ColorNumerics.DownScaleFrom16BitTo8Bit(this.A); return new Rgba32(r, g, b, a); } @@ -359,10 +359,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Bgra32 ToBgra32() { - byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); + byte r = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + byte g = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + byte b = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); + byte a = ColorNumerics.DownScaleFrom16BitTo8Bit(this.A); return new Bgra32(r, g, b, a); } @@ -373,10 +373,10 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Argb32 ToArgb32() { - byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); - byte a = ImageMath.DownScaleFrom16BitTo8Bit(this.A); + byte r = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + byte g = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + byte b = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); + byte a = ColorNumerics.DownScaleFrom16BitTo8Bit(this.A); return new Argb32(r, g, b, a); } @@ -387,9 +387,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Rgb24 ToRgb24() { - byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + byte r = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + byte g = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + byte b = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); return new Rgb24(r, g, b); } @@ -400,9 +400,9 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(InliningOptions.ShortMethod)] public readonly Bgr24 ToBgr24() { - byte r = ImageMath.DownScaleFrom16BitTo8Bit(this.R); - byte g = ImageMath.DownScaleFrom16BitTo8Bit(this.G); - byte b = ImageMath.DownScaleFrom16BitTo8Bit(this.B); + byte r = ColorNumerics.DownScaleFrom16BitTo8Bit(this.R); + byte g = ColorNumerics.DownScaleFrom16BitTo8Bit(this.G); + byte b = ColorNumerics.DownScaleFrom16BitTo8Bit(this.B); return new Bgr24(r, g, b); } diff --git a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs index 977722b819..acc2725cec 100644 --- a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs +++ b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs @@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils if (modifiers.IsDefined(PixelConversionModifiers.Premultiply)) { - Vector4Utils.Premultiply(vectors); + Numerics.Premultiply(vectors); } } @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils { if (modifiers.IsDefined(PixelConversionModifiers.Premultiply)) { - Vector4Utils.UnPremultiply(vectors); + Numerics.UnPremultiply(vectors); } if (modifiers.IsDefined(PixelConversionModifiers.SRgbCompand)) diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs index a47937baf1..df95b6f1b6 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs @@ -96,7 +96,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Binarization color.ToRgba32(ref rgba); // Convert to grayscale using ITU-R Recommendation BT.709 if required - byte luminance = this.isAlphaOnly ? rgba.A : ImageMath.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); + byte luminance = this.isAlphaOnly ? rgba.A : ColorNumerics.Get8BitBT709Luminance(rgba.R, rgba.G, rgba.B); color = luminance >= this.threshold ? this.upper : this.lower; } } diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs index 0f3c20f5e1..9b99a5257d 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs @@ -218,7 +218,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering this.source = source; this.destination = destination; this.bounds = bounds; - this.bitDepth = ImageMath.GetBitsNeededForColorDepth(destination.Palette.Length); + this.bitDepth = ColorNumerics.GetBitsNeededForColorDepth(destination.Palette.Length); } [MethodImpl(InliningOptions.ShortMethod)] @@ -262,7 +262,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Dithering this.source = source; this.bounds = bounds; this.scale = processor.DitherScale; - this.bitDepth = ImageMath.GetBitsNeededForColorDepth(processor.Palette.Length); + this.bitDepth = ColorNumerics.GetBitsNeededForColorDepth(processor.Palette.Length); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs index e28d4add72..4dc9e41960 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs @@ -74,7 +74,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Filters Span rowSpan = this.source.GetPixelRowSpan(y).Slice(this.startX, span.Length); PixelOperations.Instance.ToVector4(this.configuration, rowSpan, span); - Vector4Utils.Transform(span, ref Unsafe.AsRef(this.matrix)); + ColorNumerics.Transform(span, ref Unsafe.AsRef(this.matrix)); PixelOperations.Instance.FromVector4Destructive(this.configuration, span, rowSpan); } diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs index 2558120786..b9383e331e 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs @@ -259,7 +259,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int idx = 0; idx < length; idx++) { - int luminance = ImageMath.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); + int luminance = ColorNumerics.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); Unsafe.Add(ref histogramBase, luminance)++; } } @@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { for (int idx = 0; idx < length; idx++) { - int luminance = ImageMath.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); + int luminance = ColorNumerics.GetBT709Luminance(ref Unsafe.Add(ref greyValuesBase, idx), luminanceLevels); Unsafe.Add(ref histogramBase, luminance)--; } } diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index b45773e9ab..70d3e075da 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -123,7 +123,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization { // TODO: We should bulk convert here. var vector = pixelRow[x].ToVector4(); - int luminance = ImageMath.GetBT709Luminance(ref vector, levels); + int luminance = ColorNumerics.GetBT709Luminance(ref vector, levels); Interlocked.Increment(ref Unsafe.Add(ref histogramBase, luminance)); } } @@ -174,7 +174,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization // TODO: We should bulk convert here. ref TPixel pixel = ref pixelRow[x]; var vector = pixel.ToVector4(); - int luminance = ImageMath.GetBT709Luminance(ref vector, levels); + int luminance = ColorNumerics.GetBT709Luminance(ref vector, levels); float luminanceEqualized = Unsafe.Add(ref cdfBase, luminance) / noOfPixelsMinusCdfMin; pixel.FromVector4(new Vector4(luminanceEqualized, luminanceEqualized, luminanceEqualized, vector.W)); } diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs index 3bba95bc68..59df3058d9 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs @@ -143,7 +143,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Normalization public static int GetLuminance(TPixel sourcePixel, int luminanceLevels) { var vector = sourcePixel.ToVector4(); - return ImageMath.GetBT709Luminance(ref vector, luminanceLevels); + return ColorNumerics.GetBT709Luminance(ref vector, luminanceLevels); } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs index 1e1d1c953d..6b64da1c97 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer{TPixel}.cs @@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization this.Options = options; this.maxColors = this.Options.MaxColors; - this.octree = new Octree(Numerics.Clamp(ImageMath.GetBitsNeededForColorDepth(this.maxColors), 1, 8)); + this.octree = new Octree(Numerics.Clamp(ColorNumerics.GetBitsNeededForColorDepth(this.maxColors), 1, 8)); this.paletteOwner = configuration.MemoryAllocator.Allocate(this.maxColors, AllocationOptions.Clean); this.palette = default; this.pixelMap = default; diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs index 27d40e77b4..675d6fe0d7 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs @@ -1,6 +1,8 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; +using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Binarization; @@ -48,7 +50,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms new BinaryThresholdProcessor(this.definition.Threshold).Execute(this.Configuration, temp, this.SourceRectangle); // Search for the first white pixels - rectangle = ImageMath.GetFilteredBoundingRectangle(temp.Frames.RootFrame, 0); + rectangle = GetFilteredBoundingRectangle(temp.Frames.RootFrame, 0); } new CropProcessor(rectangle, this.Source.Size()).Execute(this.Configuration, this.Source, this.SourceRectangle); @@ -61,5 +63,136 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms { // All processing happens at the image level within BeforeImageApply(); } + + /// + /// Gets the bounding from the given points. + /// + /// + /// The designating the top left position. + /// + /// + /// The designating the bottom right position. + /// + /// + /// The bounding . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static Rectangle GetBoundingRectangle(Point topLeft, Point bottomRight) + => new Rectangle( + topLeft.X, + topLeft.Y, + bottomRight.X - topLeft.X, + bottomRight.Y - topLeft.Y); + + /// + /// Finds the bounding rectangle based on the first instance of any color component other + /// than the given one. + /// + /// The to search within. + /// The color component value to remove. + /// The channel to test against. + /// + /// The . + /// + private static Rectangle GetFilteredBoundingRectangle(ImageFrame bitmap, float componentValue, RgbaComponent channel = RgbaComponent.B) + { + int width = bitmap.Width; + int height = bitmap.Height; + Point topLeft = default; + Point bottomRight = default; + + Func, int, int, float, bool> delegateFunc; + + // Determine which channel to check against + switch (channel) + { + case RgbaComponent.R: + delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().X - b) > Constants.Epsilon; + break; + + case RgbaComponent.G: + delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().Y - b) > Constants.Epsilon; + break; + + case RgbaComponent.B: + delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().Z - b) > Constants.Epsilon; + break; + + default: + delegateFunc = (pixels, x, y, b) => MathF.Abs(pixels[x, y].ToVector4().W - b) > Constants.Epsilon; + break; + } + + int GetMinY(ImageFrame pixels) + { + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + if (delegateFunc(pixels, x, y, componentValue)) + { + return y; + } + } + } + + return 0; + } + + int GetMaxY(ImageFrame pixels) + { + for (int y = height - 1; y > -1; y--) + { + for (int x = 0; x < width; x++) + { + if (delegateFunc(pixels, x, y, componentValue)) + { + return y; + } + } + } + + return height; + } + + int GetMinX(ImageFrame pixels) + { + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + if (delegateFunc(pixels, x, y, componentValue)) + { + return x; + } + } + } + + return 0; + } + + int GetMaxX(ImageFrame pixels) + { + for (int x = width - 1; x > -1; x--) + { + for (int y = 0; y < height; y++) + { + if (delegateFunc(pixels, x, y, componentValue)) + { + return x; + } + } + } + + return width; + } + + topLeft.Y = GetMinY(bitmap); + topLeft.X = GetMinX(bitmap); + bottomRight.Y = Numerics.Clamp(GetMaxY(bitmap) + 1, 0, height); + bottomRight.X = Numerics.Clamp(GetMaxX(bitmap) + 1, 0, width); + + return GetBoundingRectangle(topLeft, bottomRight); + } } } diff --git a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs index 07e784ec53..e65b2cbe92 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Linear/LinearTransformUtils.cs @@ -78,13 +78,13 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms // Values are first premultiplied to prevent darkening of edge pixels. var current = sourcePixels[x, y].ToVector4(); - Vector4Utils.Premultiply(ref current); + Numerics.Premultiply(ref current); sum += current * xWeight * yWeight; } } // Reverse the premultiplication - Vector4Utils.UnPremultiply(ref sum); + Numerics.UnPremultiply(ref sum); targetRow[column] = sum; } diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs index d441b5e0bd..b88f5090ba 100644 --- a/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs +++ b/tests/ImageSharp.Benchmarks/Color/Bulk/PremultiplyVector4.cs @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk [Benchmark] public void Premultiply() { - Vector4Utils.Premultiply(Vectors); + Numerics.Premultiply(Vectors); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs index 819f34b924..aa73bc3d01 100644 --- a/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs +++ b/tests/ImageSharp.Benchmarks/Color/Bulk/UnPremultiplyVector4.cs @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk [Benchmark] public void UnPremultiply() { - Vector4Utils.UnPremultiply(Vectors); + Numerics.UnPremultiply(Vectors); } [MethodImpl(InliningOptions.ShortMethod)] diff --git a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs index cd5e3a5e4d..11bab17fbd 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs @@ -435,7 +435,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Png Rgba32 expectedColor = Color.Blue; if (colorType == PngColorType.Grayscale || colorType == PngColorType.GrayscaleWithAlpha) { - var luminance = ImageMath.Get8BitBT709Luminance(expectedColor.R, expectedColor.G, expectedColor.B); + var luminance = ColorNumerics.Get8BitBT709Luminance(expectedColor.R, expectedColor.G, expectedColor.B); expectedColor = new Rgba32(luminance, luminance, luminance); } diff --git a/tests/ImageSharp.Tests/Helpers/ImageMathTests.cs b/tests/ImageSharp.Tests/Helpers/ColorNumericsTests.cs similarity index 79% rename from tests/ImageSharp.Tests/Helpers/ImageMathTests.cs rename to tests/ImageSharp.Tests/Helpers/ColorNumericsTests.cs index 687c13fd55..7d7f5f15ac 100644 --- a/tests/ImageSharp.Tests/Helpers/ImageMathTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ColorNumericsTests.cs @@ -7,7 +7,7 @@ using Xunit; namespace SixLabors.ImageSharp.Tests.Helpers { - public class ImageMathTests + public class ColorNumericsTests { [Theory] [InlineData(0.2f, 0.7f, 0.1f, 256, 140)] @@ -20,12 +20,12 @@ namespace SixLabors.ImageSharp.Tests.Helpers var vector = new Vector4(x, y, z, 0.0f); // act - int actual = ImageMath.GetBT709Luminance(ref vector, luminanceLevels); + int actual = ColorNumerics.GetBT709Luminance(ref vector, luminanceLevels); // assert Assert.Equal(expected, actual); } - // TODO: We need to test all ImageMaths methods! + // TODO: We need to test all ColorNumerics methods! } } diff --git a/tests/ImageSharp.Tests/Helpers/NumericsTests.cs b/tests/ImageSharp.Tests/Helpers/NumericsTests.cs index f1678cfa1d..98363b7515 100644 --- a/tests/ImageSharp.Tests/Helpers/NumericsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/NumericsTests.cs @@ -2,13 +2,17 @@ // Licensed under the Apache License, Version 2.0. using System; +using System.Linq; +using System.Numerics; using Xunit; namespace SixLabors.ImageSharp.Tests.Helpers { public class NumericsTests { - public delegate void SpanAction(Span span, TArg arg, TArg1 arg1); + private delegate void SpanAction(Span span, TArg arg, TArg1 arg1); + + private readonly ApproximateFloatComparer approximateFloatComparer = new ApproximateFloatComparer(1e-6f); [Theory] [InlineData(0)] @@ -154,6 +158,46 @@ namespace SixLabors.ImageSharp.Tests.Helpers Assert.Equal(expected, actual); } + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(30)] + [InlineData(63)] + public void PremultiplyVectorSpan(int length) + { + var rnd = new Random(42); + Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); + Vector4[] expected = source.Select(v => + { + Numerics.Premultiply(ref v); + return v; + }).ToArray(); + + Numerics.Premultiply(source); + + Assert.Equal(expected, source, this.approximateFloatComparer); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(30)] + [InlineData(63)] + public void UnPremultiplyVectorSpan(int length) + { + var rnd = new Random(42); + Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); + Vector4[] expected = source.Select(v => + { + Numerics.UnPremultiply(ref v); + return v; + }).ToArray(); + + Numerics.UnPremultiply(source); + + Assert.Equal(expected, source, this.approximateFloatComparer); + } + [Theory] [InlineData(64, 36, 96)] [InlineData(128, 16, 196)] diff --git a/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs b/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs deleted file mode 100644 index 605aa7d5a4..0000000000 --- a/tests/ImageSharp.Tests/Helpers/Vector4UtilsTests.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Linq; -using System.Numerics; - -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Helpers -{ - public class Vector4UtilsTests - { - private readonly ApproximateFloatComparer approximateFloatComparer = new ApproximateFloatComparer(1e-6f); - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(30)] - [InlineData(63)] - public void Premultiply_VectorSpan(int length) - { - var rnd = new Random(42); - Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); - Vector4[] expected = source.Select(v => - { - Vector4Utils.Premultiply(ref v); - return v; - }).ToArray(); - - Vector4Utils.Premultiply(source); - - Assert.Equal(expected, source, this.approximateFloatComparer); - } - - [Theory] - [InlineData(0)] - [InlineData(1)] - [InlineData(30)] - [InlineData(63)] - public void UnPremultiply_VectorSpan(int length) - { - var rnd = new Random(42); - Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1); - Vector4[] expected = source.Select(v => - { - Vector4Utils.UnPremultiply(ref v); - return v; - }).ToArray(); - - Vector4Utils.UnPremultiply(source); - - Assert.Equal(expected, source, this.approximateFloatComparer); - } - } -} diff --git a/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs b/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs index 113a39bff8..453eac5681 100644 --- a/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/L16Tests.cs @@ -113,8 +113,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats // Arrange L16 gray = default; const byte rgb = 128; - ushort scaledRgb = ImageMath.UpscaleFrom8BitTo16Bit(rgb); - ushort expected = ImageMath.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); + ushort scaledRgb = ColorNumerics.UpscaleFrom8BitTo16Bit(rgb); + ushort expected = ColorNumerics.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); @@ -131,7 +131,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats public void L16_ToRgba32(ushort input) { // Arrange - ushort expected = ImageMath.DownScaleFrom16BitTo8Bit(input); + ushort expected = ColorNumerics.DownScaleFrom16BitTo8Bit(input); var gray = new L16(input); // Act diff --git a/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs b/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs index 798eb3b1a5..a0895df12f 100644 --- a/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/L8Tests.cs @@ -136,7 +136,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats { // Arrange L8 gray = default; - byte expected = ImageMath.Get8BitBT709Luminance(rgb, rgb, rgb); + byte expected = ColorNumerics.Get8BitBT709Luminance(rgb, rgb, rgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); diff --git a/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs b/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs index 46d7d09b4c..b241adb20a 100644 --- a/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/La16Tests.cs @@ -138,7 +138,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats { // Arrange La16 gray = default; - byte expected = ImageMath.Get8BitBT709Luminance(rgb, rgb, rgb); + byte expected = ColorNumerics.Get8BitBT709Luminance(rgb, rgb, rgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); diff --git a/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs b/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs index 159abac4ad..6d1b595c78 100644 --- a/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/La32Tests.cs @@ -117,8 +117,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats // Arrange La32 gray = default; const byte rgb = 128; - ushort scaledRgb = ImageMath.UpscaleFrom8BitTo16Bit(rgb); - ushort expected = ImageMath.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); + ushort scaledRgb = ColorNumerics.UpscaleFrom8BitTo16Bit(rgb); + ushort expected = ColorNumerics.Get16BitBT709Luminance(scaledRgb, scaledRgb, scaledRgb); // Act gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); @@ -136,7 +136,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats public void La32_ToRgba32(ushort input) { // Arrange - ushort expected = ImageMath.DownScaleFrom16BitTo8Bit(input); + ushort expected = ColorNumerics.DownScaleFrom16BitTo8Bit(input); var gray = new La32(input, ushort.MaxValue); // Act diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs index e56cfe2260..0d83e2e7f2 100644 --- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs +++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs @@ -197,7 +197,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } } @@ -205,7 +205,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); } } @@ -232,7 +232,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } } @@ -240,7 +240,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); } } @@ -273,7 +273,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations if (this.HasUnassociatedAlpha) { - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } } @@ -281,7 +281,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { if (this.HasUnassociatedAlpha) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); } SRgbCompanding.Compress(ref v); @@ -394,12 +394,12 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); } void ExpectedAction(ref Vector4 v) { - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } TPixel[] source = CreatePixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); @@ -417,12 +417,12 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); } void ExpectedAction(ref Vector4 v) { - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } TPixel[] source = CreateScaledPixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); @@ -444,14 +444,14 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations { void SourceAction(ref Vector4 v) { - Vector4Utils.UnPremultiply(ref v); + Numerics.UnPremultiply(ref v); SRgbCompanding.Compress(ref v); } void ExpectedAction(ref Vector4 v) { SRgbCompanding.Expand(ref v); - Vector4Utils.Premultiply(ref v); + Numerics.Premultiply(ref v); } TPixel[] source = CreateScaledPixelTestData(count, (ref Vector4 v) => SourceAction(ref v)); From a5e969466747fe87fde8b802c945d34786afd848 Mon Sep 17 00:00:00 2001 From: Evangelink Date: Tue, 24 Nov 2020 15:05:09 +0100 Subject: [PATCH 41/61] More progress toward a working swizzler --- .../Processors/Transforms/ISwizzler.cs | 9 +++-- .../SwizzleProcessor{TSwizzler,TPixel}.cs | 21 +++++++---- .../Transforms/SwizzleProcessor{TSwizzler}.cs | 6 ++-- .../Processors/Transforms/SwizzleTests.cs | 35 +++++++++++++++++++ .../Processing/Transforms/SwizzleTests.cs | 18 +++++++--- 5 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs diff --git a/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs index 0230b7a868..075ea2d526 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs @@ -8,11 +8,16 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// public interface ISwizzler { + /// + /// Gets the size of the image after transformation. + /// + Size DestinationSize { get; } + /// /// Applies the swizzle transformation to a given point. /// /// Point to transform. - /// Transformed point. - Point Transform(Point point); + /// The transformed point. + void Transform(Point point, out Point newPoint); } } diff --git a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs index a42a4bf773..c9b9b4570c 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs @@ -1,31 +1,38 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { - internal class SwizzleProcessor : ImageProcessor + internal class SwizzleProcessor : TransformProcessor where TSwizzler : struct, ISwizzler where TPixel : unmanaged, IPixel { private readonly TSwizzler swizzler; + private readonly Size destinationSize; public SwizzleProcessor(Configuration configuration, TSwizzler swizzler, Image source, Rectangle sourceRectangle) : base(configuration, source, sourceRectangle) { this.swizzler = swizzler; + this.destinationSize = swizzler.DestinationSize; } - /// - protected override void OnFrameApply(ImageFrame source) + protected override Size GetDestinationSize() + => this.destinationSize; + + protected override void OnFrameApply(ImageFrame source, ImageFrame destination) { - for (int y = 0; y < source.Height; y++) + Point p = default; + Point newPoint; + for (p.Y = 0; p.Y < source.Height; p.Y++) { - var pixelRowSpan = source.GetPixelRowSpan(y); - for (int x = 0; x < source.Width; x++) + for (p.X = 0; p.X < source.Width; p.X++) { - var newPoint = this.swizzler.Transform(new Point(x, y)); + this.swizzler.Transform(p, out newPoint); + destination[newPoint.X, newPoint.Y] = source[p.X, p.Y]; } } } diff --git a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs index e5b95e673d..d48257334d 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler}.cs @@ -17,7 +17,9 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// /// The swizzler operation. public SwizzleProcessor(TSwizzler swizzler) - => this.Swizzler = swizzler; + { + this.Swizzler = swizzler; + } /// /// Gets the swizzler operation. @@ -27,6 +29,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle) where TPixel : unmanaged, IPixel - => new SwizzleProcessor(configuration, this, source, sourceRectangle); + => new SwizzleProcessor(configuration, this.Swizzler, source, sourceRectangle); } } diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs new file mode 100644 index 0000000000..b951a7fb0b --- /dev/null +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs @@ -0,0 +1,35 @@ +// Copyright (c) Six Labors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing.Extensions.Transforms; +using SixLabors.ImageSharp.Processing.Processors.Transforms; +using Xunit; + +namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms +{ + [GroupOutput("Transforms")] + public class SwizzleTests + { + private struct InvertXAndYSwizzler : ISwizzler + { + public Size DestinationSize => new Size(10, 10); + + public void Transform(Point point, out Point newPoint) + => newPoint = new Point(point.Y, point.X); + } + + [Theory] + [WithTestPatternImages(20, 37, PixelTypes.Rgba32)] + [WithTestPatternImages(53, 37, PixelTypes.Byte4)] + [WithTestPatternImages(17, 32, PixelTypes.Rgba32)] + public void InvertXAndYSwizzle(TestImageProvider provider) + where TPixel : unmanaged, IPixel + { + provider.RunValidatingProcessorTest( + ctx => ctx.Swizzle(default(InvertXAndYSwizzler)), + testOutputDetails: nameof(InvertXAndYSwizzler), + appendPixelTypeToFileName: false); + } + } +} diff --git a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs index 2862df2127..c54bfa25e6 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs @@ -11,21 +11,29 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms { private struct InvertXAndYSwizzler : ISwizzler { - public Point Transform(Point point) => new Point(point.Y, point.X); + public Size DestinationSize => new Size(10, 10); + + public void Transform(Point point, out Point newPoint) + => newPoint = new Point(point.Y, point.X); } [Fact] - public void RotateDegreesFloatRotateProcessorWithAnglesSet() + public void InvertXAndYSwizzlerSetsCorrectSizes() { + int width = 5; + int height = 10; + this.operations.Swizzle(default(InvertXAndYSwizzler)); SwizzleProcessor processor = this.Verify>(); - // assert that pixels have been changed + Assert.Equal(processor.Swizzler.DestinationSize.Width, height); + Assert.Equal(processor.Swizzler.DestinationSize.Height, width); this.operations.Swizzle(default(InvertXAndYSwizzler)); - SwizzleProcessor processor2 = this.Verify>(); + SwizzleProcessor processor2 = this.Verify>(1); - // assert that pixels have been changed (i.e. back to original) + Assert.Equal(processor2.Swizzler.DestinationSize.Width, width); + Assert.Equal(processor2.Swizzler.DestinationSize.Height, height); } } } From e9738f21eb964fb7a1d0db23c2a3f6c8336dd18d Mon Sep 17 00:00:00 2001 From: Evangelink Date: Tue, 24 Nov 2020 15:38:55 +0100 Subject: [PATCH 42/61] Fix unit test --- .../Processing/Transforms/SwizzleTests.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs index c54bfa25e6..9c2701ae78 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs @@ -11,7 +11,12 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms { private struct InvertXAndYSwizzler : ISwizzler { - public Size DestinationSize => new Size(10, 10); + public InvertXAndYSwizzler(Size sourceSize) + { + this.DestinationSize = new Size(sourceSize.Height, sourceSize.Width); + } + + public Size DestinationSize { get; } public void Transform(Point point, out Point newPoint) => newPoint = new Point(point.Y, point.X); @@ -23,13 +28,13 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms int width = 5; int height = 10; - this.operations.Swizzle(default(InvertXAndYSwizzler)); + this.operations.Swizzle(new InvertXAndYSwizzler(new Size(width, height))); SwizzleProcessor processor = this.Verify>(); Assert.Equal(processor.Swizzler.DestinationSize.Width, height); Assert.Equal(processor.Swizzler.DestinationSize.Height, width); - this.operations.Swizzle(default(InvertXAndYSwizzler)); + this.operations.Swizzle(new InvertXAndYSwizzler(processor.Swizzler.DestinationSize)); SwizzleProcessor processor2 = this.Verify>(1); Assert.Equal(processor2.Swizzler.DestinationSize.Width, width); From a665bce50e370effd28ec92ee34e15c5d2dd78dd Mon Sep 17 00:00:00 2001 From: Evangelink Date: Tue, 24 Nov 2020 15:55:59 +0100 Subject: [PATCH 43/61] Update integration tests --- .../Processing/Processors/Transforms/SwizzleTests.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs index b951a7fb0b..4d3b604948 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs @@ -13,7 +13,12 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms { private struct InvertXAndYSwizzler : ISwizzler { - public Size DestinationSize => new Size(10, 10); + public InvertXAndYSwizzler(Size sourceSize) + { + this.DestinationSize = new Size(sourceSize.Height, sourceSize.Width); + } + + public Size DestinationSize { get; } public void Transform(Point point, out Point newPoint) => newPoint = new Point(point.Y, point.X); @@ -26,8 +31,9 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms public void InvertXAndYSwizzle(TestImageProvider provider) where TPixel : unmanaged, IPixel { + Image image = provider.GetImage(); provider.RunValidatingProcessorTest( - ctx => ctx.Swizzle(default(InvertXAndYSwizzler)), + ctx => ctx.Swizzle(new InvertXAndYSwizzler(new Size(image.Width, image.Height))), testOutputDetails: nameof(InvertXAndYSwizzler), appendPixelTypeToFileName: false); } From 9d72a840d2cd0fec9e2c5937953a769d60425f72 Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Tue, 24 Nov 2020 21:45:47 +0200 Subject: [PATCH 44/61] Add cache for Nuget packages --- .github/workflows/build-and-test.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index b618e1e657..823158e0ce 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -56,6 +56,14 @@ jobs: git fetch --prune --unshallow git submodule -q update --init --recursive + - name: Setup nuget cache + uses: actions/cache@v2 + id: nuget-cache + with: + path: ~/.nuget + key: ${{ runner.os }}-nuget-${{ hashFiles('**/ImageSharp*.csproj') }} + restore-keys: ${{ runner.os }}-nuget- + - name: Build shell: pwsh run: ./ci-build.ps1 "${{matrix.options.framework}}" From a0bf4e331ca62888781b152edb255abc721c367a Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Tue, 24 Nov 2020 22:08:13 +0200 Subject: [PATCH 45/61] Add props and targets to hash for cache key --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 823158e0ce..402319c264 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -61,7 +61,7 @@ jobs: id: nuget-cache with: path: ~/.nuget - key: ${{ runner.os }}-nuget-${{ hashFiles('**/ImageSharp*.csproj') }} + key: ${{ runner.os }}-nuget-${{ hashFiles('**/ImageSharp*.csproj', '**/*.props', '**/*.targets') }} restore-keys: ${{ runner.os }}-nuget- - name: Build From 41ed93cbebe4c3ef8831bf6eb26a6816a9c3a6c2 Mon Sep 17 00:00:00 2001 From: AlexNDRmac Date: Tue, 24 Nov 2020 22:17:10 +0200 Subject: [PATCH 46/61] Fix file pattern for hashFiles --- .github/workflows/build-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 402319c264..04b1d745f6 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -61,7 +61,7 @@ jobs: id: nuget-cache with: path: ~/.nuget - key: ${{ runner.os }}-nuget-${{ hashFiles('**/ImageSharp*.csproj', '**/*.props', '**/*.targets') }} + key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }} restore-keys: ${{ runner.os }}-nuget- - name: Build From 14129427519ac33a9fe7188c40473577f13c4907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20Lev=C3=A9?= Date: Thu, 26 Nov 2020 09:36:38 +0100 Subject: [PATCH 47/61] Apply suggested change for test Avoid relying on the submodule change by implementing the invert swizzle operation --- .../Processors/Transforms/SwizzleTests.cs | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs index 4d3b604948..97b6a6414c 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs @@ -2,8 +2,10 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Extensions.Transforms; using SixLabors.ImageSharp.Processing.Processors.Transforms; +using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms @@ -31,11 +33,26 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms public void InvertXAndYSwizzle(TestImageProvider provider) where TPixel : unmanaged, IPixel { - Image image = provider.GetImage(); - provider.RunValidatingProcessorTest( - ctx => ctx.Swizzle(new InvertXAndYSwizzler(new Size(image.Width, image.Height))), - testOutputDetails: nameof(InvertXAndYSwizzler), - appendPixelTypeToFileName: false); + using Image expectedImage = provider.GetImage(); + using Image image = provider.GetImage(); + + image.Mutate(ctx => ctx.Swizzle(new InvertXAndYSwizzler(new Size(image.Width, image.Height)))); + + image.DebugSave( + provider, + nameof(InvertXAndYSwizzler), + appendPixelTypeToFileName: false, + appendSourceFileOrDescription: true); + + image.Mutate(ctx => ctx.Swizzle(new InvertXAndYSwizzler(new Size(image.Width, image.Height)))); + + image.DebugSave( + provider, + "Unswizzle", + appendPixelTypeToFileName: false, + appendSourceFileOrDescription: true); + + ImageComparer.Exact.VerifySimilarity(expectedImage, image); } } } From ea7c8a157dcf90c85ff2a261dee541f372c8642d Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Thu, 26 Nov 2020 11:12:19 +0100 Subject: [PATCH 48/61] Ensure Span length of source and destination are equal during pixel conversions. --- src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index 01bdbd1c0b..7819b1ebdb 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -262,7 +262,9 @@ namespace SixLabors.ImageSharp.Formats.Bmp private void Write24Bit(Stream stream, Buffer2D pixels) where TPixel : unmanaged, IPixel { - using (IManagedByteBuffer row = this.AllocateRow(pixels.Width, 3)) + int width = pixels.Width; + int rowBytesWithoutPadding = width * 3; + using (IManagedByteBuffer row = this.AllocateRow(width, 3)) { for (int y = pixels.Height - 1; y >= 0; y--) { @@ -270,8 +272,8 @@ namespace SixLabors.ImageSharp.Formats.Bmp PixelOperations.Instance.ToBgr24Bytes( this.configuration, pixelSpan, - row.GetSpan(), - pixelSpan.Length); + row.Slice(0, rowBytesWithoutPadding), + width); stream.Write(row.Array, 0, row.Length()); } } @@ -286,7 +288,9 @@ namespace SixLabors.ImageSharp.Formats.Bmp private void Write16Bit(Stream stream, Buffer2D pixels) where TPixel : unmanaged, IPixel { - using (IManagedByteBuffer row = this.AllocateRow(pixels.Width, 2)) + int width = pixels.Width; + int rowBytesWithoutPadding = width * 2; + using (IManagedByteBuffer row = this.AllocateRow(width, 2)) { for (int y = pixels.Height - 1; y >= 0; y--) { @@ -295,7 +299,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp PixelOperations.Instance.ToBgra5551Bytes( this.configuration, pixelSpan, - row.GetSpan(), + row.Slice(0, rowBytesWithoutPadding), pixelSpan.Length); stream.Write(row.Array, 0, row.Length()); @@ -341,7 +345,8 @@ namespace SixLabors.ImageSharp.Formats.Bmp using IndexedImageFrame quantized = frameQuantizer.BuildPaletteAndQuantizeFrame(image, image.Bounds()); ReadOnlySpan quantizedColors = quantized.Palette.Span; - PixelOperations.Instance.ToBgra32(this.configuration, quantizedColors, MemoryMarshal.Cast(colorPalette)); + var quantizedColorBytes = quantizedColors.Length * 4; + PixelOperations.Instance.ToBgra32(this.configuration, quantizedColors, MemoryMarshal.Cast(colorPalette.Slice(0, quantizedColorBytes))); Span colorPaletteAsUInt = MemoryMarshal.Cast(colorPalette); for (int i = 0; i < colorPaletteAsUInt.Length; i++) { From e687f7b10acdd13facceb3e80d2d0cb0fdfb5b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20Lev=C3=A9?= Date: Thu, 26 Nov 2020 23:12:33 +0100 Subject: [PATCH 49/61] Address review comments --- src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs | 4 ++-- .../Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs index 075ea2d526..efa3e35a4b 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ISwizzler.cs @@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms /// Applies the swizzle transformation to a given point. /// /// Point to transform. - /// The transformed point. - void Transform(Point point, out Point newPoint); + /// The transformed point. + Point Transform(Point point); } } diff --git a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs index c9b9b4570c..aab17d2920 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SwizzleProcessor{TSwizzler,TPixel}.cs @@ -29,10 +29,11 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms Point newPoint; for (p.Y = 0; p.Y < source.Height; p.Y++) { + Span rowSpan = source.GetPixelRowSpan(p.Y); for (p.X = 0; p.X < source.Width; p.X++) { - this.swizzler.Transform(p, out newPoint); - destination[newPoint.X, newPoint.Y] = source[p.X, p.Y]; + newPoint = this.swizzler.Transform(p); + destination[newPoint.X, newPoint.Y] = rowSpan[p.X]; } } } From 1547379bdd95974b8e756f6ce8f60c9c215e4f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20Lev=C3=A9?= Date: Thu, 26 Nov 2020 23:25:36 +0100 Subject: [PATCH 50/61] Forgot to commit tests --- .../Processing/Processors/Transforms/SwizzleTests.cs | 4 ++-- tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs index 97b6a6414c..f508744fae 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/SwizzleTests.cs @@ -22,8 +22,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Transforms public Size DestinationSize { get; } - public void Transform(Point point, out Point newPoint) - => newPoint = new Point(point.Y, point.X); + public Point Transform(Point point) + => new Point(point.Y, point.X); } [Theory] diff --git a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs index 9c2701ae78..cde6aeca36 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/SwizzleTests.cs @@ -18,8 +18,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Transforms public Size DestinationSize { get; } - public void Transform(Point point, out Point newPoint) - => newPoint = new Point(point.Y, point.X); + public Point Transform(Point point) + => new Point(point.Y, point.X); } [Fact] From c71f9e3393ec74ae95478b4f9f87cce3ebc6f874 Mon Sep 17 00:00:00 2001 From: Sergio Pedri Date: Fri, 27 Nov 2020 17:12:49 +0100 Subject: [PATCH 51/61] Reduce code duplication due to reified generics --- .../Convolution/BokehBlurProcessor.cs | 56 +++++++++++++++++++ .../Convolution/BokehBlurProcessor{TPixel}.cs | 50 +---------------- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs index 8a4c703e0c..352960f415 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs @@ -1,6 +1,11 @@ // Copyright (c) Six Labors. // Licensed under the Apache License, Version 2.0. +using System; +using System.Numerics; +using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp.Processing.Processors.Convolution @@ -77,5 +82,56 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle) where TPixel : unmanaged, IPixel => new BokehBlurProcessor(configuration, this, source, sourceRectangle); + + /// + /// A implementing the horizontal convolution logic for . + /// + /// + /// This type is located in the non-generic class and not in , where + /// it is actually used, because it does not use any generic parameters internally. Defining in a non-generic class means that there will only + /// ever be a single instantiation of this type for the JIT/AOT compilers to process, instead of having duplicate versions for each pixel type. + /// + internal readonly struct ApplyHorizontalConvolutionRowOperation : IRowOperation + { + private readonly Rectangle bounds; + private readonly Buffer2D targetValues; + private readonly Buffer2D sourceValues; + private readonly Complex64[] kernel; + private readonly float z; + private readonly float w; + private readonly int maxY; + private readonly int maxX; + + [MethodImpl(InliningOptions.ShortMethod)] + public ApplyHorizontalConvolutionRowOperation( + Rectangle bounds, + Buffer2D targetValues, + Buffer2D sourceValues, + Complex64[] kernel, + float z, + float w) + { + this.bounds = bounds; + this.maxY = this.bounds.Bottom - 1; + this.maxX = this.bounds.Right - 1; + this.targetValues = targetValues; + this.sourceValues = sourceValues; + this.kernel = kernel; + this.z = z; + this.w = w; + } + + /// + [MethodImpl(InliningOptions.ShortMethod)] + public void Invoke(int y) + { + Span targetRowSpan = this.targetValues.GetRowSpan(y).Slice(this.bounds.X); + + for (int x = 0; x < this.bounds.Width; x++) + { + Buffer2DUtils.Convolve4AndAccumulatePartials(this.kernel, this.sourceValues, targetRowSpan, y, x, this.bounds.Y, this.maxY, this.bounds.X, this.maxX, this.z, this.w); + } + } + } } } diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs index cf5367343b..dfe54bf2e3 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs @@ -127,7 +127,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution in verticalOperation); // Compute the horizontal 1D convolutions and accumulate the partial results on the target buffer - var horizontalOperation = new ApplyHorizontalConvolutionRowOperation(sourceRectangle, processingBuffer, firstPassBuffer, kernel, parameters.Z, parameters.W); + var horizontalOperation = new BokehBlurProcessor.ApplyHorizontalConvolutionRowOperation(sourceRectangle, processingBuffer, firstPassBuffer, kernel, parameters.Z, parameters.W); ParallelRowIterator.IterateRows( configuration, sourceRectangle, @@ -175,52 +175,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution } } - /// - /// A implementing the horizontal convolution logic for . - /// - private readonly struct ApplyHorizontalConvolutionRowOperation : IRowOperation - { - private readonly Rectangle bounds; - private readonly Buffer2D targetValues; - private readonly Buffer2D sourceValues; - private readonly Complex64[] kernel; - private readonly float z; - private readonly float w; - private readonly int maxY; - private readonly int maxX; - - [MethodImpl(InliningOptions.ShortMethod)] - public ApplyHorizontalConvolutionRowOperation( - Rectangle bounds, - Buffer2D targetValues, - Buffer2D sourceValues, - Complex64[] kernel, - float z, - float w) - { - this.bounds = bounds; - this.maxY = this.bounds.Bottom - 1; - this.maxX = this.bounds.Right - 1; - this.targetValues = targetValues; - this.sourceValues = sourceValues; - this.kernel = kernel; - this.z = z; - this.w = w; - } - - /// - [MethodImpl(InliningOptions.ShortMethod)] - public void Invoke(int y) - { - Span targetRowSpan = this.targetValues.GetRowSpan(y).Slice(this.bounds.X); - - for (int x = 0; x < this.bounds.Width; x++) - { - Buffer2DUtils.Convolve4AndAccumulatePartials(this.kernel, this.sourceValues, targetRowSpan, y, x, this.bounds.Y, this.maxY, this.bounds.X, this.maxX, this.z, this.w); - } - } - } - /// /// A implementing the gamma exposure logic for . /// @@ -304,7 +258,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Convolution for (int x = 0; x < this.bounds.Width; x++) { ref Vector4 v = ref Unsafe.Add(ref sourceRef, x); - var clamp = Numerics.Clamp(v, low, high); + Vector4 clamp = Numerics.Clamp(v, low, high); v.X = MathF.Pow(clamp.X, this.inverseGamma); v.Y = MathF.Pow(clamp.Y, this.inverseGamma); v.Z = MathF.Pow(clamp.Z, this.inverseGamma); From 9323852f218abd7e7f72aa5d3910668219c76e06 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 29 Nov 2020 14:55:49 +0100 Subject: [PATCH 52/61] Slice destination to (0, count) --- .../PixelOperations{TPixel}.Generated.cs | 48 +++++++++---------- .../PixelOperations{TPixel}.Generated.tt | 4 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs index cc36c7d134..7919eb9780 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs @@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromArgb32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromArgb32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromArgb32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -79,7 +79,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToArgb32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToArgb32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToArgb32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgr24Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgr24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromBgr24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgr24Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgr24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToBgr24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -187,7 +187,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgra32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgra32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromBgra32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -223,7 +223,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgra32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgra32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToBgra32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -259,7 +259,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromL8Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromL8(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromL8(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -295,7 +295,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToL8Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToL8(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToL8(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -331,7 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromL16Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromL16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromL16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -367,7 +367,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToL16Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToL16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToL16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -403,7 +403,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromLa16Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromLa16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromLa16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -439,7 +439,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToLa16Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToLa16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToLa16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -475,7 +475,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromLa32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromLa32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromLa32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -511,7 +511,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToLa32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToLa32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToLa32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -547,7 +547,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgb24Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgb24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromRgb24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -583,7 +583,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgb24Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgb24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToRgb24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -619,7 +619,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgba32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgba32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromRgba32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -655,7 +655,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgba32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgba32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToRgba32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -691,7 +691,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgb48Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgb48(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromRgb48(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -727,7 +727,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgb48Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgb48(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToRgb48(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -763,7 +763,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgba64Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgba64(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromRgba64(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -799,7 +799,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgba64Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgba64(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToRgba64(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } /// @@ -835,7 +835,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgra5551Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgra5551(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); + this.FromBgra5551(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } /// @@ -871,7 +871,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgra5551Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgra5551(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); + this.ToBgra5551(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); } } } diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt index 21ed328fac..75f884774e 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt @@ -48,7 +48,7 @@ [MethodImpl(MethodImplOptions.AggressiveInlining)] public void From<#=pixelType#>Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.From<#=pixelType#>(configuration, MemoryMarshal.Cast>(sourceBytes).Slice(0, count), destinationPixels); + this.From<#=pixelType#>(configuration, MemoryMarshal.Cast>(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); } <# @@ -90,7 +90,7 @@ [MethodImpl(MethodImplOptions.AggressiveInlining)] public void To<#=pixelType#>Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.To<#=pixelType#>(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast>(destBytes)); + this.To<#=pixelType#>(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast>(destBytes.Slice(0, count))); } <# } From 74b2e359c1414d1720567ac27e9b248c3f91a766 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 29 Nov 2020 15:56:41 +0100 Subject: [PATCH 53/61] Revert "Slice destination to (0, count)" This reverts commit 3fba6f81edd9297cd44ffffcc4a7a79cf0b76021. --- .../PixelOperations{TPixel}.Generated.cs | 48 +++++++++---------- .../PixelOperations{TPixel}.Generated.tt | 4 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs index 7919eb9780..cc36c7d134 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.cs @@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromArgb32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromArgb32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromArgb32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -79,7 +79,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToArgb32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToArgb32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToArgb32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgr24Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgr24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromBgr24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgr24Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgr24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToBgr24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -187,7 +187,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgra32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgra32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromBgra32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -223,7 +223,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgra32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgra32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToBgra32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -259,7 +259,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromL8Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromL8(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromL8(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -295,7 +295,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToL8Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToL8(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToL8(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -331,7 +331,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromL16Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromL16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromL16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -367,7 +367,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToL16Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToL16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToL16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -403,7 +403,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromLa16Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromLa16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromLa16(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -439,7 +439,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToLa16Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToLa16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToLa16(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -475,7 +475,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromLa32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromLa32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromLa32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -511,7 +511,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToLa32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToLa32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToLa32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -547,7 +547,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgb24Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgb24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromRgb24(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -583,7 +583,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgb24Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgb24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToRgb24(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -619,7 +619,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgba32Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgba32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromRgba32(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -655,7 +655,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgba32Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgba32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToRgba32(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -691,7 +691,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgb48Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgb48(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromRgb48(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -727,7 +727,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgb48Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgb48(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToRgb48(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -763,7 +763,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromRgba64Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromRgba64(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromRgba64(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -799,7 +799,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToRgba64Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToRgba64(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToRgba64(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } /// @@ -835,7 +835,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void FromBgra5551Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.FromBgra5551(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.FromBgra5551(configuration, MemoryMarshal.Cast(sourceBytes).Slice(0, count), destinationPixels); } /// @@ -871,7 +871,7 @@ namespace SixLabors.ImageSharp.PixelFormats [MethodImpl(MethodImplOptions.AggressiveInlining)] public void ToBgra5551Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.ToBgra5551(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes.Slice(0, count))); + this.ToBgra5551(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast(destBytes)); } } } diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt index 75f884774e..21ed328fac 100644 --- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.Generated.tt @@ -48,7 +48,7 @@ [MethodImpl(MethodImplOptions.AggressiveInlining)] public void From<#=pixelType#>Bytes(Configuration configuration, ReadOnlySpan sourceBytes, Span destinationPixels, int count) { - this.From<#=pixelType#>(configuration, MemoryMarshal.Cast>(sourceBytes).Slice(0, count), destinationPixels.Slice(0, count)); + this.From<#=pixelType#>(configuration, MemoryMarshal.Cast>(sourceBytes).Slice(0, count), destinationPixels); } <# @@ -90,7 +90,7 @@ [MethodImpl(MethodImplOptions.AggressiveInlining)] public void To<#=pixelType#>Bytes(Configuration configuration, ReadOnlySpan sourcePixels, Span destBytes, int count) { - this.To<#=pixelType#>(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast>(destBytes.Slice(0, count))); + this.To<#=pixelType#>(configuration, sourcePixels.Slice(0, count), MemoryMarshal.Cast>(destBytes)); } <# } From 2fd1aa12cb05b7bd41c180ad089a655f4bfc29af Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 29 Nov 2020 16:27:11 +0100 Subject: [PATCH 54/61] Another attempt using Slice for the destination in PixelOperations convert From and To --- .../Argb32.PixelOperations.Generated.cs | 22 ++++--------------- .../Bgr24.PixelOperations.Generated.cs | 22 ++++--------------- .../Bgra32.PixelOperations.Generated.cs | 22 ++++--------------- .../Bgra5551.PixelOperations.Generated.cs | 21 ++++-------------- .../L16.PixelOperations.Generated.cs | 21 ++++-------------- .../Generated/L8.PixelOperations.Generated.cs | 21 ++++-------------- .../La16.PixelOperations.Generated.cs | 21 ++++-------------- .../La32.PixelOperations.Generated.cs | 21 ++++-------------- .../Rgb24.PixelOperations.Generated.cs | 22 ++++--------------- .../Rgb48.PixelOperations.Generated.cs | 21 ++++-------------- .../Rgba32.PixelOperations.Generated.cs | 21 ++++-------------- .../Rgba64.PixelOperations.Generated.cs | 21 ++++-------------- .../Generated/_Common.ttinclude | 6 ++--- 13 files changed, 51 insertions(+), 211 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs index 9df708d44d..cedd1762d8 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Argb32.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromArgb32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void FromVector4Destructive( Configuration configuration, @@ -59,7 +57,6 @@ namespace SixLabors.ImageSharp.PixelFormats { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale)); } - /// public override void ToRgba32( Configuration configuration, @@ -87,7 +84,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToArgb32(source, dest); } - /// public override void ToBgra32( Configuration configuration, @@ -115,7 +111,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToArgb32(source, dest); } - /// public override void ToRgb24( Configuration configuration, @@ -143,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToArgb32(source, dest); } - /// public override void ToBgr24( Configuration configuration, @@ -171,7 +165,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgr24.ToArgb32(source, dest); } - /// public override void ToL8( Configuration configuration, @@ -192,7 +185,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToL16( Configuration configuration, @@ -213,7 +205,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -234,7 +225,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -255,7 +245,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -276,7 +265,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -297,7 +285,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -318,14 +305,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromArgb32(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToArgb32(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToArgb32(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs index a66a6e12c8..c98e356568 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgr24.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromBgr24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void FromVector4Destructive( Configuration configuration, @@ -59,7 +57,6 @@ namespace SixLabors.ImageSharp.PixelFormats { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } - /// public override void ToRgba32( Configuration configuration, @@ -87,7 +84,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToBgr24(source, dest); } - /// public override void ToArgb32( Configuration configuration, @@ -115,7 +111,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToBgr24(source, dest); } - /// public override void ToBgra32( Configuration configuration, @@ -143,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToBgr24(source, dest); } - /// public override void ToRgb24( Configuration configuration, @@ -171,7 +165,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToBgr24(source, dest); } - /// public override void ToL8( Configuration configuration, @@ -192,7 +185,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToL16( Configuration configuration, @@ -213,7 +205,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -234,7 +225,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -255,7 +245,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -276,7 +265,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -297,7 +285,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -318,14 +305,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgr24(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToBgr24(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToBgr24(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs index 77b665a4c7..02bb675328 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra32.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromBgra32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void FromVector4Destructive( Configuration configuration, @@ -59,7 +57,6 @@ namespace SixLabors.ImageSharp.PixelFormats { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale)); } - /// public override void ToRgba32( Configuration configuration, @@ -87,7 +84,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToBgra32(source, dest); } - /// public override void ToArgb32( Configuration configuration, @@ -115,7 +111,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToBgra32(source, dest); } - /// public override void ToRgb24( Configuration configuration, @@ -143,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToBgra32(source, dest); } - /// public override void ToBgr24( Configuration configuration, @@ -171,7 +165,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgr24.ToBgra32(source, dest); } - /// public override void ToL8( Configuration configuration, @@ -192,7 +185,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToL16( Configuration configuration, @@ -213,7 +205,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -234,7 +225,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -255,7 +245,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -276,7 +265,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -297,7 +285,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -318,14 +305,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra32(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToBgra32(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToBgra32(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs index 1d13722e42..a02ffc3a43 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Bgra5551.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromBgra5551(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToL16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromBgra5551(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToBgra5551(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToBgra5551(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs index 03b84be5d7..954ef2d985 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L16.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromL16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL16(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToL16(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToL16(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs index f52e77b1a3..b3d809de5c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/L8.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromL8(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToL16( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromL8(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToL8(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToL8(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs index e01399b8af..14618d0265 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La16.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromLa16(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToL16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa16(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToLa16(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToLa16(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs index 0aa2afef52..9620a1df4d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/La32.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromLa32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToL16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromLa32(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToLa32(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToLa32(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs index a9303f9d8a..2fe7f3c20a 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb24.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromRgb24(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void FromVector4Destructive( Configuration configuration, @@ -59,7 +57,6 @@ namespace SixLabors.ImageSharp.PixelFormats { Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply)); } - /// public override void ToRgba32( Configuration configuration, @@ -87,7 +84,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgba32.ToRgb24(source, dest); } - /// public override void ToArgb32( Configuration configuration, @@ -115,7 +111,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToRgb24(source, dest); } - /// public override void ToBgra32( Configuration configuration, @@ -143,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToRgb24(source, dest); } - /// public override void ToBgr24( Configuration configuration, @@ -171,7 +165,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgr24.ToRgb24(source, dest); } - /// public override void ToL8( Configuration configuration, @@ -192,7 +185,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToL16( Configuration configuration, @@ -213,7 +205,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -234,7 +225,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -255,7 +245,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -276,7 +265,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -297,7 +285,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -318,14 +305,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb24(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToRgb24(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToRgb24(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs index 30328366d8..031008fe1c 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgb48.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromRgb48(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToL16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgb48(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToRgb48(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToRgb48(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs index c23198e760..16f96d2da1 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba32.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromRgba32(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -67,7 +65,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromArgb32.ToRgba32(source, dest); } - /// public override void ToBgra32( Configuration configuration, @@ -95,7 +92,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgra32.ToRgba32(source, dest); } - /// public override void ToRgb24( Configuration configuration, @@ -123,7 +119,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromRgb24.ToRgba32(source, dest); } - /// public override void ToBgr24( Configuration configuration, @@ -151,7 +146,6 @@ namespace SixLabors.ImageSharp.PixelFormats Span dest = MemoryMarshal.Cast(destinationPixels); PixelConverter.FromBgr24.ToRgba32(source, dest); } - /// public override void ToL8( Configuration configuration, @@ -172,7 +166,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToL16( Configuration configuration, @@ -193,7 +186,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -214,7 +206,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -235,7 +226,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -256,7 +246,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToRgba64( Configuration configuration, @@ -277,7 +266,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -298,14 +286,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba32(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToRgba32(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToRgba32(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs index 129e9ff0b5..1f1571e91d 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/Rgba64.PixelOperations.Generated.cs @@ -21,14 +21,13 @@ namespace SixLabors.ImageSharp.PixelFormats /// internal partial class PixelOperations : PixelOperations { - - /// + /// public override void FromRgba64(Configuration configuration, ReadOnlySpan source, Span destinationPixels) { Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -37,9 +36,8 @@ namespace SixLabors.ImageSharp.PixelFormats Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } - /// public override void ToArgb32( Configuration configuration, @@ -60,7 +58,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToBgr24( Configuration configuration, @@ -81,7 +78,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToBgra32( Configuration configuration, @@ -102,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToL8( Configuration configuration, @@ -123,7 +118,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToL16( Configuration configuration, @@ -144,7 +138,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToLa16( Configuration configuration, @@ -165,7 +158,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToLa32( Configuration configuration, @@ -186,7 +178,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToRgb24( Configuration configuration, @@ -207,7 +198,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToRgba32( Configuration configuration, @@ -228,7 +218,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToRgb48( Configuration configuration, @@ -249,7 +238,6 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void ToBgra5551( Configuration configuration, @@ -270,14 +258,13 @@ namespace SixLabors.ImageSharp.PixelFormats dp.FromRgba64(sp); } } - /// public override void From( Configuration configuration, ReadOnlySpan sourcePixels, Span destinationPixels) { - PixelOperations.Instance.ToRgba64(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.ToRgba64(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } } diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude index 7c2eccedcc..784ecf6fb8 100644 --- a/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude +++ b/src/ImageSharp/PixelFormats/PixelImplementations/PixelOperations/Generated/_Common.ttinclude @@ -57,7 +57,7 @@ using SixLabors.ImageSharp.PixelFormats.Utils; ReadOnlySpan sourcePixels, Span<<#=pixelType#>> destinationPixels) { - PixelOperations.Instance.To<#=pixelType#>(configuration, sourcePixels, destinationPixels); + PixelOperations.Instance.To<#=pixelType#>(configuration, sourcePixels, destinationPixels.Slice(0, sourcePixels.Length)); } <#+ @@ -72,7 +72,7 @@ using SixLabors.ImageSharp.PixelFormats.Utils; Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(source, destinationPixels, nameof(destinationPixels)); - source.CopyTo(destinationPixels); + source.CopyTo(destinationPixels.Slice(0, source.Length)); } /// @@ -81,7 +81,7 @@ using SixLabors.ImageSharp.PixelFormats.Utils; Guard.NotNull(configuration, nameof(configuration)); Guard.DestinationShouldNotBeTooShort(sourcePixels, destinationPixels, nameof(destinationPixels)); - sourcePixels.CopyTo(destinationPixels); + sourcePixels.CopyTo(destinationPixels.Slice(0, sourcePixels.Length)); } <#+ } From 472d6391925e2780b20e50b40ed356c45942cfc6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Tue, 1 Dec 2020 23:22:46 +0000 Subject: [PATCH 55/61] Update to use new props/targets plus cleanup. --- .editorconfig | 745 ++++++++++-------- Directory.Build.props | 129 +-- Directory.Build.targets | 29 +- ImageSharp.sln | 147 +++- shared-infrastructure | 2 +- src/Directory.Build.props | 30 +- src/Directory.Build.targets | 84 +- src/ImageSharp/ImageSharp.csproj | 39 +- .../Exif/DC-008-Translation-2019-E.pdf | Bin 2280856 -> 0 bytes .../Exif/DC-X008-Translation-2019-E.pdf | Bin 0 -> 2456981 bytes tests/Directory.Build.props | 28 +- tests/Directory.Build.targets | 26 +- .../Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs | 12 +- .../Codecs/MultiImageBenchmarkBase.cs | 61 +- tests/ImageSharp.Benchmarks/Config.cs | 33 +- .../ImageSharp.Tests.ProfilingSandbox.csproj | 1 + tests/ImageSharp.Tests.ruleset | 10 + tests/ImageSharp.Tests/FileTestBase.cs | 115 --- .../Formats/GeneralFormatTests.cs | 37 +- .../Formats/ImageFormatManagerTests.cs | 45 +- tests/ImageSharp.Tests/GlobalSuppressions.cs | 12 - .../ImageSharp.Tests/ImageSharp.Tests.csproj | 4 - tests/ImageSharp.Tests/TestImages.cs | 2 +- .../Tests/TestEnvironmentTests.cs | 16 +- 24 files changed, 693 insertions(+), 914 deletions(-) delete mode 100644 src/ImageSharp/Metadata/Profiles/Exif/DC-008-Translation-2019-E.pdf create mode 100644 src/ImageSharp/Metadata/Profiles/Exif/DC-X008-Translation-2019-E.pdf create mode 100644 tests/ImageSharp.Tests.ruleset delete mode 100644 tests/ImageSharp.Tests/FileTestBase.cs delete mode 100644 tests/ImageSharp.Tests/GlobalSuppressions.cs diff --git a/.editorconfig b/.editorconfig index 0e4883082c..83670fa830 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,373 +1,436 @@ -############################################################################### -# EditorConfig is awesome: http://EditorConfig.org -############################################################################### +# Version: 1.6.2 (Using https://semver.org/) +# Updated: 2020-11-02 +# See https://github.com/RehanSaeed/EditorConfig/releases for release notes. +# See https://github.com/RehanSaeed/EditorConfig for updates to this file. +# See http://EditorConfig.org for more information about .editorconfig files. -############################################################################### -# Top-most EditorConfig file -############################################################################### +########################################## +# Common Settings +########################################## + +# This file is the top-most EditorConfig file root = true -############################################################################### -# Set default behavior to: -# a UTF-8 encoding, -# Unix-style line endings, -# a newline ending the file, -# 4 space indentation, and -# trimming of trailing whitespace -############################################################################### +# All Files [*] charset = utf-8 -end_of_line = lf -insert_final_newline = true indent_style = space indent_size = 4 +end_of_line = lf +insert_final_newline = true trim_trailing_whitespace = true -############################################################################### -# Set file behavior to: -# 2 space indentation -############################################################################### -[*.{cmd,config,csproj,json,props,ps1,resx,sh,targets}] -indent_size = 2 +########################################## +# File Extension Settings +########################################## -############################################################################### -# Set file behavior to: -# Windows-style line endings, and -# tabular indentation -############################################################################### +# Visual Studio Solution Files [*.sln] +indent_style = tab + +# Visual Studio XML Project Files +[*.{csproj,vbproj,vcxproj.filters,proj,projitems,shproj}] +indent_size = 2 + +# T4 Templates Files +[*.{tt,ttinclude}] end_of_line = crlf + +# XML Configuration Files +[*.{xml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}] +indent_size = 2 + +# JSON Files +[*.{json,json5,webmanifest}] +indent_size = 2 + +# YAML Files +[*.{yml,yaml}] +indent_size = 2 + +# Markdown Files +[*.md] +trim_trailing_whitespace = false + +# Web Files +[*.{htm,html,js,jsm,ts,tsx,css,sass,scss,less,svg,vue}] +indent_size = 2 + +# Batch Files +[*.{cmd,bat}] +end_of_line = crlf + +# Makefiles +[Makefile] indent_style = tab -############################################################################### -# Set dotnet naming rules to: -# suggest async members be pascal case suffixed with Async -# suggest const declarations be pascal case -# suggest interfaces be pascal case prefixed with I -# suggest parameters be camel case -# suggest private and internal static fields be camel case -# suggest private and internal fields be camel case -# suggest public and protected declarations be pascal case -# suggest static readonly declarations be pascal case -# suggest type parameters be prefixed with T -############################################################################### -[*.cs] -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members - -dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations - -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces - -dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion -dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case -dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters - -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.symbols = private_and_internal_static_fields - -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.symbols = private_and_internal_fields - -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations -dotnet_naming_symbols.public_and_protected_declarations.applicable_kinds = method, field, event, property - -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations - -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters - -############################################################################### -# Set dotnet naming styles to define: -# camel case -# pascal case -# pascal case suffixed with Async -# pascal case prefixed with I -# pascal case prefixed with T -############################################################################### -[*.cs] -dotnet_naming_style.camel_case.capitalization = camel_case - -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case -dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async - -dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I - -dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T - -############################################################################### -# Set dotnet naming symbols to: -# async members -# const declarations -# interfaces -# private and internal fields -# private and internal static fields -# public and protected declarations -# static readonly declarations -# type parameters -############################################################################### -[*.cs] -dotnet_naming_symbols.async_members.required_modifiers = async - -dotnet_naming_symbols.const_declarations.required_modifiers = const - -dotnet_naming_symbols.interfaces.applicable_kinds = interface - -dotnet_naming_symbols.parameters.applicable_kinds = parameter - -dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field - -dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field -dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static - -dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected - -dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly - -dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter - -############################################################################### -# Set dotnet sort options to: -# do not separate import directives into groups, and -# sort system directives first -############################################################################### -[*.cs] -dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = true +########################################## +# File Header (Uncomment to support file headers) +# https://docs.microsoft.com/visualstudio/ide/reference/add-file-header +########################################## -############################################################################### -# Set dotnet style options to: -# suggest null-coalescing expressions, -# suggest collection-initializers, -# suggest explicit tuple names, -# suggest null-propogation -# suggest object-initializers, -# generate parentheses in arithmetic binary operators for clarity, -# generate parentheses in other binary operators for clarity, -# don't generate parentheses in other operators if unnecessary, -# generate parentheses in relational binary operators for clarity, -# warn when not using predefined-types for locals, parameters, and members, -# generate predefined-types of type names for member access, -# generate auto properties, -# suggest compound assignment, -# generate conditional expression over assignment, -# generate conditional expression over return, -# suggest inferred anonymous types, -# suggest inferred tuple names, -# suggest 'is null' checks over '== null', -# don't generate 'this.' and 'Me.' for events, -# warn when not using 'this.' and 'Me.' for fields, -# warn when not using 'this.' and 'Me.' for methods, -# warn when not using 'this.' and 'Me.' for properties, -# suggest readonly fields, and -# generate accessibility modifiers for non interface members -############################################################################### -[*.cs] -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_object_initializer = true:suggestion - -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +# [*.{cs,csx,cake,vb,vbx,tt,ttinclude}] +file_header_template = Copyright (c) Six Labors.\nLicensed under the Apache License, Version 2.0. -dotnet_style_predefined_type_for_locals_parameters_members = true:warning -dotnet_style_predefined_type_for_member_access = true:silent +# SA1636: File header copyright text should match +# Justification: .editorconfig supports file headers. If this is changed to a value other than "none", a stylecop.json file will need to added to the project. +# dotnet_diagnostic.SA1636.severity = none -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +########################################## +# .NET Language Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions +########################################## -dotnet_style_qualification_for_event = false:silent +# .NET Code Style Settings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#net-code-style-settings +[*.{cs,csx,cake,vb,vbx}] +# "this." and "Me." qualifiers +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#this-and-me dotnet_style_qualification_for_field = true:warning -dotnet_style_qualification_for_method = true:warning dotnet_style_qualification_for_property = true:warning - -dotnet_style_readonly_field = true:suggestion -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent - -############################################################################### -# Set dotnet style options to: -# suggest removing all unused parameters -############################################################################### -[*.cs] -dotnet_code_quality_unused_parameters = all:suggestion - -############################################################################### -# Set csharp indent options to: -# indent block contents, -# not indent braces, -# indent case contents, -# not indent case contents when block, -# indent labels one less than the current, and -# indent switch labels -############################################################################### -[*.cs] -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents = true -csharp_indent_case_contents_when_block = false -csharp_indent_labels = one_less_than_current -csharp_indent_switch_labels = true - -############################################################################### -# Set csharp new-line options to: -# insert a new-line before "catch", -# insert a new-line before "else", -# insert a new-line before "finally", -# insert a new-line before members in anonymous-types, -# insert a new-line before members in object-initializers, and -# insert a new-line before all open braces -############################################################################### -[*.cs] -csharp_new_line_before_catch = true +dotnet_style_qualification_for_method = true:warning +dotnet_style_qualification_for_event = true:warning +# Language keywords instead of framework type names for type references +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#language-keywords +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:warning +# Modifier preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#normalize-modifiers +dotnet_style_require_accessibility_modifiers = always:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning +visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:warning +dotnet_style_readonly_field = true:warning +# Parentheses preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parentheses-preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion +# Expression-level preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences +dotnet_style_object_initializer = true:warning +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion +dotnet_style_prefer_conditional_expression_over_return = false:suggestion +dotnet_style_prefer_compound_assignment = true:warning +# Null-checking preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#null-checking-preferences +dotnet_style_coalesce_expression = true:warning +dotnet_style_null_propagation = true:warning +# Parameter preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parameter-preferences +dotnet_code_quality_unused_parameters = all:warning +# More style options (Undocumented) +# https://github.com/MicrosoftDocs/visualstudio-docs/issues/3641 +dotnet_style_operator_placement_when_wrapping = end_of_line +# https://github.com/dotnet/roslyn/pull/40070 +dotnet_style_prefer_simplified_interpolation = true:warning + +# C# Code Style Settings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-code-style-settings +[*.{cs,csx,cake}] +# Implicit and explicit types +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#implicit-and-explicit-types +csharp_style_var_for_built_in_types = never +csharp_style_var_when_type_is_apparent = true:warning +csharp_style_var_elsewhere = false:warning +# Expression-bodied members +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-bodied-members +csharp_style_expression_bodied_methods = true:warning +csharp_style_expression_bodied_constructors = true:warning +csharp_style_expression_bodied_operators = true:warning +csharp_style_expression_bodied_properties = true:warning +csharp_style_expression_bodied_indexers = true:warning +csharp_style_expression_bodied_accessors = true:warning +csharp_style_expression_bodied_lambdas = true:warning +csharp_style_expression_bodied_local_functions = true:warning +# Pattern matching +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#pattern-matching +csharp_style_pattern_matching_over_is_with_cast_check = true:warning +csharp_style_pattern_matching_over_as_with_null_check = true:warning +# Inlined variable declarations +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#inlined-variable-declarations +csharp_style_inlined_variable_declaration = true:warning +# Expression-level preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences +csharp_prefer_simple_default_expression = true:warning +# "Null" checking preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-null-checking-preferences +csharp_style_throw_expression = true:warning +csharp_style_conditional_delegate_call = true:warning +# Code block preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#code-block-preferences +csharp_prefer_braces = true:warning +# Unused value preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#unused-value-preferences +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +# Index and range preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#index-and-range-preferences +csharp_style_prefer_index_operator = true:warning +csharp_style_prefer_range_operator = true:warning +# Miscellaneous preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#miscellaneous-preferences +csharp_style_deconstructed_variable_declaration = true:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_using_directive_placement = outside_namespace:warning +csharp_prefer_static_local_function = true:warning +csharp_prefer_simple_using_statement = true:suggestion + +########################################## +# .NET Formatting Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-code-style-settings-reference#formatting-conventions +########################################## + +# Organize usings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#organize-using-directives +dotnet_sort_system_directives_first = true +# Newline options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#new-line-options +csharp_new_line_before_open_brace = all csharp_new_line_before_else = true +csharp_new_line_before_catch = true csharp_new_line_before_finally = true - -csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_before_members_in_object_initializers = true - -csharp_new_line_before_open_brace = all - -############################################################################### -# Set csharp preserve options to: -# preserve single-line blocks, and -# preserve single-line statements -############################################################################### -[*.cs] -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = true - -############################################################################### -# Set csharp space options to: -# remove any space after a cast, -# add a space after the colon in an inheritance clause, -# add a space after a comma, -# remove any space after a dot, -# add a space after keywords in control flow statements, -# add a space after a semicolon in a "for" statement, -# add a space before and after binary operators, -# remove space around declaration statements, -# add a space before the colon in an inheritance clause, -# remove any space before a comma, -# remove any space before a dot, -# remove any space before an open square-bracket, -# remove any space before a semicolon in a "for" statement, -# remove any space between empty square-brackets, -# remove any space between a method call's empty parameter list parenthesis, -# remove any space between a method call's name and its opening parenthesis, -# remove any space between a method call's parameter list parenthesis, -# remove any space between a method declaration's empty parameter list parenthesis, -# remove any space between a method declaration's name and its openening parenthesis, -# remove any space between a method declaration's parameter list parenthesis, -# remove any space between parentheses, and -# remove any space between square brackets -############################################################################### -[*.cs] +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true +# Indentation options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#indentation-options +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = no_change +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents_when_block = false +# Spacing options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#spacing-options csharp_space_after_cast = false -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_after_comma = true -csharp_space_after_dot = false csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_after_semicolon_in_for_statement = true - -csharp_space_around_binary_operators = before_and_after -csharp_space_around_declaration_statements = do_not_ignore - +csharp_space_between_parentheses = false csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_after_comma = true csharp_space_before_comma = false +csharp_space_after_dot = false csharp_space_before_dot = false -csharp_space_before_open_square_brackets = false +csharp_space_after_semicolon_in_for_statement = true csharp_space_before_semicolon_in_for_statement = false - +csharp_space_around_declaration_statements = false +csharp_space_before_open_square_brackets = false csharp_space_between_empty_square_brackets = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_declaration_name_and_open_parenthesis = false -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_parentheses = false csharp_space_between_square_brackets = false +# Wrapping options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#wrap-options +csharp_preserve_single_line_statements = false +csharp_preserve_single_line_blocks = true -############################################################################### -# Set csharp style options to: -# generate braces, -# suggest simple default expressions, -# generate a preferred modifier order, -# suggest conditional delegate calls, -# suggest deconstructed variable declarations, -# generate expression-bodied accessors, -# generate expression-bodied constructors, -# generate expression-bodied indexers, -# generate expression-bodied lambdas, -# generate expression-bodied methods, -# generate expression-bodied operators, -# generate expression-bodied properties, -# suggest inlined variable declarations, -# suggest local over anonymous functions, -# suggest pattern-matching over "as" with "null" check, -# suggest pattern-matching over "is" with "cast" check, -# suggest throw expressions, -# generate a discard variable for unused value expression statements, -# suggest a discard variable for unused assignments, -# warn when using var for built-in types, -# warn when using var when the type is not apparent, and -# warn when not using var when the type is apparent -# warn when using simplified "using" declaration -############################################################################### -[*.cs] -csharp_prefer_braces = true:silent -csharp_prefer_simple_default_expression = true:suggestion -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent - -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion - -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_constructors = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_methods = true:silent -csharp_style_expression_bodied_operators = true:silent -csharp_style_expression_bodied_properties = true:silent - -csharp_style_inlined_variable_declaration = true:suggestion - -csharp_style_pattern_local_over_anonymous_function = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion - -csharp_style_throw_expression = true:suggestion - -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_style_unused_value_assignment_preference = discard_variable:suggestion - -csharp_style_var_for_built_in_types = never -csharp_style_var_when_type_is_apparent = true:warning -csharp_style_var_elsewhere = false:warning +########################################## +# .NET Naming Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-naming-conventions +########################################## + +[*.{cs,csx,cake,vb,vbx}] + +########################################## +# Styles +########################################## + +# camel_case_style - Define the camelCase style +dotnet_naming_style.camel_case_style.capitalization = camel_case +# pascal_case_style - Define the PascalCase style +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +# first_upper_style - The first character must start with an upper-case character +dotnet_naming_style.first_upper_style.capitalization = first_word_upper +# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I' +dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case +dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I +# prefix_type_parameters_with_t_style - Generic Type Parameters must be PascalCase and the first character must be a 'T' +dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case +dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T +# disallowed_style - Anything that has this style applied is marked as disallowed +dotnet_naming_style.disallowed_style.capitalization = pascal_case +dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____ +dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____ +# internal_error_style - This style should never occur... if it does, it indicates a bug in file or in the parser using the file +dotnet_naming_style.internal_error_style.capitalization = pascal_case +dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____ +dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____ + +########################################## +# .NET Design Guideline Field Naming Rules +# Naming rules for fields follow the .NET Framework design guidelines +# https://docs.microsoft.com/dotnet/standard/design-guidelines/index +########################################## + +# All public/protected/protected_internal constant fields must be PascalCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning + +# All public/protected/protected_internal static readonly fields must be PascalCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning + +# No other public/protected/protected_internal fields are allowed +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = error + +########################################## +# StyleCop Field Naming Rules +# Naming rules for fields follow the StyleCop analyzers +# This does not override any rules using disallowed_style above +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers +########################################## + +# All constant fields must be PascalCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1303.md +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.symbols = stylecop_constant_fields_group +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.severity = warning + +# All static readonly fields must be PascalCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1311.md +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.symbols = stylecop_static_readonly_fields_group +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.severity = warning + +# No non-private instance fields are allowed +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1401.md +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_kinds = field +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.symbols = stylecop_fields_must_be_private_group +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.style = disallowed_style +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.severity = error + +# Private fields must be camelCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1306.md +dotnet_naming_symbols.stylecop_private_fields_group.applicable_accessibilities = private +dotnet_naming_symbols.stylecop_private_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.symbols = stylecop_private_fields_group +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.style = camel_case_style +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.severity = warning + +# Local variables must be camelCase +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1312.md +dotnet_naming_symbols.stylecop_local_fields_group.applicable_accessibilities = local +dotnet_naming_symbols.stylecop_local_fields_group.applicable_kinds = local +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.symbols = stylecop_local_fields_group +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.style = camel_case_style +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.severity = silent + +# This rule should never fire. However, it's included for at least two purposes: +# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers. +# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#). +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = * +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error + + +########################################## +# Other Naming Rules +########################################## + +# All of the following must be PascalCase: +# - Namespaces +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Classes and Enumerations +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Delegates +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types +# - Constructors, Properties, Events, Methods +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members +dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property +dotnet_naming_rule.element_rule.symbols = element_group +dotnet_naming_rule.element_rule.style = pascal_case_style +dotnet_naming_rule.element_rule.severity = warning + +# Interfaces use PascalCase and are prefixed with uppercase 'I' +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.interface_group.applicable_kinds = interface +dotnet_naming_rule.interface_rule.symbols = interface_group +dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style +dotnet_naming_rule.interface_rule.severity = warning + +# Generics Type Parameters use PascalCase and are prefixed with uppercase 'T' +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter +dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group +dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style +dotnet_naming_rule.type_parameter_rule.severity = warning + +# Function parameters use camelCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/naming-parameters +dotnet_naming_symbols.parameters_group.applicable_kinds = parameter +dotnet_naming_rule.parameters_rule.symbols = parameters_group +dotnet_naming_rule.parameters_rule.style = camel_case_style +dotnet_naming_rule.parameters_rule.severity = warning + +########################################## +# License +########################################## +# The following applies as to the .editorconfig file ONLY, and is +# included below for reference, per the requirements of the license +# corresponding to this .editorconfig file. +# See: https://github.com/RehanSaeed/EditorConfig +# +# MIT License +# +# Copyright (c) 2017-2019 Muhammad Rehan Saeed +# Copyright (c) 2019 Henry Gabryjelski +# +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +########################################## diff --git a/Directory.Build.props b/Directory.Build.props index bb97810a8f..3a133efe7a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,133 +10,12 @@ that is done by the file that imports us. --> - - $(MSBuildThisFileDirectory)artifacts/ - $(SixLaborsProjectCategory)/$(MSBuildProjectName) - https://github.com/SixLabors/ImageSharp/ - $(MSBuildThisFileDirectory)/.runsettings + + $(MSBuildThisFileDirectory) - - - true - $(BaseArtifactsPath)obj/$(BaseArtifactsPathSuffix)/ - portable - full - disable - true - true - - - - - - $(DefineConstants);SUPPORTS_MATHF - $(DefineConstants);SUPPORTS_HASHCODE - $(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS - $(DefineConstants);SUPPORTS_SPAN_STREAM - $(DefineConstants);SUPPORTS_ENCODING_STRING - $(DefineConstants);SUPPORTS_RUNTIME_INTRINSICS - $(DefineConstants);SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_HOTPATH - $(DefineConstants);SUPPORTS_CREATESPAN - - - $(DefineConstants);SUPPORTS_MATHF - $(DefineConstants);SUPPORTS_HASHCODE - $(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS - $(DefineConstants);SUPPORTS_SPAN_STREAM - $(DefineConstants);SUPPORTS_ENCODING_STRING - $(DefineConstants);SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_CREATESPAN - - - $(DefineConstants);SUPPORTS_MATHF - $(DefineConstants);SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_CREATESPAN - - - $(DefineConstants);SUPPORTS_MATHF - $(DefineConstants);SUPPORTS_HASHCODE - $(DefineConstants);SUPPORTS_SPAN_STREAM - $(DefineConstants);SUPPORTS_ENCODING_STRING - $(DefineConstants);SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_CREATESPAN - - - $(DefineConstants);SUPPORTS_CODECOVERAGE - - - $(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS - $(DefineConstants);SUPPORTS_CODECOVERAGE - - - - - Six Labors and contributors - $(BaseArtifactsPath)bin/$(BaseArtifactsPathSuffix)/ - Six Labors - $(BaseArtifactsPath)pkg/$(BaseArtifactsPathSuffix)/$(Configuration)/ - SixLabors.ImageSharp - 0.0.1 - $(PackageVersion) - - - - - - v - normal - - - - - Copyright © Six Labors - strict;IOperation - true - 8.0 - en - true - sixlabors.imagesharp.128.png - Apache-2.0 - $(RepositoryUrl) - true - git - - https://www.myget.org/F/sixlabors/api/v3/index.json; - https://api.nuget.org/v3/index.json; - - https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json; - https://www.myget.org/F/coverlet-dev/api/v3/index.json; - - true - $(MSBuildThisFileDirectory)shared-infrastructure/SixLabors.snk - 00240000048000009400000006020000002400005253413100040000010001000147e6fe6766715eec6cfed61f1e7dcdbf69748a3e355c67e9d8dfd953acab1d5e012ba34b23308166fdc61ee1d0390d5f36d814a6091dd4b5ed9eda5a26afced924c683b4bfb4b3d64b0586a57eff9f02b1f84e3cb0ddd518bd1697f2c84dcbb97eb8bb5c7801be12112ed0ec86db934b0e9a5171e6bb1384b6d2f7d54dfa97 - true - - - - - - - - - - - + + diff --git a/Directory.Build.targets b/Directory.Build.targets index 2a7d25b977..9730219482 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -5,35 +5,12 @@ Directory.Build.targets is automatically picked up and imported by Microsoft.Common.targets. This file needs to exist, even if empty so that files in the parent directory tree, with the same name, are not imported - instead. The import fairly late and most other props/targets will have been + instead. They import fairly late and most other props/targets will have been imported beforehand. We also don't need to add ourselves to MSBuildAllProjects, as that is done by the file that imports us. --> - - - $(DefineConstants);$(OS) - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/ImageSharp.sln b/ImageSharp.sln index b1d3176ad2..8dfab6033c 100644 --- a/ImageSharp.sln +++ b/ImageSharp.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28902.138 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_root", "_root", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig .gitattributes = .gitattributes @@ -15,7 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ci-test.ps1 = ci-test.ps1 Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets - GitVersion.yml = GitVersion.yml LICENSE = LICENSE README.md = README.md EndProjectSection @@ -46,6 +45,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{56801022 ProjectSection(SolutionItems) = preProject tests\Directory.Build.props = tests\Directory.Build.props tests\Directory.Build.targets = tests\Directory.Build.targets + tests\ImageSharp.Tests.ruleset = tests\ImageSharp.Tests.ruleset EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Images", "Images", "{FA55F5DE-11A6-487D-ABA4-BC93A02717DD}" @@ -54,16 +54,23 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Input", "Input", "{9DA226A1 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bmp", "Bmp", "{1A82C5F6-90E0-4E97-BE16-A825C046B493}" ProjectSection(SolutionItems) = preProject + tests\Images\Input\Bmp\9S.BMP = tests\Images\Input\Bmp\9S.BMP + tests\Images\Input\Bmp\ba-bm.bmp = tests\Images\Input\Bmp\ba-bm.bmp tests\Images\Input\Bmp\BitmapCoreHeaderQR.bmp = tests\Images\Input\Bmp\BitmapCoreHeaderQR.bmp tests\Images\Input\Bmp\BITMAPV5HEADER.bmp = tests\Images\Input\Bmp\BITMAPV5HEADER.bmp tests\Images\Input\Bmp\Car.bmp = tests\Images\Input\Bmp\Car.bmp + tests\Images\Input\Bmp\DIAMOND.BMP = tests\Images\Input\Bmp\DIAMOND.BMP tests\Images\Input\Bmp\F.bmp = tests\Images\Input\Bmp\F.bmp + tests\Images\Input\Bmp\GMARBLE.BMP = tests\Images\Input\Bmp\GMARBLE.BMP + tests\Images\Input\Bmp\invalidPaletteSize.bmp = tests\Images\Input\Bmp\invalidPaletteSize.bmp tests\Images\Input\Bmp\issue735.bmp = tests\Images\Input\Bmp\issue735.bmp tests\Images\Input\Bmp\neg_height.bmp = tests\Images\Input\Bmp\neg_height.bmp tests\Images\Input\Bmp\pal1.bmp = tests\Images\Input\Bmp\pal1.bmp tests\Images\Input\Bmp\pal1p1.bmp = tests\Images\Input\Bmp\pal1p1.bmp tests\Images\Input\Bmp\pal4.bmp = tests\Images\Input\Bmp\pal4.bmp tests\Images\Input\Bmp\pal4rle.bmp = tests\Images\Input\Bmp\pal4rle.bmp + tests\Images\Input\Bmp\pal4rlecut.bmp = tests\Images\Input\Bmp\pal4rlecut.bmp + tests\Images\Input\Bmp\pal4rletrns.bmp = tests\Images\Input\Bmp\pal4rletrns.bmp tests\Images\Input\Bmp\pal8-0.bmp = tests\Images\Input\Bmp\pal8-0.bmp tests\Images\Input\Bmp\pal8gs.bmp = tests\Images\Input\Bmp\pal8gs.bmp tests\Images\Input\Bmp\pal8offs.bmp = tests\Images\Input\Bmp\pal8offs.bmp @@ -71,26 +78,45 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bmp", "Bmp", "{1A82C5F6-90E tests\Images\Input\Bmp\pal8os2v1_winv2.bmp = tests\Images\Input\Bmp\pal8os2v1_winv2.bmp tests\Images\Input\Bmp\pal8os2v2-16.bmp = tests\Images\Input\Bmp\pal8os2v2-16.bmp tests\Images\Input\Bmp\pal8os2v2.bmp = tests\Images\Input\Bmp\pal8os2v2.bmp + tests\Images\Input\Bmp\pal8oversizepal.bmp = tests\Images\Input\Bmp\pal8oversizepal.bmp + tests\Images\Input\Bmp\pal8rlecut.bmp = tests\Images\Input\Bmp\pal8rlecut.bmp + tests\Images\Input\Bmp\pal8rletrns.bmp = tests\Images\Input\Bmp\pal8rletrns.bmp tests\Images\Input\Bmp\pal8v4.bmp = tests\Images\Input\Bmp\pal8v4.bmp tests\Images\Input\Bmp\pal8v5.bmp = tests\Images\Input\Bmp\pal8v5.bmp + tests\Images\Input\Bmp\PINES.BMP = tests\Images\Input\Bmp\PINES.BMP tests\Images\Input\Bmp\rgb16-565.bmp = tests\Images\Input\Bmp\rgb16-565.bmp tests\Images\Input\Bmp\rgb16-565pal.bmp = tests\Images\Input\Bmp\rgb16-565pal.bmp tests\Images\Input\Bmp\rgb16.bmp = tests\Images\Input\Bmp\rgb16.bmp tests\Images\Input\Bmp\rgb16bfdef.bmp = tests\Images\Input\Bmp\rgb16bfdef.bmp tests\Images\Input\Bmp\rgb24.bmp = tests\Images\Input\Bmp\rgb24.bmp + tests\Images\Input\Bmp\rgb24jpeg.bmp = tests\Images\Input\Bmp\rgb24jpeg.bmp + tests\Images\Input\Bmp\rgb24largepal.bmp = tests\Images\Input\Bmp\rgb24largepal.bmp + tests\Images\Input\Bmp\rgb24png.bmp = tests\Images\Input\Bmp\rgb24png.bmp + tests\Images\Input\Bmp\rgb24rle24.bmp = tests\Images\Input\Bmp\rgb24rle24.bmp tests\Images\Input\Bmp\rgb32.bmp = tests\Images\Input\Bmp\rgb32.bmp tests\Images\Input\Bmp\rgb32bf.bmp = tests\Images\Input\Bmp\rgb32bf.bmp tests\Images\Input\Bmp\rgb32bfdef.bmp = tests\Images\Input\Bmp\rgb32bfdef.bmp + tests\Images\Input\Bmp\rgb32h52.bmp = tests\Images\Input\Bmp\rgb32h52.bmp tests\Images\Input\Bmp\rgba32-1010102.bmp = tests\Images\Input\Bmp\rgba32-1010102.bmp tests\Images\Input\Bmp\rgba32.bmp = tests\Images\Input\Bmp\rgba32.bmp tests\Images\Input\Bmp\rgba32abf.bmp = tests\Images\Input\Bmp\rgba32abf.bmp tests\Images\Input\Bmp\rgba32h56.bmp = tests\Images\Input\Bmp\rgba32h56.bmp + tests\Images\Input\Bmp\rgba32v4.bmp = tests\Images\Input\Bmp\rgba32v4.bmp + tests\Images\Input\Bmp\rle24rlecut.bmp = tests\Images\Input\Bmp\rle24rlecut.bmp + tests\Images\Input\Bmp\rle24rletrns.bmp = tests\Images\Input\Bmp\rle24rletrns.bmp + tests\Images\Input\Bmp\rle4-delta-320x240.bmp = tests\Images\Input\Bmp\rle4-delta-320x240.bmp + tests\Images\Input\Bmp\rle8-blank-160x120.bmp = tests\Images\Input\Bmp\rle8-blank-160x120.bmp + tests\Images\Input\Bmp\rle8-delta-320x240.bmp = tests\Images\Input\Bmp\rle8-delta-320x240.bmp tests\Images\Input\Bmp\RunLengthEncoded-inverted.bmp = tests\Images\Input\Bmp\RunLengthEncoded-inverted.bmp tests\Images\Input\Bmp\RunLengthEncoded.bmp = tests\Images\Input\Bmp\RunLengthEncoded.bmp + tests\Images\Input\Bmp\SKATER.BMP = tests\Images\Input\Bmp\SKATER.BMP + tests\Images\Input\Bmp\SPADE.BMP = tests\Images\Input\Bmp\SPADE.BMP + tests\Images\Input\Bmp\SUNFLOW.BMP = tests\Images\Input\Bmp\SUNFLOW.BMP tests\Images\Input\Bmp\test16-inverted.bmp = tests\Images\Input\Bmp\test16-inverted.bmp tests\Images\Input\Bmp\test16.bmp = tests\Images\Input\Bmp\test16.bmp tests\Images\Input\Bmp\test8-inverted.bmp = tests\Images\Input\Bmp\test8-inverted.bmp tests\Images\Input\Bmp\test8.bmp = tests\Images\Input\Bmp\test8.bmp + tests\Images\Input\Bmp\WARPD.BMP = tests\Images\Input\Bmp\WARPD.BMP EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gif", "Gif", "{EE3FB0B3-1C31-41E9-93AB-BA800560A868}" @@ -99,8 +125,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gif", "Gif", "{EE3FB0B3-1C3 tests\Images\Input\Gif\base_4x1.gif = tests\Images\Input\Gif\base_4x1.gif tests\Images\Input\Gif\cheers.gif = tests\Images\Input\Gif\cheers.gif tests\Images\Input\Gif\giphy.gif = tests\Images\Input\Gif\giphy.gif + tests\Images\Input\Gif\GlobalQuantizationTest.gif = tests\Images\Input\Gif\GlobalQuantizationTest.gif + tests\Images\Input\Gif\image-zero-height.gif = tests\Images\Input\Gif\image-zero-height.gif + tests\Images\Input\Gif\image-zero-size.gif = tests\Images\Input\Gif\image-zero-size.gif + tests\Images\Input\Gif\image-zero-width.gif = tests\Images\Input\Gif\image-zero-width.gif tests\Images\Input\Gif\kumin.gif = tests\Images\Input\Gif\kumin.gif + tests\Images\Input\Gif\large_comment.gif = tests\Images\Input\Gif\large_comment.gif tests\Images\Input\Gif\leo.gif = tests\Images\Input\Gif\leo.gif + tests\Images\Input\Gif\max-height.gif = tests\Images\Input\Gif\max-height.gif + tests\Images\Input\Gif\max-width.gif = tests\Images\Input\Gif\max-width.gif + tests\Images\Input\Gif\receipt.gif = tests\Images\Input\Gif\receipt.gif tests\Images\Input\Gif\rings.gif = tests\Images\Input\Gif\rings.gif tests\Images\Input\Gif\trans.gif = tests\Images\Input\Gif\trans.gif EndProjectSection @@ -116,6 +150,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Jpg", "Jpg", "{DB21FED7-E8C EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "baseline", "baseline", "{195BA3D3-3E9F-4BC5-AB40-5F9FEB638146}" ProjectSection(SolutionItems) = preProject + tests\Images\Input\Jpg\baseline\640px-Unequalized_Hawkes_Bay_NZ.jpg = tests\Images\Input\Jpg\baseline\640px-Unequalized_Hawkes_Bay_NZ.jpg tests\Images\Input\Jpg\baseline\AsianCarvingLowContrast.jpg = tests\Images\Input\Jpg\baseline\AsianCarvingLowContrast.jpg tests\Images\Input\Jpg\baseline\badeof.jpg = tests\Images\Input\Jpg\baseline\badeof.jpg tests\Images\Input\Jpg\baseline\badrst.jpg = tests\Images\Input\Jpg\baseline\badrst.jpg @@ -125,6 +160,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "baseline", "baseline", "{19 tests\Images\Input\Jpg\baseline\Floorplan.jpg = tests\Images\Input\Jpg\baseline\Floorplan.jpg tests\Images\Input\Jpg\baseline\gamma_dalai_lama_gray.jpg = tests\Images\Input\Jpg\baseline\gamma_dalai_lama_gray.jpg tests\Images\Input\Jpg\baseline\Hiyamugi.jpg = tests\Images\Input\Jpg\baseline\Hiyamugi.jpg + tests\Images\Input\Jpg\baseline\iptc-psAPP13-wIPTCempty.jpg = tests\Images\Input\Jpg\baseline\iptc-psAPP13-wIPTCempty.jpg + tests\Images\Input\Jpg\baseline\iptc.jpg = tests\Images\Input\Jpg\baseline\iptc.jpg tests\Images\Input\Jpg\baseline\jpeg400jfif.jpg = tests\Images\Input\Jpg\baseline\jpeg400jfif.jpg tests\Images\Input\Jpg\baseline\jpeg420exif.jpg = tests\Images\Input\Jpg\baseline\jpeg420exif.jpg tests\Images\Input\Jpg\baseline\jpeg420small.jpg = tests\Images\Input\Jpg\baseline\jpeg420small.jpg @@ -167,6 +204,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JpegSnoopReports", "JpegSno EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "issues", "issues", "{5C9B689F-B96D-47BE-A208-C23B1B2A8570}" ProjectSection(SolutionItems) = preProject + tests\Images\Input\Jpg\issues\issue-1076-invalid-subsampling.jpg = tests\Images\Input\Jpg\issues\issue-1076-invalid-subsampling.jpg + tests\Images\Input\Jpg\issues\issue-1221-identify-multi-frame.jpg = tests\Images\Input\Jpg\issues\issue-1221-identify-multi-frame.jpg + tests\Images\Input\Jpg\issues\issue1006-incorrect-resize.jpg = tests\Images\Input\Jpg\issues\issue1006-incorrect-resize.jpg + tests\Images\Input\Jpg\issues\issue1049-exif-resize.jpg = tests\Images\Input\Jpg\issues\issue1049-exif-resize.jpg tests\Images\Input\Jpg\issues\Issue159-MissingFF00-Progressive-Bedroom.jpg = tests\Images\Input\Jpg\issues\Issue159-MissingFF00-Progressive-Bedroom.jpg tests\Images\Input\Jpg\issues\Issue159-MissingFF00-Progressive-Girl.jpg = tests\Images\Input\Jpg\issues\Issue159-MissingFF00-Progressive-Girl.jpg tests\Images\Input\Jpg\issues\Issue178-BadCoeffsProgressive-Lemon.jpg = tests\Images\Input\Jpg\issues\Issue178-BadCoeffsProgressive-Lemon.jpg @@ -214,6 +255,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fuzz", "fuzz", "{516A3532-6 tests\Images\Input\Jpg\issues\fuzz\Issue826-ArgumentException-C.jpg = tests\Images\Input\Jpg\issues\fuzz\Issue826-ArgumentException-C.jpg tests\Images\Input\Jpg\issues\fuzz\Issue827-AccessViolationException.jpg = tests\Images\Input\Jpg\issues\fuzz\Issue827-AccessViolationException.jpg tests\Images\Input\Jpg\issues\fuzz\Issue839-ExecutionEngineException.jpg = tests\Images\Input\Jpg\issues\fuzz\Issue839-ExecutionEngineException.jpg + tests\Images\Input\Jpg\issues\fuzz\Issue922-AccessViolationException.jpg = tests\Images\Input\Jpg\issues\fuzz\Issue922-AccessViolationException.jpg EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JpegSnoopReports", "JpegSnoopReports", "{714CDEA1-9AE6-4F76-B8B1-A7DB8C1DB82F}" @@ -261,16 +303,24 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Png", "Png", "{E1C42A6F-913 ProjectSection(SolutionItems) = preProject tests\Images\Input\Png\banner7-adam.png = tests\Images\Input\Png\banner7-adam.png tests\Images\Input\Png\banner8-index.png = tests\Images\Input\Png\banner8-index.png + tests\Images\Input\Png\basn3p01.png = tests\Images\Input\Png\basn3p01.png + tests\Images\Input\Png\basn3p02.png = tests\Images\Input\Png\basn3p02.png + tests\Images\Input\Png\basn3p04.png = tests\Images\Input\Png\basn3p04.png + tests\Images\Input\Png\basn3p08.png = tests\Images\Input\Png\basn3p08.png tests\Images\Input\Png\big-corrupted-chunk.png = tests\Images\Input\Png\big-corrupted-chunk.png + tests\Images\Input\Png\bike-small.png = tests\Images\Input\Png\bike-small.png tests\Images\Input\Png\Bike.png = tests\Images\Input\Png\Bike.png tests\Images\Input\Png\BikeGrayscale.png = tests\Images\Input\Png\BikeGrayscale.png tests\Images\Input\Png\blur.png = tests\Images\Input\Png\blur.png tests\Images\Input\Png\bpp1.png = tests\Images\Input\Png\bpp1.png + tests\Images\Input\Png\Bradley01.png = tests\Images\Input\Png\Bradley01.png + tests\Images\Input\Png\Bradley02.png = tests\Images\Input\Png\Bradley02.png tests\Images\Input\Png\CalliphoraPartial.png = tests\Images\Input\Png\CalliphoraPartial.png tests\Images\Input\Png\CalliphoraPartialGrayscale.png = tests\Images\Input\Png\CalliphoraPartialGrayscale.png tests\Images\Input\Png\chunklength1.png = tests\Images\Input\Png\chunklength1.png tests\Images\Input\Png\chunklength2.png = tests\Images\Input\Png\chunklength2.png tests\Images\Input\Png\cross.png = tests\Images\Input\Png\cross.png + tests\Images\Input\Png\david.png = tests\Images\Input\Png\david.png tests\Images\Input\Png\ducky.png = tests\Images\Input\Png\ducky.png tests\Images\Input\Png\filter0.png = tests\Images\Input\Png\filter0.png tests\Images\Input\Png\filter1.png = tests\Images\Input\Png\filter1.png @@ -293,6 +343,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Png", "Png", "{E1C42A6F-913 tests\Images\Input\Png\iftbbn0g04.png = tests\Images\Input\Png\iftbbn0g04.png tests\Images\Input\Png\indexed.png = tests\Images\Input\Png\indexed.png tests\Images\Input\Png\interlaced.png = tests\Images\Input\Png\interlaced.png + tests\Images\Input\Png\InvalidTextData.png = tests\Images\Input\Png\InvalidTextData.png tests\Images\Input\Png\kaboom.png = tests\Images\Input\Png\kaboom.png tests\Images\Input\Png\low-variance.png = tests\Images\Input\Png\low-variance.png tests\Images\Input\Png\palette-8bpp.png = tests\Images\Input\Png\palette-8bpp.png @@ -300,6 +351,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Png", "Png", "{E1C42A6F-913 tests\Images\Input\Png\pd-source.png = tests\Images\Input\Png\pd-source.png tests\Images\Input\Png\pd.png = tests\Images\Input\Png\pd.png tests\Images\Input\Png\pl.png = tests\Images\Input\Png\pl.png + tests\Images\Input\Png\PngWithMetaData.png = tests\Images\Input\Png\PngWithMetaData.png tests\Images\Input\Png\pp.png = tests\Images\Input\Png\pp.png tests\Images\Input\Png\rainbow.png = tests\Images\Input\Png\rainbow.png tests\Images\Input\Png\ratio-1x4.png = tests\Images\Input\Png\ratio-1x4.png @@ -317,7 +369,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Png", "Png", "{E1C42A6F-913 tests\Images\Input\Png\versioning-1_2.png = tests\Images\Input\Png\versioning-1_2.png tests\Images\Input\Png\vim16x16_1.png = tests\Images\Input\Png\vim16x16_1.png tests\Images\Input\Png\vim16x16_2.png = tests\Images\Input\Png\vim16x16_2.png + tests\Images\Input\Png\xc1n0g08.png = tests\Images\Input\Png\xc1n0g08.png + tests\Images\Input\Png\xc9n2c08.png = tests\Images\Input\Png\xc9n2c08.png + tests\Images\Input\Png\xd0n2c08.png = tests\Images\Input\Png\xd0n2c08.png + tests\Images\Input\Png\xd3n2c08.png = tests\Images\Input\Png\xd3n2c08.png + tests\Images\Input\Png\xdtn0g01.png = tests\Images\Input\Png\xdtn0g01.png tests\Images\Input\Png\zlib-overflow.png = tests\Images\Input\Png\zlib-overflow.png + tests\Images\Input\Png\zlib-overflow2.png = tests\Images\Input\Png\zlib-overflow2.png + tests\Images\Input\Png\zlib-ztxt-bad-header.png = tests\Images\Input\Png\zlib-ztxt-bad-header.png EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Tests", "tests\ImageSharp.Tests\ImageSharp.Tests.csproj", "{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}" @@ -333,6 +392,87 @@ Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharedInfrastructure", "sha EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Tests.ProfilingSandbox", "tests\ImageSharp.Tests.ProfilingSandbox\ImageSharp.Tests.ProfilingSandbox.csproj", "{FC527290-2F22-432C-B77B-6E815726B02C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "issues", "issues", "{670DD46C-82E9-499A-B2D2-00A802ED0141}" + ProjectSection(SolutionItems) = preProject + tests\Images\Input\Png\issues\Issue_1014_1.png = tests\Images\Input\Png\issues\Issue_1014_1.png + tests\Images\Input\Png\issues\Issue_1014_2.png = tests\Images\Input\Png\issues\Issue_1014_2.png + tests\Images\Input\Png\issues\Issue_1014_3.png = tests\Images\Input\Png\issues\Issue_1014_3.png + tests\Images\Input\Png\issues\Issue_1014_4.png = tests\Images\Input\Png\issues\Issue_1014_4.png + tests\Images\Input\Png\issues\Issue_1014_5.png = tests\Images\Input\Png\issues\Issue_1014_5.png + tests\Images\Input\Png\issues\Issue_1014_6.png = tests\Images\Input\Png\issues\Issue_1014_6.png + tests\Images\Input\Png\issues\Issue_1047.png = tests\Images\Input\Png\issues\Issue_1047.png + tests\Images\Input\Png\issues\Issue_1127.png = tests\Images\Input\Png\issues\Issue_1127.png + tests\Images\Input\Png\issues\Issue_1177_1.png = tests\Images\Input\Png\issues\Issue_1177_1.png + tests\Images\Input\Png\issues\Issue_1177_2.png = tests\Images\Input\Png\issues\Issue_1177_2.png + tests\Images\Input\Png\issues\Issue_410.png = tests\Images\Input\Png\issues\Issue_410.png + tests\Images\Input\Png\issues\Issue_935.png = tests\Images\Input\Png\issues\Issue_935.png + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tga", "Tga", "{5DFC394F-136F-4B76-9BCA-3BA786515EFC}" + ProjectSection(SolutionItems) = preProject + tests\Images\Input\Tga\16bit_noalphabits.tga = tests\Images\Input\Tga\16bit_noalphabits.tga + tests\Images\Input\Tga\16bit_rle_noalphabits.tga = tests\Images\Input\Tga\16bit_rle_noalphabits.tga + tests\Images\Input\Tga\32bit_no_alphabits.tga = tests\Images\Input\Tga\32bit_no_alphabits.tga + tests\Images\Input\Tga\32bit_rle_no_alphabits.tga = tests\Images\Input\Tga\32bit_rle_no_alphabits.tga + tests\Images\Input\Tga\ccm8.tga = tests\Images\Input\Tga\ccm8.tga + tests\Images\Input\Tga\grayscale_a_LL.tga = tests\Images\Input\Tga\grayscale_a_LL.tga + tests\Images\Input\Tga\grayscale_a_LR.tga = tests\Images\Input\Tga\grayscale_a_LR.tga + tests\Images\Input\Tga\grayscale_a_rle_LL.tga = tests\Images\Input\Tga\grayscale_a_rle_LL.tga + tests\Images\Input\Tga\grayscale_a_rle_LR.tga = tests\Images\Input\Tga\grayscale_a_rle_LR.tga + tests\Images\Input\Tga\grayscale_a_rle_UL.tga = tests\Images\Input\Tga\grayscale_a_rle_UL.tga + tests\Images\Input\Tga\grayscale_a_rle_UR.tga = tests\Images\Input\Tga\grayscale_a_rle_UR.tga + tests\Images\Input\Tga\grayscale_a_UL.tga = tests\Images\Input\Tga\grayscale_a_UL.tga + tests\Images\Input\Tga\grayscale_a_UR.tga = tests\Images\Input\Tga\grayscale_a_UR.tga + tests\Images\Input\Tga\grayscale_LL.tga = tests\Images\Input\Tga\grayscale_LL.tga + tests\Images\Input\Tga\grayscale_LR.tga = tests\Images\Input\Tga\grayscale_LR.tga + tests\Images\Input\Tga\grayscale_rle_LR.tga = tests\Images\Input\Tga\grayscale_rle_LR.tga + tests\Images\Input\Tga\grayscale_rle_UL.tga = tests\Images\Input\Tga\grayscale_rle_UL.tga + tests\Images\Input\Tga\grayscale_rle_UR.tga = tests\Images\Input\Tga\grayscale_rle_UR.tga + tests\Images\Input\Tga\grayscale_UL.tga = tests\Images\Input\Tga\grayscale_UL.tga + tests\Images\Input\Tga\grayscale_UR.tga = tests\Images\Input\Tga\grayscale_UR.tga + tests\Images\Input\Tga\indexed_a_LL.tga = tests\Images\Input\Tga\indexed_a_LL.tga + tests\Images\Input\Tga\indexed_a_LR.tga = tests\Images\Input\Tga\indexed_a_LR.tga + tests\Images\Input\Tga\indexed_a_rle_LL.tga = tests\Images\Input\Tga\indexed_a_rle_LL.tga + tests\Images\Input\Tga\indexed_a_rle_LR.tga = tests\Images\Input\Tga\indexed_a_rle_LR.tga + tests\Images\Input\Tga\indexed_a_rle_UL.tga = tests\Images\Input\Tga\indexed_a_rle_UL.tga + tests\Images\Input\Tga\indexed_a_rle_UR.tga = tests\Images\Input\Tga\indexed_a_rle_UR.tga + tests\Images\Input\Tga\indexed_a_UL.tga = tests\Images\Input\Tga\indexed_a_UL.tga + tests\Images\Input\Tga\indexed_a_UR.tga = tests\Images\Input\Tga\indexed_a_UR.tga + tests\Images\Input\Tga\indexed_LR.tga = tests\Images\Input\Tga\indexed_LR.tga + tests\Images\Input\Tga\indexed_rle_LL.tga = tests\Images\Input\Tga\indexed_rle_LL.tga + tests\Images\Input\Tga\indexed_rle_LR.tga = tests\Images\Input\Tga\indexed_rle_LR.tga + tests\Images\Input\Tga\indexed_rle_UL.tga = tests\Images\Input\Tga\indexed_rle_UL.tga + tests\Images\Input\Tga\indexed_rle_UR.tga = tests\Images\Input\Tga\indexed_rle_UR.tga + tests\Images\Input\Tga\indexed_UL.tga = tests\Images\Input\Tga\indexed_UL.tga + tests\Images\Input\Tga\indexed_UR.tga = tests\Images\Input\Tga\indexed_UR.tga + tests\Images\Input\Tga\rgb15.tga = tests\Images\Input\Tga\rgb15.tga + tests\Images\Input\Tga\rgb15rle.tga = tests\Images\Input\Tga\rgb15rle.tga + tests\Images\Input\Tga\rgb24_top_left.tga = tests\Images\Input\Tga\rgb24_top_left.tga + tests\Images\Input\Tga\rgb_a_LL.tga = tests\Images\Input\Tga\rgb_a_LL.tga + tests\Images\Input\Tga\rgb_a_LR.tga = tests\Images\Input\Tga\rgb_a_LR.tga + tests\Images\Input\Tga\rgb_a_rle_LR.tga = tests\Images\Input\Tga\rgb_a_rle_LR.tga + tests\Images\Input\Tga\rgb_a_rle_UL.tga = tests\Images\Input\Tga\rgb_a_rle_UL.tga + tests\Images\Input\Tga\rgb_a_rle_UR.tga = tests\Images\Input\Tga\rgb_a_rle_UR.tga + tests\Images\Input\Tga\rgb_a_UL.tga = tests\Images\Input\Tga\rgb_a_UL.tga + tests\Images\Input\Tga\rgb_a_UR.tga = tests\Images\Input\Tga\rgb_a_UR.tga + tests\Images\Input\Tga\rgb_LR.tga = tests\Images\Input\Tga\rgb_LR.tga + tests\Images\Input\Tga\rgb_rle_LR.tga = tests\Images\Input\Tga\rgb_rle_LR.tga + tests\Images\Input\Tga\rgb_rle_UR.tga = tests\Images\Input\Tga\rgb_rle_UR.tga + tests\Images\Input\Tga\rgb_UR.tga = tests\Images\Input\Tga\rgb_UR.tga + tests\Images\Input\Tga\targa_16bit.tga = tests\Images\Input\Tga\targa_16bit.tga + tests\Images\Input\Tga\targa_16bit_pal.tga = tests\Images\Input\Tga\targa_16bit_pal.tga + tests\Images\Input\Tga\targa_16bit_rle.tga = tests\Images\Input\Tga\targa_16bit_rle.tga + tests\Images\Input\Tga\targa_24bit.tga = tests\Images\Input\Tga\targa_24bit.tga + tests\Images\Input\Tga\targa_24bit_pal.tga = tests\Images\Input\Tga\targa_24bit_pal.tga + tests\Images\Input\Tga\targa_24bit_pal_origin_topleft.tga = tests\Images\Input\Tga\targa_24bit_pal_origin_topleft.tga + tests\Images\Input\Tga\targa_24bit_rle.tga = tests\Images\Input\Tga\targa_24bit_rle.tga + tests\Images\Input\Tga\targa_24bit_rle_origin_topleft.tga = tests\Images\Input\Tga\targa_24bit_rle_origin_topleft.tga + tests\Images\Input\Tga\targa_32bit.tga = tests\Images\Input\Tga\targa_32bit.tga + tests\Images\Input\Tga\targa_32bit_rle.tga = tests\Images\Input\Tga\targa_32bit_rle.tga + tests\Images\Input\Tga\targa_8bit.tga = tests\Images\Input\Tga\targa_8bit.tga + tests\Images\Input\Tga\targa_8bit_rle.tga = tests\Images\Input\Tga\targa_8bit_rle.tga + EndProjectSection +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{2aa31a1f-142c-43f4-8687-09abca4b3a26}*SharedItemsImports = 5 @@ -400,6 +540,7 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {1799C43E-5C54-4A8F-8D64-B1475241DB0D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} {FBE8C1AD-5AEC-4514-9B64-091D8E145865} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D} {2AA31A1F-142C-43F4-8687-09ABCA4B3A26} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {FA55F5DE-11A6-487D-ABA4-BC93A02717DD} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} @@ -421,6 +562,8 @@ Global {C0D7754B-5277-438E-ABEB-2BA34401B5A7} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D} {68A8CC40-6AED-4E96-B524-31B1158FDEEA} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {FC527290-2F22-432C-B77B-6E815726B02C} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {670DD46C-82E9-499A-B2D2-00A802ED0141} = {E1C42A6F-913B-4A7B-B1A8-2BB62843B254} + {5DFC394F-136F-4B76-9BCA-3BA786515EFC} = {9DA226A1-8656-49A8-A58A-A8B5C081AD66} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {5F8B9D1F-CD8B-4CC5-8216-D531E25BD795} diff --git a/shared-infrastructure b/shared-infrastructure index b0d4cd9864..2306bb8209 160000 --- a/shared-infrastructure +++ b/shared-infrastructure @@ -1 +1 @@ -Subproject commit b0d4cd98647996265a668e852574d901b27f22d6 +Subproject commit 2306bb8209f7c1f2eb9e2ba089b6f2fb87442380 diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 650f30fe1c..d211992a94 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -5,40 +5,22 @@ Directory.Build.props is automatically picked up and imported by Microsoft.Common.props. This file needs to exist, even if empty so that files in the parent directory tree, with the same name, are not imported - instead. The import fairly early and only Sdk.props will have been + instead. They import fairly early and only Sdk.props will have been imported beforehand. We also don't need to add ourselves to MSBuildAllProjects, as that is done by the file that imports us. --> - - $(MSBuildAllProjects);$(MSBuildThisFileDirectory)..\Directory.Build.props - src - + + + - - $(MSBuildThisFileDirectory)..\shared-infrastructure\SixLabors.ruleset - true - - + true - - - true - true - - - - true - - true - snupkg - - @@ -47,6 +29,4 @@ - - diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 9b8be05b56..c15c2a90cc 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -5,91 +5,15 @@ Directory.Build.targets is automatically picked up and imported by Microsoft.Common.targets. This file needs to exist, even if empty so that files in the parent directory tree, with the same name, are not imported - instead. The import fairly late and most other props/targets will have + instead. They import fairly late and most other props/targets will have been imported beforehand. We also don't need to add ourselves to MSBuildAllProjects, as that is done by the file that imports us. --> - - $(MSBuildAllProjects);$(MSBuildThisFileDirectory)..\Directory.Build.targets - + + + - - $(IntermediateOutputPath)$(MSBuildProjectName).InternalsVisibleTo$(DefaultLanguageSourceExtension) - - - - - $([System.IO.Path]::Combine('$(IntermediateOutputPath)','$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)')) - - - - - - - - - - - <_LocalTopLevelSourceRoot Include="@(SourceRoot)" Condition="'%(SourceRoot.NestedRoot)' == ''"/> - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index f4e9851986..84e4bc199a 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -4,41 +4,36 @@ SixLabors.ImageSharp SixLabors.ImageSharp - A cross-platform library for the processing of image files; written in C# - en - - $(packageversion) - 0.0.1 - - netcoreapp3.1;netcoreapp2.1;netstandard2.1;netstandard2.0;netstandard1.3;net472 - - true - true - SixLabors.ImageSharp - Image Resize Crop Gif Jpg Jpeg Bitmap Png Core SixLabors.ImageSharp + SixLabors.ImageSharp + sixlabors.imagesharp.128.png + Apache-2.0 + https://github.com/SixLabors/ImageSharp/ + $(RepositoryUrl) + Image Resize Crop Gif Jpg Jpeg Bitmap Png Tga NetCore + A new, fully featured, fully managed, cross-platform, 2D graphics API + netcoreapp3.1;netcoreapp2.1;netstandard2.1;netstandard2.0;netstandard1.3;net472 - - + - + - - - + + + - - - - + + + + diff --git a/src/ImageSharp/Metadata/Profiles/Exif/DC-008-Translation-2019-E.pdf b/src/ImageSharp/Metadata/Profiles/Exif/DC-008-Translation-2019-E.pdf deleted file mode 100644 index 9be0c8402b8b98422df221b39ef20c8482bc9275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2280856 zcma&NQ;aUaws6~6ZQHhOd$n!bwr$(CZQHhOW3{`#f1li(x1F2wR;kw-HIgxtNv0qw zPRB&g4o7x$JiiRh!okJGLC8pGZ)63>%gZ2cY2#w*#2{{C=wd2rYHV*}`kyN&XBR?N zE@lQ9Q#*4P3qmGFMotDfLRNML6;B6K26-bZWfxn1erFdaQ$t&5*$njel?hcwy^HBD zvY!r$%Shc*gH4XiBF2;Cz|xQmmwAUe_hS_n`fR6FY;IHtI!?%UHhrpN_oano?+H_A z8qsHBfi)7~Shs)hPs&qkRZRH4H&HQV`~y&m-Q3dXJ!FT6)$W>c-xMXomzaU1gLaNg zE*@!BNL;;t$oIX3`5VFhA(b+N(zti3n^_)u@mr!ywjYyoP$vp>iZ=MFBlbp>E zl@=o>P2N%fiNMr$w>c4S6J0nZ@_4-Lrk6*!w6QFdf3{wJhIa0JdrO!Qh7pEF+cV_K zy|LWo>j&PsmU@og0?HoT4#*i_lJuxjs^do)EX>LNQiZXPQKJbgVC{Ne^Ja+ygGEKy z**th7rXP+@?s{bf+m2JrLd!Wl3WaQQWOaJHfBz4Q3u~;sw;k;OP>g9w&Zje;?!LA2 zY}ZBO-~qZk(&q2(psF9WO3Xh;*dfbLw5%|2O)j@O2pi?Ay2$~#!qCJ1K_T=g6#cp(-bOD*&@cGJMF%>L_CxfxUSb5N%HLfa6vD+h?txE0 zEjvhs+TDQXxNLG8zSQb2-c?w3n!(P*VHG^Z4d+9?go~lzQeg!NeN8M$RT@W?Ty9tCJB(ilBOhy(x$`S+&u| z0wvk6j&^Q&EOUABehd<)0On&{SgC~h3lk9Cgls3m!`qoIB=*xa`I@xWjF9Z{jUyEQ z_HojFAc4@YY-7A#XW#VoaR11@WHE8?aiEoax!1d`r$-bk|Bp)x)=|g-AF&j{eOYHc$Q~L%#-YHp+<_d2;#-f&XqWDY=-QrM}bZ=k_ARKBxO_O}VQYE2m90Y}-N!|A;xx*2TA4r{~9AARs5H-4# zk{cm&U~Jod(6TFjKjREw`@Smpu1Qmob^B2C*3b#V`v!01_-&k5@L$cP{FiSKWEM1L zz4qj}h5UI%>q;MnQZdFwso7zh1NpZ}zf57BG_lra*cND|Vn2 z@+h!@%#&&7A#7wYhuC>@-5r#=x|jep>5(;3mGv!*y_?#s#Y$AG$t8r?D)C&$X5TB_UHvxNp=L1jQ*?gE=l z3vj+0^Z*TfNr*bXdJ+C)?LIK8@0&dL!*Y3}dn?|f+>J^%rj3Qr2ud+;zuS#Shk zep`$9d*$MT^6~RyGkv_n#pqIK;vV20({jG#GUYf8g!ph80#pnSm^#@0vfG1oQMt9| z!L;bY5GNXYq^Vf&J^M9s&PfefVWXd0#02OA&xk~Qhu+uam0L4;VefUaf33AuPhHNy z@-^a^9(iCU5Z>%oWV4fX3C}ND>78~8oQ4GQ`++vL?!>JUaH0Cck?}7ht5N<0Hekw4 z%7=f>6OVd|CLmMQMMyo!)Y;WxJ*dS{AC6^o6DpfO>iHxuM7v&WYNh3k2~n^FLMK?; z)mi0-9Z7Q8ov_5|V~xtVL1tZNRfQ z@>%?)MGJ9GS>&8EJJ|>nD7{W!AaQ9gWzAB8MXN;6ZDVebQJJas5HD}KkQ@x1DdT8E zR|Tq#keXLCBd{g4-ML-h570MI^X!KO-pJnLj37vsG_otB+cauNqV~*QCmnYHKrUgC zf%az#wGT9@CN?{$QHK6|3h?qHR1?;ZfCdMdK}XNlZ^3(^WH#4x6V~`tY}%Zs23m*_ zz99!}jrIoRIf`*HIuv&%Whn{g{(&hI^nD-uzVEM?^$W3N6DG+!(Uu(!2H5?(1 z<3`T;0c|TCt64KzNqxwZeZ^G#fnq((SO3}_yb_pxV3*pY0|mo)h!QQvoh{e%`t!kR zZsWn&Q@f=J%82r0U@EOA6PDG+9M1NZdydJh{>C&oStw91txIzTP>AFt#^eXnxMBya zWiUjC@-`E=Gkp)$Ud02;2Mw8WY6t8?$R=|N{B<>YGHh?aKy=$-%8eJ?^e(29%{;6y z`)AeH#|%Xjgz%8fd0KghBwoRXDgZqHgJ+7%>P@NG=Y@%mX)u`AYYG*snO(N0R+Fu-oXchl+Ab2DD z0>GDB6u*sRx+bWe#6<2UJ3GSMcX3$dF z2LE;1GZGpH@Cb{M-YA5B$&;nh6kM#Ge}G2CdIZM9z8}z!*e0+jTZgJTsDKnx{!ku{ zTVpeYP^tQ2o9C2wVlc_H=&hd5&N$ zJXMAb0+7$e)_|c%^0L~5nSJ5S8Kymaj|BZ=Zif(rwK37T))p@_sWb`W1}}^UP@B|Y zOo=SV+zLBK-~!9 z&20YUyDjpt04-djVPe&==CpY7A-)LOZKV~sjb(H(e|A~$1h>V%S@bhDi3el*!N6%M zTh0eQwigdsNGS9>7g}8TUGR{-yVf~It;E?xXjqmVR*V{O(d*rtdp4yl^$<6Kqb{2l zI&&d=P$SwvQ?j_%1kPPHD+m_9zG;?3ujitBG;1;_DmN4#FVKUG#m zbQm|H+h^O{t6LeT*g&1QNq!LGRAp;_YHSYD$Z>p<@lWo2(s$Mowa>QFb({lBbWx53 zxLhj;({Pn824Lr~yg%IhEL9Sij3L}Gzeg$5#zfMtbfSq*sS*Uo!fY;b@)?}sQ1c9QlYf7(FT0;x4}^V##d0hW~`%MPe}Hb`4cXxK~94Uy#GS9@#w>iOXYRW zxjRlOf~2;Rr-YeSRj?amJ;266Yk`)QOe!rJ9;X(i-P&T4H!v|^vb92AL=Rn(L}+h3 zblMYJ_~k#2U|xUJ#!`GK#3*623QtnEtX!j8o_N|in;sbS2+3=e8XXjwj+n{C9C zEwN+1H+VSsx!=+7Th+){%mu5&{LfsGu)RfL!YIb;$j%! z^JroD{v$gzgfj6jTmA~$FHd;veWyE!DYPOlEbAGunA`wxy6IbZR~x7MGh<4`88Xo~ zXo}$n0ppmBuPp9~hr`=t0WRDZZ-dz5^)}fjy2FS_f2aal)H8!O5KlaHIG+HZDe(%x z(qo*cRDQ?g7#gZx+A;g$DXkpP(2p`FQykozB9|zl`4SUSKcI8tX&CX{H_11)>G3cHLrNL`?*;%^6%G^TuQvP)rm*%;^ekr&&$VRDG z`^@3f;AxBDWUUJie4ojLxnIsM<0K|BbbQI@Vg1oGc)6m{aUU z4@;dP`T_^Vw4ACO;P7|d2gVFjR?xXWyIl8 zFzGAXVZO07#0zB`f=Uio!FWYfVwb;ggpt1$5LSq7SJwD@5bxZNTRF5-2l4ZDoa^3; z$(F~_f3mT?-HvUaCAiHQ{VoFgVP{Wiz1G|#wlQw#7jfUHBjEcMguOYXtdOhuaw`>D zUd8?b>XN`1$R<48C20>IGWkb#r5&pF8P(|VW6p_YHf>&}@u#waVDR(WoK)T!8VD1##%k1ytI>sV@&O+`t3mNV>Fax!UJAMUq*mKZ-r z@E}g5R6Ce_V3O({cUwM01%rP)r9G|~44ci8xg=+%V zobye(?+EJ~8iaMo!;144Cdl!{^E3CQD@J!j?rOY8O08!xW+Edk3&Z@sNXk^v9L8H)F{r$c{<$}t;H}*k z2bopeokQ%qs}Pg*EEZ;R6Jrl(f2mIguV7KRYrP;X@q-Yjyp4KE@%r#MycaF;ICz+T zJnj9uY5XFQLL;lC>c>?eA-Y+{8zGLgW%YnoK)vh(wVQ~Pj-YL^(&s~p`dbEoo~-){ z1A&PR0)PukJ{kgxlRrkY(CFI=mVbqaTBS?rY&-w#B6`{GX=}&!fHY^?4@w=cP8ghJFV!c=k9B z>dF`Y3tya!jEw&WzL=QUSpJtV7FHIP|G%mZmunciSyLQMC*~t_x(g_X;T?wx4**^L zr<^ce8J$NIAs}OTXqxm=1L+g`u{y2&uK(swrZ8}gfx=^PlAl^goFeAvFAGE&LOtngWB z8J5Q1D{KEj+P*0b1I&LBE?TT%h5zTzsQikfiwiC3h)b(H?V&j!X;v+9rhi(8YrTYmg=~(kjO*?$v@! z@^dNQ4nfY+MHO za2IBcprs^mozh@utpLCLecGGzi<7`-R8y-ofbl^X$h6;=RdjNZu^}mJvw+=@YiQSf zoeKMBL;#v?=z~OiK~P0UDqZ3ku+F1|diuOMLoQF%XCFM0d+oh9!-|&S-fs3ef)(4+ z6*cI;c_5QD{GOianL~ygpVHT>Ggx0sa5LXAI+rpir2h03`;}Fja%f1quX;h3jVNcL zj0+ltlXA2#Xhz2s_bb$sHjK-|L-D(QQjcIi*$8bL$dwW$;GeJ!rORMbb($ax$K>;H8fJ1kq7GUXA1_E*gG_u7bXJgbLUS2 z{tu3b=%+83Zruhf!2#>-M!3Mrg}fYz|_fKCD3w-Intfz>EkDWY9`3>`Z$DZ;4F-2!Nsl5+_D5XdxJKgJKAjjXZU7Q zi5Y2texf$JYOWrHLLV9c`3v=zqx_t~S{gjNCnH-iIw(#!qv3Z??R}|GGiIIL{Yc?{ zv2^8V!rvzv={a`UH5%m^S(;n*PNG2~@BZ~Za4BoS@#I-1*`qLZ-FXn!{c3P2K+@}y zv^)vL58Hx(C%)6dCzKE3R26~ewtP#Qy!U(+r0L+sypa;e-c#2f#FEcmohq4R!8@c` zPECagiN*7%rivK99)(LyWLxRaE(3`1;{)yVIciG-$*!LA{NtRD5BEsVsJe|c$82VpOBilG{StI%$n12c*JlE|Il))UpYz~_L4lAL zherLpmJ7-oHH9uF)e&$`z#&iqvnkm2Q=6{5By(CnKpx}RziZ^Gk%`D=n5TWq`^q`h z)|tpTl>N{KYc{26^f^}$cTg?feVh^W$>|0}mgFw$-;#j^p>KAbu*5tO2cm6@>+5MM z)BMQ&%eBe3gTc`|#Gm$!QfU$i(?Re~d~}&uymw8~R^>-rvA&AXY%POGBXP;;DrP6l zYQ^|b5k2uoVWwrBRw0BWQRJa`_k@^6pT8-IwXdL{Wf=N%%747arU+3_hZfN=BG&JC z&HlD*VNG}H{q1h1)zLd|V78vU6g~p$J0enX5$Pzz9eImSW9v%Rty|fo5CBZ`gFg7U zqS~B_&1MOUFyZ?>i*yW6)Zyz7`qR zWO*oOk=-E-gi-K#Y3ov|6UyI~egI!33<^IMiI^m#ZSV4IWU}=wswx?ry-;8!5IiBX zqth<>NTtwBzca&cB?QC zoeFl6^T$~cRU{uX4w|P(m0taek26Qv5ZK4{rR=@oPg+O4V=Kom#Mu!5HJh){YK+|J zR>ftZHhxn}u2gtJqUNWCY!8m{oFGDB8Ol3^p?Mn$VZ zT760O*^MvIzTaG0W(cxzv^XpmaG?)0N5N9jFju}#>fGkajf#GArO<_gZyO+r-66`Q z+(S{$u~=Bk8B#8!yEI}gl`{?)2&2|}E5{;(di=WUEPdfe1C$-DH=CjCLM<`bW)ydf zkgI+bT{hph1vD8sFjGdyxRgE^%MZl<$p|^qUJ`P{lYZOsX0tl5ZeRGFF^%yl)4AIq zi;_n29$p9~7}s3xp?;768v0I9XK@x-rAWO0k`KVCB=wUZ$bg({s*bDD1{bu*O`?`d z{o-FhzUUcvt)M*%g?Tym3Pb%}r>k8PG<>4!G~?Q3I`wKBZPX%F^=p8=M4 zyvJF+!6VxQLc+kQB#Vncn{Ss#r1Jlsc+|y5ak@9Gfy1-Z?;rNY^MUNJ8^E!b3@lB4 zvKi7N{g6L$)uH}N^q3T8^08ae8PsHfSkZHW$omm>^%{-b(9_06>p>RU*{?v#cRCj6pKkUUWpjaLY@2U?Y!0{JtVeoZ zIPeUbdN*)-v>{ExK_%whg^G!1AYJui`+Bm{A2>be6jc3#0SAxDs}AY#l?L_@Yt^Sj zXW9Dry0LhSU)rcfVtiUNRD0B4Z`#cB|cD*iP zP+G%vv$#}*O3uJnT6lSApUGFrAg4JJwbHsj=xTThQmL8yOaP5#M^?KYH$CXw2&W;y zX^%4Db-h7@D{R26ZdYKYQGxp_jlkBQVqetxB@vQkC>y=UIPPM=&b*|wEy56?dglAscmzS@Eg^ z&z{mG?V~d`7h)w53~M~xhd=|pQ3WR5Ls5~#)iSe!O&Cs|#`#-YEfJoVgG^9A=q>== z_C^^xKedmd6YD2rtuV>O$j_mjI!~vWW_qm{&A#P*cs#C!F9*NhE&#Zf$B0;BpuFf_ z5figx%O{MA!=29ijy9NhnykH2)f0Wfd1zR-2HE~e{l5OYgy$iOJ(h{_s*5eKr$`FN zY4B&!;5$VP?jYWBbm(1TW3@EM>t1mFPpB>|dlNI|KT$i#j52q6qpplzIRQq{niv5> zUfX#ayY)Z7aolr~QPrrDL=%tav;sxhD2lPQr z@HOt;QXX7O2f$w$zt2e2ukWno@NY@(;;aQM+I4tqHbnHg@YO)zEpxjWH@pE&T>9ou zVjy8MPhjMvXUKBPI+p2c;ZDGb$Wei{w2UGIYK(_nZYDikz>ax;4p!t4{#D^#47B|0 zNhZd|d}m6?)xLyzo=D~qHP?3K@;{^aLv72K&ki#WP)-FF+{t=*)A zE>V`If7u&dTAHyPBo7$$MS6BX`BLW~Jz!NU-( z`c^AKAC-W=x)hitoADepn6M5MHHl5yWxd$bWtgQsC}sHxNrm#@sMrZT28CRG4SeQD z@rxxX}AQT^4{{Zc#{(_e(MGxEgkZ#Ge zeYd8Vj}?RltTht2bovbuOg=}yOIfNla~krLE;T9kSz>Z&7(G7(=`m*gq*)3mX!>Yk7(QX+&^h z9`>9FJMIdPzki#N7j-OakZL0)-C%{t4iyVe;_MR+3|S zcwwD@q6ab|6?kDmvAdA}8WW`>MUXKhqzi24*YVubIpoOcJ-yzr<(9yDRWsG#j*@|J!M#sU?a7)rZ})l?_TbanaS>4d|b7=SxZ$ow{Nm3iCysiN~eQ?@s`Ats5- zZ#zK$bc7T(n&#jyLad+E;s-c9w+{^st*0WajNr#zqlM;DlF}`ZQET%YQKI(nJXA?x zR?N`^7wTOCk9}LjeV}=EJ$8&r$HCn{UUL1BG~@fV>!TuVyprE%s!Dx;%&vez+LVg z;P9bfWBllbjbkTHG8Z*b?8cac&mCln`dO6)WCM>~+M&LR&j3Ut(zcX(Gx(peo4dlC z29K=6_%O@7mWPYPm<13#P90B@1!oS~WXfKGg%RJ2N{6h)Y1Gw8!E9{R! zmyi6@C)e|ue`rL-m5cxjyJzUKcckQC)uBq|V5shSG0$=4D92!@Kj>WqE<*1#8(iNo z3f--nk|L@>CYCqraMxCmS>VMSv-`ROQUjNZvW4NeKmNcR7gw%@0bwi=m=ydM@q3m$ z$Tez!-0ACB^(P4^rKBtsm28|0E3En|o#Mthd3zA3F7vMtSnOP5y40Ln$R^9^wXDjEU%}e9A?e&p6(7FA(sacyuu82mY}Cm%XrxXY?4M(7 zYwV00N76>Eg58#{6GK1S0==V) z73u6JzmL92nD<p#REDkE#L3NV=A-bmR3l8CmoJXU1qbdtqC zk`-_)w6253433Hn6rPOMGVVNbZap=PX3+T80E(*}S^~EJXe%gXrA!7Fx(jm_Bv62` zd)g!=*@oFB&%}gM=I6@fr7oRug{~`m26em zdmu4df_d89b2r40*4AW4W4xB6289f#qb|{B`k*aIP+t>8?@%YZ(r1W-u3O7R%w$tO z9QsK-JLQd=QvP`h3y9JW^)D^sK`wQd*1i;F?PVju@$`iWzuJd6)bqfe5ls{>GA|Nh znfcGn!~CYWcF;J!bslyFgng5-flEdaM&h9b#1V0+jHXqZ5c0&YcGr&O*&%^=qCoGw z2rmlZtnE+44m!S@9^*%?^TGE%2hsa)q)&k)n{X^k_|LU$8^HzZ3;pV`;n^#=Lj6x z@Lvt2ZS2#78a1d*2Dvz79r)_!4-b;Cxam9z^Q;K>wM&`b`aF!dlw)2@30Nw6AWx3A zkm%$_OtvLA6i%bszjnjem~**NEvILtT>@I1uCzi=A2A!fOmUIw%>^~aek_fa0lYAv z#5kk-uvk3yxtNWCpg@0M9QNq%_oOr zrqrrU$0ti+iN^yCsH(chJ1&0>lok}(I|95WA=JPbrVlf2dy!+l&F`JSMU{7$TvC3p zuWnhjWoV+UxL5WCO>Q~i4v6mBsJhk|KNppAC79**#(#;?R2z-}S$v-xo!o=)h2jMv7)Q+`3Dwf5hOuH4$yMvYysY*NmVNAA$_Dhe6A< ze_}j2C_iWj_j$DD+3rU>S@8Pf^Rw-AmQ_J>$oZ#15F^jS4Zhk-Y~N73LF2_yRefK% zc~5cTnXSIh^c^RSnUz5T9UErn(O(#*N|sf-j*jk|5}Q|A9H$&ST%rdUU)|A0XX%+B z$QEW*1R;IY&|dYWK2)+5WRO?{?#mynGT*C*!kg5;YSo|1BQ-9!-cP#+Au(BtL(KO+ zHS7q_L7XZgeH({hg}l$d;#JG`TA`+j6ZAKW=HCBmt~>)$9f0rV1{~b8Zh2ATHFpjp zG;#%21+XCBwFRzG_LeVV1UV>(L0?A-wun1((7NSOtp<@uLGn@0!ydR{-Vq*8%7>g( zzdFf-6udZ;zB@?r0lMr^aD@pNV{!ZHRji#|*Y~)&sP}NFeVdco+ed#II2oHqf&+)m zj=<2(QbPnh3QLhuMHa)xG&-CD7%QoJSRS6VU~h>!B>Z+my_Xd})fc3kcePFb;3OGQ z3o*J_gavAJ+F=l+HJPwIBy*@@HfgMooAzxaOZc?Y7gD>MMnZSA264Rnjn_YS;L~!w z=Up7wc5H1;T7oYnqg>S_iQn!GRPZ(;&JXD)nF_@NB}uu0j>Cdyn>KV5U6#LnQ8}Cg z8F1JMtzYS!moqm0Ri+ZMsr@ZTdPuJ#JjxDk*-l@_GGve<9VxC>^mU)rgwPK*!~2P5 z5H0|gm%9<@rgefp@6eLr9u(Xm3FZk@S+k{m5)?V0o}Z8L(*Bmrgyv!V&M5Uq*`$GqBOXIxPulDe+pNPIavK8( zWsC7A30tPr#!>1`*lY0R`eZ(jefGkQ1zMf#7A5;EJk9@5GP(>y4xp($I*f z3LoZSG?5R6zH?EgwI|&*a@k#pF~;>il({0jDEC;F@m`x(r|hDLHF$gEpCSh3RHt{p zUY4We z#%)mtP=K?P47y;&LjL_rA3)W&=mEMPf4OT?L+ceaye&lPlQ?Ecm2b4$YSVvj2KJ@0 z-#c|A4X*%-S8~5^(rs@k;sTm3D_{~Kd&9-t&qjVdh3uMNOhx zBlQi9kSg07=XmS3*?2dtYL%mqphwv<+{oEza4Fqz_iRbt{-Hd3|_V;X@Rvo*HaVey<}rDyAwaR z_k;W!vn7#T&l>Lh7H}S)Y#kJ<%l5#Xx%THn$pH!ZRnszZHmejYEgub=)2Zc3H4UX1K- z{_|k**_J7!0q*WJOO}^y;11FV_9U^6nca|~oK2yZ6s3ijKRdPO-#kFvH|W%H(Ei3c zR<`T-?0^+waQIrJ9~$o$Of`61-XVwT%UNpS{S3>Zn$;}H_FT0;#!3mjuRr&Lmfs*J z^OK9vVNgtQeG{dPV zrl+Vlwm)x&19B1d5Nv0peb$-=?r%8TfK&jvnkrsKzZU5(cD&ewnOh(k@ip{97Yv+I zY@Pz;z3h+gP~!h;-ys>4UqK|e;v(_jV`MyZ&`OleXU1vex0fT;%0@xw2z!)x%!1!k z9`7@x8MR)9kWDb)ke;421coVGu9QUME_iGR!T-zDW;8P2|yH7FhcgQh1uWoFR5{ZQH7^pF}!+Wdx>e&k{;ACv0){*?{T^g{{|0Q~bo5~bCW2Eyy?jxP3V^`{IU2EEjDXoxy{{h1 zfuX~B!HovVG1TZAou-R{otHI|B>G?r5Q>u)5vAPw#35^+B%}7#P_ZwNtL2x~U_(kC zB$yUry2C|-li;h#5Y_4Srip{PwtO?9QG-#AM!gbz$AOdFqse(@glK1j0 zh<$8n+~EESwgp^}orLi>3f#4Oy35>v<3C;0w8KxfBp*c1`rKMz8)9Y7+RCTvGL9Z; z?=cVp7G`46qZ}~{HRbu&OaYXb#^{xI=jjBvs07z06mFyK8p^~EL2o)!_mOzIPij}A zy;bMorXZf=3X`ZFWjS^S?arpu*55Dugo2q{_xIjqwV!%AA{j4~wykT{hguZq-D(G> zxhZ7^(3;~IHT<#2^&tH80j0C;N~5YkzBzVe?hnZ)L=h?B9S<5_Z}q%2U$d|4$3&=j zpJ5}pa3tp;0OG;ow4=z5lgjJ861lD5X4eVai*mY}M?XKn)fO+*dI7s|$JtP~j00Dx z+ChBgEEi_?Z{)bdGkLBmdn#;vvt*g4RcOcY$dSiE+j=SnAF*9Jppl=>Z+%frIHk#E zJ7B>Cg7}r=?0JqvLN|I~HdyoB!KWx&HDFNAE1(;3MvNRef}g%)p;qX@;)Zndc}nW` z&DaYmiJR7PGYAy$Cz^|mv!c%0O3Za#2eOt2r{|4WKMRri zMWFiuzjDUvIAP5f-~9Uv0dp2@M&L+E$53r}r~Wb!J7j=D^S8UoOVqf7Koe;UAI99N z;SV<>_jyxI(n*W%Z0pjt%$wPl4OslcK zp#m3bm5>QD3N0Z!EUFQpWZlHe>!5=%yP66?7`GSGrN)z_+`D`;Cl~B0OKCDLjN1Vl?NzY?2<*G`lpy=qD?k1c><(MwAPs`II2#!z9+xl8}Se)su( zI#A4HV*J?zdoyL9ZlnkAbx@4=C*$oTWIz60f^6EzZr4aAT;Uq>*@CPU`X6DKl9|^j z?N$pTH9ueq7jQD36QQ zb|H)BXPTJ0lOfrFdR~{^+?mV_c*K}niy6nrY>9AdUmg14O`Rjf{Qzd^xj zGUtATW9E*8Z$xh4Ug#)JBXZ|J4pI_>kK}L};z-pZoc*PQ!rTZU^H+Vc-Qy7(s$$X5 zzdhe)Op+L?t5O(`Bo7KY@+OfY>BisBdS2j6V4-C*rZ36G_~c+vu>u%J_ErB)lM}Md z#%t?@tu^CYKi8tDY&?j3{vP_15<}KYaKI5Tv7)1TDWNi0(bzCq_Hn9W>89X!Wjef^ zmd@3K5ov1L1fC2wq}?63w~m9uXWjfbX#myq7cr6(W~T5RF;2(L&v}j31ksOxXXrI*M!Q)U22EWNIk82s z;ZJ0-nTG=XDaUp}6TFm>Z#9|gXMZ`I`%S6XtH-E0WaU+RO33S6R@@KUt%daIm0%)N z{bo4g!hQS=f0Ik`X@x4$wkWi&y@&|Cr@l{$|9q1BJ9V?+Fm!BfvP`Vg^G8m^U2AXK zA=Xe5NsCnWyAH-gZ7$MwF`bh+&ozd~8>#Bn#ar0FyfqSvLU<*6qffhgsT^{c<5EHr z;(%;1JzC{&yoTg%h12@9QPAP!bWB)TssTblt=A(bo{qF(VRzEQ8gkAAy=#C<*b<3f zw8Q){{Pv;B`DaCa2^xk11ulO$p3=7YAkmiLgl%VKy0wZ|z= zfHCt)(FnNHc{`fYFcyDnMQE%s^4T+5Q9mbm89Y@8C`Oj7pbuf=?|$z$soFb=%aDZ0 z+q$~o9DS$!n3|H@Phc||h4<+uEm2~vU70R2^@{Qm5IXqn2TC~5^0--n_iV40|0Sm2 zwq$|WJh55pNehw-d3fEPKu;T zaZ9}t-f?&{{OMGNlbe@H_t-Bzh{>KrO?*HBH6G}?EQZ{))`@QI-oe_Q_n}AofL?=& z4>ZxLv~8#FuZK-%yjH*XRo#2cHE|kh!K)uo_qJcp-v~W!-%sSs7*LRrYJym1qE1BR z_@KPis$wVsI!oscDK@gz4&WmAL2h9rG>5Bw!Q(7Xvpe`;goh`u?t$6`z8e(gkp{ka z4%{%KQ6=D0s4NVBsDBgKdEu_eA6K;Jzq(Xr$JSDKPraQj8m|m3Lilpg$t#jSlladY z0L_`N6lj@0MPd=|D@w8L!X(9v2hj|vnxEP}G;fgR;*1%+>&_#O{v`IbXC48?93_`E zLtkTer92FbgCj!v1nIE?-jcJLyUYRt3ZCWz13Yyw_H64^8vZsMx4v@)YNKAl-D27W z8iGz1MpLJ@YX`(!{9?t*u}^r{&wuNR5n*-n&^L?o%u%a}vMX|D?m_ooR6V+)pXncR$3gh~Bu0`xIc)IbY1PVgW3W^Rn;DIl zvQa6pyo&ZSpzS~cxubrtI(r;4OVySX1?mo&ieiJPm8;(Ps=y;NBPWvSUP`TiJrG@zgiA)520ZE_D`M}{XBT*I@UjuPgP)Q zquq2{5jN?NX&~GU>3jujTYBDhJ)|CPvaN2v3tv2;%aSWb`1<1&5A07&3t3s%%2_}C zw)@;#E+F)8wDJ-|@|)#&B^lUPbwR=aJUXflIV2wKZ~SqxDFSnZ(1*@*!FStGv&Ey; z_^oGl`3bM~BbGkv{R^>N*PCFmb|=hl>ykt(Et$2E*fJ5r}cULpOdzAm%}B!--xVa@+r`A7I;U#nxwRdh||Fmr2R%KAH+fjzYX7%!0PEhu{!o%rLS2o7-Rp0PNefSAICznh^+< zh`&UtWs8A=51VN~dM2&ifw$`Y^JvkDlAqB1nxh;^9p2Bp$oOn4FkF`*v-@!16yq3L zox%LO+lZA}FC*AZyJkYbp9v#3TZqta`u>%$45@C}aqGY7HzV1B$qh388T!(hy&ZO6 zz=*PPt|=@&_sZ#Hr_~Fd#RfQgru+c7m~d1_EJpV?y!g7K+WXjrp z`2ps^+x+7*c0j>QJ`@i_qp*8QN#|0*({}DTHHb>PHIw{(eEW$&ivmzfU8}HS?13gO z0jGGuPjia-cYnP2oYZKbKUHkaIcMm(GFjKys5Ma6`J9%vQ*>5Nd1z^vAO(YIr2oKRKgCw)(LS+0yeP#x8tsJ+8eLKgohe z=nF;6P)k?jZH~v)j}Lja1C)4^I7=O|iU;0ie{YfJD|xdb1zNy$*$Ch2(9!;MVpX(B zH~jwrH9*S0UW@T?q;qx0Sq(5D{g|q+(Y|IK9#<;Bw_moD#ArZmT}niV`tbCP`X*z% z_l}73JQMYtU!{vZhot1B&NFNrbA=iw=}mR8r#Ueb+bz#g_kb!c6+(t`y^+}RIUYPY z9;pJMcG-`Y3Wy)EI!1}#4M)Vz>Cq%^);WJd^Do2H#hlS-g(Len!X3nI?O1e!;_svw zS9bynt8_((PtX;zJwF4mWK1}2@sORM$Y&=$M7C5ZhT!tTwd*OcHiqBQbR0Q)`BnIc#WL)GB`Gwy3I+FDlBiy|fMY>c}7c^NrKxu;xV5l;X zNq1}GjKwF&9joHkmIy`^Jt<1A@MGcnLr=`mcvi6`^v zue20jTNJtwe-V%1_VXXqqKH+B{LNk5SvFrLc5l{XAE^lY-eNB90I=-5wRHj?F2l8| z1uPirD|soOJS*d@4#|-OCzn9ufaYcyX@)#1?ut4U4j-Dydxhl^XuPV5 zpWUOmz}NC`nO;!VP%2_)rO2$pe`P|o!cflOiCjMtOO zAI1#yv?*eINM}r%e>H0o5(;nXMNdJKD=19W~6O>@TPe!o=!k( z>+B^j1CB+g^OFfsdF=ZrWgT$@vnD0mWccm)O7sX9>R0*sd6*3kA9jG_kcsZiW8$;3 zA-2S+d6YWP4@7li@+sI?J{lMizaS+7kfUzTNt4P;8%5qm8Nri4q z$f^8zd3;L#eF`5h;IFp(IgQo=!?o+K$!w+@Y$K1`QTcC7RBua0ra#;_i}EpC?zz+Wh2MdjgIkgD-+FIe_BQ3*r`+ z=Wt0E$E3u!OT?5r?Oup@V}E3XD371XC}p;Jqlib2Aa^Ll;0vCaG6F~RmAcD{>BNXd ziAln?0PHzH>a7o|RF0Nu0y8;0jP;z9uLoQEN393x$tlf)>+w!W?L`3II_D)8tA?&3 zFvSPyq}QWXZ^<{2R&;QeNGm0OXe}E+#$m|8wv65rarKD5pAT54bY1;_Nth%h;WsUX zV};-&;PWylqY6Z?YYksd3`Y0m8sLx~&$=dKUkDe67(r^VGO{0&QoBM2MG+eu8pwqu z?A)!rhWKL$WxUtOj+?a1HsBwQc7g5|Jzv+g-KH^J3G=RAG&n1p?yR7 zl?B@2*4nfedn&Jovn~7_${YQaU)KcFf?h>RnsnOh(Z<-t?V{_paBC9=Ml{FcWqS4J za%NqEWrL;RS4)=bXkJBGnFKMCYHb*YMsMlrg2&TEjIgoll8$*&ZQ7Cr zsAxc-p815Ib1p>Tki_33%^v44f_PEocApA%6e+9QX1${vB=SfsP&{)ok>;((Ot;WZ z3pMm#=?Mc_*~E>wd1z<|lpO11@rTsw>X$15Gd>;S^MO}$y@M*8rXtPJp)*vNADb#e zp+k%5nJFkCP!q8Y?Kvy57w4v+Z)q@^$w7&coei?C!`ClRPX3G&J7j0j5C6vNir?jE z*yDrWSx?%3D&0>#XFTy`yLy`e%={-NViDX(fv%vCF!%f4YaUWautMYZCzh23F*XUn z6Rv@B4lxa5WKfs;3m!7LQ0?ug!iDlni9@z(-mJKy>{qNr$F#*qvB|gIkFeiQwGnAL zw#VPfXFWd}-f8NyzQQ5O^v{s@q1+SXCWOW3X{_aTe zus_E+3uJVJS|Z`pwwIfy|B6gf%R7;Y??MrSr~xU_xdq_m`aoedG04nii&qH_cx+$3 za{<-&T-rdLBm4KgMZsT~xAm94zKCGR!<@YZN6m$t4zE9Pd}w$T>Sl$%TToNpFo-&g z^DQr4(mZzv!IaZk6JJ7wK-r0G={obu(=(K{!)oJVVr$=4fSS-`eRv6~k+9V#Z7q&W z94f5nRdl%^K0nS)4}s`*NjhsbM#E~Lqm50gNVfAjcOagH@WL|K*dP}ji=@r}Zjz{t z)J!;)ImXQrMETNk_`^?-$E}N`>}MZbVy>_CSDo}I_9>CbgQ)>xRYyenY{Mp8b>h+` z4i0Cg#?*1id4@-qOm!)x_-3q^yui-E(p>sr+Kts7vTeCsNMZ0U=&Jk)SSgxH8u`Kf$sAsuDG0YkWr9trZHjaamh&d>m>xB>S)BF>dK%d8}J{ z`x_tW_ehvkcXyY{F0lpHRk*#WV_9Xx9fW|x9j?a}-0Y;?MMJE1%$%k~>xB}0l(E!# z$8g)oc^M1&uzRuk5{%~dAJ{LKkg*^FTx7Vwfcai$q&Q6g>T`}rlNr#njD7LTFj=&* z)}u#(Gw%J3z=-i_nl4#=P?St5XvquOwXRgQ+Laqtg)5`BoMj9KMC>4?!mkr=?aZ<( zr`at1wK&`76OjI}z9`_&(#uSfL1%EkMVX*ADD-ay~oU|x86})_Q1dHVW z2MXc;Av1gKBy>XHGlE7qE582GTfvXDOXM$(^jsQCoQI!t4^Ljy7HwA<#0LSvU5Th? z$AP;`75u?5e<3&^Ej(kC;>jELw}2br0KxIwcw!bdy%>}%_Tbvsh3ZEj)~OttYd=lN z5>~M!&ol9nv+dC}m+B=##tMjz{i!XP^wL(+F(Nx;VaKY?&mzdh5iZ5i)N06_$kwCt zdFH=a>V&xH>xBs>xGOL?3|~J=n)3ZLyfr%v)@t2SHz9A0;bBIsj%d8v7;HZP4j`qT zX-G_SxEqA>{RY9k?pKQ&0D8!HwiyY!fVRDf_PIKi-;KLJGm8@UuFM0P-gjBEy7D3{ z4HEC~^MMhb%>^*0m>{6-I%yf49Rus95jCy+6Uuj|$)AqR7TR*4N+-9!rkUlEX9`C7 ztiK0fkyWfw0eBLG$@B^{uHe361>fdWbZkndFWJDbVGV3%Ojo_DS7kN5JaoePD5U?+ zNsMD{)`YJI%$cu;R8A5cO)6YPET~1(wWJfBO2LDp_7I_Dewpue!HenUDw8&xRT&Ef z_UgXnvVk2hZXl)Y%}DqHJI@R^o!)DKKgzrT z^MfsoIA*0FRT1;XQb{_d;B3uqOMBmvK|IQTl0e1y` z-6vo9$T4T%ae5DOg;pf23VMM=10Ak(2{1}8225?;ReUg^Xeo@NkQaY+E2BUiq1YPv z7Nhj0o%vcKx)CUDgWKRJbyx~NdaQD+I^KvZpPWz`%8!fw)_CzoY(;ufepW9{2hmo+ zzKl}giSbEjAxLq&;(gF*l^Xb{A9$CAy~whOX?en2%dA8aQJ{vJYHAa9o%EgCXxGNM zZZ|v6JBy+^Q^j3BEV}i}n&Ej>RAx`L?_D%wJ#=QmkK`r;h#xxc@|ciH0it<57i`|@ zo~Sq{o9RB2>7g~Yp@G_hjKH5=M~8jZ3XNSyl0L!s?sP%K4z!?Bv~8L?fgm3S_Tg01 zWNZY9Eh7mTaMQ7njTv%iy~_Kv6q61nT`m zBFttEd6OK3Uk-~*A}2}1opV9i`~Wmo(X3nA30I|=9p{1|0kD@M%)F`UFR*;kx`KGt zg7w>9jxJUl(ul%>dxJqpK^OqzwJVvky4nnZH(-M^`gqQa8A=2$LDpqO1Vd@XWBA=f z3H8AaR0H>49Vdwy?mlCQ&QJ(KmZ14O^0>?223?7gaP|n{p^L>@x6m!g=rezkTpH~v zBT!oSTLL=Nba=9AG|Rrr>*8Csoik{Z9p} zxMDIRzW}=uF#Y^37LN^(FiCZUfsW=60!L z6;VLcys3vKvRDXP&LW@X8$e|*{ z8xMH#N^fO>o7W`P@`q46J#OnwloS`I6aRFG)3>jXCgF7(z9GGgRjMmK;ZAim7uWh{ z0hA5|s7dQ4V)I;AXZwc+NO(JViqrpCSoMj3nzcfIay?9sG!kwZi#J?|07FZTLO7`^ zkERO7B4Y%ZDmtw!s@JXzTj>*B@O<2Q0>KLaD}ILy;fDMswm6pHjm@7W0&A^=X2@dF zd(2BKd~5;OZqwAH5H2M=-0*u&iCjDr;f)Nv%uDC|16WUggEU1m$})Rs_S27x6@LHE zjC1ke2H0%lW#q^WOinR*@4du7$q=QGFKy}d*F$Zt5D%CNEoupKwzUIKhsCdTS^0hC zYEVB$H3EDko4=Wp^vJFc7AoT<!s%tak+f%>s+k4y#h(ArZ3Bz1iL-2Ad!BpXt!z7EJ$ zlH;?VbE^q$Fgx?H=wjIdZ3Hi0xGA(kdqB#IqCXC4X<>qic$PerzvVk`|IXm`z=!uZ z^DBQVEKc&FR-~lu5s(=5;)h{YX7SLPck4&8Z5_b%E0VgFFcsTQJe+KwdE~FP??zw} zUMBDsG0~qk`@HuUZA!c>BD$&|>5-_TB^3CgHhT@0u&McSC!j&S3ia&so#k*BacvCS z+W{TsQI2BLm&YeKs2OPzhhzF$diq3Z03S(!3R_wjfsJ1BWRBewSBm z9pwW2`MfJO7=dOF(TCNu`%`))vAf=nn{U9Wrj*B>#qn@+dg<3l^NX zbSP@~t}BEg@GfW3Dm4Ua&T~O8MJKeEty4Z%fIx$Y(*YljUXlZBb)12PI&2)a=x$x%lXaL zhKX!J-`kxzAXc>vtJ58vumvMPQ`gI&!N70|lNO|pSZ3WWd9Ky9W3#P8_+I1ca_VN7 zH(b)MW4bTSHnh50i5v<{%e<2UqV0Fw7d!m-ur6;3b|GCFMu(?TLq{SWm{{&$)+)T(BmR7tZ;4!dO=a%UPy zZUxBCvbv{+X$Lp5zM__0G?n09m1;n?G(xIqn(wxG-sPq&;n#hs)j`xQO{?`=1I0Cm zzhe-Y8#u{z!d+3-0%JvuJX>Thp%0su+vcPvYk&$kF4yT z(dR-9m0cu3+gm?S1uw@EOK+-HnQGazOGRv$vr_52?Wxg4qf@{4NcUHRr*96I#|xp; zZMJ|R!BmdrY$lK*uI}+>Jg=dP<&e6I&CCxV8s!9Vo@G8Ug@bIf2x^#V1J#e#1K2wYE@#p^D#eia@522a@_!3W2M$3UNVK&hubF+6 zDCm^)Tc{)+k@#r;5XvDa;bXc){>mI-)G3S2-AyeKrEpM^XQSU6<}n3#=%a&{q<5)H z{kMIbR1O~`!aVcZb%62Bp-h^%Pab5Rrs~=ie4&G37D7`tsLXpWR2Ti!mN1V1Xnj4w zl#*JeG_FB)(|41?dBuAu0O+si3GPaXdlaHd+p+aPZynHmdI?FMmj!d7W=q(C7--ZZ z$Z^Zx&85(x2IGiv`BIwea%r`$EoLKfoxIX$IcuCH8tUilwFD^)`ES+T&U#rUfyJOb zV|`tY=_%ZSYjq?}D1hj`YdNi-9YJ_|J#@+wZTM7jA zJ8NQQ8d-a^S|DyznqH@f>!q=7E-1cCQ|&iK7U~V#e&<{@{Q^^p1Z`*;1A~--7S1OL z$BqNRN>X7!y~3GbRWR3Iq=`j6=6!eTmbJ(7Fb!xQh~+P^{VYc?(mF+RF#uz*?~$Ak zq^e#=X{~q9;*M1C;85wfb@UvVkRpHa#_G0C9`5zjLdDwxG~UCUMf=Us5@91TqXjE;y1(JroIE~L1!tzUbQ(rL=M{GVMy)=Tj^#|0LjeH=2 zd*%5R03|F93&zXdaLxb4=VGo;oM7EVPP;qKZZ6;j1UaRH(5VtNc5A0M$;q?;){d9eyg22B_{8U}bR4vmF+tKHMHxEd2)a=z0* zbpu|(S@+o8kRe$f7)9I?MHrzc5$+Eppt#8%34t#y16S-rOKiYu1K<2gD~{&wgHVFD zg+o|&bN3lf>q(Rvbz}!aYvm)_Bs#SzESkySTe|PUZ+-4EXH2VcX+CfbDUP#P1+K4+-ctPBE3!9(PX~cl|bF|0Q`mZYCGZDY6oiPC5!LC-| z>DLgc!A4?sRwM_elNIrz;Qa$0;Gkr|x-l*G+6 z6Q9?8*EFhOye?sWgEpj?<$EGb2AYY+hX#YI69DzTVX(yiUZ(Q)*Vqf5Mm60e`|Ql? zYqfe++ML9e%1FmP9;RpjP?gvyc`WPUqKPO&xd9hT2jnh@C6goR?@}YCPvmi&P4G(3 zfY|z?YZ0HRv-og z3~7HR7CW{7m+>r$2ZL8blws6DT<_2IWC84Y zxV8d~M0moXUasOyLDD~kX?^v9&T>TSPHPEhl7H^&8czKv3 zP{q`?JhVGP$mrSCeL2h^NyDlTR#MRuyXbE;B>PM8a;y#KB7XMjv8{L@2bX5STrvJM z)Iky#O~blDBy`M6ItbI3%WEW8u!Wk7RJL%v^QKonQ$_1i4L^@h|?}4Vy_W@f%jOc-IO< zHfQ9?(Nx`#n(}%VVeFguPQ`M8kwZeHsBwsGb{P%eTVc8jQJXf7+F&0XmWa{g*ndE| zk#&;kiA7-_)wG`GnrQZJSB0>E;$G>I0y02oJS$-r2~A>2tU` zPIwKJ1@U78+R)5~{7>5SsVd0>H^3+wta24<-t`Vi6^lCEg6yvE!Ckng^V0>=-*Zb) z#ajnxH@ChQDjSQ>7j?W1(<>pR%K!0g$ucAF*H>bPcmhg@s?}lR8knz@M;C-msJ*o3Mr?i&=vRr>wfBpLqG{0n6x?D_j_&mZ?ok28`EGac87qC=PRs%hWWqc0b8nD=f7@ zNZgnB`&URsZn@4MKqqM@#7ai!N^hGDi8-R3Z4(=j%$!UnaMQJ5iIq@zn+AsX*g6uU`F$2o}GS+tf;88(pG8z%Iuu;=i%GqUEEJ!?T{CYj2z zYR(m7l5HIv;=+aZY)oDY@rx^!l&c@m~)jhT>~o4MMzm zbn`9!yO>r1cms9s)DYH~L~A90n9T9oRDN!}ucAjdbc3GKm_oC&C>}y#sR;fR3A4Cd ziu(cP!`l>B8!KeSu>W5zZElgMpp*`^$irkJqN^{U*Mh!i6+UHEF_rIVeQk8tj|W?IE1m)y`fUK7hSEkY7w9feP7;4H$YZeI&J z;m+{pAC=~dXXvsdDVTwZgT~hi_1=RM(_h_n&MO^#mW9TnZ3)Nxd>rpee=|5I=NU)y zU{WRR{ncWqO%tn8pfC@40N4t3(wuLmNp|t3J0Hm7EuVMvs+th;MQlO?R8Jaj@ zMzZMegI}yzw~1E_Kwnl=1^~eah#oNwTjV z3fy2pnG0{;U^XLKopzXn7x&|GUGgS4`QXj{WF5bqZTJvE3U2Bd>^xRd`Q2sCe;{CY z6}eNpsI{Z93C|r#x49`fVnNSM$6OxDtO$=gik6vVGh5p`7Mb)56KD8)OS%OAU2RE6 z&W+35PCYP`;dX7k35xTDfrk!pfs8ro^qM@g@tnE&+dzokxQ9jrzUbdMBt!C(DG)2( z)*Ls-|Bt(MY@p)Pm6dV*saXoM^7tM1KEL8JQNZ|yirxpaflY-&Kb9ZBDtkO1k?KQh z_b{c-5`VZX+me6^tz5-Un3hk3P1;q2cGz(gPT<)F*C@vuhb)ej-l`QL7 z8GX47m~SL6W^i5lYu9w-u5^$)cK{Q#_i=_iZcx~JkI?Q2`Y6AZwd>V- zEf!@H&-$!dsXB6)XFmrY8N7_@tAnVRSA=p#PxNy>el$pS38^9uM-QvO3I8hvDGB8vkoLej;Lp#wFRW+UkTL^2apxItYeQ3m+Z1nC>mBN?lPDj+ilY0C&y zyUrBnH-kWq{lQ@0?7+JtXPx>UL4aVBH24X&u)iaQ4~&SE&P)a66*ZONRef^oJtBlE zkVQg@0`F9Gl+YY5c2$UWELV;;B`c_+Kkn!rP4wu^Z0n{O(p@&ip9TWU3$3X)D8BAh zI)_*u;O^%h9km4TLy8&)U3}Qcuxe0aBnn;GQ!w#xlP9m9*HBjLxtdsd2>5fknqMd< zYDb%0_y76ea}Z07WzGc^SXd~TLU_Z4H$~hYn=clUsc1l+ar6bLmitvAebc0>`(qVM zjS=(9qT59wi_u84;+rjip_Z#FC;($k&0z)RJG!(&OA8)LgYf-B>t#w9K`U^(VQHmT zRvbd*(0Vu(&Y{xr%z5xp_6lf;95Stvf5HhhT0JBX87;^s?6&qOtJg7zSsKMSGR>)r zG+Tri%j&Wevj!qtv{Xft*Lv#Evn=jP-P%FbQsH`ObX-av78~S7_*lzafw_mY3muf2 zMe#IM8e!fD&!O%z0SS4sN)5o{+*9MfR1TW#OV)up#}Z-Yf>Q4(mFnF132MYMmt@wI zV*@G8=N#fJvM5h9?|n{!xg*G7=<>?sfK{Fvy%yt)bz<8}S1AHSzY=H}MmpbWzaf zXBX#EDZQ~iq?Cvo&?HrKUfTNOl*LZ5^+HnNP zIPOsorkUgAbS!99DfQ&%E@tT^8U_Cdm`nC&i^x98tSiFL=|%WCsku9}zzxFdnvrCr zF8pAxpUD+j0*;HAN}hOFWUuk%Cb0J0uo0o4zIZZ$uNNE*gvp%WUtmUKEl7%zDza|R!a^NI#dNc9y ze2I{@x{A7#MRuXS^zRQ$1{Wj}fi-!7%#Q8ObW5`(9^1j8!C4?2C29)D3|XPnsRtWn zF4pI{xR-p8*FHIqRnLnRz+b_~>U}I?D9;@i7!gxmR!B7bh4o$XY@1LR9=56R8$qii zBqpZ%J1SIGbRFpez#@nxHT0LgN@(a7v4SSc%8*Q0t@?3kTe^SxY^o%XJL73nveZqJ zLZhY?qvde+ z-A6o|37Gn8j|K_<1aY1Ga&l8a;Q&G(^Ao|h^s}>Xa(W3hmY+RXzvuW{6VXeT$edeT zc)~AQ-ljBn_%0(*n~T&UiqdH+*uDlxB#LAW2Z*6y}M zh8+U2h770N)sUjLep+ITdg$n*CZ`uEE-8O%J4K%_RR$sIo@es_R|@=UWEE1tJ-=$W0;z|bgMRDI#tlHC0nahIoHg1)tGG|vDu%WuQBJ* ztP2rFu1q=Co!UOp9mb}6E7p)9FRlSN93$+(QV3X|7(Xa5KAkVbs#_9mxM|qfCTvLA z;hUQPI8rmhU(ghp^`7N`Wb~an3C~k|P`w(5BvwN-q(fBK{fLscxgN_VcjVZLgR4Bn ziXMMbNS1zmhrCrWL(Io;Mt`F%N3rtRiNdoN1cYBBkt}T69{*7+I2xZo@$~N~5oelZ zxtBBs8i5{5u;6_(7(sBbz1{W~|5FkxCqz<<{%X2E8ly-dc-3_-2FII^(8^%V~ z1SAZN3*4k(q`h3xJ(5n9dH+m#Saebl^laC|nMlxK|77;6hTA)57M zjP1wGNpfLF+asU9l>h4QI_?J_*5{r@qvJhv10@|@H;+6P(rK{6LB+!uE@s86aMxec4C{^QAnyGvL zMlq0jlZL)%=_zGV;r{)O@QQ3d@l-qoAMnwLWZ1fOsyzkmc3e}P5`5tq&vtEQ*MVgv zpwMwUW7!}4Z*;n9gTGMz{%_oxxJdoSiv5mq5|*Z(e3o!q?N9E9Z?%|)pbTjk*M&hd z>FbFW@ljcGD-a=uULYtS@`RQikM30sES)khrZ@?aT|3^()W<6rO zBCtaP)9542KDe%XtwRqB%8i-|k{TJ25;*|(V8%R)p&H18Qc<$Z?5h8Smf~xBa^)Zf z%r6eE%5FF{C^zQOY-FBn?Uu&dIJv$n9p68^L%^wuSEO#pu>C`+YNy2b)4#6+1B1fe zEaQ1g{w<#>}0r3-nge1hvr+{VnwVPeCA*crl z_Lz{6bbesHYMza#=Pt-h5+gD0(mQA=b&hBL#qtG1T1MyOV-D5!^8W zl!?0%?bD$9E5#+<(b{hED-b)}f+Aw)M+F};hQQ^k>qn7a@83pTXg`Lv!~odqJ{BQH z@g}M0vY`Jh%5qRtfnjHRrRd1 z<|ALgB=8$18IbEXM@q!bT(bdy78aTjK3;SjwxAmwn0fQ zxR^+FVbzCtXP)^ayNcLmIkg15@SGXJVEPKkv86GY)K}8WwR|JivSqz8C(x&r2n~*P z*M&CkK*@^wWPuJ0Lnogj&a_3+JUlZ697^~qidcDAt!)Si9mq}r0yeE$`(4Fro<6Aq zGlt#Z<{S3h=Y^i7Ma0)4@tzrDy&JsdQ)vYFH^fn*f-Gk zF1qg{wZ$(1q{+p@Bs{5rtSmxnsC`&9p4ZJu-LqS%@vs8d6swEqO%(uXE^0vrA6K8{ z8CAGZ9Lw2t<>AX%~Ufbm!?k6TUB(8Z=z_`y7Lo@hoUa^8EWrc zy#KQ)SK}I!D^PK<52?c3Cl_D=X{A)MBoG<~RHiAZ>O{>;X{>`)JM4j1?l^XOsAy?&%tNloflo_7|x@AtU}R?VkN zp{K4mjgF_~=++g?v7Oq$Va30}p%z6#rdqJ~&{Y>+_H;@b6d{76l#T-jv+id^wDap# zse_iUH8+A6jWht1Uw?Xgrf}csvO>qJ>cc1zI_#_*6XwQSnDPU>j^sIBkHqtD-GtuFauf+X5G^QUJkilgfsnKAgzv(m7MqO--e6b@oaAnR+4DI~;3 zT@Q#A&Q8PmZZ&)FBw>QL?Cj(*2Q}g)QaK3{FVI=eq-3_tYu2gG~^%@!r zf$PG3Qju|>sNZK{c^+*l%SyR9r*QQb(NJu{lBDinGtk$0ZRN!*bq%9Ngi z#meV?hI*}aQ9v39J<(?UGEi6*UlL~et$<54^i>2WBF>Dp(bZhz1mhs`#G;w#cLWK( z34eOL2RDx?lgh+FuX=auV%94cj7zLra58@Ia+wSeGK}9k-&;`7^?^`XlGnZUFAi5W z-jnD-dj|Glu0kV)Eo7C)9V)dp4^4X1Zk|_!Pp?TMJPVfTssi#IeN4wUx%H$4QG@&M zp;6_t1A`kl}xtFhP4wH=17B@vGIL=cB#9+iijR-Dn zXHWs8Hlg=~ZyboLLvqJKFbg$+DzCn*SnnT>A-O8HKKkw(4L=lBHDnABYnVE~S~%B_q8dW;)UI#hv@M zakvT&l)+B3Mk_mb;H-IlPN83a-TDAhBLj{-=;n*S{U4E;pE5H9%~bFQBrpoMHMz&> z%OS^?F$>FC?K?jEk1!Mgp4}2~c!EzS5g+z^)6rp!ZH9G?gQ{&Jsm4M?`C!m$PT6I~6=9DdU?Im;tW?ee zW{!R7e%`*xOgI5(fkz!MiS1;i!Al~PE&$jQrPcf`AkZI-9q}^tRissU9F`fsVi_++ zI%E%`4kTu}Rvk!B-__x1=~vSys_3zi=Oc$#a>c*dIHB-CTj3IgNyB-Nb$voyK5VLO z9NtLxW`b8m76pruocSRsS8BV$%8K$ra_OUAnPEXud9EMF3E+%R(caXuW@0Qw{yV*p z09^M8YA9!CvTLS7Sa6r92=3_88*m!*Cg-B;sDu>7pmeJ5FjGt#Aa2v9>&d zGI2BZqdRTu0~khm#1?vX0?cjz*5%~aj;eU!HX)i+xpe)`(sVAY!*UE|f8XGg7T2|$ z!{KT{_XoION)P~Dee%9Dt9h#WQLw_KmrD!9aUI_A`P5je`_YaxvMuT5CShzwy= z->-3xALZkBAs1mMut)G8sGM2l;ZIF0^o3Hwmu;@-S=c50+l-0Qab_c^J3*=ym3x4W z86&yS-2#H2M`H=7xCy_4WX{j8^I<|C5AS8SwmL)Gvt!T$xg={wrB-4NbIvbGk^g)8?w*m7? zRiR``+W7Dpaz8Nqv>Paxxg!+z(KPRlm~V(ALReAykU#Fa2*J8>qG@3TShhk+)_9BH z2BbdCBs??d<&j4BxtvBFAsm$akFXWrW;3ZAdtOg-8ghm9`;X; zF5QKOKf4NE6`8F$g_w4}j9-G}%>CamtVW}{ZTAU&j?V!9mE@K$^@N47$R)g#ymsqX zs5vkCA}NBM--Mz?u+~RNbQG$RR>hx|q*tXI5rJ755)=9I^og zqm+p3>DUAUO zMfnXLsDpn#!2>|Llkx$ci;GIi+)dT1blD|>14P<~x!;c-0jH~nMGEM}NU`bZMW4Au ziYYOlyN=`~zvV3TNW8qOfy~hHz&|tG$EW|Dy_mU!$b#L6D8GqTe`2Z<@fjmX5+Vj` zRkk1Y198{kJ1Nvn$&u?wUt(KI9SB=({P^M&`X#k%{SVyK?$*0a=Fx@%u$$D~0)!RI zcAm*gj1uV^_+z&PjLolHEmbL34yO)`N>=svHvJ#9LJ#0|WJz4Bim_IY1$;~KBxDDp z3+4$DAa#trurkIM#W~lugutF?akopYUqV-j@-5@TykwHp;I80$k#=ZOVncLm-dym`ndL^`H+`glK8-V^;>4wZ_42UF^bF*}|9 zM)VH=Lld`#n43s1z)lviXBrNeKM2AYw-mCfY0_S-y{8coUF@lbs*JMD;Gha}HWqij z`^PX$tE2wEE3{H2MQF2(JZJdWuIor^?=Fe-lg~RsNK^wz6DT{=O zqzBCEn&;FRqb;n)5@mAWFFNMV19Nln+2A^|Lkb5kskN?6Y_)SJ(YIf(4wb}#aG=%R z;$4IIk!{^vi{H<_>JRL7xwe>7R_+2B-1|Izt*nYTfLg8;6=A1&KMA{7naI?X z*mSr;d4_1DX8_I+hlpG0z*x&`^d(b0oz>7BA>60CRVnDe%O@Kab*c97$j=x3EZKwj zz_eB9p5wvXXqFVw+iJi_7{oSQ9@cVc;?yz3@nu$&fnMOeUb?B$ylUB)b9^T*{t{cq(A0vI)vtzria}YEDoDR?w zZ*KP_<}69cnxDCV3m><^Pg?O{9Vku3#=jV^lsl|D3T48cPv8%UO;$vDg}f_vQfD7S zqXjs2hyRHD6O&$Vjs_p6QiOo;bzk^1d>{l_()hU*d4}RGCpLRhgw=b!Q`JPUadibn zyAp>KYOSG8iyA-^v%zyiS0tAHV%>{3x@ydbU{@H-8zBv(7KLpqLc_;5h_&wNU*FwY z)_G<8bw_~?hY3S)y3(zV7I$pxbG_3d0HYM#~E?6kb3c8d=3K zqS63Ph?**)DFam7KH?a^n$DGtCfzIU%;XApi(OyVHAL^(TLc~`WSI|;M6QZEq^n0s zJ{6<;1q|)lZ7mhBzfsA2UwZ|ij%}|n{&LBLJ9WHu#3B)R`7J}h6N-MGZ%63XXz9NO zFs2w;AkUA!ZWug2T&Zq${Sr!jf3cN>pFMq!6vL%(CHVPC!0i#T`i;u1%}FXl!SNYxYrsnTAoDF^sL;` z*+ux`F%WHk+{9tNCbJ(8LDyv9*W~BXQRft`TC-B$ifkOLz=%fDx8`sZ?A&?1h7C%; zl(p2hr>4T$lolxQ=My+ zKhiXO^iUF;A$BK6+Q3CL2MCiD;(Bs+j%h?r-xQT3K(c&9Pu)+W6S2ddo*eKKemhp> zo3*p(dMPBejuuk3!?_C2((*pB207Yc)cW}qwSeay@8Lu8YczR*9TEm;ECiV-ifrn2 z@#6JFm-Pvp9|5Iprtu2X@#z=r7*jqNl|J$glhcz>Z!QH4Vgsjl*%yE%|fesbYC`k9B1pn`NiE zkDQp2M#xBIEHi%m_CuOVzZq2B)UmVoix{ijNex4L19^;kFhGnTpdYLKf{NlL_;n&$ z1Y&MS`lpZn^uA1_PMqJf-JF-okkIW;M4q!xMq*onxKj1;kj{(M$s~(;lfYMK3`e3e zNI3=G+e7+t$VJza=epws)8=X4s}!3}p|?f=gh%9N*dOyJt<{B10`ahB<*&Y2+x9P= zlsH+A^yO`rgY@#r&W>?XJBcAsizrPRuiq?SbR66@1mO;jjX*B+AMbeWEG7@NNY;Nk zCo}l=2Ia3HBCnloyHXC!6<^Xb|9Y0_3Vadp88#Gg zO8qJKgmKGFao&pfN(Es^0!Od9SWd~H0@`D`<`SzeY%@f=GR`qPGksOM><6aR+>%cE z&?Y=~!{fs#KoM{V?=p98iz{M_zo{9rWhk@5wWrR&PURLi1z1vzPj6#~%VbX-U7MUw zzpIM1J4$zWj)XL=t;n;|B;YHT^bU8IP+lOMrIwUth-(HnKZwoMkvDPAYc-j(?L*C; z{6uM67Y8|TveZ$M*tmLicQPs(s`~1?MjE@!MSv8-5eA-->L_VBX>9%>w*Y|r%V62c zn(KNe1i!ycJ1>MoK<>RMC!!@9RB2Boo-*~sySU{K%HjEM%~^Cs@8&Bq9gSOiTFSjH zS(+z_QYwF?jS|nsF0B`}e@kwGws);|<@^MiY+0b!*}Q zIkowHYBR?KMGE|Rror6jBR~-s29);P)1m)!RV9gPF8VeKCi>1?NXmO0n(yu#eH0&w zdzBS!lpKL%h4v`HXDG8+JX#|~K%QVpyBA~1#QlkL`fWA8b7OqKRX*gC_GuLUQTh$= z{lmWxgmV(eI=dr0?itHwcN&2w^zL#{Gq6Ge4`Vl3X$It1e1Y{AX9cKdAIcv{8YytA z;f*yyUgN1NSKrw{X-Bf}HbYGRqoN`^Z^LA@@+hfb}nFI zCd4Q7?qPXhcvIyX;NUTSPTrR00NzC;aN$9Kz#z;}Bl;!_ac3V) zLef-el$x+nNgK-5mL|t%N816O0i|OF`$xzM1@%D@Ydyoke6RyD9t5N!Dlj$VqW-kwh z3c4|(aT@>wmG2JwS>5ukT|{!9jFE0-SW_zoK+sy@#9`^mR()3i=G?_wKgSh&P^uvl ztZw)Q;-aXE&mz>`PVZqG?v_|Zl6?>(t8itw$$lEtfy;J}hhR_mP;XK>ZLQ6|8X-iY8^zoim04=GzdFy9Se3)OBQOo212AhBG z1~-aA(M|Q(jxDxu3Jg&2Z3gZfwKeYMh9;N{;b-To58`8*HY*Bh@`jBI+uXv$IN4&IePA&#Q}SPnq_KG6dx z8`1sVBN?4}mPH2`z{#vwUva7O%J2(8e&t1EctlL5$-of=Z`j3WMHY+UmH3SsI*d>9 zj_sVaA-9FN=y=`DA1+L6kx_6xPfXhwwV2g>LZ&EAu!c)-mq#%85~Y+H(IvtCy6SA_ zFqZ^%@lf-Nr+-gCF1IH$T;&ts9QpNHKtXwoZ?B&k^V)E*P~Yc)80_o%%NH(#EaU1Z z@=QTz!3?EidSHA9DG8*eYq0-FGnKXlZ18*WMtSmR3+l~{@2Qa=;dM7rbqy5(3|TM& zH%nqpJwDP`TxnYPD}Osj84PkD@Sb!;9VTO*lxqLTUXofXwdP(UOOo6@5dkv0L4 zY;IO-pT20nr-P_9DIE^h1SeKelqV-R=W+b^SZ{G^u&xB(h^zu4@CljVddY;+fL(T=)he_tv z`MTc|6?_A4kZRrYb5#R&lVWenE%orNQ+|bX|T>lFEhP+^al%T|KFG4siM!>@}SU=T@Omtw$LmV=?HA`d~2T8Wh}Y) z3*tXi4+Ett2CX0a>gX#e5Ha;s;DFlyQr9vo?49Hhp zxRx=4K9@QiE$RlL_Fl}8W3?%aL~yv?Q0)#}*Scc<)h!AaetEk?;GD=2auY;c)jCtW z!m5Gi6Z!eM3Jh=Kr_=qb1#7RNhGAW~)9#MTvB5KfFSdRL2phi#La9hUKno zA=a$=SsvdP$(=;{CxHmaQK3G9D#v(zonfsxOAJzghRMX?nb2dQi5FL1Wlh55 zZQ|v1>3*&hWi1ncgX0$4pSX4WuJnAIxrz`4%XV%?&CTX-Oj}LS1YX(udKw~>C>ikC zjEyxy)GdDC+~~e?1Zf7QvZ`W3hTvEsjQ5;JW4cne1lEV?U#UUnjSf32yaVg&09lKR)e~_6vP*GTK_b zsA>ESy)c(B#4U)aWOzP$vd`M2=xHz*GU5xcLC~YDp>gH!1fhqtd&Cv=YMnS$RLv42 z*WMWZXP=$u4Tj*=Y|ZR!DE!682m^8d;dXk%9)&lYwp*N+=(#+amjn;R?KI4fh~*t) z9qi4*BPvF2P)6WD2_&gUy!8ul<|hPw^(-|5fiF;{iC64uUf|VtR@TxeoM7UBu8cvy zJ@I;jU}s`evdLfdp1Oy@XH(CAxp5IK%39=)9eFYxW%!~TC7X&sUDR!hpJrr6<8b$l!x0?oz(6)sCn-NM`PVq?AC9jqSedjNfWRW`~l!) zNdZ+-Eac7&v8#_63Ifg#JgyNs+C?9+IopF9U7smn+%DhvUtpsdGy|jd8VlyvzEp@iY5z!w9KiwEkaPchB_Z^7+0-;_Isor4;8sf#r8b3uC|-aI{kLeLoH~$qVod!K-&|*`Fpc(Xbnaz!fc6tnGp8nAU&SS$ z6*U_j3(%v^myxcKR6T243tWIu-Dq*Fy1W;`Z3WS5v^A*D z>Wcy1nA(xCwV5n~kU3kCW8fne8)8eIAhB<6gIX?1b0ye&iUdh90Giqy0(fVd4EOZa z&EjVRR8ez}Iqc~O>gCAXm^LW6+{10}gYg_+$L?-uB2-KhEwG!i_utnCn8EZZ3$Ff=|I7Fd2pwTM4&-ZPzr8${sti?rWc z$SqP>dpj1mKlsr)Jfe2c5Un(ZxoJY}Kv%AMgCw$O!#T=fyj9?t2XO|?c#fQZWPSD* z^azWIY&Yw?1bEHKt`2z+b8miB-db&zIzJ{Nc?F|Sv&xWsJ^h>y z((ldo4iitQQ-_AowS>KV%Rk>?ft3EHD_bZMi@MmYC4wrJAyk+j)J@qBB=pKMHR<8J zX$U)EP?d8Be2mk$*&lu`Qy zECx7z!rmcDD+(B&OC(<0yaVXbwY2ba5?3 zCQw@(@#Soji~sFGe`UEB@+-i)=#Ni932jL=zU7Ul*ytZTJ0$$B$423N%e`W&{AR9N z*ljFH*?tR-S<--nYt`m=J%7}xxxZRt)s-MwFfd}yxYos!{9a8jAk7UcvQoZ}vT+KW zzL%CxCuL&2!jm4SWKf8!uAlz}E``)O8HRG_;S?4=~*a<64xnIVit z=DG?t--c%Rdv0(QeNpd}E(9?uI{cZ3+R8MV9_}s{9k8RoJ)#=0j05vK65cvlFd%_# zlI}q+6`}K}gqXy_iF%Pctl}IgGpD?NpLi5i`Oz^whY{UMs%}YY1H`=Jl6}d!`9`#X z=TXdE{(&F?5H{DZY2oc+2?5TNnNs+| zd3&TI`~<{4lVMyt)fY~+)J!1dHv}XGovptKCq5@e4fx#9(BRB$Ku+2P16uqSu0%Q_ z@$tyUTMRk{aBQY$>5?(7Q}UaLIOE1I!Tt@+Z38KkQy;4L5J2G+LHi38_Bl#u2Q`lbFR)I{;l4CFr`ezO8d}{N zp3q$L{G66=St4V%K3a%x+~|P425G7NsJF+E8uoU@Ms8v1-v@|#akYrBEghTqlh z!cnS_{y_6O8b+QuHc{j!xCdV~K&J;OumliMc@ox3u2wn?YH0CR-5gg*hf_SRRT2}0gSr*m`FRq{e?@p?faF! zo`}q%tMO_^~{}71Z>US^|Bw@$|(9&A|xy{5e1i~J_O^)Y!N^(h^XyXo3Db6ajSXTlu2m>&rX`;o148qd~ z?}*0zJEcg)42z4Pv+TNf4-Y!S1S!X6y7J>kTlyjpnP6z?_yEavx~V&0p6`yQAmU{x z6I){^XGaqQ8`ys*J3~uYCU$yy1_FA5|9$4>rW3WWb~bUO6SX#QHW4;4vNJaMcjf5h zOu#_TPERLoVr%AXPQbv%%uFZy?~0yI*~8w1PR`I$$=QaN_y2quDnL=~&aS0ZMV}Ym zN*$Jdoma10(*xMsXh#`%E=(=J?h7V;XM_q4GI`z`{iRZ@|KGmf6>`w*uIZK`WEOrx!8 z38D5+vj@_vV^`ctui>JDJfD}kC_Mqa#=pO2959WJ0yrp#w@g2aM^Ourza~v*)%GSC z8ti|Et=csPM{JG5c|BOFnGTDmgu^Tz4b+ZiDuLfO2_d!;=F(sRa&2R%4A(oZ^<~iK z92@iqxDll4YUeaKqR9Npn|>P!t>cKe3^#WdjzCQ0t%T~SpmmhDnESO)?9-3FE+~!|NDy=IoOi& z95UL-!u5IgwIm4=b|@i^87MOV1b0viz&L;8<)81yz8Oob-_6CgKgiLb)gTT6dNOou zbL`6mZ?{d?XI1)sn-)?&COE*TMFlxG#GrZ(*8%f9evT#^+F1Vkn|lsI)$}Tv)&xT> z=b_lo=lX#Dt6Sx6O84usNLaJyQT^pbSoCZ)8jcRMUpj{yI+*Zmsh6QiEr6BvwMrE| zYS%{Szb#&?v@`9(gqQ(UoBSN82)LrGOj=jyWAVhKJ52J3=&zJKk#X%)0B6#Frbezu zS_`Pgd0`Vxh(Q<8_$&b(@4_j=SP(HyGhCH4Na=bDlAVB${hN}2)(%|iXOX9dp^eP5 zS9AgpHvk|ycOu#zxq`8$4WGq_#_q~w1RDOSNDtk&%&lk0zROJODSI=~h5l{f+0RO5 z#sbL#zFGr_cB4otV2@psK-av*7t(uh$HZWDQ| z$mZ(dOpYV)FO82H0L%#j!O`5eustVqgQ2GCg@gIl6nbE%vF%I?4MSb1)-;xDBMoNt zCBe8Z)!+M709o3SoU!q^$~hwB-}Dv{nu{qR?KlJ}<}#K^%Q3diQs}v{zH`-7yfFqF zF-2Uf5h+{l@p)$-CAFfda5}R)TEefU#mG)LD0e2szQHEL&LbG?a2kRD{#ij}jJT+l zHXcmRRLGKnUWvY3B733sfWr+)T-c^={hdi484X+cE`(KokIcu z+Yco@9jtNNI@80X;fb~9Rp2;1d|fRNVMwuoi#mDDH~!CjW;25g^#{FabuC;$;a~cT z2Db4rgrhva(IM3G;s!Qw{7wGUmJM{``hb~xZhn9ftRog`aF#FI3D_gUwuMiEd!O~Kn{GGv#kTYSgbMOEMj zP;Fk0A17~zY$LfECib=7-KP35hc$2u(6}8ys=Rk)3%9-%x>NW-hboh_FwG}L!7DV) zelq1BEulE$WH4U?_xJ!TG>-oanvDMw(BxqKFU(|OW&a16jQ<%i)g9$PGJuOWc`~V0 zjo5E9Wa3nOa3u9llyjt4$Dp2QqgNp7(?w2SEi%Zdl?3tnY9cu!WKWTF&s;9K0X|+S z`tJhKyvLx7YS3DjLQXp`{-E>p0S-uZ#Vu9T!FryPWkN~yY&82Ua%DrIRsZo>GbH(B zGixOM&Wi})sf!4Z-h1)dj#Vu1mWXeoa{cl))i2fkb}AzXzTvgb`S-0;Wg_Pvu}y+2*iIDo{bzOQ zakid96wioe6t4$FkDDSuJR`+erA)7?vSW{UB^LwOSUHIsgG+v~!@Ku>S8kf|5+Q*y zSsa5^nt*4MhuzsVM^lq2lZE$;pI!a;kX0(=)HH{rvg%O=02GK?d=a!0_CHsY>3>pD zdNz*#Dk&oa8|#151__a|M(N^(=-5O+a2KpL6!bl`KD;n$UAx2RFKrULLZlz0O-6B4 zG=HktBUe2mC#`EjCkKNKF{?{b74Uuw_Rya^10XhEh_Nbq2b{iAr!RAUhpT?EdaUwa zDpZU8jr4M<-bu{*wlYgbHrQPW4E;2IYN3@~i&2A+GC4nmyf57TTXK0`a?+)}$M;x3 zhfqo@#aNzcdGn2pd z&x$Ol-K}QqbKLBSZw~1plyud4TIu4jveQ0v_^uP@n=;_nGpU#GHvhUgix2}V-$H@U z{P>JjWjp)0RCo3Cl)3w$5x}`_wnc0sDkX}f*Q_$aq4n2&`?-^tpEdD(H|7xJmvfjYSs(f9{_hA+WI<&af(l zAAQ(Y3_XbY(}gVN@K~@rf?QMdS6ek_aUK{0**9r;?gacM5NrYin0-exV#XHu5TfLB z$f1GHPqFx~@ex_pb)U5%{5pq9<;uxqVuwQ(vj_#JZLNj6?*4Cx{oN{wBMTzgK*|0i zGNj<4#%Q6ldQ}%CP=fX~1L&jB>$QXn&(p;l52k3lP07<$E*_ePQC#R-23${U=cP#X zGYX@lF$mKE5!0p7!~GnhOcs97*{|SIwcO_OwZwLO0(C1JgE@A>h?cb*vLYM9926l|%DM7bZNlS?T1grJs4#dzB&Q7+*{9`PypJ9m9i?%`V- z`*?RkQp%PIx(S?7v85Pb6Zd;>wD3%VCF+-NGBW1nedGTWk=<(ydI+uKQwkBnRcX`Rf$va$O9;GDk`mdg*g1dZmDw@=NJc zSYf=6nR_yc9RQqpn2}H0cxS#)9Q)sm#<}O+Q_;5k1X;Vkzc_-`Aw0f7RH@~Alv7wE zDiv8Rb5U1pkrRXA@#eO{8mC+r#tN~}f)<~ZAzV-#3t=I0;!m?i|m^p#yCD2oJ5eSls}c0!=Np%y0UtCQQO&T)Nly zE8-ndIfEWm5-c>$(Q@p{Hc|>{G z;~Szff38~W$<%Y(U{Z~L2s1r1hmlm5;V{=iT@egxJdmJI%c_=&!PJ;WCO>8l91@4R zi7QXq*GW#CpWmV3fpiydJHSNC{T)R?&D=lO2?fe{d1OX86CDJd=A8U2F!-&%bYB*Z zZCsdE#-xiCq!h2hjzHU8VIAjaSnHLtIAzHL1jS6DX1nmw4AOiFES@r~Kf+NPW-q4t z2<^TpaKLJJ55LC8s?|5~N(~+ReV0=)B;VuT>xjEdRvY^?smOSN#Sm|xo*`;YR-45R zn;OZ4Hzd+UFtqTs%A{mbbD?FFJzTfj@!nmAm&-y~fH1B_E(25w)QL)_<#t&xslzoP zAdsH*zpD+XJgDGIAoMEr#*ki?YOM0Hy>e=n#kvIBz{L^zI1P+XjoT!`emDQ%Xzsil z9~Nal;$X18F~~qSZ>ey0cpwTC?X>DoD8!y)EU2o1>O{dA>8lt++e7?yp&7~^Y-NDl z353cC8sg+gHy!s3{czX1yqDYUPcl9X4ka|MEw@jty@$~~!J-*TMQ~^;E7Wa{O>jUIE>u3Wwwwv2*{Ms>XK^{Y!U}?_I#fEd+tvrE zUNr1?(dTeONC8Lp-f!b68JsaF`Y5&Pj6``b>3sjx7Y!1=n{zN#ZB)Gp(|k}ouYj(k ziAwF)5&v4OZlcy&cVHM}p|=XsUJ#2al^&>7VMSoxHNcVk=1f(Z8vGig*oQdsn&L`v z{Lv%rqd0HJ!c~uvb%7wV>j}b9mJf`hP55W`B}cA@^7VY}F+tFQ7{0yUBXw?xo2z(p z?sZNG4DBy+*|9fJQaWNNec8*kZ$Gw9qW!|X@phOA&&jZ|NP=H86hOW&M6}FZ58dyLQIrM_1}Ka)lS~$f5f8V(n4hwFOxSk(umOsHgYO;h*5-W?+B< zKh1eEV0mW(mTf_5DVyT8!vuD(A&jD&tz&L=o?le>GpiJlUmyd_`69nVlX)uNku}{{ zvPLtXHCL#))>ZdYIOOwV3h3%{cR8C_@ar`9P>$SP5UpJt-V8?3$Q^RAhY#Pr6h&uD zw<7$Y{2n@~QI-eI87!iGE`6XJl)}cJWP2r#SUt1B5a;efinF&0Sizc6?;Zbw;>I;{ zam#-K9hYkp8|mSW0$9ST?G!+<7c>`=rdiZs<_w$aV=mht>BgB(53t;;#gWiCC1W~TZjdWABkR&d z=Qm&(e&F2y+~hF-kD8qSYu3Z^uV?*#&w4s~m%ey4qm=XL+YO0=7R81(*`7RcP5>Vh zOsAfq3|P$j^Fu+dz6d77qPfES79aS-sKd(zMiH=T(g6ri-GpQIsT6Tlv^uwg`0Ok? zr7h^?ahTx*M!wB-H7WLs?N3|KWQZG(-XLy^Vf%EUMhmCuh$0Qw0ygRyj~@~gUvaBn zvZdI_!Q^K(TPi%g_JwlpMvxS*$gn=qbAv;B5%_*e(u)`FqcOE^jy!>-+dsadeQkTn zW@&4Ac1KG_(f*X=P9fS*!OY+RbT_lQ*a1e7q7T3TIno=FOXh``O0=YHqlZ93!nhan z@cRFVo{bvdD;V(Z_wLbJUqvCs*%f6;d8Zl1B|sp~y0`a@FLKnwSk@I8A?&%2zN8}@ z5oD5N^rXmS6}AMD(gSwoh!1d#~~-kF@0pn%q_|voflBU`rCgOVSPJ9ONPzK z8lcm4oBSzEE|`$L@(dWJ{u-jcJua1XI5qYUqUYuh@#+bAZ#9iiNLPvBRkw>ETTeCw z!57r`0h}9UA|u}5DrZYhXxBRtcz52nZ+pv4G-b~{gNc|HMF;j>hc9_kEKHhAwU@ub zfrk>i@t3R-pS{Qt8#kpfs`|0GFA%#qfqE{gj}xWy$*Y9Y$tX(h`ODnsqtsoN>YW+f zE8SIwbV|VpY{9=6U|y6*S3)hI&{ce18Og&hmap1tg(TybWb*y^G}t*USnp`DDTW4i z$-oujNL543d${#d=xS8?&xs8~c;l%qL_?`-PAx5k_p~VBteVzfQu!-tW-}D-i`^L~DE$R9hPQLm;udB4|h}|J;GW0zy}k0R&Zt ziJOKur~vVa9h4{pIG6soF?f4!&fr~GuW>&2ftfBkA3qar57>DT=qlIK-n1XL+SfZO zfwSD&=8tIL+)CHT)mL%^)QM-3S>hsqU3LAOZgI*%Y~?dg3kf43IBC~NCr|#(P8u8b zp5+IB6Vp)Mn&crs${~Vvf~yKMoGIBkega|B8AG>f&QwihRpD?@1m9+ovv{2aZgzS_ zGqlWJUU1}=0a_wGAP*{*mLFBHB4$n|m`we;A*v6?ujXJ^hJ_kaC$5?X>hQgqM4lyr zV$3LsIrSGu1AJb#LoW(NzzSNeRGm=M2w!6w^%$)97pEogx*oGBN139X#t5L+8J~06 zFHUrsCxKj!O&Y96Dx6M!F8-*cmLWT|}`vMr+!IOS~Zp#Ymz58B|#Qe?f(rjq$$$ zl|{Ykp9p}M^sjB%&B%{IHzi#k+XCZY|#h1 zL9p1<1f0Gl0d@-i6kB=m=}~*!vuX!ehQ+@De^Bb%)t>BM2I9E%pAN6?s20atI6kPq zF~^3{vM7P1QJ$%L=P=SFG~*cL^_NmL22Sj)GD_Feiyo)6ilz^!5nZMWdtl1Dgog19g}sM&2;CSz5EVLxdx-+R)lZ5O}sPl!&o{-U~pjm@c=!8 z1Q;+%8@4lh7*fL3=Qx+P?u9Z>xVZthm=b|sr+6Cb%6}5tRH_%()Z>4wb~<9{A#_&J zjnn@Mf~nWCT<7E0Up#!;k4B|rZml<1_$MCAxM!PTzEjQ4-7$SaSl#GheRAEC$($Ip z?^_nQk@+N-Rz}K@y^$CXtl6%V{gYxJ`y(4;(NoS>vyBrpffC6S2yP4!#Xp@AGgS?@ z3;tvbo>Q9QY^}kmrbq`S<6g@?h@rHuO4W6zHS$=_bS*C~056BWtWWqE7)sxfK-!^L zGD7gvK^K@cbEQ^<_?g{4(pp#+y8Fea`CZcRme)avQ@Y~6LXeueu=ECdrJgn}dK}0l zWM#KeJ7OSh5~Y8V$C_FZ(;F#|O>H`qx9i}4@XfhJB&=2))I-Bz(J?7t~t}q z_D=4zz;cjT?8F+cWfBGPz=}{__H|m&yB(t62(<$1!P^&-y)dr5Y!H(1ia&~`0rqHL-7&m#|0=$)pA)Lr z(aU4Ijv+Xj(I)%rWFr~qfw5}eT zhHq9=A=o!R>o;oWB>n}cMAerYZh6D)Ibig1kT#QE&DEJ#h_+n%s~W-)n@cJKY6TNk zoV;uIs9Ym(%69d^%iR1xr+@`S5OrUC`AEJ;Ab?9+1fnLbt}9fCd+d!jqM?(To|FkaDM_m zPKN{*Ls#Qen*0>#-m^&EsWdg>NN?+3%-YrzuZ*?~h>g9^zn#P@T5j&)ddnsd(BAhf z;9$Ak^|=~9RiE;>@=~^f{~nasOj4Xi$Xij8r$|9O=6_}9A607g} zFZBm`K5vV35--5Ia#upZTOIL)9oBDzqFp8E*ekI_r-mI=6in^!(%yRv#{->+5*LMY zsk4vdm5ye?Z3XW}8Eoqy8wKB<8`}CTbh(EF9AsIR08+2ED&e#FfpHG-aCL#>s&mIe9P<@>QS?icA(M3sCvtzBsCLswy_%rlI;fQx3?#NH|~mAi6c zwq`#Xw)im+MBYx&S$*_uDfg%f|HSW$8@tp(jJf~Mvte1e=-y*HWztWFOyEYU_}t&1=+v$B}j(O!W5O;13)d>X|7JdAWvdC1Kzio z70@V3B@KezT+Y*RA=kX<W7eY(v3B|pb}Z!&)sgaEb=t2qOyv|vnc<1SF!G5F6vzrNFuEODJVOIYW%qO+#v zwG6qp_z|kyPvH?t6;sd~&2tbuuqk)p7LyMV9~*B?=((@=88<7_KcYF@?{HgS%ddRT z^Fr9f6F-oPFo#iKonEKMvi(z%QI^X?&T zYLaj$d-NchpRKHHJei=^4`0GB#83=o*$SK!OYkJl3SNw!IRNKRXXvA|4wLDyT~;V-aFY4n^9l)$N22YeI&X!P zt4WWC^E;&nw{;Bl4fZ=YJ>Z2mfKikuq+zkWy(Y;<|P*?u1NfuHP`atDFDgDqG2 z45QmM$&}+vCtv!MHz_AO*2A!nh|;9L`HEcr8oB1QV|JE|=Lq75J=T2JzCnPyMQ)Q2 zxMElyeuI&YP;}qjWeE|@uKp)p+e`ecI@)vLhYKE*>5Q2lKB4a|PP`>pNe=;jVM=%C zOne4wjH){jc>8wBQGP7!v-_gZmlO zY%YZ)FO=D*-M!Fyn}pU?+|z^`+UmiP?(%(k+>y>?xfZ}8M|4lTqpzJ6tcLbXC-g`q zGR0$kFbAx)o~vlBFqpU8THGN@JG^5e++I|~Zk+*qamx^(w*aWo`G;!$hjMNBCdXW< z09b7jnp}uDMx%Qm){$zicM4SVBU*qn;cb9-!-I9CR0A^~&ZA|DJz`zgMucvF5gC&{ z{1eD_cJx#^e+?{Y232;c#3E^qIgjSpKE55qDGaJsGRvu}0L<9(Q+%hOAP#)?ozS`^ z8rSXj#@rikI?Q;4+(8;EH(;)_N1KThP4_}UPm}4<9x6~ON9AkmG?@Y!REk;mRliLV z5`JX0rT>8J2y{7KVyOJ3FbrLQAA+o?NMYP;NMgYKu7Pn%|4(Le>uQZokj8@@xhUTBRiHde6z5 zbeipR>W-cK#O!>xPb2%Yz?@l+^VJ<&fR1i7ZGTWz`ME-mk40oLvhZ<{3xld7Z>mH!tnsrqgYCrcKmUYUDXn@WAEk}ePj*45Vd$(WVs+)TQvMlg(%4&nz`?_C>4Ja*G zG;&Qp%WO|6$&U%+tHVX&$}Q|a14m}PYKN}!E^j$st`c7gTkAry=`wb zD=R3~WC7M9IlD&)o2bU@4e0k}Wn?G-5CDW3#kwPr+Xb!hR65cbP6S#X2Chk`-1QLBjU?y%JUNeToaYu)1N5P znO>nlPbDPeV;(XxIl0Jl0F=k#J+GZpzU(m zR0hSjc%=DsnGt_Y;()`+CruQ&#-AJJ7wPi?1mZZczBz|?R^qWPu=l$E3@U8@BT!*u z`!CLpfsy%t^RWM~)g@`T{k(iv{~Buwj2E334Lp;vS(1~Y8XQAz?yq80?~fKRF`RvV zreo9i1NUCU{aYr|vLzfv6INs-Sfz5YGN}we7!KYw-{4R%As_=0iS?AZcSgCyZeolB z@yw66nD9dKidpDHxO^7%@Rf!=#_rNBij2kiKD|%2u38gh0BCbvD*d&QSHhDJ^)m5m zh4Um4{0Gr71nyx`*-^+TL+qhSb-&n@Z=JQX>0y-}wkj%1mb3ExAKH1Z~Z-S_+2T_Es+J$`|0w^V!vL!%PiDSBt&_PmER7UzRc4OZ){C~wMt7}3w6qd09TeV zj1MM}yWbQlbSfHN1HB$_tgAKtepPJx^i7y4QPxL|hn~bHFzk9)idE7-U3=i(X)BXl zPIG?^75xm6K|lz3F+J~h3me7Q;uBSCQWv};@Y)A?Ui2^^bePi8L8Pc zH$Yk!dTx|Z#uLE{Q%dw5PG<5NUSQ4y#i>axQOw_xzaI@muJ$MbyoRC z2l&Ch3u1E)PGIZ8?Z8@)E0CIkGb|IDk>hRDsaLK8k6%z1JU zw)HitiNli_7x!U^SCtPg{AS70xarTZ3FBtwJ=ix!u)Y=Vf&mI}F+0V57`mrzG^#Nq zhjKPe4$Se;yT(kD8S%b14~BaqRjh9oLc514eWl0K-1GJhz+9b8B4SqrU%W-VbM@T+ zxSj;zC5@6E1U2~*PZNC^nI3Tw9|aJ?U%Z!J$$Rg#jDV`KBvbNe(f@?M#t@^^W%K_p z%KoWI6e#JsM$5Ks+qP}nwr$(qRkh2uZQHhOZ2W zGfd-`HtkY;?>|G7?H`V$5(sMGNza(N%s3&!7FjiPpF{9@V^y%e@+7XsU*HYqCt_ z9;m$pd`H|dPop6An8Hnvi3qgMK(~;dVe@y@7Cr*2@N}8v9@aGtY{?m%oHH1q12UVbR3wXbjDa$4Z?fB&WO_f0f zF?#6To1HVo22I!T!8umv`nY*xT%qQ7mr;7fK92^JT<*23_WaN0dC+2282(VwgXRG%LgmA8q(kD{`4I|23tF)T~j75QY`i1*f_GYAjpu(3LDRiphD>vdi6(OifnR zkGrita?`m#VpC+p{`u$dh~oM3j0u(9qjZz*eQ_>$pkI4wI3p6mH~~_37>rItk(&lc zvFwpXb^?;afi%pma+nCA%bCj8aue z^kw0^{j9`+pe_jgW^l_PTqqALp=0ZlExXiT%=CBbo+W|h@1S-KS+;O*-~JF=R;{_D@B z1(LLs4&czwaF{nFqxS4ctuqEwNK2L|j!mz^Ye1Wj@Ea_=Ee^HM<&e-G9S?2oh& z5mvQ+`dvW2PM5~4tw7AaEO=KiN-{N(?66QHx%CYX9X2)#KydlhLuRR)4qEX}(P_gZ z7RBsg*^hu+BeRzJvs1xXF2N@f`Au5-qt!-{L^+?T@p#$qw#sJnlx}n!O?5!6p|+MV zrk;wYSD6Oh21l^7yv>s`Hb!?{ALnX{zbHskiZq~o_y&1uP^Zt}KT=yDbEO05<^taE z>4ObhrjiKk#trL?c*|nVuxv0Lig01OJI<1l!PJ|#6})HO<<6E;^w+_VITl^_76QnB z2VKtv?dPa?Tlv#SP&SsVg!x&Bz(PBo+oLSk#uK%AA^R69&aXj94M0GW^uVqH(wN-v z-oNRX_1z|9mia)XfHV9rO4coB&+p?ORX30edti&?Qs@1Ty+mXABtn2zjqQ3`x^~`0mycT(iiyIi$G`9?5q(gYX~wd zGc-9qC|t|z(#~uHkaf{`m-fBVmruxs$rVP5nFvMcPGz{z`5NoVgR{q`v3cORJ)GQty=*#R7Hnz6xkXk6*%@Fpj7~JH0Zh8IDSC0``3oFxhpiF zAVCatH7|`3Bd|c70~Rfi@ACB4k??t2`goPHiHmZRjMmrzMGI;1g(Zuym`iM?Q+$0= z-Gz!ndbdajXSK&1ch+$LM^xrp3d)P)qXo=tCS01t4o<9b=j#zwo={~xDN}dC{S)hI z6-TP-#{xU%CNE{&h5^mDOdSu#!hw^G2MwzoT^Dr5C(--cw|rWeG6A7oJU0lvFZ2k8 z^8sc-YMOg#J=^^>WrXuN_6Pi8O=e*T+R3@OHhoR-=}a`JSnM#Y{kig&wT0Z|7P)mK zMVFXzWIbRC6616raRTCaIUC<(n-X@^JAff8hX)AoF;7*2d0qL+Cd22MD1_QlEB6Y; z&?0+0p?eYlQ{8zrb=Zw*lc8*!nOCMS8tK$ji;z)Lg^f_`-Ct2OLyA-4(t!kmM4V8T zWh}DWikz9GPBbcT&barTHB%w2N$dPv2=o=+gaL(lb!TzW0o|+4=2&gN z(}&)R-n9|KAGj6UcL9-Tzys>*y}`8=h5+gYIBv9Dvd{1`=jv9NS3jtaCT$E0e3riI zFyQ9OGw@`c2UTaRVd{euV4k`#9rO2o`mbi2=D$*8WP>Oml$$Rj~ zrcUqIxu>Yeq{y=?7?nXMl*e?l0D{{7OIPRN`iiTtWzZd zS`{cF4BS%%6g8h$k{V!x=I2DO%6Ve%^0L?}1S*L;fJ&-@=ZE97@qLFF7v%;8ah)v~ zWX}_>OlM;b7N&XKAOx8`J=2y0Bd=nfz(SMVCYYr%CZv`SU{d}glo=WRHz+gxKPdnA zO*|=qF)79^nO*kx%`K^^pyCl-^6BU48wV(S`{ww>k{$(6WC1b%6_D?Y?cH^KqbnG( z@Yu|7EI@(z=rTBnEGf||UNo^?D`Xr@BMaAO7#2i7GNB^YddP=w<1PIdB%wVln>6^- zcP-DYP#1MNqn~SONNyO*jbwufb)TiI(?IehnaXDz@eWlKBw4bB>4b1FFXi@G?+-gY z56UGNb74@_Wb^?3E%$hg2^+pQqx6&KW^?ZpmD#Toj)=K~8kAM-m;pH07Ip#zn#*xJ zhSOUp0p}i$VOg#QUy1k^fCsA9NE|;yRdR&UMD-yir$}~wld(yn>fu3_ z52n~?ToMFNlQPJi#E)#V!%)Vv@_H#-s#%@Xh1Thjck1;R)}k9uUd%AR{t;qHttqkUcf^*fIm)xlVE8c5oK(A`ld0_u0^E zr01C{ot15fERRidm(bC?lVH9tIwa=&C19&l5woOXRd&idJ-Kf{;G{6OtR6tY%&Nu_s+3m5vg8l6QM_=IYWYTbb z&u^|&-r`$r5}r2BFh@zmmXJDSuLjdxbKA4n?kVpgLn^ zErz$MvIMkO;4CMaQjL?cN4hvDWaHfiLQv{Ig@y%?EM6J1bnNm*#;R%nuA=`g?fOVH zhjw#^Q`NeOWxG^zv)tu_sv47l#9vcfSg#eghig^I$yV9U;xET5dQy-k@XnGHI2~Lf zy2^xVHRWtBE_>R;U)*HK-d}M^%_pTyP>+|1uha?EA?drd&jb!rR#XwLmQ~ALOzcW{ z4k*Ekjb&$Xs+r`qUW{g?sU!IyM@i8(OVp65{prX*js78u!kGMBb&VoQ%dD``*4w#K-Es)g)J`c9Tm#qoHTg#Y{OkOCwuk9j$kHK z(L}Bx%DkXKzDVXv9byGEGDq=PEo_#@Cx-Ro>n=puS9*a~|H}jP0!M>dcc^r2EL6Zj zB*)25xXG8ygn}sVm*wVGQ_W#Sa*sWS{DF(Z0V%{%-FRL+BqAoO5bP;u);$|5>y+8= z4=uPt3MF(}`P88`KO*&RURrV+y0-WIqi*n}aYQ7c$rr*Ah6zKuSw_Y|l|9&GSbqxH zGw=3c@9pvEN7taNzVuH0)Zkdgbaup`vaZy6cmv@@+F)kgEJ10f?VSEqJF7%)bWW@7q~t3B_msONl41 zvD$y2Jha?ALd=IF*Tht+dl3;+mrQ4MbaeXpuU&YA+YW@8&U6|T-&i~MT{ziZo!=RrqjZ^522hx!tOkM+c{m+A~(-V8UgHcu4 zq$64GDU!2|gEgOArkx2Y@)jPUpt)t++48&A;fv`qG%6ibZXJWvjP;?|Lm4cI3y@WoK|2Ri7H`0Tg`&Ja2BA5MX?*PQ0;%QHV zJjXg@G|s?cmlKZwdNnCqed|F9P{^e8(e?Eb4z1Ne=pZcFy2*Ft6s>%g*>w84W5bKEu*n zop;Dd;uY~m<#N{BK7n-#C&!IX7nV1K@(!DzS7X+O5+D5Zbl9qAOR-wh9>l5cq0c6CvFkEW-;#)0zQAmSaz=2f`}G=M7;iZVK}-zUT7d0d2ig;1pfrM-{I zqc)%0>jmfkY4p9$;t~tU@EnB0?H2;Rg&sZUn9K2niTX?>Xp8WRl$tN!J*35ao0wfg zZH7Reqa+Z6tp8(jOevK9xQJoZQduHtT=@uQ#>H%V)$ZxVJn&_JT57x+TV<18jn9N# zl@<#GWwGSEEiG%L+GBS9p6{_JB~4Sb`Pkx93XP>OekmWdVcB884F+$RHL87&|6}@f z&+P{3(lJ4~1b4CVc}p43R_l3y)X{q9Q(wLHSP!W@?wq{O0asTD?~Vm)hiq)Q%?vjm zt{M=7*Y#LWSRx9lZZK9!6QW8w1tUHXay$nt{{H0aEkT#>^3Gj*@5>oJSbTX^u(igJ zEyS@+TRi(*n(*@R>pdK1;b9#eZRW|A+-=3+W1Hyt)V<4c&WQCHGh4aJRW|hWAi;IVS6EM!ylO`*8Ue6ry6z0?O!!rHg3w|B}GNc%i7jTskz5}zMW0nm1g(CTh&~HiM4Oc~`<79z-3XYgv z$Yf;ktpJuvVs!!yZ`B9?*HHE4I}?h~eNFQHxq^ZMvys0-BNH3f2&btzV$*jTb-N86 zlWGOF0f&{hqwo`0hsI@r04r{r2XBs_&Sfp`hzedjQ9~KjoyKDCeochGnWc{CfJdHM zX_UowwNvVVNyN=yT7;DUh`E@$a!t4hh)gDH=o0|t$feGz8Q>p`Atq~*~|Aw(X9Zs{r zm<~wF{J(yfP*#mBmA7Mohc>dz9K0^flz-oh>U^XI8AaH_qR>v^^=*~n$zPypQBZR4 zhVd{v2f@Z}S)xl$4q&yIAyU=)i!U0knlR5%93DB9G1;>4@VW%TLaG2zWBIVGSXSt> z{=-ny2{AqA99HrlE;aQ3nRd0bFTMmFXIwLL=?bN2dHL;UN$F95no)L=tn zPrrK-vMO6HD*}d)N}Bh_B7XYAC`iOQ5>f^>xm$w-`<{xv8JQb_e5^ioz*d-UE~IhZ z{V|zG;mj+w(C}*_B6x8n@&=(oY4vd3wn{(bD>ZJ>!%o_aG zN{&M5u$*;|$G}h z1uA8udC0oSu*IW_;RntA8)>)-9M#w5a^1JlqTU}xJztW9N#YA_5P_xMKl82(H1tK% zEPU@VW#v%mpXa`*?sE8zwt$cH6LP5{G;Sd+{--u*`9?1q`d;2fkqKxLQFo{saoYRz zE=DAw(zzv}f|mKGkc%Cv`CUWic@G#wQB2c{i|kB*1)Yz484BcLDPA@xVQJE16RUq_GZ#H{ojx4&_SLcyEb@@V*5ndTl@R% z_en5erbMY0fRd8QG^;a9Rjkz>B*cW0Ew5Yn){0_qKxos0OqMt1_7hp&M}<ETZT;(5jFoYkrC#>xWV zoUtKv8fd5m@*HGL$D9UofM2(*qi3|#-~d%OH&nkUK%Ym`#eZk1dOx9%_fmgE(`1~? ztgJU-8YZ-`Wq~~2rZ$UeUc!1RQ1QkGw-2(32r(XAm=??PP)z^x5cuDW^#Ail|KFd3 zGJXG$Nx;0`$h=rhnIl?WNifjQ9MUrjb`FI71@`KXUqKZ-ZQ;Px+S(KP{8OS!6Ngy{ z;VoGrB4ji$#Lvp)Wg4qASEo~-EBql5+qaIPcL+i<2TwpM*ksd&Cr}{iGiQpS7$XBatW};(@ zMsU1u{zG^@$&?J8$7i83qP7m+WNo=UMxS=>?av>?GDImaT zuuI$!JHrhEz(4wDL>xV7<9V&GJIFtzB~-a3I&t<;NbPAm=b)#_-sQ~1>DOcJinn)q zDW>uf8TtTC**EzGpy|#)L3)SGD>gz}m>r1Cc{_D(z9}j)SNQl zl29fye+!Z$n0f-`@%Xq+edu0q?|lQ96QlX?Bs_)NDF0k^B(l`u&$qBe(sQuJ19FO$ zSh7gC++YS#rZk}l*US45Zv6$Lst_%w8bz(9@PrC@!u&iVnT5j-&?qO)wLv;pSG~_k zRYs?SQXB!9HkQN=YT~O4{)7aU7u{F4@iPosy;@uqu*kEh6`4b|%I2^o2TFmi(%O(6 zM+wVT?|j)zd2p1>T5Fk(YdxJXMC@O-l~_Wlo85)VMX_AL_ra22e{Rc4KRlyz+qD01`Ooxo-(23@)RRi7F=u`fJI$mJt1}^GegKtPMK&Ev2A12d+OW?Z7h?fJ^uS&>LgMBVzevXk;$|_Y zlJZBakVFGvvbc-MAlb$?sh)p!{R&f=DbL1{2egC2`xq|YC$ea=voB-B$7yHXp7g<0 z<3NY%Er^efO6gd`Li}VW4vee{m)MCDyyo5hUQGRw5Aa5PSS=UJ!WxAZha;N|2$@pT zmB}Db8NE3oRYj6avs&wZF4O_28l#}chwC?RQ(itj%c{<|8y#9&tk89NdkE>qPbMIJ zPwV-2e6yH(n^redX}-}0-q!e9zv1vdL;rs?bpOxh|6iYjcKtE=5<%Wy5N5^!B}_+n z)|BYQH$7H)j7vzOG;>US{a?RyE9B5g1^0?Y%QLXZe8=mZ!}_#0HLvNso#{8dZ2l-q z8DfeIC0b~!C9)ra20JK754RCfzJBH_^(f)BY-eOJXlC;`t@)Z-l zcbiLXmtZ5%iWuo52G?q{C9txE_&%i4Ef_ZJ=2hXJrgg5@n2foXNCbj>XT_(NpJgz19jK^31{e@6k} zf%6K6^;(|JaBSChoS*#BAer4}PNrwf)Ql;m3tJmKSjwaHshBba65fC)P-rYDBcl(f zwgDh-F+fy{J%n(gu5pa#FFLX_0`K)t$eJO&20xGxw=<#1ksV{sW-}f+)UK2EkN4_w z>>B-ihp18wK@p_Wmji3_EGqysr7K(;@qUu0O>7$UmLL!Fc$yB}z@3u3m=e^QiEw`% zSg5_k{I8UE^?na4+5su0=^A*p1ZZ*`;E`+G&^}!b#nh0!vs00@3rfF~ zK{tEy3~}aE;pEArH}{tp^5-$auaL37l^HqvLTCq6zH_7_A4s@i~xj zCUl*F&oE{pd5F>mEV~_PqQR&A?qPq(r0qwFiyJRB=mu*6eeqVg{uSL^HL$!k8Vj4j z+K6Etoef&8d{!2S`#AZOAR8wE2+EGTaZ&_jSIIi~+Kl!Ts6*TAUc@+CblqtD$${oT z956n+VmAFNeOhAq#(&B`eBzcyob$>^F>xEq3(Fgtffi1lm1GivBmwP|9g> z12*8>udrQfil3G$kJ3lhY@YJeF1NZLRip(~KS$t-%i2kpX^7z+^`eKjw$5d8n=5v< zh032xBb7?XNpu*P=HDggK^{(tEaTI2r7cSO(sil&P|0@3@U5I;qpxdevn7Abmv9lB zLrm9OuuRKJikkXZ-hR1`OzAIe79I)LwWT7Y-$03XL&9i~t=-7OJwHDmt0BD`f+yeD zN{`?9gm_+d!Aj(V}213X6A`i<7#n=7vqGgQ z8kM|uQ8j0rMeFPpHMlDnmJ0{y5gAznC#*yI6C5v9v*;aUgOqBykNiW9*nH}OAC0{{AF*16R>QgSROPO3d+d97S*&k-;RF5DTgK^FuY<_Gbk)6t>sRe1jlfnF z%ZCLX_JwayI%8%!7c=s{7NXIcUsI;=t7mt&+tY^(?r-jgh->~Ir+aw)hNm=U4=%C3 zY~TrX4us;|(4^6)T}J_%^{g$9>1^YN^dMAz^y5B(5FuscHlEpdE7b&ne%SqMC)F-=(!^ps^k(lhyw`6#hrU_Wulp{~FOG zHT_sAK6xRnNT4FEn6%90weHYeiaym?&r&`9nTq5L1h{?{ZIIXMUNYd dpKP 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 WDC}ERZw2)q#;Rtyv0#O+5kOczkN9x#qy!_aD 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
  • jhXV7S=J&;yXgmY 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%0DoZM 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

    mMnh}Yc6^g097#s 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

    $4b}fV4rk{ z__pH#>T}V@3opWh`QVM^A9&Y8&J9GEil^F+d{F;aS;N-?-qv0vWL*Pan*D*?1@oaF zPUNe|EoQb`VJOYGo{a?dhtS%tb~6es0sz*ACvJ%LYONPjN6~dHndXRTz1;Wl9`MM@ z?sM8P2my?l1CaSE2Dme)@n#S~s*<*F9@CAfBee{Uv^0%-5zZ=$7F-2orYx`wGr~#n z<;bSDA@6X}zMZd-9p?FfYj)@Q9w_~Hckpsxz1ZyQ`jLq#Tj_Uoi2_wO-+wYTV0W@p z{Kxh^Vge3hsIlx{$UAe5yrrn{PAbxPQbSGLgnUFnOT|(#&8n2Y3Ta_`E`s;H!0)O} zj8nI@Iwf%AqYXXZa$r$L4mJnjbvDp{K%Ig<2?3|W0qAr*<>;n^74Xl$-Pk=wIN444 z5{A>DPQGB$_LTdiJmA;_mcTAwv21^YpGB;M5Os=EHC~JKT*u3v24DLhV_~0(WG`R| z#f%5^CBzSO+8sK9iyO{4rFe6;q1My}6WG3{nzK;i;6U%Xd5#*y{iI+hj#iG4m*{x* zMqrSGNR%X}JGP|873q377@EdrumlTZLma4u@M6-LmS@Hc8^oBii0lxu+{g<sYbNG?wHBU+3>8Q%`WxPlR+_u8fbwyAt15i^5z%#J;F3T8z2L3{Nt5T*Gg zl$nd)52Ije3DGd}0-?zqN!vOzP|{MS;YNSY4|v~Dhq+WWW(8opy|0P12r+61RIWW1 z%Z6}Zwqyv{*ax`))PFuWo`Tmn)sg5IYP==;M#Y~M1?-}tRdK_i$jMDKDuu)5f#C%> zIgd}Xe*7T6V~Jb>?1AOZOqrLb19b9gR-!%NZdxj{m-SOsc#Wi;(-`x^5}-a^Ar0v5 zfiBNe#;*xD!|;}F5;YLE{%5pJl2D%(!?tvLx(Rd@yCAw@3VHS4!=t%(>g4#{gKvf# zuR-?QlF8*iD_c&cI=j&K@e)#N8jW|_?Gj%#f^%+5N1ScCnS-v(b*ks!gk3jut-N)zj%;UE{oZEqqC+Vy#JO;o02 zxMd?Sx6g92IL<~Dph3GYXQ?2~QgJ@R<_U*4aF@)X%@)T^CCb#_bT|sA4o_}QZfYVb zbjNXi8@`K2Lq7ckK$&SNXP4VG-1_l#zm333)Jaud9-uq|^I1(}IxVEBCxe*Z+)S@KQ$Dxk(uPwC) z#fMU6DLJxl?qjvHiS*}`MZeL@GGak4ZRC|@`RgZV;sfe}Au~L5;QNatSLw}9o?Pd~ zy1%aKM8a-zH;_v&dRr+#F3`l6Aqla0p=KwW^Jr+cv9L%%NPPDEM&V(O#H(Aco^Fgw zwD2sL0R6mBP=F>w&{?><(^^rcHBYfSo={ugw8 zIN#)y zi+s=w5tI;1V__O-y!&?c!qR&cUHE+oogU>FQN>Ev+s|r*t4iBEut6LoMWk)sOe#kk zv{fiqo3b-ua1+YkKrF#=5>Z74SwN3q#Q>8!tI=?~5!li^`T8RzhAwFzatVyN7oPWe zvf{{i0<(hC=7=s89-Y*_Sz2G(Y%-D=70q*bav;_7!}Wob{oYGF>e7mKT)cB4gJ)dz zqo0W(@$M>S*q8^K^)mrT=glxNs?h%nOU3m6!cws@ad7-EmI{xQ_Nr)$I`2`x{8S<5 z5lq~rLjrYl%v=1RV02$rxVkGX>6xRl9+oWy?M{xtLmKmmRpwoy)(>i{=wui?rB>`} zQbFwjJbWBdvUQ51eBH1Zvw~!7am%G-T10;^43Y>g-H*J(Iw?vpT(z=l;NN-K9thgq z5PxHo7(e(0c&fSSE=hsjB^7aaPzp?x@?xn?h_S%TXGd8`pUf1BXvy`<$zM_;`7R{F z302d=;+=wb7mlJioXd!0flIq#E?2cmnMosk^VXQxXAZ=ev7dl6&$lHYV)4ym9zzxs z9!2j;NA9L}&$GcN$ya_^0r9ttr11;tbU~xZ*Iw4cP@%K~t@!8JG&t6Lj0d3dbyFu3e5!|G8CI|KKiv9XWq_eq z);Aoql@pC{ymG-}a#XW|v}z^3?+VdvPInBGTeT-x5sc1pn$sL`P{&`UVgK0J#{DW5JP`E_ZMpsjeap)l1*}0V?{VPE%T&%Ldio5Nz023e@{`TF92tM}#MM3_RS+D7 z4aOIyi2z|!S^+``LS4q@WZov9Dj&)hFo$ZjS6~LyXb*%qcp(%;lr)fw9D*C%70+`h zXxOKRlv#!Wo}|<2J4PoE;U9dicMyI(VpV?5((;b=^pi|C7C>DL)0yjNj>w?kr5wa& zH%~gLCkc2BaOZhIZkcwXQr+y#u4ReKp)2{DyZ>S<;Q!R{U1Jh6nQAuRm_dy?_0(do zzmM@euk&ySisKf*h5Z#Zj&}gNqXsv&9zd7PiQe__H8OLddM=V5m_h|4HvdwahS8V3 z-=8!`i*CpN(MnAg<1&8n;c&Bv*j*+|8rT^)8B2jh5g!_ydFQUew>;?%JaVp0#zh5H zP(N{DNue5GH9b)acNWs~MRn)&#ou_$glJVt8%~Gy3p=iUn@Q6l1P{u7MerLBJDxIE zx^molZL;QtU)~E(ON{g_E?P-}3J{mcUo^qC-i@s<6|Aq-`O}z5gzKe#gpdUePjxiF z_xKo(oJ@`UgRc5GW_}@m%+5U-?}r=)Ry6`^!Yyabw135yj>y5}vGnt0g$15}kc}?3 zO@}-JkJKNplVwh*zyUYmK36l+{!QD_J(H<7$T=1#X7^FO_4F+PccyV!!~uT|J9NTH zLZ3vyz@W7kE76vS2OSS}Ct8lass?aEE!QO46E%oD&n+L-%}?seB-bDRV3AN9Kggpi z)5KW`+@iIn93zsCu3Z=}-jn7u%Ru!9;0%8A^0*eSV_1djo zzM<}cC4c51?IhQ_QRq?1mu>sgiqBe>QefCk^q3e?n-s^PY-jbO*X6kKm{@%tjaDny z4ijRN-aUrs4{6bF@rGyd`BfP(GEC-0_-}c#X{*`cN2qLj-;B?+m@M9+_UG=hvnI6m z$oMAbNY~S-G^E>}-32!G_AcCMD0M}3yeC3$>9HWPn!XFY1p89l@{3X+6vpouJ=71O z9NXeHzTkg$INVl+O)p0aP34p%CE>(vGJW$W;cj@R_OXDDyYVmkQ5hlW2Mc->%PIgE z%IWg5J3K$DI5?H3ybGrHgxV-vAdW|J_3Jk{ZWtQL&M3!qP+nnE=gH3w7$AOg*y6%` zlS?((+Tk5g@F6ZUF&H0up=j_IPW*0XpO8UZud3m%IAiJx*e`P2C!|;h0{{fTZnVRT z;Tc?e;}n;knOg!4=c&~{AbOI^T$!)~Gn7xJAY)plnXOZe@?o=-dyL)$Todwe}ez6d9a)hJ5>`#pCZpEwrc1cwrdQN%;S9W^3&QD<8n}|M)9ESbv@UXcu zEffPsgQ``@V)Pq3V-@}#sot%ZltN=n>BWp8{0$Z?Oa+Qb_u6sUWgn~$u z=bbw+!}EhoMj9#+sWNr~9P5*Gc-E;2&aN)XNr|6k>W!z*Ku0G%DuV_nY(GVrx2RGU zY_!ht!iB9r#I2pN&4^)Wz}mussA(0n0yf&Y59;!JS)-|3ZE{W#N@4B3iR^2{?)hzs%1{Sm~vd5njY>Ey5S)|1IJewVa!A=m(;q_AXAmyv+ z)sk>^u7q-MXU5fC=*tdpDC*Ot_DiUkAmNXdKk@8==@~g*n>-u$tT8+t_vvk?2%+l0 z$E20M5yJ-x5^aKfr&5r2LdXrO|CwhBb~-`5|*45rHeM+A|hkik%qakp9V|-8MxK<#s;@2KZJ$4 ziou2@V|IdJ@E01RL%*kINzbL;qs28w(Z>64Fk|WnkKK z=-&mrR?qlcXh1bVz^-3t2U`<%r*v_`(KK;g@k$yu&6gkosJ!lL&_Jq~cbS4Vg`;3Q z3#knxV!2zfL`H!#gu0w{>KHt| z(1Qz};#&q~o60td+J967LFC!!S(L_aV3(grdgzsxpkOVI^>Db#+fnHIiU0JXsIlj zTIL!~#wsWJ4355l^bhW~DFgT~jcPGXUiX~BR`=R2`K#2syP;j)FFjmXikMu))*>#U z87(QhoMJbjttR^HY&*{s~EgC_n_Sa_cPmtya9N^N{!^ zjb<|@?O4JDjG!qh@b#GE-xT^I%R79KHfDwX*SWJPpYgRpMR_*FUo@Bd%j7TQ)@Hw% zHXgOLd_~DWM8yfR<9j!DhsJuyC+p+8VE=H?h(`%P*;_}`p)*J-PEwTaow9&Vm-C1r z6{NC3ulZBAgB@QK3#=<-Rm@xUmZDCNR%j-!ca_P;B8M(9(?skS_M0FYR_5;Of_%_l z7m5ofZ}WNkx>R5#g>)E|gu4<##Oz)!Hq$62`w~kf;3kB@2l{OLpXygNF)(7)EZpu^!GWm3+ z!ESoV>_CBV1j^3{3L0X&gnbMB%ajxD@Ruo5P}KMl9Uy2wQO;2gvK=!~+GQ%yz1q3p4Vr&F`tP)GzIP)DfC=lI&ywx4mans>CobD3ah)zh zq9q2P{vf%{@jo5%kIO~cOm7YhI`-*a*F2Edi6X+w3^EBG%ztY)>g*5O&d2Ok(bJ0> z^M4Mcrg^vN7@7cKs8wbNN2yy?@x~2TxCLa8hC6ayq#@j4JVJc;Tk(fU)}OL{80W4- zN=>y?ic`yueFz$@2HrEP@m@UK`<%;rh@BHru=~pZPc1DKdLZWlnw@E6#j zm5!;1dlzL_F%tLF4qIsG7sgln)d??Wy=3ren*`aF4dN1YZZ?kKMlf9P1JZ`J_-?3@ zJRI{YVm>?K8ggMzGWqwZ-WSI6Yhvb}Q(o(%WL4Yf?R#q%+Uc+w|DH1tXZiGA0i)tjKW)^+S@P0jf7J!3Mqfrv=356?ya9>DUke@n@=x;CH@{ z*Ig$jwUq`BVPI4E(MzLLuk6xm8J%|fL62w?Q1ssb>^J$0%EF}AWm`sW8L4lp{i-uC zfdJ)y?~s&GvMwOJRU&KcVspcvr4sWcQ?(+=dFsh~RP20(0Pl0E!z1JvxxK|;WCUYh zb9CFD8Dp|^+!Ii!@4ihZC86wY-7jebj`I!n#C`edKRo0zt~eeBn8gx?xkk6PvFb&u zWJLC}^u`H*IfpJ^1pVp@`?V3m4A;|423S4HF86R*lx`(O3T!)--hfkYQ^8c*4xX2L z*kjWqJ^=vg5Hm_`QH;03$dQo1PKgp_6K{p4`}~Ey54=ek7q7`tfGh7tTYy8>$p6_# zCUa8;ejFyD^H+r}p=r>*%58YfMKYhN}hj3j^r}Te?mphvt<@+suS&MceD3lq*`1dRdI3t>lO_ ze|yywtrfW6ez@9-N+a{OlqLY)dzuTq(Dyy&VtoE*gFh67e*Didko3!{C=yK^n}!L* zSS%~1PF?}6ILtuK)-%}8+v7fCp;nR!%Mrjb0FX8LWhvil*^*$!$BF>=#wdqQ0(|?i z91$#Mj9K^k?IEin1c-VQ?+C6%)$(vZ^LdF{F9LKjpff{yIql-nS zwK~GT=0%H%HyMJ{KkG10n!w$usmN#H3@(7iqF4fWWJN^<*+Nx#Tvsk|$7MQxfWhBk zZz?y8+;1TPHyy1!)hBw7vJ_-TYb+&szwaC&sZoJeTs2W{Rv;yL18X*=ZijC1Cg3i$ z@sI80L5z6bTv!l6ye5w#Suu`xBT7YC zYQ8E(MY!!U3O}2xNh)vrjVSw9k=v~$V-Z~jGqk~(rr)4ZuOh;FdNGT!gnA0w9q zCpX7{?ei@14kQ0u`_Qd@B`A#jK}WLIy{1W&fz}eG`p1Jz2x z+a5g`pcaP&$y4T-;-_+e#kpqSXK<~x+;q=mj@a!KtJeBD=~S97(~1Ugn!b&NNxSM1 zRU&+*vm2Y2{H!(xarm1fiIRU*6A55RJ)f$3O!iMcC?y~9U-}d0ivilV3|ldMk{~Gg zyD%5X_*Et7@D5|0K@Pj6ikah~U|oWJJn`8^?-dcc27yw4co~LzW7c9(Qy_qklHjKxJ@eKM%S6H^REq0nC zp9|CnLv%T4hc>tVscl&N{P6U+WSY{GupBg&1vp84`5#e7=ndsgg;FgaseU!A!pWt z@deZuYzTAlm92G^L!y6=nsE9x^i|9S%%8+o8*UWt*WdjDs3d+NHTs-ew76}!cBzx6 zMvnXRy-}yPkAyt3Ah&t6b=d=H$fhVK4BD53w1UPF1e#U3+(xjGe%csG?Y`$pLMO6= zu;_O&V2BPu*wwpFn9Av*1l@$#SXKiq&(ZaZu`>;XcE=9ysh|^>KP?DHnfYarK?iMe zyRIq5VoZ_}*UxaCMbOiTRV3SJqhoX|mjNLqvUM05s&BS*kU_$Uy3jtT2^3<=9~2$& zJA<9QUOA4GaTJdX!2Fwm_K6QSV{SjTV!UTucoR}c>mGNE@$Zfj{hChV(1v`?7K$C4 zA+r?p2M?p{fawHMxe)u-DO{z3-(eLHIqb4aU7|q8>MSoqA3a=^c=Zi41>kC?P)DSq z1bFHna>I+f)YIS;HzGn3+QaNw8`@1LYCnEV<=w%g%WUvB;$p4Ds_wiHBYZJe0YLSq-HkPw|K#PaW<__9{rc_*cAkud&Mm&DUL|JXrb) zOAwh8hF~s$fw?GM;x!#&!%dTNMi!e(;1iydE171213Sc;<6(UA7Agp`8o)gobdk$_ z7o-;#1C3$GBMdX#0x9Cr5QKw-2LZg8GP}@QvKOLMq{#KV$pCY~m!U*^)dO%Zm&xZ& zH+v*JXr%!Qa6MJB)}x8TYl;2ua2nFYI;)2%?DF_^o4Z5BCr!KO`Ns^l;_Ee*kCz2h zLd#Kg9}ASh1HTi8FRV-V)M$MJIF_H8Y2#y1n!KagBI)L_?BQqAs8A z=%RZY57dM@%w&Dg|FPuCmCL1_%z?-x*OK!6xL|S7T=(>a>wxnz(_rjx!&NQtXu`B@ zIQJ9ZJIxZDeN`VA_CA%UK+0g|+06m)x0iY2m8?@=x31is{bwD|GnAG&j9&(vC)G|X zU(Xubki0e}&Y?#q(>yeZBOMpxiajs<)c9L<=nOO=TtEJ4=2F{?@CHWP<*)KEBq3Tx#8F40hTjK&A+{m)Dc&ET7@=C1O*fSEEeIEm^akc3qh!exHU zRPRH&VH@v-o*+#s45+hb%|9XxK0JDqPJXe%K)u*dvtSKMPKSJaN$x?{{gCAuMH zjFgNOjH!`ZKi(1-fmSC^Fh6-Is4`Kdur6Lpm~bt3FD2vx&Tp$4St3!~7pLAJH20+0D1-IDHn0B_vSc?PNUp=j6B9jWeNV^8r3D~ulPkc0t~#a)>VS{$`|KwOp6z_r1Jf~r|P_j}0|C{lw9&e!`>BA!o1*1L?uFTvT zTjpuI)lHaYSUch}fHWrj5bIqVWy_oumS^{Ot|ztO{qf&|#B_4q!LHo9TTO~%M@yUP zBPPR?j8eS_ zWlf+;Z(qm)1gDL_ScTeC!jct0sRl@EW;hd1*wYJrsZa9O)d(wv!mnWNvhX7n<565@ z;^p<&-(|}aTG&5cJp|$TS`6$02Bz7 zWlsrV!f<5qz#O4}57*ueI7Lz10z#GI#VCWBAv z;{ZZRPrkA$;MoK>Ny3C1n*WM;s=7OG*k^1B85WMErhR<;)RjY~f5_4@gWVC9FZGgU zz7^ZZ`@yUE3?g>*j&V7(cy$mgOPJAGD~;Gk@-(CL=1prql@vvMrh)xGxzHdhm6 zW`##uLH*TI1HMvQ=Mb!18t&|B&D#1WmZKMakW%L0^+;1L>ZO-S8zm9npmk-&H>_XN z-g#Wrvgwufwh{zQy^EyaDYYeWadk-*dPRpX5zUJ2)V2en*zqi3{()#Oz)+h0oZ5J^ z76O#9vJx(d4I5MY7L$AHrI8*633)zsX8OC=J=KvFTerT9LM#U;mIKjF3MMOi*GOfR z#LQ(TjT5F<0|FiomZj>yJ#aYjCzfet01V%~B23%Nw_z$@zQZ0pr zdq+sdiuA$h(rHJ50V>SuwF;TSD|Dolo-NmPHTKy^c~`Y<<#c&^4fbAjGPk{46!$e> zR!$U5cfnapc#I06=7>?N@XFhwt+ReeOwo_ca8Zn!uOmnR31}%ZT&6uQEjaM@uooRL zKp}`rWuHv2C>|^VA=x|%!U#o0Fon(hpEJiU4T%=xz$3>%`Juo2liDredNN8 zhBh*8ofr&!o)jhb+VWCMvMOq~~|1!GUrt;~jk7=*O=wVOZUMMjpKZ$6_R&^f_ zMCCCL$eDD9G6D`S#F-=)ab81z$n;qZWGFuWe77^v9wE#9FeJfILM^AAX>->7Lm~Tq z4|*U%xR;(CX(>lB)mh`o@9$5$1@wpkIC!Dtl!mfCuw}E`e;V4Wmpc48w*NGuUxW}9 z(#nl$Qx#mm3b*FJFsq8(ED`VciY;bw^c*9-aK;2E>IQdPb=Cb|3b+lmVdP~-+o9m1 zn##RXj-XF`t)eA+U0y045~6HA6RSFPW_(xCGQ^9OWRDLwyob*K8uccXy>6vO2Bu8E zr*CQh7J#($q{_*kL(P?Vswg41vIoF%>#!I8DQ1<&nY>Hx4qKyDLAYku^HBlAOcedK zu82pn7_lfD6+EE>L~jg7wlpxXML?DUv-{J}Il)AaMZtVD!td5feH`f}gV(v=&sc2j z3^ect$5fUsnd@}rY;*q`CI>|f2lD@|Y9#S?!;d6Yw8)_gYrhOt!E(ifUv>Ktf5XJO zy>R18|12lYVMkY1%Pgn?I(`6~w&Gjc5>=HMoCX7Sh5D{0o=Tq~i2B|~kH;4ach&P} zUJ?`irRkEttAk6fseVPec;!kSPoxrW9CoOxCL*F66ERJ`5+PNl0X8jIRg};MU@EA| zXKnH%p}oFSV3v#U#Zn)_8wMmm_*Pe`aq`XYjT)NghMO-+T@5c{X#1}%&_Os#!c zhw4#n6GXvvp|e~_Ti`^ed?9UN^6bLD_gQJoNhOhYM`}O}4(qYZ@N48ppfRjtJNLU% zuT!Pi@oiuGM~mSYp3*^*t4h={Is5&(1o_1n{aJ0b7zoV5l%ys>`c{L{Zi87qq?wYx zLubXSk572Li4_x*DxCiy1{e9dKDeBjltJYyQ-b~S9o=xB#-cJtp0g_CD9bHuDP`AT zxzw47>7GPR@^FwuXRC^mor==^kA{Su zJ)zT_5O)qkQBp!e^}kpbo*Q}7`epH0eMLluTrPwAR>D;ziuB+zKVgGFdOHk-LGjZd zkF7_q7Gym2g&0pA ztxR3V#RDINx9@`xp1Z!KI8+9nkD=W}HADM!(6iM7dYnwWK(zGts!UuJ z33y1+j%G@0+bGG)PR8#edPBShHLAn9U=%Etg=`e}Rnzy2Cm>n@i&y5aUBpmmosGfe zbR~C?W2mMhvkd>lK+nO%AI-Yf+OzaJ>3oT#5v;dP8$>aXN&}LNR4Fp=Rx(`yRH9_s z&NWZ-IL1GlvGL9?Vf`C1-X+y@%MpmC1hCdLHu}$It_3d-m_Fh&tsWS3F|NCxs_xpq zy@M!7vPIY^_65-Q9$2M%BVwv1#YJ37MOkt6{^b>iw4fdT^ooH6+(s$RB3PM*y?Z+e zRLy;YzH#AvUGL^47=Xv0pHZB3H~W)(;;V4=!o;N#K4q`x6aPNM=SP5N($79I+ifc| zst#O4i>|ivhgV-#TF;z~AeHTIM-+v|CnGIVG z^7%eRG&@muTnRun760&(ao15A?*|Jsc{-d0_)HlKZJGjdjS?pjgXplfsq7gHCDwki zrYrd36j7CEy{JeTcQv?3uMleQNIEH2^n4+j%C)?*5O{l4sZfp_bIHJ9nn%zxFZql- zQ~e_F$ua*e>{^kuXPd}+ws;@~%*!JyWs;#Fc*x17D)3)SYp$g>g+7sbHjbW~=39uW zUCjSnE9wL&B_H0~rW#0ts|+n~J-`k^k1F;kzpH3_^Z}pl#u%)6u%o@!QRC>ix9Uy0 z#Mc*OCy}C@=E5#ez2HC^h+}u?YJv&?puU zR(8^u04ELAbCH2G{?X@h{lSg6PdnTZs zh{#d1RTrs;VGf9v^qQ~tVaxqrBk8SaBBXe>k7@UoST|jZ_`gzsfdDU-a}$w~Qb^ma zAE&j-yo7AxjUnFSs{uOP;_0(d^=%rzn(lh05+i1wS9TKMK(f$sLe@3iYh`Yp-EEff_J2;g#f?Cc+aYV@Q{cU^XW^aX z`Xg#kC3LyV7iV@!@(wbc_#2n$Em#z1F1DSKvMfv!FY1yue`V94`CbMJx}2JS`9sYo z&tjWxUtziU)E1oOwN%k`F zh?JUmPWoUjhEt)&B8&kravy_$V<_4=6T%*EoOaT3csM)_JBc4$+YP#x>H}e9^~r0) zObY2RBf!?8{--iue?=Q}e?-aO(;|T+)w=F8FoNa9LQJB77aZ`0=PZ)5%e$fMJ%+yU zYyntYwYl-QmJHge)2nTc9fDZMI*LLC2>f)X4kGd5_!zhl0<9KlWIpnvm zsdog6Y%`Q}TC4g3L^j~XhaoV|j+uqZtK|8E!sn`5$Ex7&r4^EJoCFZbc3M>Ar!%}4 zspxob8$QtM!Gt<_{UxBEA$<}IkPdny5R8Ntc~JwjwvU#{aLCkUi+ zzE(1p53r8&qN(?wNiR~zef~nvPx}hC|CFhN*ckO{A$;Ijd#@PWs=NAErf>^}ypPyI ztqoj@6rTF;u7}97)MN`BNOiZoG(Eiq${79)p$~qN7|AGKTyu)Q9FW817UFB`Zg4qQ zU094wQ83^!+q0p%H%jb~ow9#;`9}BXG0tM;xfoT35~Q70JXQ|J1w$sqtqpEDMAj-6 zD*a09;FQ0TM2fC@(}W&@wX3-aK^^2=;XjoB9M~&t56fw(deDP8_BGew$4QTcuY*Tf zKn0kOMyQFf;V6f|-}mf6zb<0UiIz1?AEpxSP_EB4rFAkJ-jQPbS~@1I&-pKQg&GLS|NW&KA)49b1v|X(Ky0!6xE$;~pqDae*Ij zLB|OuM3b0s4e?^BkN~}qC6gg$CSIziPlO;^>G#;{;zZJykT)us6=dPbwRAj2C8&3) zTXh{XNpTG~?K~*1Iu2!PxQl~igTVj_sjy_9R!E7lq&>;|C|t$!R75uM!b(Av zvS(Cwn)QB8-|TJC4s`28)<+sWbjEX%sGCj?!$u%vByJ~gXYH9wud1yzY6ouE z!EqG`H4lcwqk76Wm8XD3MXDR6nQNoH?{rV-Yrrsl)o23L+GT^bn+~b`qKu3~XTWUfd@6ZQgVCIzKXx(V zSgtVWV5a`o07W)BXlj#x%9RmCX$YMPM>NpA+kVsu9l2VXcWhs{UUbpVdgFoNcWO4E z%It|JCGgr%C~g>_P#oO*?98MudVKzvfUM>>BMYs)R9|9(Rz_*oXGYUmTt~)(+B*1o z#iq{M^+#u&r{)gztc?`{392b0ncVxXnmp+EJP^m*xqvi)22~=7L|tI|ap+8ksO2)s z|I!i{uk#MT1voMf|8;?wz39r~6sS+~F9ZHR{nB0=#yscI5_0)*K>EUKgTQ)D#xgms zriE3m#R)v=`@O~>2%ISWPSHq$BA-l@%eWl2&}!i@u^g&RA<0VY%kxq0h*W@1$MH|h z3-&;7Bq?b5fr8bU;;-p)E$VF{>)~NGa=2oY;JX-iNRMHo-+?Pdz(RpY{Tx8Y}0H#k~g(UBR0F8P)GX)K=6vY+5$&lv)++0hWzyshJ8_TNs`*f8vzJ#xVj;UGSEn3KQsP%1Y= z|0>B;q~22;nJ;u)C>^S$LN${s8J-`-THriHc6fYhd`*qV-2(N)QW8xmuI52&`zI4tZH3#D>d<=NIiJV^;J=ed zQvFCMEuB2JMkI9bNA)97DzWuON)#fNdKNkyfVzM928F1Da6hmJoFnxVP>cESn4V+J z(&+wYbgZ%%r3+nxud!&Gux!ISyta=nl~uLIram2SR(tPsna4|D^0x8SHuyo&Xeg65 zN+DOuwqyZuGu36+Y?1hCZQD^-1tInt{Iek#vEfE~bm+tFgG{xavKN z5{|%l7ddNpC^(*$sD4Gc-Vc|=B;~N?GOX%ZhFx8MXT1@7Haw`iOq~fFXH#zhJ#L{|fM{ z+m8%EUI2*VHTvFtY$0cWloYMlbOW_CO|KU&0Sl8^{+J4$3 zCAXxiw?*AqyIH8SPU*a=`_}{{^P@}#=gnYri&s7>e;4CI8iZl=bN(sC7uZEtT^4<& zkIs~P2TF?elyoz&Ad%=?QN0B}Sa&LvE(m1ggz(eHj){qmGv*(HLWN=txE+N9znvF{($FdwSo0W0 zAze^N5U@oHj<-no^cL0#lFr+U5ngiEx#B(QB zLwKJda}jT|BYH#uM2=>;eG@CYV?t6w@GBG4ZRFadM*cKmu}dWELb)+veJ#Rn5a;I! znX8<}D`Ly5{fumNkeuuUCH=MoZK{F)ju2fdLd~Mk^4fJwqqvKi^8=`9bDJHRpuurb zTM>93CITWOoH7FAihawbY0_9Aw9jh28BggQQEe%P@~O@Ixa!~@xD2p{-vXy zai7YWi|iZj2-k+-9^X=Sz=^(`U(_18a7;@?-nOzDpGCPLANu|3{dE3azD?;BFmFc^ zD=#XXzZdy_^DS&ap1!$1E%R0ge6jrd^BB0&)ute`QC9@6e=rgp<@FGBD~h%bfrAr1 z$oCvjST&No7DyZ7&3b^UoHX@q)?G6Lwq$uHs6)fG1qFc(h`wpG=4gnHk6$&4T<_fw zY&bUfh#^$=L?zOIP9p1lbhA=-pGn5@jRg5BlbFzM@7}JHEHbl|2LmX`{BeknxV@mA zEg`?u_{}E0LN3W#krwSzi8LB@q|^F~zECMRo0h|VDPibh8LO&B!6SY<3rJy%Aq-+= z()$?fIckvZS!E_6-8yKmnLrVoK0JTDcTG@Yc;c#)Ev}>dt{K2$C+c?*75y|#5ZcN8 z45NLdKHCH|?t+!_{4POiBzAPS=qn;cguFr!8(`L0woW8>bg@b)g7^Z;3zifTz(iY6 zSgkzn*VBRzYrd5i5m&Z*LkjpB_nR7dyIsKr07VnDMfIjJ*`3G%SO9w@jY4BaxGpKa zis2E)0m;D9z;65W)wFdrGa>DEBF88LXn8MVJjxN;rNBYAK#sF`Se=T(mY(&KXU4*m zbrbMLs-I^ z4l%5Z4Z5g|GtDbK!;>JUV5OpKLLcP?br8J4@27<&pu@j?wMl^0A*X3*Kvgkd{mY%{ zFIs^qV@FN@pMcVYka`5_y5CW1|JM1n#*^0^r1UaGVt-s>nf3X?9Qj>QUwE=s4J5|2 zhpg`@asS}iliJ?Ic12&X3q?*kLa_j}K=|^(nX8kMd;$(}?biFniD%A}lg7E`RO+$7 zkbh>kamK6G7d;74l5W9nB6H^yKds{V}tFx%mB>)vk)a;t7k zb-Tk#QYnWtD>y+}511ojH{&{+*1PGK2!h6)Ht)Gv;D_~+1`U(S|J$LZTm{VlQn~Jm zuTM3qY86OPYJ_*?l<{;_>RZ_OFq(OQF63r}Ny;6osSvh^1~(fxb?J!6uR~VuGLKzy zkVB%wsBp1wzt_6FxICLEAH3Kuh>hV#y6B6n&ydX!c3@|QU zU7ePALJJY7b!*yPxx>2!AS^cu_=8W=Amk6z?DI?+flOJ< zVD|){!p*idS+=~6i`b(8JEi(X;Dug~-Hs%Ghbnx?feTC?WVqDkZ2Cw~B#~(!^ux)B z9jN>CuW>P~JI33iKh;nT?$7;eTa>t4yT^(Yz*sYm!{XBfJ!BjI==ujAEFQZXPP^$( zy5Ier+wAW%;~9=wd-?Zonnf5PEi3EoZYrGflcAk``8><($(uEr(7Ntg*1RA}5nfh6g$i5RLz;$E%q@ zE4FlsoPP;az@3TRNbg^?E^1u@Pj;Q^HAA7P{8Zw0YRme6ozDmmHoCzVE5mAHiIO3S4CKeepb8`>00X5AHdPX>o7H`CeOMYuAFbzU=fnNbF9J-1- z_Sbk68H{=8)HeKRw#+NpHZPRb)*i+g-5Wf>rFfGsYvAYVoC3tG@3rM=61wgs)u7%Y zKaSpvPK?dpl83|yMXDw452N)t+#vip3wj1wrocC%(7F6eF49_cpDL|=gN?1?LR;HUb~W|!a6xM00q^?3u9OpNOcbvv z-c>kV)`kWeYlK1E>bw>vl|Ue6<=EpRf7i@6RRW6=K|Hx*9ydl-`a7IJ9p95umpTZo z|Eg<7iS6vA8)-Cv?;c^#IHhnDgH^g+3dWBv*>>M{eB*Pj>6J`9slncxHZJY^7EB}; zi+@x+#H$qkyWk;SO2cQG5DqabK@C&GITNN`gA$owE&)5VTQ|{{ z=E^w|Lm3k|27|jj9D(dsu=c96asnA+YM2IL3d^QG~z;VQ_Vqx0xJ=&C14LYBZZ3xNF3vT>9_m zzIa&{UVA3PeRhspQGK>|*K$Oz(ov{W96t8uC(4vosFQLU@s#!Dm%Mg$LNmCYHcO}h zxA`IdtOoFFX<1Mvf8K!uhAY@IO(heir^7JN`n9*JyPq4OX4-`=tAI4npkYHX)7OVn zmsqVIm*242wQ3H(7k>XE*Ui`r`fV3DGP*PD%sy{D|vzfLp9d*4%Y1b6Jx>|1v0pt!Yz5 zE8wfNIWTGPaEzd~jfI(IB`V>=-9qQRCAohXWDOC8qcs7zxKSzo%Z+6K01s`V2-z(? zR3}Xq`AC(KECA^H6TP*R=yKwf1#~*>`L>--ZXTX7E=dncm2TlX)dGPT=6wP zZ&jbl5-Q_ql+;@$xR63)3o1MynTh;CtmMqd9tCYpnmBA_-qLao^|MxcsV&c7PwNut23-Hd^7u{QxZhkh|w z_urOZ%~&XTfw8_x9h9CBHe|;)O0@2}L{^15R$b3A9pRit@4yzmq|6piX-$Z{=wi!!fu0usk|RB}}etVRX7eV1{vYxK%3)vDHr+Zldutb&o;0 z$KY>bY@1bS)JAqWX!ZI13icYqyz~d!`*q+LeGQDcExV^*dGRc;3X&p8aX73ek()RqB2BK zG|EOU7+-*bVA#H{f|#`vCqIvL$Q8cR{_+Ky>bK7WN*tfgqkN7}!QLEmt@;%3q|Qv>g80QOJ?K8BpCxca+oM*aeBLi__Os7SKDDZeGYt zEjl<%c-z+M+Zc~e%S*3IR`{fgVmF`mz;e7 zXtDr99*G%>_eTT0>~TBZhG`7h(>Ef3|OVzThKSB`>9ljwC4l?*Ju`po%5#L z?vd+hc(F%Y0;gtd5_7L84=2f-UXxok(kP4(M{~Y(#7k_uZ7IQU%}~19q?Fo-pp)8( znF#PzC>C!&hiA0Eq;BWF@a5Hymw5P7a_M)}uS9YP8aX2~PooU}Je6+%FCrZ|`sTg3 zFs+T-V#sRwmKr9b+oH$2?{1mt)2-}$%v0VOQ(bvckYSDV!?JYgQHy8QQN^;rP~|~q zK@f^XZUxaDNF!t0pt*-rJ04eq9YeC#yuHGvO%sLv8rtZ+ZbNbNUZkeu0m`)`m|bA|QD}d@M2gHw*XYKw+))KtHq{>8zsq*;_+G&klmP2PX{9fWCx1JQ6NQ!qYHAFHHUmjC=YEtnEL3K z`O}>w9!BoxQHpvw`9|19pEG+(ml&X!Z()>1Y&I!u?@f`kP<9+&GsG8Dy_XC#h>9H^ z+but-Hm9OV{tm3zI1WbV^D7gvX2{5!I2|=-+1OnQi?k9nj<3>vnQW8-LiLR7r3oW8 ztU0wt-ODWq@u^w^k#$q%r#Cd>B>Wf4H0j5hE~v63OF>0BY~MQ&7m%;$vQb45@GL;T zJ{R)YcB2BE-OZK;KNaDX*dX6L)o2C8zL1iS2B;7Qjxw*V@{$G9cX(3IVfTxvr^)Sp zOe==ocs#ABGwa4L;b*=X37LFML4s-!Y%4j?#L58xYB-BlmYl%7dU*A3p~j;!->i<3 z`TUrEA6UL?o#NPLfXl-$_HN3M#*$z~QlbqLn4ueJ*F)1=HSfq!>V|M!x9@|ilorHn$kunHU~Z?+ZA48 z+sUa8G-k8}CEo0jOhikKArmI}#xZm(bJ=E&TE!+Ie>qNuc#sDY-Y~2#rYgP1nSd@& z#QfeG9xXf8o7$ylMo84wy>Vab9;t`Od)5EiU=f^N6n&&N(96d?JTzDrm-nSvEQG#h1BEq9V`gdO6d@<=^9kZaQye2f3 z*un%_=)tVVm5e-VyQJ;4?HE5Gs%q#%hz}IjIq+>1L*z}c`%!`-d+%VKjw$1)u5Qhl z)1krOb}U?eM_c_&ynf&?Fky~5)U}C!%zz3Wiw4pn8ir4SIh1pInu^szE4sOXK;}5s znju-H^L7?BXP0D7a<>2x~Md&oJ~4So^Aq^`XZME5oB(M7?BdhTFXl z{p|>Hz}Uak%r^Te*bIY)?!PQ$XW{wD97WT75df|<+=->|Cl8TD>I`A?f1nSS2X+kY zgDC!<(X^+`sGH8V#@Z?MQiez}1u#2e@xYJ~3Dk zp~-f2ay=ZX$oR?nRi-uK*32u^5_$Y1O4G43xuT<1{cgVE`GL^-Q>7i0XqPA2u!X6! z@_K9N3F@80CPtlev^Ja&AhLL)_BKyTwtdf>H06q@C zu%CM4>1s`rKVK`Sh9Blly$pOFofMdqnHR|V@u_3-nMNe<4J8*TQKyFE7FpkB08sU1 z*Xl@kIN=6MrZ7B(M}#8LN`60-tt}U>)I!x%r3VXLuqIp8J<$T$BkeX-zX&bBOEiE{ zY1=rIGWl5Eo$GxzlOfdo>#FVoX4t6YtO`GhXyOr6D^}!|#~_W^%0qVegeH4SK;5iYj5Xvvl#{+J{_;>f<8bLu`2j=t3wHJEtzbMd-`RW29} zbGu1b>=`eQ2dY+oH2#iNWti^VKP>Z(Z&PGg0IaZ{Zjl+>R+?f4gD{6w%s&d$Cftm| z426;5V&5+rh9>J&+6}K8o_*fhumoQNYRutUUf>&7Zxm56*EAb?uUkx32P~je zY!s(7#%5W6HVrpT@0jOeei{*eCq5)|<2Ft1hDa^M=LNpF7F_LiPR^vlSoo4o;jS4x z7#u3(PySR7TN81A4eYvQXDw<5>8S0*@_DyIA(DDEQMgmle5p=2_B(wm3YIf&$3Vmb ziP4~!RDO+fymD4Y!pviQOFYvf*5A8(I8`g7v9NEVxmNZ*0$TfZjilymq*C%9vUEQg zG6+(*(yz zlG}Xc;lU>bzo)Zw3g&Sv(P>IV#CS;6kUU#sNLF`Ni#1kasg5FWT_aH8Z5Fv#MjdBN z>UCA#M~*5~n(d`wu86#FtsJzXOre7yW!R^hSN0FP8zR{pSUyQeOx zduyQu9HpyawpDWeaxrlPF>Go*C(sUj@=*&JV|e%3JUk;{<@yV*EnbR)bWeZl0s0?v z5L-WGW`SXsGyjzqjE^h5=un zE&U8o)&*MVXgl)4#-Fvym>J8Q8)z=3g?j*R8q82zK)>Fs;_R#kqT*1<(yD7c-Jh;r4`W6_ zn;IM;{oKYuRB(cO5VKR6bjb*QHWa)ElL;2zdXtAO`hv8{udB_|KUZsBZ@kP(Dn1F- zq+34l#lUsZnYANpCXIiS@Y8oob=0=s9{Kc;j4-U0RCjF!L5V`9jI=BF@V5jLW&!ml zwU~HG9T)12QjL|g;k&Rkpk~vpyt1{fxZc#%%d|DDGb4>b*W+(8mul9J*0jzU21L&y zD4@j7^V5ew=G6B|G)H2mF7q@3+3tGo6vj83_&wTRQ2v}9nkXF+M3aNn=?z?s4#WHZ z9W4Ul)h-Mp5^%1Pi)T*A^26pGli8e+u-g*p z7YIh8u?_pkw^YvpHCK0yl$CS49O<0fbbnYlb`fUkWijEfk6F?5y)ofUejp$w7*P$vKdf8f^17Id(M0aY@LwrEmXs@ zUAZoUyU}jh0ik$`*1oGqv z_8uxQ4vKZ=%Zmo_nM)k^!+9K$+YwNr$wXsE^ewEKB@4S74UjcZCtAAZhY%Ngw7%5w z-K%9CJjO+=nIC{CA!z%|7h{h1<3SWKlH)!0XJ0SspIHh<1sw?J?V)2MP|wR}lT2k; z`k(5}1EcSOD(-$RZ~@d@#np=!3TS1%E9_HMDziWPp;&0OvGhiZJ7Eu{rSe~4oS@+g zlF%33ethyek|vxu9B#YB?2niV^*;j$6l=-;42-sYA^6Umq@h^>H)d87LYD8H*8Nm# z*rd3hm%7U*V;&@*EbNm6ne3OZ&+eLJae_>b0b%$MPSa1VKkIvfZs-_iBGb`|Rj9&K zTBW#^@2QE?3(`g?{>pUtKq{)9`!4bTAzw0h^AM3VPL)cmTJY>whEz7QCV8}E(q;VDGxc_{TEKt#AGbO zk&E(R6PYbDYQeF zw+<%{uoYpzsx%YymQ^uw7e9c*A{B%A(6Io7L(rU=>dkP_n`44jDh_T6I+WD?wX=jk&>bu-7Pc^li4xFNuUgVoqbaO z4`b)BC5jSc(XwsZwr$(CZQHhO+qP}nRkv*R8}+CM{SO%#xiU`d{p(ZO{{e58mGA@j zX(oZs&9}5NobmyGhXGU?8F=KIc+AK@`-7xu$P~&8**mBkWby1@V$t4eN=1lNJ);2 zE7t_U=&!YxJl!R-o_aZvMD;T!XlS%{*~6BJixH?BKT&Odb~X2%+&!9|7L?;ju(UzD z;h3RhS-WzK7*9bn4yU2pkUeJd{Y8jOPfTWCpn3NSe5Pd9qOVzXw9JKmuGR0fm2pCX zCVX>*1{$nLm9p{Wh{GKG`p$Q@cy0&aLtS3m+HH4dq9z-{W*L0MTn1Jp$|9R3#AcSf zVkF{4$V8<8+ypiIS8FE)kS6BTL5Ad59x*Y}%~!Ss%a;8*cHWvY;MYs66)iBGQFzQX z|L*6e`QMQ9L#OTpv=A~p_U$;8Kuw&+%d|@R%Fn1a#F!WN%cHP8Vnk`9svA4m9AnhG z>k}6?U|yZ%+0GTqGH#YBW75M?&GH8}8&l!Y;at8Y#u1cc2MqdkuxZkkS=>mT-Qxfq zHNrs*o1<~=s0c?E&9Vv(Y1dCR#Jh+zc2G;&l}+P^#^2-~;$%Z<{1ykIkFs|lbLi{d z&?U=G5#aZSt#t2(s9HCKEidBoX=X=eQ(n1no0cIY!m@YFbP79_cP@p&Cky(pACQt3 zzVO6(T3drAb>@gN^vXw7ED9@}QVEl7!riDPUQxD-IyK^M^Du;v0LH|9d+y)kw=sYK-M>FU zjWc#%8hCha(GHk#f91ht60=m~U|s_(lYB1IvYk`beg;AyZIuHX)F(7NUO=_}GL7>4&#PeR7Cc$Q*-<1@A)y@y4gfF+{%wIE9_1Cn zE&16xs-gu=hfGy#I@cVmckK+15tqP)+!Ya>WX!Di^Iv|Tzje_dJvu#);H_dS#s1H; zIYMR8{mnGK2n!U{e}JmJMfx2CANsuUqp3~^lC*x>sukE`0+fC!pVzr#KNobT7be}Q zD^Y;%8&s-W{1e^(X zZ%7@kDpJ_{>%5^%tLGeu_381p<29VvAO7uy^e#cKNL)-j(caj_G*(c2cio!r#3qJ5 zjxF;wU2PiRF5hjNuXk@W05%Y)Ag=ELYGqVccurJH24HeO`}pcfrB{uP0)Bp7i(2&- z|CI+N-}hwaWFSt|{y63!tsQ>#Ev<02<$u@L{k<%<0gV;f0@V$(8V$faFu(36Snc%O ziD;lIW4VdCA2AM>y)m1gjrKigKY`U{n@c0tzv}xbd2Y4OsmWWA*BP9c>gqeGwEUxU zy9X(Vmki+It;47Cq3g1}jG$&*lvXG8dpK6zd0+^?OIpkS8ZzwAV!JFsU0z=;SpdjH zKDC|bXmVBukrlk0g}$kbK84@wD2d?LW}GJD!I?Czf0(&Hbl7vMcjIy$MV>+msfQ&1 z_0TXIY~0-%?dSQY6uC`_#Yn$g@sp@`?U$=_iQDjBI@n#;Zd;&K!n9fn&i=0}=;?t+0x029O#Veqj7L0?+tWq(ctOFfbT=GaOIiDhp& zdw3`8VUo}j>bjXL`=GC^XySJZIy3f*fH^eMdxa;iQx2A1CG+9Xn6?stV zA`iX~MsSQKqYsD2FER8`pKdB>ROD&LFYbw?oD5Qa?|=4yhC_Xp`0t;fzFW{j;$#T# z-?p@~xrkN@0qU^V0Nn%t(p|oYP5bAUZJqDS{nBKpAPcL+)^hxIIg@)(o77htyeZnwL875+}6!=CqY+{>v!%3{h1# zxRh|5NjWg{uiV21$PucYL5G8P_DpxXVw$thk)OZB26?U;@PE;XsP{O0{sDD_c?V;F$LSg_AfF|Y zIKn_G6K_?_w4Yetb7Id$vnnP6t)r!a(>?;iGKEC>{WNY{Fl!lnkp3x!v$1Hm=AE$oK;gREL#my=z=aC6<`cHr>JC)jmYRM)z2~Mi?@#iuKs7X;*e~q zs1&Cf+n7uWV(LpsVmWZ#P3@%Yam`>>#vOJ#erS19WJJX3jm*>vZhhn&-;D(6fpB5j z3)dSJkT-jLWidrz&t%qXzrkfCs-EZ}HNXR4&Gx8C8*1`LAioDEkb!|5$@LZK9lono z(TJI?4Jmh1Nm@_S&E~5hfl_wwNhfSx;DZ-swyCRnaroKIcd<5`U)j7vj^>!Kz*weE zr9W)ZPP}6b2_!dkJs^y_gyo}%HB#xyXR~}&n3uqSPJ-& z^TI?`FL%Xo;lP88&xbMT+pOxL!74e-fR1&hb44+iXuD~L*4pg-dg}Q;VxCsl55qn_ zoVIsogJJXAbWxU`$5R#4*|XD~av4;3pv5w!N;1!%5|?z>fxLk)C(VPv$Qu6(q}xwS z4%Palx;&Zuz^pU(zn*K2ay`f&wQ1pn>Vb1j1FNei2&>LaUZ;P!wy-aE)@#%mG8%(r zLWKv5^^Yq*F3}nQR1XZBr1lY~g4hClV*dND7VSD{&Qa@5q=NnQLvdVuUt5ST+B80G zS)C*xpNz5lSVH)=zK85n9gDQlKKBX06don9EoxqdTm#Q9(h+YKkBQ_#1peY z_^*Wixj)39b5rG58CZiAc~}PzFmGRR%HN}FXs$~DD2ID9l2PGIwOwCs$dc-w6ZROEWTDb}z?_D5^%+Omd?TbMSXc zcYH=%5QQb6cR~=+`*d9>e`9dxh|5$p3e>=8z+hBV72&z4CgMSPFT*%8opv2Q_F=9` ze;3iUpNyy)oBFB2Zxrrsb>J^&k`T_)u)C(x5p&hWHC_{m`rIbbWPC1wR`L|w1(oK_ z8;7djnDSHzV+Gb;-2YVpk2ytWmm)t=i~PD+E|{sS&xbn>))-T~N&v392>2{7-f8Yk zHYMi^6wph5qLJQsvX_f({jS&zD)C(&I6aeWQ9TQ&Lcjb(nm|JS2X2GTiDBTxND8uk}N2Gx#j*S z*a5!DeZ^zfNLsPXo|+#qJfOTrmPm=kL+Jl~-j%3Jzys(SLU=hed_dJ`fQ&8*15IFm zpr|b9iMnQ1_Rg7^9S2ZSyzqvy)Ql{EcwfPNKa;dr8Hk#K^2y)G+%U~jN|&avkka|o zV*M!V(sn3IkS`7Rv{-OC!p-9+3?~` z4A1tY(v@a$f%|csMTxRJN=-e4QAv6ycgwwmD%~%UFv0p#44OsXIp$4RcfatDhvOn~ zD!`_gip~qZpbEDh9^8^M zFd}JhmLF^`lRvPQvl>)lc#enJcUZ}AKn;EkpTl86ZJ=Zql8mWtMvOS{JHhI|c((&- z1-?mSQXiw>2r$Bu|5LY4$41q3C|a_oOjSw*3Z<{UAgsRw6{cBZr~Qilo!wS>i8F!k z)Cmf}T_|%-QokC7V(GRPR(Qdruzf#;Cb#Dz*F+3onPfu45F((CsZ^3dYg= z0j*}Qr7}{)%f(%u2CW} z;<|0}$k&a93j~kumb$%Yoht z50N?vTAHLc%XjA)wWsRV2m>Ba)jg6#yCKxFQlWg8f#Q0$*bV_x!bM8VUCa+H0ym|D zlQ*rOySA16LaKLNX$8z(S{=B2vC* zBDE3FUrp6k+Op=2F+9gqv*h9ZssbZpW=6_lDv{6zsF~}B+qEI*Swhvq^^G?Y#p8bv zEd7yyUjpp5B&N`KF3$KPDN)6k$H`2qYZ5*!d}ds!XGk&g@vjYX_jl+TTPbw8c(Kk# zc&QPhXdn0ec&E-9!fjxx+8+W)3R0oatBAB}9U9>)4KJ&}gO+^`LZvE<(!7ugU8KU( zpVu%fRZq*IM+OJYL8?~F$X4Jefb!t&%H+}24!=o!f%N%7UeEvqgln+<+D>szyvaxu+LT-7wBNimS zeC{NhUz*hI$%I>`TH{aK2wk^hhwazW2z<<8N9e2k=#yjpWCbCMG5Y{wM1#O1XIaT5 zgH`_I1tdvX^orcrX7t5=b~V>As42*9o!hGlw%SuTN{BV;AYD;1w@e#IjwlZS z52gM)URTYkmHqpVQM#`~C$A-LeqFt!3%R4>~T<@f%L0@ z8OQwBLaQYKc|FlU=>2kE=NY>L{%gDqO7HN;>Tp z$^)X7(a}d00^q_a4JzU)Tynlp@6{W3H}Uok!ATm(Og<)%T9XvO!`*~E^K(+`;k)1q+nT1z#Q zhoM=JI6G|wmeN9(BSDF=X<5`@G_pR(0-f%>S8>Lx2lC;lFhOZDd0sW4j!;9loYcU4 z#p!{+V2w%f$ME}da9EGx$UMO4-?t}q!dVWPgXZ3;v-WQL>5t~qhA4Z@*8VPf-$Q?Uiw3fUm)K!Ffl^7DZdhZs;G*FK8I^t5~fP^mj7^^0>?d18ivGhF-ezn}& zAETXzGT8b_EdG_6Y^@WO?ck>11;)QeaTxoWb4OT`a8>^;0o2cP%IZ6z?hpvTsPT zM{stLj3Sfa-v()xpKi3He%73%p;K;Dm4Xg5%5m0_e*v-Fj5$Dh8WC0_8q$BlKF<7E zl@JprI!Fm|=yRw-xDrtl{61~3Ko?P6(ru~}yWVRf>E+>l4Pw_gV(o?4^-V55KXnZa zpvRSIwPE)JgUw%-#xp(g1pokQ=_ws^l21;7aZi7y7kE^1R6jZJV9~zC{5+De*|8c2 z;q3(V3DNQ3j370Put83+C+1uX5M58ItP&jf`zBCf+BsOYO2D&%Uvliz;t~2)4nS-a z4zYNMgq-R)WJ6GVaw|Q4*gY=4A@Wd=h_Y=Sxig_&azBpn9(k};ud`^CEFBZuPUra-HlQDGF z&@bt0^pLE#@;mM>k=k*dI5nG%1D}Un@JO4-a@A?n2pr|~VDp3V8Dj+xnGypo1gIwz zGnXb72Pr4lc3E7VR6RP5Ds$+P;#3rS8mnNd7svNRa)2rfwLp}X5EX>DDMQSYxV%Fx z7E(t5MiTl1t4{q;n5KAaj%sv8YKfz-Uu0}rzSQecWH!r%G2#dh%x6_RHr>8TBB%?W z=63@edkKuBvZq-}(YB=ZBbKXpZs_=n9Gj^{=E|>nfe)eaUQL7Ewi5rX<1Rem-dMYf zjI05nK8u$;7FamI!@!uBM`@#>jqCT}uPfNVlA!CUS3~8%zOLgXjq^B*f2deQ$?fXyrEWa`v zrYmD$G|cm`f4P3<<_O}RD#6{0qr5>ZyCDoBHUT)SgUZJ;)i30IK|)2!G;ZR2t%$8d z|DcW-NaJhRBX51e97NoNOI*YgYqWCk$dLD1SB`XXb%7pn% z6ByOW2KDi#_bdra;_N8?Ua+ADMuOvK5`?=Kmx-#HFkk>WKN0ArL4prIra|1Ut$L&} zFpH+38(g8>b%G5|jn}F5Nowln?j?en;W1_X7m@FWQ_)S(>R+ia;kBJ7uT5Iv6ii>` ziM-z+b*DolP~305HH;Anl=Pz{q_8sm&4~hax803@eJ5BrTQb<5#Z@xWes`!6J5C+I zx-9A4Uf}H56+jgph{rxjjG0%SvRW&>a~0D~^C^fei?2`BJTD9bbrM_)3zvRjF5b;Q zD1kTyN{@iUi*&$7f6?V@T{2L@f}-fML!S6HNa`|@JStjm-H{q*=vTy^HL-BrVwe8% zVBc zqdI*$(chlu@rtLy&_CyV{&v28e}miE9xok)!d3or{V$Z2$mo)f^&j@)=EhW1u5;iJ zc$TU0tM$=HyL!ee8A;{TM~)J1p(9;0Q_z5goiU6n@pdnQ@yI$X_z0%XD+xs<_;zFM zgbyr#lalnTHELzoe)6Uet|UI*XKmG~_HI*(slhPbbF^po9D$Zw$ud*Ut^SK08fK(+ zQrF1!f=mr4x?gsMjY#t+^<6>D4!obEWFPhDalD+jF#jdv8`&lLkiEsvqI*bz*Zior z&^Z75(?XK4dcYi$=rp6DZ&9BCRXKqcBaLIYw?YC;-DMvJR?ubR(Vk!=h6;15KW$&A z=BVK}#{2Ki^*mtM-DIn>`+`zfDpT%gUVt>7wUZ+~ZS#lGnS@H1ildz{vvngfs1hRQ z66IZQ^<_BG^!s1$qdP^4a&|tOdSVwewTFlm5+K%2&P?3lDF2PbG747~JaKd{w3yb@`I1ky91I#EFH`)G z<3!&UAS@tXai4J!T@p$nTc`xXZKHFF%-=^^xk6=E*n3H$tQrx7w1QI^`t1*j!G_c7 z^+JC3HG7bzu${ zw>#@LXLxWpYL89xiHDl5A8Bq`#73v}+Hyo?l;RPt(&AespN@cBHK^5b*vW6_Q522r zIAC4Uf!5E-^$IG<;>==;NWZ!C4aw=mk?mwQago+pdT)l<|3D~w48Pup`5)qK;1X+> zfc-E)Scfx9VrU28C%Lnd*FSD3v2rR*m#|W;f*Du7!wk0Pj)olL{1@5b(Adg{@WHCP z2mHGgE2O4M4`Pm>YyK#u0R9FWc)_K*@Bu-AZr+^rviK-^1i7csPek(poUuq|)hTE; z{#7BKgxoE7nYd-lExqIA@m%^A2ld8SJz6goDDq`*@khbi4b6jcn4eoOeM4eQN6t0% zLs8(O8Q51YFF;ZK`q0=?@YX zw;{N7I|-BCEQ?H0)P!8_X^QrkIbJ-72QL9`S1xJ4aVjB12n$}IaaJ?VETbV+$KcX9 z9U8q7$P%R|`v=#V6CO1RigDd)(AvR~LJF&8HK5Jwg{T^L4?9i5Gr(N_rv;s#l)ip;WVuU7lJpk>b@3EOQFLbq-W4EVZ{XSpfsj-X zIFwCF*ci$c&T|s5k#I@;RG-$Vk%9|cwnLHdHNX%u(jOhx?q^zm*@hJKg}%btkoeT< zd(*lTD4VUc4AA3p5Jfz`a;&^+ArsYqC4&UMvFHSJJ+#Ly7gM^1US7VX)sgjH>Hs2- zJUskQk|~q57E~@({r>tlX0m0b4t>>N3q)AW|6JoaiG=3c<^j@QPAKV3zd(=NireFNaikeS%Kbor zJ%Cr^c`6wRSo{G6GCoww#^IT*arE&YJ3W*uC`|iqx%Iy4GqlAw2;QMwe!5HQpt7ca zD2(hKt6WoQ)JWfN{Cylb?F0j%IE_z7Tz^qua}17Hgh_N%PB5$&4^ItY?sn;v7kJiV z$oLsoQP?L3*}iSDfjYQpkdh*`;Cq*FN3U?55#w;&g!n3?ROg%8r?!p@w}&d3jvI>B z9j*t#VL0TdMM+B;djy61yP`HSSfl@b5IrAX9wQwkKJ0KFxgnuy5wi0Zs1(?+ z(!*B|I`(&OR(=ze97LT%jR)e`8K_xJbLe}KIki@Hu|-}cp0_G9{Or4y7fxjEjt>Dc zilLuC`Ts0?n^a)?pnq^M?@}>YrIY)yzQIF)BZ6NpIpE-iR}j1&Rmh<263N^)CsQZ! zWnx2`dJ|+FxPM`s*%@bec@HSHHs$~+vT^OMi%$EXeVFcUR@-UF1j%{yEB;PtV%_y> z!OynBmb%0pfQchLg!20#^LE*>c;OO2OHYi$+S5b;)6_1o&mq5v%`RM|If{(QQeQE& zHt9#2o+R5Ay*wEu(NF<7y39oob$T1r8v+xpfGR61kpYS-`FD6GEY#0Zb9s-#+Y*~) zyoZ$n=Uj4WCtD~D1bn5=%X(zO@Q4Jpt!q-tWPkH*%?5R|>ONPm_Q`SkrS_4pyyYM8gp_phEa#MP zj@rCret@cARFvz+Bd-Sq!X2io5>H|uaW~E6BlhSGG$jc=V%o7k-#M*Qi4P^t^&;|P zti41Jx4|YbAA_cQAw#0-C^oof7xVB^f*lyA1w}U5-ySAyS3mY8U42qN>0}>dx5rO; zcRp~iIlbG3LS%+Tn3;+z_nbNSB}7qZk9Uh%T4)XuV>vw}NcKn;$=hv2-8lTOE3!{g z;hoU1gWz*eFg}Tlh;I-F+`%tk-C03!$3t;X0ZKqi^c`L8*Hly3j~jG_S^B56NY$Xz zyjt2b9%_4=COpa%Dq|F{?^d>@{yjr@@l{3 zua^v5JOgiW%pud3sO1V~n5lj~l*Kr-K(QRoZh%3aa&kWUYglPl%AUvVqviq{KdqV# z0Z+v|8GuqkGwG#nN$Mw%U-cdydkgj%v7^=E6;Z+}+=wlH0M@s(4yJKedqtvCwdGsB z^$)#};yYfAJ2?D92k9Y5X>_W|Y}wjh(h}Q1HQm48m6g;m9_n+Do)foxHCgz!UQD^7 z&V_XVg$2A1is2$yd$J16_sY0|c5=hji*`BNY!k`vfWJ2&ycx4Ac! z)c|+mARL{7+nv_q-gXes>WInVGyc!i0+Avwt5l|tk-FSdFcJV?H5Hym6c$n$ypUSX zb|yG~TCrrrS@Q#cjJ>o1%XI|P^GMFCiPAeN!*$oRLA&0FrRX4u<2Ai1z+y5sS7tQl z=po$UKcLz&JU%X9=qV!cbu08&oJPmbq33n#?p2=dZeSXIWY~>11V(GP@4Ibr+f^i} zR($Vy@hUj7!I`|CWu0!R%}ruzy!4?jUujmXK#$O-DS*{3kUPwm>n zt4FUh#wU_rrw}Ns`&dmyJ95NpovuK;o4o_~b=YhDpUw!tMl=0zD1g$|}L4|f_1 z%(O%=>3B8&k>5bu}$d=ko&oK5ZqI@8BH)D5Q*7)QRzA8?c>|o_ZSZ}Agb0C(vj+8=8Z~^Fv z-Vxt=drMc8T=%s#IzXo+*c=J4!&@l0Z6?Y_&>>rfD0sz|qUM$~2aIs$eT4eX=TtX& z5Y#3z9%dggN1p|piQ26Xdacv#y)hJ3F4Y(co~R26wJUEwG5FPgh(6Fl&K};a zX`<`5^Sz3D*7>u<*ao(Z=(`u%_H6;03rA_b(LUIk5cn2d3M1?1=BY)jr<*#hjyl5d z%o~(E0KArR6_=i=OFI(B4JzkdiGtZ(7`t2lK}e1CzwT$@J|9?^G*!{6LXTi0Yx}n8 z>+Axx%*2+j>ie937)DGy{)Ld_F)_K2%Nqs>bk258YT~=f(}T6KS|WyJ1+qMy+U0=J zGU$E_F-RNFGZV`~zFB8ZDgNiD3-zY_SL$&76g5qz`sddQZI^>pxgfj_>9v#$w^`L* zF~ERFu!XV0CG+1=+GPvZ%N{pv3|fwmvv9wy%QApdst2P06PP}kM!dHRJ=iGO>wVtH zUlFtQZ~>Pw0se09sepI~UI^F$aobZg)RArRNZVlcTm7tpHfu7!ni_)-yv-%=cV=T9 zm5;#hKpxG~a}Te*#?Mk!GtcJJq4a~B$$o=8K0oqgOVMVO^Q0T&`0;UEkKuwXxzb;F ztuk_Yu|FA`jY5UP{lQLK2O<~$Zx+%dS7O^Eukv(i6_otJ3Bf9*i}Kg3AimHzVf=u} zUJ^m=o|KTXxhvB)VR%798=dI&v}eBvLqtp@$yVl(E6SmhbbbG|+uFUR&+Jl!^bK3} z<-MC+Rr%qs_gYT+%xuEJ@b14yc0AWDUd)d-y$_G4cz#o2o%!1xTxMLABWw#a%Hjpt zWrJbJRzQIy?aBSwRR|ys>W}e`Ep2!0T(;-|+j#$K!P;0WAU_Ze4eZ~KR>-7UFlsBK z*faffJi*llK&hBeAKjT-CJJVW@1Q*06NnWp( z6hg++UZXq(czP?8o_hFtm=V0Xe;I>Siqb=}E;VQQ##5kwwDH)1eyFh{yb^L4X z;_B7^DX47oA((Yym$#tKv1q(DA6|OZK%4h$g+ffgE&NHN4i7TH2sO-9+Z zop&l-W#1Z@IT)Beu7;R4VI^1G$w%y`<%li59;YZ$NN1m*ibvk1p>?BWNUanErb41%%@kHD z6JgK&h*hqW{Y9ZLrpw#ENfxE9&2s-f2Jog5~@`xh~XEw!Ejkc z!PzJ5<-cLiX^7&xEhJSB$t(I2iSJM5AwLhTtW6%8Ge$x(x6FY4V(ltJa=+%L9sN78 z^2b}rgofu2vUkbrJihR`sB3_f6wvN-A(vi)UI9wxqP%s?qVT(t3UcCDw;sZj- zOosgHD71bh*m-~CHzp}jgMXHLn=E*HfXQc;OJM9${&-fWXr4eiBV2%++Wn(W4#0F< zJpA)3Y$P7KRk%BhPrhPN4vAK2g4-$#f9IqCBDf%0IVKF-TgTN+x|n+i0fe9kBS^d1 zk!pQ0CQGu$t##D?%^97-nlY;ucr4VVqx1WldO<0c{<^#cW(G1>QR#Be>2H zlCcv~;N8IFP4Wagfo5TDQwtzbF+sQfX{g7Bvzam-O&(V4rb%%Hbg^eX(uH8Hfxy7T zue_e$1_VoMN%12c6-zqEieRZDM~j62*V+x||7Y!njg_74f7udvF`!FR352pA{*{L& zjOJ}D`l+W}K%6TX$qskmY9G3g)a|F#SV8)G1O77^A22I=#|2ddY*V}z*LJCfZuDq*6 zrx3vXY4pR8rOawx9a3~O(*rXKimR1Hc~@Z5fcDFuFB6d~rFfky4SzEe^P0--2by~VAR?p|DS;)SDLsogwc*XNoAT>5hMlv^6wSug4AWqfs7*8$m``!jVa ze@g>|7P9GUrAfLiKc>k**l8aXrLwu=L*Pqhj}O@ULMSUc4Uo+lu&rl7W8kBT4+#~r zcRjzTbI_4}6lCPGOJcbNmL?w}kZQIAj7nADWhO&Q2C-*od&F96+l=g$c?r9aHI~aC zs1Nuv7fJk!D<@EE(B}r=ov>vd_aD_ZaKN|-vB#o&2DQ)CN>UrKT`@OwqXh?v$l5lx zte^Ezs0@-0Qu(QBFpU$nU6o5uZ2vd+jMKD@bz-cofRASXL?ICO3cn8?IE6E2aQaOrL*YrP}fCrJUATg z4LjT?j_9S@G=B$^i4{b%Yy6fUZx3p8NXWMvH8gvd=@dlw2^iUp6Jr!;1&YoMNRNg!N9D6FsgBLmD{4sd#-7zE>wOxQbMBTr2i$Xw zCeD?zD=RK3^y5=yj#WCv9Vz)r>1TBeqKw*%{vn3qn%gmDi3?QcGxc+ZWo&yKKAvgS zwm=>QqP4BaCvb8&-|Ya6k1b*e4Q}id zy?*9a>!J7~WaoL`xaXfm{jT}-sBe)Ug_NvR=`7Q4W9u)SB&LFjQ`wKFV z($Pm2ZX^IKLU_HCTglNBEwtCNr#>jiV&N2_?JN8w^EkKUZ^u_XeGRf;(nE_6$AR~z zjws2!mqSX^>}{viuwDz0qpW;=tj89{EttU#yxj=@_qi7nUO{5K7UahC9IvMpG0qN% zqT14G+yxV*V*pc0g=ehr-!PKFC{Ksl#jtm(5j>A#Q)E5&i+GL&mBfIE9@(fG92E(m z5?X8~HOnj`{^6d5pqNNW=pVD9dFvk1kW&&j)C$Jd8=qS^KZe!ZL~J+`ksE*Uxa28U z0rev*7iKRR(^D*l=D!|JF)HOkZ&vOd-J?6Le+!T%=?^6&Va4h)l`T7`@7!+7P^p2A z1}8FV7S@geTI7bZ!|)&Z@7eIzk&s0^gqP0>SBU)@(01RhXFn~8kv++KP@rSeAT8ZE zOL&W#fB$la#G&#%&e~!Lspth3u@X%7=gNR{LVIey``S|O%)X})a3bm>BTQAnH1vi` zi`&Jo35kp*EhobaO-!P)RC?DAgsxvU3&B@{`wFDE77QJMO_7tjo}Rr1!B9(2=_6*W zF~y8D+MKyEZ`DZpyHJ0y$m=IBq^XBmCH2!i|9moWX&7&+tc-xWtk}_1J416JjTn=t zp_dDav5j1Lld%RwSLamS1&gcqczC^TAM{>eVY1||)}j@f&11l=z@Vld^OJ7)t0>9 znbvNDi~5S3Y4&7PI@icZp*4qXE@TYD*FBxky$u*@Gg1INsXcd~UUr#o4Q2IOPSup(30Y+(LxX;aODUH%NtAb-#<($ z*IMF$<-ZR)uHjfGi8kE_Bd~XKlM@+8{{wce=oyjPk852Pm^1nf%?{gO%aLLT2>fQcS801vNNN?M%>5_R3`pYXq-`%cPD-$b^ET{C}6S2z!aqFhY=nPXNj zur29Zq<8GlD^onTZ#g07dDz;Q955EPx)FHSx^kn8KoXw73TLkuz(d9~K}WtQNvNma zE@vFZF}xmdhs{7jooDL<@}gK%bNIe^t{9zDWrFF^umxYz*sDlN>Jx|9(!~v2(=&%< zxVh>zrgN4s%?FU=?$n?A7qBEP=eUipad50L#*MC7W$SR+1(*Tlr>h;Q?M%}PGOcA# zSYJHO>C~=X$rjKi!p}62PLm=ua;JW~7x;G>lKp7Pk^a7$mI4g$-<%^%D!VGpe z-O5xmeR^4tlaTy*L=r+Tubk^~><2mEY5zDFtYE>Ak31gihI6w4)Z?&F1HwM(3jM{C zFg(iu$Z>fN45`+NDTlF`323Voa!87Ze@Un^pt0+4hpf$^Uu_YAjPMT!z%Yjlx?Fu< zi;fEChSnuIC^$QN0sIhsRZcbf-@q}+_4%k9A-2byP^k#sK0vqtQR6N>?gCHiS5Mb# zN#X?4G1m>rvS~DQ0-^kM*g1+yFej$C;K0k8E{YU7z77fG^`7cJi7*~k29LS8J707U zyi?_!5vhU~>UA(Mk8fLjQwr|qtW+=?lb%LyGMa?iYtvR@&gv*&vlZ76E3z6Tr}#5@ zPED#0>`?3nPyU_-4A&BA96P=9cHS9?_oHAEe9QB{VfTdvzDF~u%@&ax8J@$YrMPQ4URsujKSYVcr2!zKRVq>Vch_^by$bkMH4&FU|XPb&ZSshM=ir zE(Im8LUiHeJA-b*!!0)mTb}8Avw4$oJmg-QJ9lo0e-XA1F8sXa;?pJ| z6~vFwvafH0F1$t)9`}D_Vpzp5&rc411)RxeJS%k==AFDODXj!Anw1?8AKwYKuaKPR zRaZ&^n2`a1kdQs`hG=?x@-TGNMOM^?44`KA6mwMUgO~<9g89~@=~MmAVTMw|T@$G5Wp;%O+vVThnKsBGEA=|k;jX3PKs6BD8$?Wc zK+8ADX@zqM7m5zOO^Wiu^8jI~jNLT9?fhfWCn8(InY|Zpl9E!=dSoyFQ+n2Qb5aT= ziUki>*wW|_!Bfu7km8eUPOTcO(Y0Yc3%X)L{ntA$z-mSb?XmOe=tG#ZCT+>*-hY*j zb+pSM@aOQ1`>74Z=mD zaB00{v0Bwkc0Z;!q|gbLJp;K(tLQjEyTch|)4ZpN6%Wm~8J8L#0MS*|Slxa6Xl{|o zg2QL_gaso+6uoMyam3fMk&iAq8Tzed1S+$o$Q}Y9{2ZY9*%iC~|g!7$KPM@S_c3zuTY{z``D zL;rFa_+jl#N)e|K#cAVD(%y zDLO>9wmm0{2i7+fOO&t}wEY;c1%R43CXYp+ynh^DeQU8kVi{!iy90jtF*&7u%#=(q z+wkcT_aI`Qt3*5YjuNONb(B8U5WziAB?jOuD&j>EYP}dVvhOK2ou)WK@L+&dtTIJ- zT4bS>^W^%O6>|rHN$w0Hu|hLV+&*P_EE&742+1B$$1?(?OC44zGGz?=>c+vV*H(0+ynR# z94R|1@0|vf+57oQ^3W7I_gzQ>QqKGDLRLx;qWL;w9&omC(&Qdz)-dv8Y>je(jo@AAp zTIwrA|BmVdL75-8lk(v|u7@p=5TYw?OsVr@hPF7eZd-ayuYidp3_?q>Umw&_-%}^> z9G8HB3Wc#$TWgTwuK{LmR{j!IR6ieW$c84-=!R)v5lh^4Nu}$je`*%U_(x4j(8t?) z=N#)hMB_ZnFxj@zF*w1kdo_&w(nB$Lk#z}SduTCGnRoNwwI_ej$3^)+swkOhC=eGu zerxXf-wQ>Y;X3eeknQ1LLs7W>UW@G=-Tz`G`&C>6PORPW->V3mIgyIS&ABIG&M1j{ zGZYB0u5n9MtfD`gExEHh1OMG$#y{hu80^7d-Ws@{JgjOvrL7`K>ue*yzTi()-JY*c zMQI%X7@o5(Pn~8?WU6LGqRbc7X#vTE!MT1zkY9OyFEqlkcGR4T+;;_Tv!fEBc%nTp zRo!5f0}ZYQKWo2Vdu8X?t{!NdVI}lk>^1_$TruS(W}-kb2D2&K)2edyRfZ1{9jm0! zl)Ci)Kv{}M95wD(Kez+V!3tj1C3jZz_wavs&Hv*)%cSPXfx!67=Oumq4y{j8_JmfW zfp++I6s|fBni#XT*j=gN;A-qz31a;8kNSy(Fk!Yhu z_V(86^>psKp+orfL5%$aUR#|R*J13|d`hO0Htz$+=8b(sQ_Td5%W<6)XtKM)y%*iQ zo%N=~%S?y-6NAW*`C&Tv3c5=Q%0O11E9F+dYe)FapSJwuJB>3=@<-&$B0&u=lB9KZ z3-I|LN26u(eajXF!%L&paZW8I&RF}WSa@bju0El~}VJe024)gpY!Xu~p| zF1>11sDjxMd`enHh6$s^@{6J(lt_=>N-DZn4ZRM>)$70akYF6SdZprc&O4~q_n8dw{|dF{2B z{vysAP!=Xz%|5uLUejvHqnIlC6(~4kwZ+Dl*?ka4=oj7uuhP zVk_i?Ca0wwo7zW%&2L#08tpwF4|m`Jp%0fB#d+|Wmgv33&5tVJcHq8tvRelnO;VBZ_|>HR@!^#MGQ&#KXJzR zZ+R^2GLc=Besh9L=7C{<^3v>Kb=djN!XVJgV963_>*IDb@#>UuQn-hhf+s;|4Fr&R zv@@RRKHO@y9!ITa!i0)2UsdBM8k6P0>8ZrYYoZF&;*0_`orVsQ%@j z+$Q_gl&94u%2X(b78?y*T-}CL-ddesgE(7V7bn`&m1u~pYZ961%of~mA-_esZBc}V z&3L=hBw|ze$wx+}*=;*LtAn~vH-QdA*$K3sp&pZj_XqKky z+UrMnp@%+V+vxxxTM+7Cb)Sv%p6wu@!&%wTV*thftcB7#3l$f|f!eB05SliIOo)gi zD*~Sq`s1B_ajnIFtw-OVnx_2`ZYmti$E(+hpt-pk?-Gb^3fuf5%K4OatG5@>X< z+bGXe57lw^T=4y2)&r8YRAJT4ag}z*1*SVbo@u4FmUINyn*O@alehq=AgXK;1XuTeOf#vx;AMs!qzw7$PqSj%py9f zYB^NF{elOQKWXjVVhQ0qr*Q&k;t3F-Mvk!{0eUxTC$T( zp5*7co&Pf7heu6h;e8OQ%_lh(@thsgPzls21?`)?DkgiY{c(GrwiNpJUt0+n9rqWY zoVjc8`4L|rBG?ozj+B&$$i4&=YUCDlYD_Ga%vM~<8yK-Fz9tr}#98AE+U|T<*th?n z{ESi&iLq&U84DKa9NfRBRX5rUNzxI~RL|x|Q@2olZ*mIR*RdL6!0}V@jpMsvxns8K zc$GRM^)=a^7XrZrk9i+#?yoD@jKN~X=Xj{q`x?YrV`LEw3j;VX0YvnOyM1B7~PVK zJsS$JS4{zNpC|%CpT|xnrK|}Sn`yV_a9esu3$jKYVwkIKX&em<-(P61mbr&CP@dTM zd&do>`0vDWq)Xa7a)JUR5~cn!pf1S*%t_~fY?g7{;%GQ5mV)4;914c1E56*njz{Ti z1*PG=ev^MgE}eZ^*yKhy8TjT7RrFP1)6^}V27KrFPDh^n{3-XNtuKfO@?+8Hc4OA7 z9JCeX4qSsc%Hc;no%W?^)H=;a@tFxG zH1WI6HDz|=!z^DgPc5Afd?o<*ZxPn{L<@Wvtqu`wLtr*^JAb%%_Y9OW%W) zwxx+l!Sr^$O@~;=5lXG67l#-o03!0^g~{J?-LFWOK3X+XXNCz8q677T{^N#TComfP zt=(NkpvI!R(&xwxPv#tU5SNIvM!$eF%;6Wg9;!C5FxTggc?BRXYgZO{#s{S;iY!F>t;6{}CM{6r zr0}}U034{Pdf7qay`4Lhy9=pe_coRk8#CHg$9LA9)N%s;f%`uTNS<=nGJ_{9=@)=$-uEw|w zp8__phJF)Sp)pY!G%{`ay|fnkt00+$0njUP$7rl{)=f6rToo}Ep)q>(N;W8qZ#=U1 zp&(=pkf62}Qc1A-281DYd$Ubf9o>Ye=bLCp((HTA!ErE{9OBv=Z|wz2{%nuk9#+gy zbBh4bfm3*bsV=`e6@1>gs{$;ftZ*5*Ms>NfEN#o{00=&Jm`1No<6JqOI9ASBmjJl} z4hYP6E8u@$@fVD`iz^1VKx4V27ZpbFTnp@^gcmbGwVf?n?J{g8%dpd+n8x0Nz~At z0Ob(6P>OI|{^yB68kU}4{Ew}S^bbp`=>&CREz#-L=)1;+BWvN5k(gA#dmgM{6&W+W z8Nt4Ccc;UJ;l!1k6RpJr%*PpH_QF#So)u8)vF{~T73-7thCKq_Z8W@ z#Y%!>R2|4C`)e|q;LH(xHs;+w%;2*|FOc-eEq|U#L-|W9QSUyd&PQy>CV(xzbb>(g z_dn=|t~4<*F$ki~%piXyJ8j~s%!t?{CpE$|eet`=;!H5Mng#@`Wm{&`{_7~(;SfSp zXS7^#KBkn~T&t2bCFvjmL@Zgco2sa10TL~%m~aCkZf`P2sUgT0usp_!$okzo|Qe!|R6OXi4BNuMHxzDJB~Hb#au z^V_Vu0u|MD7p!oiY{2X5+trqel@O-PQMvw9#y$9ns0(@T z7g(LH&#_fq9U)AdhWEe+i}?;a04_LF zzOHFgsKKex0$n{G8SP;9GE6%>&6%9Pj(4U?_3JC8E63Xu?vh@cq)}<7k@3BpcE34F zg~p!j;9>}~{cdn*2R-J$q zfd0KSdiB|ZBp=ck-@SHLNBWHwe0dJS{a|sr_TIo~!O;(?wlpbkz*qH9Q8%RX-Dg_h zWHRK=0WyplaLyq6{xraK_gwKvdyghsdp2P*z)V#LH6T){R}9b92^}?+Pq-X-DHS9F z*ZGFju~j8`oY|!KJFop12mA5B4k?^5^r{?o1Wyhg6BG~ep zwh+FeNJTIi)q1U7gT$4f97n|`_!^Ib8i3D`Tf08`bLYb}5cfvFL2+R5E0d($RIy(> ze;&G1ZQCiOKo;5iV%HXNNkMBv=;D{0509+QhJ5K0r#}z}9T_>!XtY!K~DMNnjc?TCj4(u*Pmkqv(5k4^Ws$$!r*jm&?i1 zo6H{3$viF^vVbv7lrH9SXc_aMMF^(;Sn(h#bu0AS?`K|#8G#sD5v9#u0W|l3V9Zdb z+$XZU{kI(WP4s)3iDs6K#&Q&d&D6%Xl&~HK58NiW5q|NRkh%2eF&Z2@-Uhvt%!Tqu z(l}+2qcWi_(ZPO@W*7J`obCNCy_1L@n{olbXT%isWQVQwUGmKAD62WTMxw_s=-kdT z#0WFI;$JX?v>V}ilXh-e_2i@oLl^1$osZ1kr zc`j$Sza=To*5EZXo$^sJjv_`$*Q-irl9PGcMG;5OrHZ~hEmjD+5uz<-^CVcH!3Z8Z z7Iny{Y5%ZjpMuw_X%q#7-snMq($a>D8v_;|>{qGMAlqR4alRY2Qu159+4&LA}s z&_5px^*Dc77DUWrRB47Dc z8_RC&s;N8n$pGpJ1^U9pk?!HS$r9{m3&4(~oP?9X8-EIzE(Qr1`5?!PWt(7C6#yD)2;))lEZ+82bjDl()AUfShg7yVZr^TXpg(o9+|gq1 z-<5nhX?Q1{AWK+qsKDZ3)sbR)ea#rcoZj=#WfrJpny%>}KaWilGnUUx`qINQnr#V& z=lg*yyeIxVzf119YNy zpQh2!V|YYpHCoU_q)$gil>fKuGYy?n)OqJET%=&%!2Mvn9WB=N|$ z>+Wvs{=wdo97rWtv!B%-Abl^}=3O}Q?qNNS+r3`?_POve%|Qt%(20t=$Y^z_V(R)MLvLRtlmTZXbv0Er&<4a=RPXLX&%&M$z_ z_3oC-r`(cg7#Kb0#xm+1B78{5e(#5HtK|Q$#G@oj-5cOz8Ke1*Xv>cB|IK!}6_zY| z8HC{(07olm)Hym&gZFp@#|GS21t?+MZWBu2Mz0K9u3@>h$JW&CD{CGpz<&Zg84a1$ z&NShTM=a9>D8Vn#r=rCVF%GS+X;=-J0b_K?$w?!Q4(25Pm-nKP6rggnv6T)t;brh$ z+V&9?oXE!<|MDoOIhwl>Me7lpe*NM#L_T}qCPVSf6dF8w9Me)a8x5Firu)@fzoJX7 z?By*Ketpwhrfcno(TknEa-BY4fUy~|cv+w^;GWRA@Lt|rs&5-(`Yh8BEV&^ZfxqqX ztQQt`upa7a1D#-}`B~qA>hD(tH1&@**~Ir-G7cEnn4{6GG|f z=7>>RP`!u}k6~&O66#4Z_|!%q^9kQ;^Gw95_5nSlCy>nvell5Av)vbfvyTondEvN& zQh#jb@iu`?P(AyrCv7su(x|shA1zdkfVz)mcW@V&z>~&uz2{k2L+D{^%9GmOt-Fyg z`ujsJKHz^TQ)KhtRiid&AY@}+!n)06>r`}Pe~*ahuhYCO!sXX25qTijJ!3P1LB2b0 zaE5WP(-QHM)Q6#Bw*I|NSZ9hcS9(R?S&fdR9;%_(G6lHDDLFvn@ZXA0-1-?jDFTt0 zy1`TDnPGY|b;%>)v_Ca@=9Kb9W@IK|RvI45VKLa}d0_APb3E8}8~Cm&@ZeFJKbxQW zT{}1eKeu=_Ul6W+Gy)sDLVJvoR+{|kl^@*)Qj!vNBbf7TWAgB;s!IR)1N9V~y}?UG-<*cl*W~$S1CO9G@>vO>fO>W)t)e<6rL!8l@xB zMHVgTi*I@SoUwb3+0857`-;i&Y~zcBR#%KL>6hZL4sq*bD_7X-a^OPxyJyQ@T$M1^ zAjRl%I+DV{O*k{n`*X>mSL6PiLc6FsQ|+yA_sq+-&(qn(GA!?;v{A5N%9+>u_7@!L z%KiK!_ER&*K$v_J^%^>(F9xTe^n^%nya*#vI5P=TxKSATuPj7;6MA*-e*u4&m5Z>E zOn*-Znvh5iA*vo#9k}B8Uy7degL!rSFTd;Y(-4eW?{ z=6fUQv>M*(??LXpOyB;UuGQ_Sk@dV2SwQsVno+ot-Ki?- z6FY~D1=q?ON5&G3o@&x5?);H;^He4aleY(BZ*AW?mq4?(aLV`(+WxIG$S0NP=Mxq} zmdcTnt^G1KV4y(ty<)Z`<1u+Lqu=YGeifPJm93FuFBQxh#(&~-A8`~}ClojJ$vSG$ ze((P`m4^NQqSA0Mv;2RRCSOPb7WrLYkG9Z;Ib+Z?n*_|qO}vEG`$8t<;tF4X#=ni-yiyB*cUah6d#{|GkGyt@(N50T+An3tH4GtwBJq+S>CllZ4pBw%k-HI$)ir@a{gL2W?W7o6`=B7hY+=lBK#q3o zxNphQcCjmCpQeE5%7wWoIVooJpoWGO%_WFcy`cmXMZCmHB?9Vz{VEz1MYV;5H7Em| zYfynsc4#1}gNc-t#jb#SsKJzRkxTQC`955sMCpqVQq4=9s89=6yakM?PqN-3Ku%}m z^|He4itBA|OVW11oxnMN@TX+F${Jsb#vN%%g^?qlNG5`0dKHe7iOjuaivl-&#K=MA zK>=?!)3kx{1B4%v`Td$2um*B{*S*8Y6|c9r_AxGW1Ne~#_zC-TvB|e{@~i6HJCKoQ z2-?Q!(#7Z9TghY&cV{8(&9J+PP`@PiwY_`V>`#O4SCLQ7EGLMmXGiiBV32Jlr>Zg4p-W5@VX2P+mBl<$*BteK*wkwqCm;jcfOs`clcEk{H zUxi=Nx3^wTSNQ_YTT>)%pl2VD0li(ru^ev}@9<3w{A&nr=x51`TX@z3tKqxd~stH}=exHp!mi*kZALiDff z?eZW5FoB}MDG9AZ!c@`@JXeXeYE~2#YdGQ80)AdWndS=8An^gt^n|4T+^!ug_K(TH zERNNQ*`<2#K7ArA<5k295#hQW9i7LMSkfK~1cpDGwl!L1aJC4#u`eHDV^NBtw6yY^ z49MDQRMNxFY9`qu=bzL3(ix(x3zC*Fz9uX|LmSv(&VEJN_H1k z!j!tlJbc0Nn#{LO^OjNwtO)L=+LqcCnKSuLf)v@e_EEonL{@uFKK!6FHSr4vbj^tG zSeTk7Wgg!3jDpayBn2yB$K=?y$B}f z2aLMC0@tq>M#P2>(+JH=$B!+M(ps-FMDQG04PE!$8SlvMA__7sp&tXW&S_x=bi7etFolf$ z(3!nYI5V9-xol=3T=vRnWLVD<#CQh8eCx`TeD~v|fqD>nH{*H`p&PxKAr!4b!c)XmYXNsW}oFZBz~Igyts1Jb)Nh$Vx(_=N)Rit{FGZL zKR=Hi%%{V5brWP%?#x{(69wral|3qyWeV_r24zh0%(>k4+|<;p7<{%J_sSy9WyqnD z)X;rzd_*OdAF>HNIGjb?iXJ47m+-k~8(8ntWu<0aBEm0!$Eg_0&c-h z#JkcxA~;y4@q`E)bj8#f5G*1LZn30zd~dAM_S5Xnr7sVwVXz7uIec8G7@CncBkk|w z!d2g8DBm9hk3ZX9!3TkS+hD)#fbedGXPE=L_$4|#(Fxk2Z5rwZ{1Xtb$;LDp7H*OE zOF$F$Iw!_8>ATWYGFX9IJ`7GElQzqaHXY^f5?Yau6DW6i;{Fq-2 zUo;Rlq4Sz&o(CX+1fd(R>o}N5m*O?O`hqhqpI>9Stz*tqOn-fCxB+c zJU>_i$Y6uPLKmQ@gtGX%seXb`!R>UA5s2BQ4gkw8P$mW{xHu!)sAZ-|$%FBB+;S&8 zX~((yMi~~|l@Dbm{=QRIh0SA*YGOx>mdu%h$p7Nv&0$Hvf30bPoMQs0$m)mvWFqRW z{q0buc_Jt*KI4P&6+IGhzSeoq24DA4pI#P5nU~1$!osO*EML2}DH}rnJ^@Ym;BvYf z2_B2W7$!+kh3l`R9={al=7qU&h%X&Rmm=xUHk{FnWR(q$@<0=%v<|4SAYX96so1EJRM`&BhD^o@lRSo^xR&%$Fg0$GtgkXwT(0gQ=S{#0wl54 ze<1!q9ZiAQ{s$^J0h+*>hTgF!wVqOidH;SfvrxWM!1=If(@J4lAxvKPoQX>5Xybi5 z#dLT}CLlOd3Ez+kCNN>Zwqw!D`xY!A;*mMF=%Y)a-NaO$et~MapxUNA?ltG&C%TTF z3)mma9EvWzFKX>hmW-@bOM;%QTOdTKufd>q8DSVl-OMCcQp59C+#8j8&b z)}4SSnjqVhC2qJ^T+FDsRUzo}^yJUF^uZL$T&6Fan^EMIizH z?qOTqm+?>Upx)3-CGgn>rdIvMan~quMS2!s!^Na=Q&`m(fAFMhQh6Z4fQ=se=Uei`505aUh>@du-o+%6 zXh2n`ky?^Id%(ChjOcBMv-;IoE2`ATLixoM)oBrGY2W?yFgd>R*w)4QTiyuB| z@)VA6#GyI9oO5c7ZL5V~F9otY z1}MnQI1Cw{5lHvOpP|pFlPaPG=hKA+ZNMaljfea-t!`z_0AS9iIZPMD6Ue~l7V9fb zSH^*u>e6KW9?oA}2T{dpLi67;In3E2<`tA%{eDQX3j+L+Pp-kefFXiEQ}i7Cfl9)` zi7xsW_MEK<^mQlDGn!URO7f3C5!NKMkQ-6On*~w_wR`rN>i~|A^u#MObzKf2bYNtD z`-3266-~f>WakEqlRz9{$IG*B%4E9DT&=_{u%eTr-PDo2Ujto-CA6kyd))BW?|hcF zFSc!(iXO#(82foF;slb{9jLgiFF4VBkl9Q6eJH(*}gyDwl6v0Y^cI!zWz zy*SpwB|H%gvte?H1-GhlH>Yft#JQqG;ffI}s|Xy-)E6dgE9=#05QZ z!h_8e?I$C6-893sw;hrBJy`a;3wJu0n!@fv^;_KX-H2pn#A09URNVvl=japtlDefV zQB5ET1Pnq|R0;iy8pV^(~n^ob1l=4PT4mUR`7RU5r-l= zT$L57K20cO?k%W9c2Fgfmr2;@bFiQhR*u(YoCpKm z9fFB^JFD7s`kO!bd+4dnh%9&ZkXgdCzmMASvbi$0b=aBwQyb3qZk$Qm?o~iwD4A*a zN683ojE)S%+*I;P&3zM+8v?zNXQjkdaR}NQ?@JzPbSp*uAes)_V-7)0;FzDK`u=gk zd%JIV`|xESy{T}YP8~0^-+li0NpN!wxLlM|!3yby90es!%O(1IB%M(LdU$r(+WF*F z4rQ#m})|J|y32(Ut&= zt<^}DgGv)!QX9=pONCKxUg6@6>E(W@tjV?4%+P|C-AMAoq5My7H2C^HK(hIOBDgnH zuH(2?B#+xN>Y>+qzz@;l(yXQ)lnjQ7OTepYVB{iD_VwSC*b3!)SF47$N<)y~hJ!G03tDfbz_ z;jJsMpqfQF=8MCs+E9t5vx`Nr#1sU^xWom~hQnWH)v#R6R^Z<`3~o_e=5_qi^@gfl z8}r?ei7ma(bT`0G?=dE52+?9{3CP|u4x3xRHK{y~S}+^u{@!??v7H_PLxc<|SBPIP zQhw7{)`CMPFk;80D>1X>2U#vO1y;}_RoX&sQbZ)l&;%CPYctCvHkZJHM0zfB?Q2)o zHn~3lhnx7|{R>u+4QcBS4xFHh*40q`iNuwHeC|?+HI>7U`ye(ZF+=Yah6A;6BFKI7 z%941@U^tuDAa1>@*~S~KN6zB1olXIaK1D9xq=X8~>Bfz&Kq)X(CyD|?0l=4B42JD{$g&Pq7Ro1SByOpTSDcc3JKT^pmOv#G7op;wISi=WvNR)%D>Dk8AV$1tglD0?l zoX%{nJKi~VF8B-O8OZX|hcBnjW>|fTXQO`hE+KOdh|ne^cX7mF%`pg{(>}mJTTLs^ zjGfICt7Ve2iI_dHVIn|K)F>D&4_Br!wIRbBPTbUW%>VN1pn->)?ZHKSPFP;iPtX28 zBd1+pCx(u#KJ+uPu?+P3rB4{pXKohQ#z9y>t0RMp!|b3Bjqknu)}Q}`+QhjO7Xx`i z;=56$o}~j~kT`wi)^@x?1(n*r`23E1*o&H4L3FSapvc_7d!$7a)n7x&5* zF)+9ZD~!u$*^vpCKBV~bUQG%oJgv>xwsB7@g-edS$10hb33{aYUWBkFw333IiZCSd zirMzE_~U`3YIQ^RV23H$iy7&nL3%}{f9!Es3-JMlDpe(WT!7!`>dRK?{J=3CNr}7= zU7Fh+HcKElL5@j+_yaF?<)n+d1yv=Ioh|80nT%qVJ(;4ARSc^S^;{k6?9>G%k?)>* ziChDKH5|7Dd^w{@If-iuk%E{hLf7qk_y0l0)J7RkUN`DxUyTv}R!05T$plzaFmTE= zTXIfw3J6f-{eWxIc{B@d^8byNm0nE7 zIV&5!NmPE2pI{4q3847s#=pOeyYtVsgi2~WucAXx23dNH08uTQ?X?5 zfb@9lJP6ILRj?=^LmDdFopUt2>G2qM6)E7~2vbPyvb1=lKDbj6Qy0 zOx^nmno20_nDJNc#eM5E&zw2h#vzqsJm(mK=G*To0b;YfdXl2vc`ZE~Ncq-7oG!~c z(qHZ-b$!lVQl1ot6OxL@O#4z_lv6H`Bs6PzJas9_L?N^Dou_0zYM**4Y zLZsi0NVW=2-|;q31IA66*}_j$>tGWak*^zDpXdq1h%DIcju=XtrFX-6bcR*hu@-;B zmk?X}h8tcL5U0p@m19;nj7J_VJhY;shn7ktIOMo_M9*=AK2uNDlby6vH_MGIgO>>4 znELOdr5fH+DbC<9mJAxD*Ikhn$rq2smm5w5eUFxt3G-fQC5D^WZPIt?k|yV&6rzq_mZ->3oC|AiW`avmQ}aSZ-67W&P&nr1yAdZ zlI^~^q%sHoN!$RYS>t{2{Mm%<8sq69!mZ&yE_r1qb6ZU|%tj&sNxU!mX7^eQ#&Kv~ zfxo}lHCs*zsP5%MIb8q^#6f^1YLTQ(DrQPvxTpnxH^A1{wKd6vAW#Y4t9diiK>&vM zubSaIopB~vIDZHj`Qy0JwVxw!%*wz30&F;)^=(Gomqx?fa#X7=h8#^!gOP;Wmyc2a zpMaGQ2@OX)Cf!hJNRUp4&JR&P7~`#VGqjGh#Py+)X2V`gcmpZ9w{u5Nh4|i}R2K35c-l{dYaiYtx^)QIL_Qn20xXU6;8*ZWHObH6hOI>Qz2k*RzGmS{TDsZDRSOb2Jfg}Ff+b=g zMY$w0xp`hF3QV6wASM$bmy=k~tfW_;e~G*o!35wnMkk@<7mMjg(Xf#se_T+0;%@1* zABmr`@`LFDmD0Zv&ybj;Tce8U7uBjR`mVI{esbt%WgF49GMA|AGVN%DOXT3}F%zW5! z8SP4qC_S105k$Lt6x{%v4U?2k$aY zH8?j9Vj93vnPB$haan#0$^T@?sl;qPBW(H9(D%?cr87bODKi!J5)eF*Tf?PEh!d(= z>O8Zqlg+0Kikw`xYgw*5a6>HZ{Y@e#om;xjmK7=NEVjGP#Y0 z;l~08{(&!$$45BwUYO_I7o23Xgu+@x>eL8rm$D2o&@93Q-t50`B)IxwjT1yi%g;Ag z?kEy?ntr@*`v-s-Gnqb;5upulmz@@y6QBinF<)5}LehBjsSq&1f!_SCvW>#S9wXD< zY$#-@m%-oJ?~BX351-j~0l7sq8Dp~p1J5C#oD3MA8745i@0R8pe|z8OFb^LkfIcr# zU=gILTZaO%uQnEAt#>WY6#6rsYr`Hz<7G`<^I^uu5`%FjNhX&p@^R%pZ;Ox$QxHw) z@KgAe@z7{ruk(5e5&w7Y2!h}Jn5p3ebHZh@aPNGp6|)fB9$MO{cQ72oY{WGQ_L9$r zQ6+nu$^$5$Jt5BJIHo zC9iF@SqcZnoYj!$6BBxNBnL9Dw4_{Mf)(B z!plXI_UBwN=EfRk;(z{1TUJxS`FlMN-cndxO)cDRzuH!Zz-y|D(Tktymt^$TmJHHIozr3Uz<@sxG@6E0 zJJyx1!`DzcAo5rrIN3j2CpbT9d8j@b zjV((6oJYdk+hdk}8=}k_=~`~OU9%~^>At;ZZO3E3qk}LhgYg!T6XQQdzJ(lNbS0o& z>xDCB0hM`)mYyVn(MVp@&UMZ!4!AW=VP>eqpJ=!&XM}Lf?8gu9*H*FI3WsKIJPi7m z4INU1_&&671S0;1S6^^p0XbC)a~6Xl*2xF4F{ke`r}MPc!ko|asZr6KuKRtp!!bnW zbmvY}4=ebKv$N<|BMAqzJ+BDnHSS~~`BvgWB}tre9;JpCzi8zR`16wtj1k%Im)!*Y z5WkQUiXYJXwqp;YUu5pfXsQ{ma=S$#Y;++&mNcjSrh0jJpdIM9$k8V`;tb(i*g zMw^{+!arYa^0z93o6(FOD5X3pH}R_9D8!G3WAr{oXNB#~b1FUm5@uYu#h!fh@)am@-2cd`g^NQLG_dB{Zp1UGFyjX~Zf_648O7tw?1oA5j> ztW465gHfv#bK`^ldton$=uV}Mv^Na{JD$ciFD@q@-j{zBRgVAu0v|rC@)b zQ@$(ZlmAp-3_bbKNSe<8DdQ)4{K3tOts>rd>qtlSJaD|c=z+!yW7O&f0lk8<*3)^n zkB1ql@UZJMY6NoTh)V)|4!LS4{`D@rC)v9`Uj>H(JJYSGZqY;2J}%6mwcTMep+fM+ zL!%pE`7vNV6NrjlhY$zx#Ac#vFwQCT+a=#z?(bz_%^R>_tocI2G^0e76GqN6>QWf@uPZqEIslBcn8fmovtG@*X+yDs*wA1N;tc><)xN_R!M9ESG}l=*{c^*SQo? z4#PxBjC|Fdu)A||JRFX^TAX5V_#;3Nf!-5?e14kA&uwr^Yo~ev*Odceqg*&_VVi4} z!G=PipX?;~}iEV1TPKPg)2EF+=pE0LQOp?u{;RnQOzCA%bm!ql6*E1yn621A! zDs|eYCtIuZuGXVt`BnwySo1>AxlagWjPx(oTv++iwdzeE(p@CthEve=9&GhYBi#I` zGXC)M157h-S4Vd5ruEi@^QuRo?*V6#I`7tfJ*N$)qGw@Z8?ym?cI50&5yo2IOi?`A zxb;vg4{9>>m55LmPIOC7pgY(v-K+<~DgoN~!KGeXEW}kqtDtW1NRtmQIR=5I9jHiB ze>F$t0boGKct!&i>&AlOeGdhSwqRZ#$Y+FC1*4^SX9 zN`zfZ_5Kz=9t*Cs)7r!CPme~zi*B<}rjc4gTXlKnyMDY~rPC6s408fj8W~LbS08zy za#S2eL~Gdys#R)FvmB9~k^_S&fzJy05*!hqrU`$?qsNdIr^?SU7>6~L=O%4Mrm>O` zHYIA7au76@CQ8vHcTQKxaFrzS>9QkJ&ZlVs-%;&u4Xz;gUu+*?V&hnz!n9*F8gduW zFOa*cqDp516I6mLHzeg-FIFLG6j}>%lgdWQr*il^Z3+O#ANTR=cn|6ooyufF_^x$u z1P?dQ(h`&6b$!_X{_2Z0I_(hzglS=Ec)JL+PXYoFJxG4~P4_`NnedOjxRmXxn;VkO zsB_secN^IG8J0B2U7v81o7KDpY<(;3V}B~mHL#iy0iz^q_d6FZe~bSF;r2F4=-&e; z#K`LiH>*-1b)QmKY~u&>rj&~g=+P$G%l>*v*7mr(WsCG{wKzdFUE1fHsh{d8{9fW{ zJi?Vl#xyjCn~jIWZ|u*gPD0>LohfSx4iW-L&>VfyU4vlH`fu$|v2G+W45T~sGQwWv z^y8U3Eq};8pVWV>>ubfsxH?cA`iAwJOJ&a{xIGbJosRLyYqkK1H3;ca==KOqwe)V= zD|fvyC=VGfe<==al>(eYque`?*9}=#?aBa9lui__5@2nVk|h*tmS<|&NAwEfCL+Uj zV+k%Usstd4?Nu7j@F+sG<=p8g=#q4^-l}`fWG|}7IB5K{hnq@tieZw&<=X%NCd&J1 zw{`bgd5{4?X%KW;G4Zja#nAJ5mK6xV- z($a(J&Ft;P_u}|L>DN3q+&W?GhwuHiXR4j8Id?AQ|qVA0%|vrH04KdfxpbH z7tOlZl_`enzKjne{tX+c6-+*zqs=fHsk!Ov^)I;YN>T(qDUs|C|EmSfkpuE78E#gH z&%6cZtf;TEEzR~AmX@QuEoH6=dL=yaSUbiVM?-nN8vPH^|1wo`GyPwtY7RCorvJH^ zJYh1FSR!IO8){%;aACB+_!|Gh!sqUtPg6=0J>2Pxrp76!&naYYJTjpzfExcO87QW^s06nn>jMR5mKdQAKU&BZ z-|J_QqIW)Q_pSTAeqlpg^3R}fjRck4Kw;cgMv{y_I-`xeB@dU$z z+GWUuACJ;sg|G1vV4 zK>;IDjkQ*~vc!1q6R}-V=kk~(KfIuhPz3X|j)1kLR!$y87}-b`n?a_jd>$LSHqOOj z)lNLZJ|Ed35O6lV$5y{2bOx#?R9i0G+Od262U=NuWZ#*Cl#E?l}NQfm5n=%aeNfnF6 z`-iH9YX@giV=RG7wVii%cjZmjeVn#-b-F~OG{)YIW)fhS)hp7h=WV$4ZV;AUMaS2tjvt{$p|l@v^u-Z4o^ znTm@vNB{JJZ=*T4bTWgtS`J@?0Cpf7Oroah7wT)N<#XGjg<^c-m_9fA*b7^-4_a%x z5^Is|w-*gg6cjPNANhRAOn$Jmz0^zBW(ae|*`Vhy#Bk3~|L?EN+w!;lG6;7q-$4`) zqvTOY_keMQRTE=#LA<)wOXBxNmxH7mV0;WY19i@ud!6~T-kqy~{fg8TN|7&S$OG6%KOca8RVkWxf^U`6Kk#DVsbt!E^A={Ay+x+ZmS*=$#jt(y-;82ixzG3 z1keE@Z~bG9`(9GtDHxThu2WHK9&o?m;>}w#NWXUJ=H(#XPkr1yY|L_Go+QIzG`@;8 zg8M+_*ZG6y8aOf5AMY+HOSgE0G*xsSyE@`gVml4^Y!hWP@qZoDIlTFX+GWQ1`sqH7 zg=vH)x`&zvz{#lUqw0{rznIlUZz82z6$M-NA~OVCy=AsPENo^UxY3KDF2m})q>7Q* zIpRZYI>pbzHHJ-~<%5n}M9FY!|5SpUpmWx=lVq|ucMH3UDX4l>sq7^x5>1w-?MoFa z+tYiTkl1?|jFD=35X(BhM3&ah075vp0o;}ieZS!O@DtBPhmDWbr_MW!3B8X`iuEU zvnJtNXXk}Xx_>@Z(%5d__7%5Mgu-=}GJ>42A60-UyhL8F7IlSyRlZIpTs|kD`ip~7 z-b^ez@83cwKX#u<4&B2V_nLIVQr)Q5%LbDAFa_`%-H}8={wsBhba!>o{Xi>HDO#Er zK}KE@F^~$p^}!s{FvwM6dBx&$1jkLf_2i-Q!aBNEO`DEO*ZU@pqHT=)vbzcpRii!d zTsjP+*~@s7w!1xL1NS(0}wU06H0RvkW&CahoE z%9uMt!4pkkCz>4D$N%oBs09nc@%P8Y8%@VZNiGa?F9luH***7ANFUua>kczk?FPYs zpw6-s^mNq8QKIxK1_8ywt)?M_gnRW&p$!=Nd&PrbCnysb4}%vbm~LY36r1wg*P!e) z9<%L?lIwe{XASZ82heMAF$nd=|86#gOO1-?i%EuA_G!)S`he-h4RNu;-HTn-nTxFH zn`%_>E7I(fyEr7J02Fj_faWawhZxcyF>7(H&Ow_9ACxJFTpEVPjL^0KT{$xndVv#s zU*2q{wg-Ivn%faf>76_EOX2vu9Yb*Bk7pk<(&R}pmDfrcVe7iA9DP<3-k#nD?PQ<} zy_0WQ)*RkE9jc|_38*?{D-9wz)F8AlV#Voz@=B*Y9A-)C;s7IT%t<7on0T2NkVpag zXCcZqGW~_-r1b$E>eebn6KqHYD_V(?CUAK4-wb&pAjTjQVmUhs7$lWdJtvaETq6Oy z;pkc1ClpTY@tT-=%cu$0Ig&$hxoH&uw(CMD5}w3Yc@Rn8A_4Rb%kl@IA)#wbRT*h( z&v^zA155HR^5`Sa8v~v`hUQND<3`Wd6im0{@nh-O@`zmv%AZ&b7a8xNc#KKSB?pYx zp;sNT=B!8 ziudtjH*xtJ*Dg(*bfZ)F!u5vGdhJ^8{GUQTXRE%dmgjpL5{*Jes@#o+DGE9<)w6xu>O`oOV~k|)mI?qQ-D zjp&R@g#~ika0|H|UT5`W!H8BvxFIv1jR3h|GH=tJ1ZjenN{41SNBXdSV?U=NveP@n zEmu4l9-4oweR9VBV@2#s-9zqJ0QMOv=6+mU7%0pJ96Y8KPww`VYo@!+f$CPU+T>?> z|F^Msn?Qj=tSHLiH@seP`)oe{Hd;eVd4$_20W3L%9yD_3k4Qe|bB!x4K&}!~p0qn= zP>&vu-PmocBJv+TrxCo@(`R+qp=y`AKnQJzPn~q0Dr7$}(MF@I?r|>fnikicx=Lsu z%D~v@*cU?M*;pet^@sz)Pw3?&vDJR*EiRVtKutc|iEPHkcEw&jjSL*Y?#fgfiD2v8 z9AAr9Dekeq{U(<%Z}a8;ff;pyW9iwr?r{K7t*R@eK)33G7I&Bb)Zp}`WOFh%;q`#7 z5>3aH#zz;G4dMZdJN^D0-OW)>F5nq^L2m#LuKgFfA>Je$(xD4MW&wy{!C{)r#<%4h>$-4V@xE=TIDEUT=C=x9uz*6!mrS6`T)!Ro$ts@ zqCPNA_di(Ti)MzA-OZc*dpV8`mHBO-LYMWxaM~du88re}g7b zk#x(ewr*zV=3rda!2{*X*^4dYb(bdQLMiRQ!6E|Ewej~YH@K4&je$H9r555w?J-Ea zV6pucKC3+!;@SZh$SGmRO_MKf9WBHb#P^(7(!rB-5FI}y4F-pJ6V`0ag9q;8k(L&y zwFA_E$uua1dhuE&ria>){%Xq98&jsd=w$+u7A#t04GMJEh>0cl6 zfiFt*ndRph1kBT(r#0bh3F-4wB8gUG}AMA|(o|B^- zNO6MAFkQnNyW^ssnQ5O0tkBA+I(pL5%UP*tr~?-${n;zsJ7IZWtK+M=aQILC!F=#V z4o4KGE%(5Gd4j`7ggQGv*o=UNP7Wf8JD_l*6|u%#g+f7I;%Lx9NI|;^j}#WJ`8QWbPbu`#D+I zi<3G_sa5e1O22{BhA!hf;Wiet3*=dVwcx6f9Vs!YQ~{j8zlU+=qUJ!kVQBltz0Ttg zVsm6yK86HOAglo;74VjF68P5ZUXxL!$u9r6@}X?%PHGdpqsb#sTkl}tpgQN7jf807CoeDTL%J4r7h`bdv`Xaf zYd&w|0|^LgU%EI7LwAodNk~ctCs|y`>Q5@Q;I5TN<+Cd-3cSUkNXSpM9Q}%_3DKiu zFM$74Bi1)YtF(AQe?Tsl>K+#S7zGZg4i=LLA3Y<-`4+mr-{Mj}#|&%1&FRrQjH#>J zQb$eCCzVV>$7>JhrhPT+oeF3#1#i~sEX^%n(!e{$vQ`v9FuV3^V)xD@cDIkJKa|p< zgpNTVROFK4-=2m#VLgxc>GCKH7-U^B`Mf84W=k~02kz0{oHJxdEf|F~Isjf2$8FC^ ze=do{@-j*dasb9pc9jEMlj4BTl6pS6t~=#q}mti#o*zy9iiZiy>CI;q){CtlYxp{onT< zp0F?|WbgV9;N8baIpU_)`6)TH<}B^!AZpzAbtO5fEp64)6d1SmNrpqdT`?5i58sGO zMn{oR!=;0|(?PeAHkO=EDB;@$nHE-P>DXcmxFOf0GdA#e=6U>`AH-2mwHGkeCErcz z?Lcx73yDYQQLN1pyW^~P+HX&%L82)tsl&^Xnmr-htB)QLQx(-zBFk_m} zFEV}v++92V|A>Tim5dsTr%4_`kq-cl+q*lzdiTCiQV_4t5e~%hlpy8hv5+33$Z|Ij5x#b!@Ap_ z^1ISGPaeVPa|?$1KUl+^@g(aNF*E_*7Bv?*FybLdK7E-KFV#M>mafr#14zXs~oG7?0)>TT|UQ-<%!hRyjiK91Y@x{HyVtoBA zlG^>o>2GM@h?z*OtA;5zG>dJlx)U+#Dh-lgcx$B&x>+B_uR{3QWO>mb;8`LqJ0NG+ zi7~VqNm?O!h`)O)dc2ha$85rOs`Iw?;8hjxYn&4CpnZ(4?H7M*Sifz<7zk46c|DGd zs;f@&ZadlVbIBrrvL{y3^yPkqT;G z7M9C6Nu3h4aujovw5GAmF~nHnax8|)vbV6PU}P3o?YX~F55KF!u#4X3LoNcZ!9fuI zsyKiD=RwZMK|kxh@sEr9KTbp1qVRt$^R;6|maUVem4s0i-be(n#@{&Zj7(3l+zH-) z4rR6P`NP}ibeEO9BefIy9<5K=5B2m6glKHkXnoCH(Z%iz+qDX&CzP4kn3WHvG01C% zI>s40T)u5y_O>ml-LZ6nWvCcQ+6N%op z)}*|9$ncax@vNA=LGyoRV9I<-`Uy9~R3>k#(JB8O+S`)c1M=At;?pEa(&?(98B;J* z%}nUDE+U4qxuYggyoAB%$FbVxS0|>n9ncsMek2Al6nso)61F##C5mB-MTxzx=nufd z&?LT=fwkiRry5{7`tj{od;T-*N#^6&kB`h)NHfyO*})f`j=Wj;YtnUzl3tkQ*O#kS zfa$v{OXEmR!hhWto-5R4y+#PIXo+^XVLt2ZKoFSCoLCpCgCZE3 zfPoG!fchEQrpK&+S`g9^Ip>2)4+aN_ySltLx@wInh<@W&w`g;UjxI#bNb(q_U}iapHR?c&hy-*TcXl|FjezAD9k_6UWLJ zYJ{ONya|ljQ7+P->XAKxDxZ3cnaEuh?r}%-Kv)wIPI~bkRrmQbd5oU;{MCrqiiu|- zSpLf<)Mpgtx>1qX#kWl#Dx6mOvpWwTx5zZ+oCBzbkC;EGW16SVF?^ho1NZy;hX*Ik z4FktS2MCY%w^*yiV=VcAE;@_Uo;SKZ*2`0>Qp$$BPUZuvO{p=j>X@ z5#cyg+G}J!<(6A-XZ;OA|xw|NAh@Z zx2m+BhsD1X#kP7BX+9Oi$dTOds1sJm>MmO3gsv$3H8=)WcA;i)2o633-dMD1>9$gSh|=h$<6eP zITx_^yunvgtF-7>p3~tf>cD|8Yo@MlaOwflWGCIlRwF@X-iE=%NZ&NI<4`DNuQ4O) z(qegJwE3dN;PCz#j7vA?s0XX$rqoh%(f}qr`a65){7U_0-RL(%H&(B1&iVNM>B@_6 zG`jA_b_cdbs^Wk4Sx9SS2=ZP;3WMw9y|iYMK31_Dp@GQj$D4oiqC{|7K|>rWDBOil zL{@+nespe!b_uFn#)7-Fz3^6jooiJ-7#$Jb^_M)S`CdOQ$@ET6>$i<&?cUm5&TO;l zvE0S8mXU9EM?1>&=%qzG#22)mtSJ6d7IyobX8)}#n3~wlf+7~MlXd6*k@JZMM3YOq z7@csB`OtKNAwws$V;2SYY0zMgi-h@W$qlfX9hN!$_T8Epp^AR{Z&@#pU(B}iDd^Fd z9m39*M|6BieK0!=d-f!fIBwHJgbS-VN0p}U0!jRH;eM<*V1YX}hFM`tiLsGmAa7xz zU50zJiJSgN4Xq~YLgz^8dn8KDmTQ$TYv^g~CyOqT2uqK29k>xGV)^JBK}rxVWc>NO zF`08GNP@hFI%lHjQ}?tC+=o#ELYL9^(^40S}nbv{)}?JP63LT zz(ND=I!wM1h+rbvzL4tk+MfIo5rjlY$iM^>(6hW0)8VoP=5<+(1!p1N08kZvupW5A z^?J{!DNk9RzgMZeC1KHkI=-W-8`lZ(lDU^zrga)+JBHvt29o&~AT~x=hJn&av@2>T z``D)iXT)y($D3WOSSk5_mpo~Wx6Sys;GyiC17M1>kAoF8!L8mY$u$cORdjPV6@Q#(!Q=TarTFZ0@FIw$2R_J7*Su>NnhGVEMT|F0q8xj}|=O#0q~ zy|4yXWe38=$8|b3Di)2u5d=|qXAMn-Cm}WF{M%0YOVv6uV@en>2p*VmFPd=HjyjdZ zsp)up=J74?wR{9~vJKaoAne~iPZ`mnSr+>{V30*Xx}6-<`9oK9gaG5x-C)0t_BQw7 zKC$Om8We{)pYV&kJ$@FUKPYBwW^!v+^C?+dLz&+W3ze=;3oVe;4m53+7sY z3;N`>S><1zNv>odRHdC`OY0QTnorVK=46iw;NfT_S3j#P=@m`q2qD(dMg+0Aby6d>92p+C905wl=|j z!n_`2MGd4M+i3J5B~Uodv$^SF4Uv-o z&%01j|HQKYimDy&1+F+CKyvRFwDnw<3x+oV!hcg8Rc_qII_nr0VZ)dh|Ah^z3@Isv zVYsBoS$!~~bCQ)y69MYkX~c`O;ehDKDmg5`*nv5I=0fLhJGe@B)*g+5vwgnVGD7AP zULsL}xD(03r>B-aOR@qh+AmfvpP>}K9F(#Nl?4>t`!J2FJ>bsu!jn<*WgX8NTKZ`( zfoFO^hq?8`R)ZQ6Y4={$zo;R~N_0sSsf^rMf1F^|F?iS( zp&%r9_4D}_8r!~{+33dzSQ^Q#d)gg7$oCDs=LE>LxKWADPlFJqgk~-%YefsFdBJu# zWKONnn5$m9^aU01TWQdL(t3Vrqe*7Ee`hUS=eRzUbRQ=LJz`=dt#S!MHH)wLSH2KZ zso>k0hy8eY4N3an*LgVQrD_mgn*;q?It{#!Yb#>Ut#A$W>|i^+Ln8d`^Pd)gISx3X zfS2TBk01omim8ny5;iEh1vqwp6lGutoOf)??p}a2#3#RX?;fId&PHT6k^jZi{I%nE ze+wZ%ZnN%STS*7b}$(KFUf8~Rj zLS7|8GAcM7HI?VK{5(-p6B7}b&y>BDAKa9Q*ALRt@a%%jF9B@Zez>GH6?GgePCx+` z#2q_4TD@R-lRp1Zi{f6dAQ$@n%nMT)&09kGiaRy*8WhJQt=Y?IckaREMIYkgr{FwMiEwbdiu8q@Be{fU2MG9MXBxko}dq>}zglk=1Otg+~gQ zQeZeScD29!Dw#9M+FIv6o%4FvQT^jm`(lp|!VCy4LXSReC$Y_seNZGra?6C~ zDOb*Z66D&}W=jZ+X;XHRw`!_B3>d4)Alvz?9^TN1C8u6I#5o8$#qHHn6v1GyS+-j- z#R~i*ZN*2z!Pi6CM4n!N9`-Z9pe~{*v;eA*Td=jbJ;$KQh`jR&CX&O_Ne8y?gExLu z0e`76$2*s2%aWS^;-RY`r#J|TOz6yn?5dd)x70z|9(_fF;Sr+*X81}d612qJeIHUr z5`7f@z+)Kdstb98N_UMp^(fb z$s?13-LOVf1qUQVdv5o81r~V0W1w_A@oY`NOhp=+nUrt1!@WM!-la$+^hZ;oU$Lh* zD?Ir`>Rd8+L5tWHI-7hNK-^4`*?z42P+k$Tkk)S*>cFDjur}h#f{361JE*hit54$% zD0B?&xAz8wX9sXvRs~4}MDQd)>=Cg17__IM|D5KOa?)XpsPNw0^n-)#E&AVpuLS*v zgRSMK(n;#3lXDq1P!@v2#k8_#JXmc+{~W@1t(#+>tWiM9v3>gmB4p@-;TpaSy*?Tm zxG1ot`>GONjruiZ?ZSK!ha(5zE|U3GdysR0vNzT-{9U8^N9zkqWP3ToPvCztc?J4r zjsj)_yai7Ci0U}q|qAs9e$VvAQtWqgb7+#!NZ4_=lKe%e!^xIwXchR%TxNK~TV|3|OU5sRv zR;aY??>d99k2a9md{;|wwr1;k+&elai(&v@@gGQk+0km|Xm!WPLV}l3aQpb|%2mFo zV~uqz!L{oS7~Iqx>(=CnUf8IOE1fea@Rp~+_<5NXJ9$Cgh-k|c7F2PO73hVtVr7d@ zX@GZcD5c2f+;9{PdldG|n!0B{sP3)efxVf)5T1cJkMs=Iu++^Zy-F`h#gSW%Xubnh z$X})>C!#`xemF7BF5!D~j1uic!-@GPE0cCt;Djk!yeH6cVKD0f_cwjHSo)4C&xh16 zw+doTl1nRcQ!iz7+n3h?LYtb3dlMS)iVK;j9AvdkDPo+if~9zzqT0e! zhefhzOr{??Xz-lbM$StjqiV;wved?Z-Mf-KRqrOB4A{cww6OtNb!?U zHFiR#^{H?*G&9-AOffeqYoQ{Xk33xJ(traGd4CPqAIl=2SGr7z;bhMHE}QJBd^C-F zp=sua;l~z*gjoBr zUE2b*E?H-ejS}rSJ*o{W!PF@=#rUzd`LJho+25Q+MrW7#`0k5k@)TG?%kuQYda)#E zvZkEoXc@Se#~L?nb zROWvmlAVLl1S#QP?2X{8GB-Fcy$D0qaUq#=8wA%=5)gJWY($=L&#K5QC$f>OafpaZ zQD_;RM@iMSCv2CxQw$-H3Jrg7K(x(c!c|0T{n6N{)DRFEQE=6+7@^e|P6tYJn~Yqj zgPKp^n%RsDe#W(!iMATjKxvea!<~HnrHwSNFny*fSz=Jl~Sd*hP zTv-@eDHy+%>3fZ3FrpYr$d!;_d>x{FFFnu${5mjzR1uL}7WCITD^3 z3!U>f8Vkj&q~wZ%lh=WwWsD7HZmSBbba?fglIRbx^F%x1N&}o2MC~{eBcz!&dOT?vg)Btp_yx$6aPTEmIZ+zO_-e3HWF(vbj2;0vn9dyM?P6BA;Lp@??B_o!v9 zUwDo(?C8)J?&a!$n%-lQAa!-9Br+D%B#$5HaoZ{ksueP9K!Qs5tnG8h!v*U_d^yQV zR$EFJ!XPZiUY9Y@?TOTMtc;?zSD!(5?Bh(Ew9--PAlBEzANOPaZh6y146ha?WjD2cj0(&>5P2sO-VXTxvtJ?%Zmt#6kb#oh1zb6qUJlLCVU<_axj z1;OD6lK@Q=9;#M9uNn+$v$qvfZRjQX%IxZ4e{%CzHDeX1QqqW$BMU|^Ps;c^>x;aQ zDmbq7dbsm`Lrq#|(P#Ynpd?r#gslg0l4zR5K4A&M=X_emcbku~#eyL^zZjQ6I8%$j znY4lW{B!ORlBy9?pD8*aZ-&XB<5gGA4s2v)TQ^bg8FN*(=!IbwBo@-sq;hlhAt+kU_BK8w zNb)LA!WyWQ>mMgARx#{CbGXYLXNY5;cWGxAobFIaDDEva^Sgd$q$AH=`*NXj}iRscy?r3=T5rIX6#r?rhc z6xMbnHwx~2Z|2B_E1O{Q!((~DXC_PW-jqFvQ3ACXmz^xYgJh`qI2DPK3~i3u9U5!V z1;hh2l9-7jXHv-?UT{i`3%c0f=W|)z8~GrggoQI&9mSD2insZ|iQ933ET(H{`nF)* z4x(ChTD;s0Fp1O)vrITVrIvqVT_xkSc=~3h)fTM%#H%hP8WtGx=G7Oj0Ll4@vGkEF5VPzu() zwO0nmcd`y--jcomp?+R^y>Yg_jgPymFNR$0bV(IeX%Tqy=%ptT%ce`s1TFiQ6y$KoqT6W8p3qTqv*}_TFkEAIFk5D>^e!2Y{m_QQj5! zr}f80P~GfS;!xBlS|=7#23clp)T%wI!uc;1CSkU*Xh4O8DG(MQcpU#4Vf@o_X`1Q>_K(P75jf?j_qZRX3X@k2p3pP!=%PO_3px8SGX zdY*gM3OCJkX&XnY2HBH)P4!-y5H_Ai=mHFq)gukAU$so9-X%V=e&DQ)nOBl)X# z3SsfdH!^&q0bCpWJJYom6xat(G;Ji=UB#D-M2k&+)oLLqn5+?T6<0cKI(H~p8Ns++ zUP(hjmXd-_`Fe(+nF@sUw3;2?h$0fRZ(N<0m_QbATfwoOu)z5dgiv$ z<8imR?q#@-h~-0S7x5GHfiwT*1*#MAWa8qVESY{!GDSgMWnZbDpYjq^+UZ@V6 ztiN?6mT`Xy>2^q1q){c?Ud@H(M$(itJmP-mALU6UmsVoRJD|^`TV8h~>Ws8{WC&2} zylfd&H(XK8O;;#OR-`jIQ~nNhDFmVKp;C1HsC#6(CK|f?R+=cgkGPtqLa?JG>^2e; zuJ6=1OU;C#+3{7SBshwfALLjS;RzZq@a6ivo|;G4i>Ec@^eg1dP@D;q-dEPtazLrD z1q1*SUlB#hdzfX>U9-h>j1hNWSImbRJC!$VR3L^35w*W6|71eQhklq+*a6NtsCwUz zMpziLkHx)Y|r?t_63!*+7$kj1fvDay&7T(D=pFaQRo-Qn5Gn)%XE4ky))QP?df_tvvKk_AGUM>-M+Z>Tt=VEO8!%+ z=Ngtqbg(FgC-sohuIfq+DdL>2Gx5D*9!$zO<$4;6Rz1(Jol>xu1a?qs8}xWlEuMWY zt(g)oX`12U8=^BUU(@O^zY_}@d>$gXq#=u4ol0ZL8;(rzf4cTpbfKm;9W-5KL$MCL ziA^v&5`!K+z4D5V4BA=<{PhY4i3Cbn{2_X$md>VRB9{!g?Ud(j( zpVW10ffrebar*S{(5F}@91#VzGJ_w6IbaCe&lXJCe>H$n&_a#)b!Ix(0nK(sZDt#( zw%>NTZ6b=r29E&__ypH)s&!Oge>6-S`}6B2E7;&v0OoEfUSX$$mNjkNN%l2##xudv zHx=Jn@qwkE4M2AqRV>^p>u32d!i}ncUa^^p`n*Hl>k92n40#2H`3X&%O;f4VYbmN~ z$TE_yBqf}A9I9ki3VJc0G39vGB}Vpfhu5vxcR()X;U8k&^Tu7i78L1>yjj#M%d85E zYD)2GngEal*3ZZ>_G@)hf&rK)Wj5iqSNHT*O^e4KNH-Dy_P6wG<@!oekY0&X-ufpD zu~`NV-2TC1Cd+t+xOt`rS(N%$PnSGyVjAlwY`)4;aLMu`VNN|b|17%odj4MI0*iwo zssrl#GF9rdq3iZUJ7~>fI)u;1jmFG(bQG?YSc$4ZE@*auqNGNkmLy)Ph}wK_OSV2( zc1?Lr3e6v1>_s~S}mlg26n_5SaeJi+uRG*O3d?w;T!nEH} z9!h-(-551Ov&Julw>>8s5|&q@>@rHUn~qn$_FJZ%!7}c(k_8oEIT|e3-JZECD2%n_V06Ti1rzK5Dj07|c8Kf7Ns;n_ME*sq|T-|u> zJ&9KApxdd&L@rNvK6BO2G=usV8!rX13K{z17r8|tn8MP#oY>p99?((&7p zggI_N^UdOM5*L#McpQ2@M-YS`?6_vs+LZ@BYc$2oJ>_oO7S|#diQ!UD7;JpaUBH5n z=BN-gHYCp`$sOSWDPIs?I1Y77Ch+V-Y-3={KI!(A?xn>OCrI`4nrp z;N_QqqwpF$!9O`#Bh|g6ZdOkTWnk6UsOZ(pLl8zZOdG33w~xtL9Qvk#nKmg7#6T+m zQ{*Ac52Z3~5JsZ?B)s9jD;$Fp2(?2jJFHnSvUV3Jka7iT!OvB-);<>B3=YyhaB&x0 zg7~6+xN?FPq)(|}U;iL1>D*!WcHg*IsCAEhTwrdO`go9I20Le8#uKPc*xK{iZ!do=LNxj)vI9dKLi%?B{?^1R}=WbgVFPg&SPn=A8HmBwNpvQS@MZV60aBxosDzT6gZ3~^1}1Qx%O zOM=`kLwxX?#%WDV07Qo^Z3I?_$Da8L#vg>3J(;ZtZMBu`olZ*9^Vxo514nPpgEDkc zLOV%5(%JEwd0v&>k|xf=QInCnu-*5u_!D3}aiT-XyIhAl-xBo^gnG4dhvg-5&}qj^ z3U4U32DC2p3`e~cqpJkv$%R8cvC=cEMZt>^R(z7*>Ag=kJ*GHt;;mVFoh;r~i{_@p zul}z3d8f3lD(%>rUl*SG_7o6V`hktUJ;7%T^@~Zv9;{(MwZCCWGVw3wjlhDU?=^YX z{5lSmGR?$8pM6Tza;AP$L2ctcnb}Ko19jh-b2B~MC13W|u*geHyA&J{MXgr)@9{RQ ztX8Cq;1&uj2XInlh8eeY9PvZ7vfhNVX8cCX`1rGktxQbjc<$_ZHc5hRPO!NAmCyEE zp7Lh?`MDq|J>TQzrwji<9UFxD3(R%* zcD(UXeLOwRg-mn_5ECW$9T|AMZ60RII(|Z zUQ$m5=yG;hErGe_xyDhTETBM(Kich+J&WF|kU5jluuLcza?USjwu(IBm&@b|^PYML z=@r=ME9_J#uOdLtbBoi#KcWojwm;#0t7&W>l5@fh&gI*F>$;|1K{0*nA?N< zti@$}x0TRha!jjND!$x>F;QoRr;2B@a1|!yJgd?h8m<>rpuQKM>LdXW(c>c z-Z7C%DNv@L6%J${Q8*e)4BwrPtnP6bHm}ols@X3{@i76V>2EH|0N#0Ub1}8p_nprK zh+o4%1ei~+YmDiXNN~Tq$-?jS!g}Qe_GK0XBNje=~o~7{byGelqHb`LG-w zgYu|Zl}|#B`ndbAtldCc2&!;0P z1D(6-yk9Ou?=CV!kq$cs4smI64ucfmR}$x}_wH7zm*)s&8u5@n3uggafq1eO{xK%y zmOcBpiAI6k&(xU9GmCRW@9P4>hz{i-yO55IV%de!?FPO_MYmUfq}v`0&tGH_PT_lo zxk`27dBm86P}u;D2p#eK&pys@#PEDvyZA>bY(ruG5}k@~Mm}WjG}+amIDt}qi9$yH z<2`E%-B-aUs#3uVm)>5`2!f$nR#kM;jonIl+dcdFep+ zi#*hPTYSO;f5qV-?#Cz6ilE=rQRM9m5}!WkvE`ejvG?>(0!lcVbZ3>Kl7;9pcVUvz zYXS((l5*}Z1h##1q9X!Onhz4UITn|b{Eg#Ci@p5uy$vlV%?8t&QC3fAvM(axe;Yae z+5gQ{@`+`liJXe}xsQR~n&`2H9dC2!p8a=1^>qTuQhqwt$$dqFToMax9Gl|y?@8Ya z_IZ~kzAUXdu2r0sNHr%h)3ws8a>EdNWFwXh%C9vjy*Ajl$Ci$Nq;-8Q&G73-EWfbBDS%1I3!s3e!onNSy6rqcb^&E82JA41i9a;n0&&uEtHaXiw1}D1Wmu&9xlmwXBjcKP!2^x!pKm_vL5HPvowF zXmO7W*tAmu+P|4CE5X^uHN+Vu4<5{ol&nv1I;+cCT76u5rxE8EkbK6(uYYvbJaA{8 zf0qhBiW~$lo}Z5qegZu$GT^1b;ab$2Xms+n&3^L(BKUK6?*Q6=He@y}armOE#|Pz(NteU!3`j`ExjW$P6rhlDA%N+DFj=E)vx{%_4p{ z1n7-6k)nBH+^dy+K(oH)17xeUw3VI8_kXtNa4^Jdrtm!#aAiMkvABT$*iWImxYYKT z6m|@-o?2piY%F&HlB@rrD@dQwZiwvvm7~h9y`u{`^i&ICyq`58Rkk@CEo=*Mv^;&T z#1wej`AINLQW(`Vs4_ByczmElZ~bN)9QJh>f139XyiipKK#=ukF=QkYoG-Bf!3i9|b&Pap;L)to zQNgV&VEjW@{m?94Eey+jh>uOfk~hB6B{c#yA*{iRlllrEcnl@t$iHT*>CG1UuU0zd z{BRurR1eGT5o!Lgo{N{aM*a!cF>)o$Tgl{V2$7vMCmG;eW-I>EZg-yx<%n_Qe)=&kCPz>$2A>wLwChvyMrq$d6^Wi| z-0FulJpVY}QDY@)_00NC{xf5tzHUHA3m1X@#TkW+=C@oa-Ftiz zDs=TZ;TU|ChlY#_D6)y(ftCGaHrbE^mDot0B6A}KiHqE8D_kK$po!U;S7lGJdD~{p zR^4?}_}Scg$gSxK#vn-y&uDV@_gp>Y$Y-r^euOqMwEllCs2IST6bX zz)zRd%-S5bi7WZ)ObYRbEd|X!KC}}!T*-E;LBUfi=+vpE9?5`JcEP;5)>6khym3{{=Xh z82QX}PvbT@bm;Po1rAa;VQ&Q)vs%f?R}*KAe)>XXNqNk~%Cx?2j-|c?v7%1R1S4>g z_`3J#9T_iTK%Q$r#8F1QL!gdDOFul~-Hv?FGGNjv;m@1~*mhNgf@9<#iE6L|Kah0! zSAaA?|4*q0_x~pKVB!A%Y)F$8U*M6P4DqTD!)|^bQ30ZsXGoNTAtb63cAqu7ht?YH z2wz>0>SSUnO)4We`lGG%K(Q@t#~JQ!u8YQX#k2E^4;#J+d5gI~uKP0``fZ9G`Q#HW z;)kdd76^B2eXV=d-tv8W+XOx@HHI8*&0W^QgJ*JOA{Nk?S@whfhp}^N&P9Q?Y;4=M zZQHhO+u5<59ox>1ZS#w5+h(7)zE#~1_g}1W!PAu~EhzB^@NTnRVA2yK`U zq257#jf-?LA^wGUX@=>5BUf}?!UU=Z|LDK^S8G~94Nu}XGk;GN}Xj&@V zM|n=?=f*zR*FI^aCS*&Qfebl^BSw_$%DkWIGrv)&+!C#{sARu879W>%VoY+zipbmE zL9qYE4nv%`Kz~B2^!D>79tm@2XnO{kbLmt1kYf>YyDu9P+j2a#An~`2C3pag#)pd(V;vjF;Na zC@yaEwV}5~uu*3JyL-2aZ+m|6zObhhBiUrZ+W!&JZoO+dh6z+AYR?(IoK_~)&1KsB zIRNn{)j{IT!+I{tX}IS01a`m2=t^HT(LnB`-BzQA8)@1U^~&|d&k0&AO$BmeXmSj~ z6hbxB+-18e`1Sq4hx*nHjrokqbx}(vvbEsV+EtAsPu$VGGl}e?>3h^LE zEkNVxnClYn#UV?NM>D1e*T z*dFBgl!7kp>{X+Lx6EQte%05^ZRhrk;i8R%X2SwG4;LEjDpr|Qk{*;GC(l(%ouu)t zkag1T1UXM!89pJ{6ke&fS8i6JdK0TH~$lw9#7%WflUe$Mg)98&GhoW!U*%tlpG=rM+M@-2f* zXJ=)`ahd!{4B|b_wg#$&()@rm`8IH)eWpgW53lLs8Bb(@_f5Ol4E$Z`a|Nt+uZ&QR zXH&wRV5>}6*CTw_C-5L~(BgOwOgye(ZnF59F1qsy9a3ec`g6!CE+(*iMAQ^O-%$CV zA<6Yeh1#!YrI#R5*p}5+s#GOq5`*;#EAvdoXV!D_(!2G)+WH@}Cv76uPiQ3~FqZm^ zc`7=x{{7&q6AoxN4HT>WCogev1XRMy_8yp?_~VEQ4`3;yWo}{UB1DBT%F^N9q=-cw z#-X$=+@QVRi284|^&d(?RQ>z&rv^*W8RBi|SXUHX{>8E4`33_U#}xtWUOQ|nRmna)B!=tq-`m>g-Go}Gh@=PhwqrO@S;hiZ`AT5GMbT;S%BP=48x`6 z{O%R@GL+}a%SwbN5_qAA$XDC7YTY&;BdbF5?{wZ+3=cPNv?ey`=Ri06w`j5p*SFre zUO(%z&5YtKk0ceXl zgz0n0ICHDDD$izuJAB3ls?bQ_%Q&W%c#RCtC(B-Bm{cYpbWj21|F_YID0V}ng z;sVpiDGViXX%r&592R6lr814z@+a;&wD0Th09VueetBW`=2=lyj8QOdvwdi!!$z?O z%{1Pv>y}HGWfR&X;WuKKL##mHhTZsK4 ze>$yZDRqQ0t&s9y+dmABh#zu&=&wlsMLFw{+B1}~d2+nnAqrOGGY|-1lNgGN?*VpS z(k-x=9=yCHG+_Az*?PHmyaGPXL=@FY!2!TD;9}tTP{=d-3?VCN_Rn@llC{=YBJvRF zUxw>Q4K8TrH=_iHMj5auR)lnnyL))bsd(c$fPYuxKZy1By*Ea zR^0xPlLq{G{|qe`l^(w(3TJF4Rz^dIlSxU)$Y#(q1&z2y%~VfNju~j zq)cZCD$tFtkp4$BwSVMu9hsrveq#rSqyl4-?UGvVG5m$yPfj5aL^{inF$&8S$f*)4Iygy_y+fcj5 zSp$eCx>fF2{u~zlHLN4%)Ic9h5n?%EhTrTPF55f0&oZ4%T{Z%#0t?xf9;XW~ZIN5V zBhh1bwa`O#3uTgvn!+Ay_WUlv+!wtB3f65!QhgrFw;i&R(16 z=iFC-B6eS>Whv8<+^o|}l-oNC!JgSFJytbx$Y_6HzU~o->}tD*zdQ^y$F@8Ig=NLH z0pa80z@QVweV*~~Dh8kgS|AG;B9r5=p1IJEzg<>h@tdtR&R;>gKrw>IJ*(ziNNco0btUU_k0So)!kd9#1a`y<6x1==DSKq&297Il#3Y0?XmPNM*X&=uXA^z^V? zg!XfBTH>ua9l!%Am`ca0z`Z^z6ODl5Q1|VBvc|r0V;j9eB@mrz%<`>;EovnsRRLSKc&r zTMIfyJ)7iDm$>G)Se+-JWT*Mqi)OGln8AS8{fJA14mt$A*7$W~S-AG>jO?4!m_!AP z0e_Hlh5hPL#I%@dnS!(b>!@Ft6koO)mEM!uk)xeg zDrkXqf|1kl_wTFwy78&;`quA~fu8-I!i`Yl2VX6xSU%IkfkxbuO7<8lNj3A53P;z) z4#lxQJloatUC5VVnF2WDw|{1c%iM*N9$eORjvu+uKGORQD&$lXQibqb(RHO2wQ>fA zEMgmm(mfPZSk})u{|6-ke;}vGAx$OD%Lq&Ty_~;7`WoZ@kkC^F?!gZtTK7|#v2Z-C8G$bVR$F{Wk$ocHo zGIe+RmONq*HFTd>;c8nUGWFcHd!qE4E~oOtT*%18YBiT(AXm$RE@?Zh?XC>P*$1jv z;qFPq=duy4Qo=zKFMALdci2LFCSQQ3dju8Vv^Ux$r8yN?Jw+2lN3HNzqjw!v9NxfQ zU#a&DE(YOwnHBG;7}8b;jSh2eMfMgRLUd<-x|$~INHSf{iCA_-%OX$Qt^*IMvA>OM z(d*w>2?p}QO>NH(<9RZFg<5s&I#`MLWUP>&a1IE)L$5|EriNU{^l86d1)|v0D@lgcVu2B&0tUSgH5~VzW(3Q$|)v(OsvTHiq%3wCE69ei|t(-`&F3c07UnWq$~u zs!2sscf^X9Fh@n()oC+PuIpr4fmt``cPcYh=kck6dB( zE09=`5;uoaWj^@55M?BbsZq+rOnGJa@Vr!BvoIP6$XcGk!b>Zl?EdLjGEJadZ9*JD zD6|o;`m9BGL1%}#i2%;(B4iU89k*JP zz{faS=I!_4JuY+AHf)HCtncio*OqfA=%$qEWyec6Ffny_2LCbFo3r)QQAu}Ykjdm( z1PL{5Kw8)WA4|@rvn+XaYc(w5Rg?t;LS-vRO|bs6LR~78Ci;%uq?`{crp4aT!ugEb zop-z$UrOb*O#mwmU6Y$P5pUIb9ZvrVt?sFDrNO&MkbUxSjDmXD}` zWlyYQ4hl^7{>w{LIn`8yxR94n=YrwHKL5+X3QrKu87{WL)!7?U`i4;kns$_9 zS2l3TY4^yntXi8N8mk(!UP-2fJD7AbLN1sg9a{6E;qs6R6<4BFdTT8@S)bsY3sXKi zD>!_-N;9$yf%bGt>rIK0EsdC8CdaFQC34|&kuVuB@c#C))(5w3i)Sk6O}(nB>)*f? z;f4PYLyg)Y1x4H}hsiz|wX=a->;yV;Y4u-Ro&@RfryvD?THX{ZB8xIVCcd0(LolX? zy#piqO8ux)xQtuKHe9Wk)Y2)llTvpMkEua}d-I(??rt9^wc-Bu)d^i9ScP3Ucvzj7 zz$vF4g2yRXdka*8&ESyerfpmI)zD(h=eoO0#F(kw>0I?YpXQ%JrTG-uW&S$i_?8kEF2jHx1SGl$we;<%2s?X$13+CohdgTASJCaumlCESU;I)lzI{M;~H8eGQ8 zf?4{*{UL`at|-1-wEHI9wX7mn6q9;CT6N-fTc)Pj!JQA^D~t4+VUlz9<=qj7Z;1hd z)9eFlvncIn0g5-lqGGte$TBKQkiKpgcXGH*yWUTHn1oufb$I#{;QocuNuaX3!`_-T zfo8tKRXRAxh|h=<*wN;uojFqDQX3Eo0e0<-=J*5OPtVZOt?b5;A*9=_Q(o&_KCKA-*tSCB@E0D@9{#TFFace zP-1s?lDk24R1E1m@pUKkC)0?|Fu{;)ePg7Uz{MHIDMAFhAte`#R(kvZe?gE<@}B>x z0{G$0J96?bE0B+tJ1R_0g8ks7izl4Tn9#SHIyz!Wm(bNrfo!gfcIdj~_P!))bTUGm zXnGwB(xv~!J#uU5)e=0auDXf*ie-X^B!Kaz&CIj32_}iU`Fu>x-2 z&>p~ef4e-YReIWbMT}sR?ZrCBfC$ITAm1mpjLm^1HZR!5%xz2O@1~<3L4&MlI=^{y z+w4x;c3X+5L6*P?9(TJa+qb1H%tNdrO40F25q$3Ly}po!M}$83u=6HxbkLvP#8~XV z!ItlIKw$f>NS5&RRD$nsK)0LJ1d)mrSKiGx11;xoEZHEAjj{Z6tb%W~KDgCm81zdJ zMDqKNq2h%y4@6+wE`?byje``mD&?z_cty^)US~l2gh7g-0wb;=x8e{? zvLo((nADh>`YQx57%cW&wQF3&SLn;NZxvoH;{d}C60m=1QW$pItytJ?1fIf!s_>qg z3V0(UuqJ?9?dak}uZU0;uFw4aL%KhK7-g}Uit=?H9wX2A3`Z_2oo2@V<{^;Jvj)do zdKG={KYO&X)uZGV{F+&YSdzM~uEse9pLrtBFY`L|uffK+)gd9wB3(llXc)BqNj-&Z&47>(5k-KNEVos>~ zWy>`Te$dddUdF=&D~j3Rj+IX&oL3RDqvHYGr9*OgC&STpj3sPl8C(F2 zVM02y%{y=&een`_j?~0iq5@+Y{gK9eCTX`<1>?Zhs`9lyuro|`1 zdByTrc(yGiAwB2uC=C4ai~h0X{28mweYT(S-CWR8mMp&SM^i4MtA4~_DzFyLULuW@ zFujCIxQ)$ErM~_0uO%4h#UxjTW>E#bTKg4;Duv<5Qj7HL$Xv*IL_H$8@-%ow&-~U5 zHZpH_#weuujI&*h5lz)`@tadFceys!MAgFtkd04K#umCnY&h0Q?Yo`5YR1`@3+qJf z54)NgFU*)w%A`;3G-@fWxbX z0p7wc;0V`>{t$bTR>ruYgBesC{2woT621tmND^vVPg*uqykN6GSRT`qn(!^-%_tV=TI4}8ULibOn*02NDLh(xDjumkf0T!3*AKV^f9ZdPiD8dK*R zhglnB-M{V&9DE_;e;a^#9b9F-LH`?GMn=up=nzAP?N%cz%RHK9T zw}Xmt*YWdS)vwNy67+OIYfyhbGdPmFUj>Z03=IFi`%4;|G;dIL(=vB@XKMV-octAxtiJ$nTaVflg7xri8%(102~Gl*@UQ4dHxDTP z&Q@SQJF5|)XGzTf>?~7V@i@nFv+lRhk3%F{3u_*RJtS5*5bPWsuT-tUS%M+6sA0`y zVa!D%)hA?s#HiYGeav%n{;}P#Um)U0?rYV;-&2{Ae|;ogPc44uS>m5ZVAI?SlVi6L z1tOvfOnz97!^DJn!@_#PM7zwfbGge?M{I{T#YZ;5#>l(w^10DN32neDSOYlDMD3Jx zA$L^~hp;#K@3zzBEizg<0P;Ih5)^1s<~%9fAR0%_st@&I)DYguId08?GcQ;qiWlp8 z)`s_u-MuYg#vq?qsHlH`T!-8WXjf10y$hzD_qHb^1ql#I)tw2a^UCUeQmIKP`!`ZZ zYj)Sk9w)N-@nw|84S5gHvr=IYK~PXTLQJ2yfizlp^ubO=GmzB&Ss3tfYPmSS@O6?P z5`w0ZwveQGSFUO*Du#5#Pz}%SLA-OZsd<-c<-iEfFHiq4io?*6M?}yx76sA6siVoR7C!>%${P%4Q*7BNtIxQZV56-^z&EdX2oU z4=EZRlZB=zj_x;`3t<(rL9*KAv7{7;K>#5skJ6v^je&HbTnd>AOW(OFiFi9WNL-|j z%j5NbX%974fh}m7%$_)i-@SHwd1Z#<)d4BpHS>?qK{80KlXih)25QzBhM+2nl?Eqn zzbju5a$4nzk`eiC6#8dTen?lw_*Im~ot}Drc*y>Ouec(*F+#$5! zSXl9R7L~%SI^LQZ4$f=|NG$RUymnah#&j=zrQ;lkR<``pHXmBr(UA@?c;p|w)ZbR8 zU+2iGnmh8)D#LN3Ez`|S3-%9meigRAsS+E>&y;|5+XOtz{JLnSf`cN3HlEF%B>uAl zuskKp1R`_?lh3BTy?)UHh!v_L0!kx%N?hdrLQy6Ku7$MGZhBsC`Sx1w*qP}d@@Hy# z`(un?#iJU_NM}XN_#PKk8U2S>tvx(ES*-d8oA)5jD_5@)EHzyGSxcr8M<9zv)7RI5 z$}vTh{&i}eKw4;4wLD*nDg_fStb<8(Y-=CljN7R^8!^l0Vb>s=h9Gq#r0nVEc%`%o1!+Oe!d+aezP^7(LiAe5D7Yl8c~;AA7>Ck zBahd3@H~?@<-=h#^uo;A1z1Xn=C;iju-FSV{yb+E<@3D`S%W8i2gC#?Au>u@>Tr ztCQKhSO%p2&$KK3`908O*Z28O=|ak~BC2wRXrs=PG3{h(gS1A5RHbW9I*9AloWwkM zVw6&^`dGyrNKzBxdGf`VVMaI-EI6fdv(zES^lNae_K9atlTnnd2}(*|6L8W56=C(< zI{9fx#0%i!InL~JLvC1&!{t^Sz0)Vu$;+SFs_sxQF$~A#>C6s9-(5K7 zYMtpL_dOk8yuYko-)UBI6_bZFC)1m6H~Ry_Jz3ZgeT-i8yAU##Ck0Rq4ZDU;eh${N zU{1R~fc~1~oZ?e|xKM3zQElJ({dOfwT9M9yulWr<^onKkC$RxLS4!29t63n_Uv?}w zh!+CoN~#tc+fCY@*I~dyJoRK~EBPeKOuRP$RCW{qPQ>!)Ud&FMBP%uv=O{-udzhO7 z2gff65{nC;3hMKfw1qh6^@QqSj<~9EXHV$C&shm}eX$n-Vs~-B7#}QYfX%#zdEi)w zGIP)6gv`|;o0h#aY(9XA7KMPeY>>yegG40`>Hnwemn*BQT>_Zx6aHg6;z>yU(&kGi z_s>Y;VA;4fS1V^bJuQ+I>`0 z7g{dDo$1d4l8*1f8~~n*owCf%rDLMLMUa*pfcDeStO+V}!*DPhPzYt9Y!mrq#;RChEI%yJ|M}Ux|`>F-hB~M^BH7n=I-l^5Smp zvx1Z{nEWP}UQJ9x1I}LYOc}vx=|+4K$rngcpfX!m^B@3&$OATo=LUj7MNg=UkbeQ~ z4msMvgJt~N6dG-@1d-!>4I-SAxFf7#U`;0gu}Qaf1E+wNtu))vuQA;ew00<+h~9@E z6T1gydf;wz7!|2-N-$ zBe|i7UQ*~yl!N7_Bp5X@n_0K<#I-aIlZ{>UAj}o73i}&U6?k&jxdag@OfJxG(fJa(A~E>5>0W;` zai$BWUl!wEePh6NL}ERvu;Rhly)ygA+KPT|%u^&-o|!>22hFoi;Y6 zGC6pz+Ycer;ysYvMJRy{`I8OssS$sq4E<5-4_jbkA zT4}wfws6_S_#BtQMxI(r3yizpb$$C@zu{*YW)|6k$TG(pfMI{15tlD2{lr2Ns}=2~ zDcp(t`W`_E=<2F)(Pg1mGaHg=#ED1Ce!T@))0BT}Y;OnHnx&o4#0KT;1?qhahnmsT`b$QyQt`?T{eC*v9Aoe=QT+|E6VP=lmbPVM>YkyO}gFc16}h z1v$aay>r5cJ>4NEWd0%wN-I9-@ffMNi)DlOa!+%Nw>SNIsg`GAC_0A-t$)N$yAF}= zx2Q4HRjK^q1?vg|(%<}7G{w)f_*hkQpbAbH2b!bU%*Y}Frg0gU{B;d%=(>TqKC?gI zQE@sdvEaYY?HX`GaiUdBpPl4wy6l1{l` zsL2Vss_H*3R@36Yo*A!F?=-!ep{N_A>5B5RLTLBZN5!he=$$LZzh9PgcAGI)pL(NB zuYyT6)#lch!Y5+pxGsDH_q@xxv%EBLzOX&jg$T&W9OMg|<>PiHeblAM2F|v2STNYg zrL4N}pL4w{Xy0Qjm7?BJkR1VlPn7*{&)lbiEwu0y6=O?efUvLGcQ+84Pyz&Mif%{L zgqp+7&}|S-~LODNd zR_XdTWcK$^!l9qjIfbncGszsq)mK-9P~E>3dAuh=cdxJO%oMa>^;Se_b|E!IM^c_* zZzG^`Ob8a;wg}+@fYU5&{`JlCyYOLD9b80&fWgFX(l{sm<8A!owWt>9#!2(jF{}*X z9@T`BM=-IubV+__v0NL`p>NDslayz)fFXwl4q0|aXHOlz})l24anTe%i)NluY>P`gVEdkJJQ@?Ej!t!syJSd}c9 z8uX0_KA~&13qCQBG+CoO`uS)byqK|x_!SPSSK!e4{g+}1nDXHna-Egkl4WmqXW*%N zw{8>Qf`aJaMO51cYS9jq`-8f?MWCwiZ*qv@mXwoSQF@v}If_B)!Y%5#(uwmRhYMJ0 z7n)|Q4Y@~xP8Q!;^x5>gXyrq5m(dIyTn#0g!|?7cDnerSTv^p8l! zcERcutlvvH*>b!d&`P(=)KpdMDpY#?uZ$B9k?6_zUK=I9f0ok15o?(|d==eRiKbE6 z<*`8bE;qCq1jua1b*ILn)(jEE3s8yS}+Xq>mP(V)i&^V zJCxo@j}ybkE*VSExss?XfTVHS>pS${%iQg=s=f@y>@- z(6~2T?{K#>P^KOEbb;)MwXR@l_%d-QDpyB94zAjx}qW>mg*Kr*|WhKHkcAZ*dbGY6B4g z#2qBSNBDwo47)`9uzBmwb}_E(3sEZC_;PlK8ZDj}RxW#RWINzyySk%IFUSi90YO(N ztnqD9V93pufLUoL@S>{Pm|V zcK?y_a=My{!D#)MUy%XokrpHZWoAb>_n%1{-xI`!9O`wAxfLi+Fe$N*IQ(KeS%PNs z(r7({Rv}AYQ&JW0)dbk;qeoM)cN2ukQUlF$jC0rU%O4H*xC@G+UlYR5$oExnlfxnv zT{ZXjMj9h_rFcS+ux{ta^mlQKWoA@r&uf23+>T`Wa=A7s$%oorgNwo8g<|DjiV?U2 z%aqLD<*SvB?6PlSs!(amv_wnU{-jc>c|L+@t(gX(Pu>GwruPt~PlVaKVn4a8{N8)? z9z>4VG(p*)MN+)G`|4IM^5xYY@?OT_PtS@a{VzmcnCn3mW`%ElV%E(gN@56$!aptM&<7`qD2> z4*vcFn{K9@W1tA{LBlsBNZ~0e1W*`8FZOR2S}|Vo%`e zyY;S%cZ;Qbdh;qU4p&Am6G5sp7y;{QH4q-_=%9V>Oy{z$bi7p66OTnNcBJS?dnP>& zJewf(7*_{f%ZBWJ?7oYw&CyNbdeqQ91bT8$Y2F+=n)__>GbH{>u~(qQY;>$xDTPh3 zkKOK|H772@#-K0(&~lmXLZrGGF6g9;}rf0a9-N`Njj#lY|VWJ`R%5aS8872&qR|5m)IOu@$&{F zNsXedkg8?&c2}9dmqEwJ9z5k}oO3s1Kdr-6->1#+O#}_la=B1RFYUFu{JBe4`aLO= zwGKDUr5)fd)dxTAqX_#vwm_VR%u6tTZBO#d|@I6*h>rP#)!*@EnU)o zLb_gT2%Ey$NvmCLMND^8U$#X#)mDxyFZ|r;$$69I?7^GoTGA3%Y8_K+8+1us&0aq& zZ5BvfY2s9(cSw!;`naF~L17&cKKm{j?<#U4plFUpv1PX{yPUsuHoOQa9h3#e)c0=7 zL62BUcx!R5`X27r9b#Mg*2UKh1HOd1YPQl?r6sQXsYT?z92YuL3HA!X8;xMim`2=} zA%i1wQ4tgD8At@oA*qUi{Q!ZxLv_v4=tXUo&Toe?5yO6iIpxF5Ul8AXK9nUCP_(_| z_6%ObBf`Far2P9bUr!XuT??s1X2TUQwK3On=%D?Vd~GFX_if*v-Jt131#N9tAvYPR zWKGVQ=1&sDti7OK*`X#eDWo#jj7cCpp&52cp{g?xe34xGG1F8;eP7b*UqfRThc9fA z$fviv`k`T~k4;9`NoYWLSOnq*VLhPKUS#-)ee*}G{g;+RGiROdxO8$hV+UhvGa(QU zus%~ho%slmfl13i;S8+R`pAP%x3mxDil^Qd_5-uPrh!K7F2#?C<}h9} z(84Mm?esgP|B2{fNsU>Je^>)QRQCrG2#?1onvZW;*5wybvTYz*kdFgcmyK-aG*;>c zOJ|d#kPBs?VdS#Id965**ujpTfmL2RKgpz z{fNZXUh(nux+lr$wy5#*;1{zYCRe=dvOiut?x+>6y&cjatq^jp#R zMPDFO&}!2_MmPB2lT8Lnj#OgtE@uZ2|8jg2T+<@4qi^~04NxKZQrRlUD{8tAR!vds zq3T=#-F-?wRvBfhnZZhr!m^_8%y;eB^v5}BI6XQWhgk7HJ5oGLmdG3#|6GgJU~E1q z(W#jd%?i@W4N5`W2nM7jwOZ4MDb|9x57PEo#IfCc(J(kpLAOmO$xtXO8ggJFhlQ8?IM;6d`X0w7y{pT`cP+6M>pJ+2GnJEU z6$SAH)2P;hq6m4+;6=$N-s^8CfXLQBEo@9mf2`TR6_>y+H(8=Zzw7FRnISR40$i|HNp=dl1!_3ocLD0e`IiQxz%yU0;Ia*SO)X)HSb@dk+RD8NDy zZ)S7r#frq`e9xWHALB~5`hGE4ewv1sW#EzV=xBd}R-xaO06QKqp_C#~FdyF}^-uUg z2*757DOy#Xw-HQ+E-ot$0XDDM{8J>{wghji95>=5e8#x}b6SOJ~#$~PHK&U3cmk_}J@ za6lRufHPI3r||C1XYJc8i`CU!;Za&UdJov1hV$h4z5@Quw?$$=P;b@AXi{PZ#?oY6 z%laBxIG&aCMa&MFsul0yzVUudHOWJGZJ0beKUd5?c#vUMhucZ{7?lDArmX$BkMe011#dRP zeyt2KO)41`L?mFjfO*$sZ(Do>i6d3L2NN~QJIir|GtwW%P-X8_WzqzR2}sYfBY+Z( z!}!VStr9Vz;(k&TVO&6!bwo+2fhEON2aZ-%x$oo&e1na^j7dQS>m+7AP32P%#N_7^vKdKoYw> zp1NEVB8c*^4rAmDI-fFPm4zM|fAAX-;$AQd7d+s(?U%>=;v_Zp zpX*SrFG#BzHiJsdAMM-jJ^*IByg82)l7RZWfhmGcvCJB*JfXD=c9QODDnq+b#sZjK zYI1|sHoAXu7D<<5+va_vG*><3CTQlPwv7;-l1eDYSiTst)T3_s6;0)u)@imkV}#-J zhaALxrTIREo{d$dPcO*@lQw7OE%C`aU?uCU`UQkiwRQsFG94kbTs?^!Du|kf0Jz0l znn`fg(AE0@6$x7;);Ueg-`iSPc+Hya@!1 zE%qTT>>cl`_D^2K$vgx;4xVX>h=xu$_kpI94}-kfi9_Y|5C96u>EVT;D@G^=l2(zci@^w0iS}=jh-0l7i9?_T<6;sZ!dkB z)&k1`!#we-GGf(qZXL6caK0Hq!X{lBpbVD&YGC-E7%)}BIVIfJ1FELjdU(UQLqB4% z;REHmlj5F+N)P{rc5Kmm@!!9^Wp=QZEi-bo1QJe-LLBluJJ~P|bFSo=qZIw=K;qtx zUj^eqcQqBd;mNISMatP#oX)AC&k3;f&vK(MP@sT+|c zoLgh_HM)E(lgXj}*zXOkI`Co_E@{igh!@y^(zG7w48SL-%IlJ&;UG;Uk0sgZQ7|D&L*!^A;Ck^@SBssZxBD}^ z_>HqJwKvzmcbN}rCb#Jpji*75d;}7rBxxQ$kd3-)+v zR};(q#n5eZqQa%Y{*aq4c{xJIGeNdiivXZeZA<)Rmg>C_aN(TDFsmQy79e}bo{t+gTBf`A~

  • (m7i1PlSa5)hca{=hemY4CEmmBbB7xZ(2OH+v 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%0A41>nJyLq8rNaD7qal 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 z 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\dw9A9vB!t3VO?`y$ehjVg$FV4rZ^mj0jC*J&0x; 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