diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
index 5d110552a..8963ad495 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
@@ -470,7 +470,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
///
/// The source working space
/// The
- private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
+ private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpaceBase workingSpace)
{
if (this.linearRgbToCieXyzConverter?.SourceWorkingSpace.Equals(workingSpace) == true)
{
diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
index bcbd64c77..fe6a57f7a 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
@@ -18,7 +18,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
private readonly CieXyz targetLuvWhitePoint;
private readonly CieXyz targetLabWhitePoint;
private readonly CieXyz targetHunterLabWhitePoint;
- private readonly RgbWorkingSpace targetRgbWorkingSpace;
+ private readonly RgbWorkingSpaceBase targetRgbWorkingSpace;
private readonly IChromaticAdaptation chromaticAdaptation;
private readonly bool performChromaticAdaptation;
private readonly CieXyzAndLmsConverter cieXyzAndLmsConverter;
diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs
index 65fe79994..fcd031e26 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverterOptions.cs
@@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// Gets or sets the target working space used *when creating* RGB colors. (RGB colors on the input already contain the working space information)
/// Defaults to: .
///
- public RgbWorkingSpace TargetRgbWorkingSpace { get; set; } = Rgb.DefaultWorkingSpace;
+ public RgbWorkingSpaceBase TargetRgbWorkingSpace { get; set; } = Rgb.DefaultWorkingSpace;
///
/// Gets or sets the chromatic adaptation method used. When null, no adaptation will be performed.
diff --git a/src/ImageSharp/ColorSpaces/Conversion/ICompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/ICompanding.cs
deleted file mode 100644
index 55a7569ff..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/ICompanding.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Pair of companding functions for .
- /// Used for conversion to and backwards.
- /// See also:
- ///
- public interface ICompanding
- {
- ///
- /// Expands a companded channel to its linear equivalent with respect to the energy.
- ///
- ///
- /// For more info see:
- ///
- ///
- /// The channel value
- /// The linear channel value
- float Expand(float channel);
-
- ///
- /// Compresses an uncompanded channel (linear) to its nonlinear equivalent (depends on the RGB color system).
- ///
- ///
- /// For more info see:
- ///
- ///
- /// The channel value
- /// The nonlinear channel value
- float Compress(float channel);
- }
-}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CIeLchToCieLabConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CIeLchToCieLabConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CIeLchToCieLabConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CIeLchToCieLabConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLabToCieLchConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieLchConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLabToCieLchConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieLchConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLabToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLabToCieXyzConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLabToCieXyzConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLchuvToCieLuvConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLchuvToCieLuvConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLchuvToCieLuvConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLchuvToCieLuvConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLuvToCieLchuvConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieLchuvConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLuvToCieLchuvConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieLchuvConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLuvToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieLuvToCieXyzConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieLuvToCieXyzConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndCieXyyConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndCieXyyConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndCieXyyConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndCieXyyConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndHunterLabConverterBase.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndHunterLabConverterBase.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndHunterLabConverterBase.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndHunterLabConverterBase.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndLmsConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndLmsConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzAndLmsConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndLmsConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToCieLabConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToCieLabConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToCieLabConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToCieLabConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToCieLuvConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToCieLuvConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToCieLuvConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToCieLuvConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToHunterLabConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToHunterLabConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToHunterLabConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToHunterLabConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToLinearRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToLinearRgbConverter.cs
similarity index 92%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToLinearRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToLinearRgbConverter.cs
index 9ccea497b..3812cdbdd 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CieXyzToLinearRgbConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToLinearRgbConverter.cs
@@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Initializes a new instance of the class.
///
/// The target working space.
- public CieXyzToLinearRgbConverter(RgbWorkingSpace workingSpace)
+ public CieXyzToLinearRgbConverter(RgbWorkingSpaceBase workingSpace)
{
this.TargetWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@@ -34,7 +34,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// Gets the target working space
///
- public RgbWorkingSpace TargetWorkingSpace { get; }
+ public RgbWorkingSpaceBase TargetWorkingSpace { get; }
///
/// Performs the conversion from the input to an instance of type.
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/CmykAndRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CmykAndRgbConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/CmykAndRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CmykAndRgbConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/HslAndRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HslAndRgbConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/HslAndRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HslAndRgbConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/HsvAndRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HsvAndRgbConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/HsvAndRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HsvAndRgbConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/HunterLabToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/HunterLabToCieXyzConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/HunterLabToCieXyzConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbAndCieXyzConverterBase.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbAndCieXyzConverterBase.cs
similarity index 99%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbAndCieXyzConverterBase.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbAndCieXyzConverterBase.cs
index bdf451cd3..a93773262 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbAndCieXyzConverterBase.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbAndCieXyzConverterBase.cs
@@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// The Rgb working space.
/// The based on the chromaticity and working space.
- public static Matrix4x4 GetRgbToCieXyzMatrix(RgbWorkingSpace workingSpace)
+ public static Matrix4x4 GetRgbToCieXyzMatrix(RgbWorkingSpaceBase workingSpace)
{
DebugGuard.NotNull(workingSpace, nameof(workingSpace));
RgbPrimariesChromaticityCoordinates chromaticity = workingSpace.ChromaticityCoordinates;
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToCieXyzConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToCieXyzConverter.cs
similarity index 93%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToCieXyzConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToCieXyzConverter.cs
index 21a96071a..1030ac981 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToCieXyzConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToCieXyzConverter.cs
@@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Initializes a new instance of the class.
///
/// The target working space.
- public LinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
+ public LinearRgbToCieXyzConverter(RgbWorkingSpaceBase workingSpace)
{
this.SourceWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@@ -34,7 +34,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// Gets the source working space
///
- public RgbWorkingSpace SourceWorkingSpace { get; }
+ public RgbWorkingSpaceBase SourceWorkingSpace { get; }
///
/// Performs the conversion from the input to an instance of type.
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToRgbConverter.cs
similarity index 80%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToRgbConverter.cs
index ad3ed88ef..1cc055bee 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LinearRgbToRgbConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToRgbConverter.cs
@@ -19,9 +19,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
public Rgb Convert(in LinearRgb input)
{
var vector = input.ToVector3();
- vector.X = input.WorkingSpace.Companding.Compress(vector.X);
- vector.Y = input.WorkingSpace.Companding.Compress(vector.Y);
- vector.Z = input.WorkingSpace.Companding.Compress(vector.Z);
+ vector.X = input.WorkingSpace.Compress(vector.X);
+ vector.Y = input.WorkingSpace.Compress(vector.Y);
+ vector.Z = input.WorkingSpace.Compress(vector.Z);
return new Rgb(vector, input.WorkingSpace);
}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbToLinearRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/RgbToLinearRgbConverter.cs
similarity index 80%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbToLinearRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/RgbToLinearRgbConverter.cs
index 20e2d240a..03912a421 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbToLinearRgbConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/RgbToLinearRgbConverter.cs
@@ -19,9 +19,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
public LinearRgb Convert(in Rgb input)
{
var vector = input.ToVector3();
- vector.X = input.WorkingSpace.Companding.Expand(vector.X);
- vector.Y = input.WorkingSpace.Companding.Expand(vector.Y);
- vector.Z = input.WorkingSpace.Companding.Expand(vector.Z);
+ vector.X = input.WorkingSpace.Expand(vector.X);
+ vector.Y = input.WorkingSpace.Expand(vector.Y);
+ vector.Z = input.WorkingSpace.Expand(vector.Z);
return new LinearRgb(vector, input.WorkingSpace);
}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/YCbCrAndRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/YCbCrAndRgbConverter.cs
similarity index 100%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/YCbCrAndRgbConverter.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/YCbCrAndRgbConverter.cs
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs
deleted file mode 100644
index 92751e420..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Implements gamma companding
- ///
- ///
- ///
- ///
- ///
- public sealed class GammaCompanding : ICompanding
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The gamma value.
- public GammaCompanding(float gamma) => this.Gamma = gamma;
-
- ///
- /// Gets the gamma value
- ///
- public float Gamma { get; }
-
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Expand(float channel) => MathF.Pow(channel, this.Gamma);
-
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Compress(float channel) => MathF.Pow(channel, 1 / this.Gamma);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs
deleted file mode 100644
index 085230fbd..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Implements L* companding
- ///
- ///
- /// For more info see:
- ///
- ///
- ///
- public sealed class LCompanding : ICompanding
- {
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Expand(float channel)
- => channel <= 0.08 ? 100 * channel / CieConstants.Kappa : ImageMaths.Pow3((channel + 0.16F) / 1.16F);
-
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Compress(float channel)
- {
- return channel <= CieConstants.Epsilon
- ? channel * CieConstants.Kappa / 100F
- : MathF.Pow(1.16F * channel, 0.3333333F) - 0.16F;
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs
index 14c4d6d77..68b4d95fc 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/RGBPrimariesChromaticityCoordinates.cs
@@ -7,7 +7,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{
///
/// Represents the chromaticity coordinates of RGB primaries.
- /// One of the specifiers of .
+ /// One of the specifiers of .
///
public readonly struct RgbPrimariesChromaticityCoordinates : IEquatable
{
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs
deleted file mode 100644
index 77f51e495..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Implements the Rec. 709 companding function
- ///
- ///
- /// http://en.wikipedia.org/wiki/Rec._709
- ///
- public sealed class Rec709Companding : ICompanding
- {
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Expand(float channel)
- => channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, 2.222222F);
-
- ///
- [MethodImpl(InliningOptions.ShortMethod)]
- public float Compress(float channel)
- => channel < 0.018F ? 4500F * channel : (1.099F * channel) - 0.099F;
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbWorkingSpace.cs
deleted file mode 100644
index 7e1135b2e..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/RgbWorkingSpace.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Trivial implementation of
- ///
- public class RgbWorkingSpace : IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The function pair for converting to and back.
- /// The chromaticity of the rgb primaries.
- public RgbWorkingSpace(CieXyz referenceWhite, ICompanding companding, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.Companding = companding;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- /// Gets the reference white point
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- /// Gets the function pair for converting to and back.
- ///
- public ICompanding Companding { get; }
-
- ///
- /// Gets the chromaticity of the rgb primaries.
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- /// Compares two objects for equality.
- ///
- /// The on the left side of the operand.
- /// The on the right side of the operand.
- ///
- /// True if the current left is equal to the parameter; otherwise, false.
- ///
- public static bool operator ==(RgbWorkingSpace left, RgbWorkingSpace right)
- {
- return Equals(left, right);
- }
-
- ///
- /// Compares two objects for inequality
- ///
- /// The on the left side of the operand.
- /// The on the right side of the operand.
- ///
- /// True if the current left is unequal to the parameter; otherwise, false.
- ///
- public static bool operator !=(RgbWorkingSpace left, RgbWorkingSpace right)
- {
- return !Equals(left, right);
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbWorkingSpace other && this.Equals(other);
- }
-
- ///
- public bool Equals(RgbWorkingSpace other)
- {
- // Object.Equals for ICompanding compares the reference only.
- return this.WhitePoint.Equals(other.WhitePoint)
- && this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates)
- && Equals(this.Companding, other.Companding);
- }
-
- ///
- public override int GetHashCode()
- {
- int hash = this.WhitePoint.GetHashCode();
- hash = HashHelpers.Combine(hash, this.ChromaticityCoordinates.GetHashCode());
- return HashHelpers.Combine(hash, this.Companding?.GetHashCode() ?? 0);
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs
deleted file mode 100644
index 98938e656..000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
-{
- ///
- /// Implements sRGB companding
- ///
- ///
- /// For more info see:
- ///
- ///
- ///
- public sealed class SRgbCompanding : ICompanding
- {
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Expand(float channel)
- {
- return channel <= 0.04045F ? channel / 12.92F : MathF.Pow((channel + 0.055F) / 1.055F, 2.4F);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Compress(float channel)
- {
- return channel <= 0.0031308F ? 12.92F * channel : (1.055F * MathF.Pow(channel, 0.416666666666667F)) - 0.055F;
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaCompanding.cs
new file mode 100644
index 000000000..d9babc7ef
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaCompanding.cs
@@ -0,0 +1,36 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Implements gamma companding
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static class GammaCompanding
+ {
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ /// The channel value.
+ /// The gamma value.
+ /// The representing the linear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Expand(float channel, float gamma) => MathF.Pow(channel, gamma);
+
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
+ ///
+ /// The channel value.
+ /// The gamma value.
+ /// The representing the nonlinear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Compress(float channel, float gamma) => MathF.Pow(channel, 1 / gamma);
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaWorkingSpace.cs
new file mode 100644
index 000000000..6d8b25e9d
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaWorkingSpace.cs
@@ -0,0 +1,65 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// The gamma working space.
+ ///
+ public class GammaWorkingSpace : RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The gamma value.
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ public GammaWorkingSpace(float gamma, CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ : base(referenceWhite, chromaticityCoordinates) => this.Gamma = gamma;
+
+ ///
+ /// Gets the gamma value.
+ ///
+ public float Gamma { get; }
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Compress(float channel) => GammaCompanding.Compress(channel, this.Gamma);
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Expand(float channel) => GammaCompanding.Expand(channel, this.Gamma);
+
+ ///
+ public override bool Equals(object obj)
+ {
+ if (obj is null)
+ {
+ return false;
+ }
+
+ if (ReferenceEquals(this, obj))
+ {
+ return true;
+ }
+
+ if (obj is GammaWorkingSpace other)
+ {
+ return this.Gamma.Equals(other.Gamma)
+ && this.WhitePoint.Equals(other.WhitePoint)
+ && this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
+ }
+
+ return false;
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ int hash = base.GetHashCode();
+ return HashHelpers.Combine(hash, this.Gamma.GetHashCode());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LCompanding.cs
new file mode 100644
index 000000000..ebe7ebe93
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LCompanding.cs
@@ -0,0 +1,37 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Implements L* companding
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ ///
+ public static class LCompanding
+ {
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ /// The channel value.
+ /// The representing the linear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Expand(float channel)
+ => channel <= 0.08 ? 100 * channel / CieConstants.Kappa : ImageMaths.Pow3((channel + 0.16F) / 1.16F);
+
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
+ ///
+ /// The channel value
+ /// The representing the nonlinear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Compress(float channel)
+ => channel <= CieConstants.Epsilon ? channel * CieConstants.Kappa / 100F : MathF.Pow(1.16F * channel, 0.3333333F) - 0.16F;
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LWorkingSpace.cs
new file mode 100644
index 000000000..cbc4be596
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/LWorkingSpace.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// L* working space.
+ ///
+ public sealed class LWorkingSpace : RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ public LWorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ : base(referenceWhite, chromaticityCoordinates)
+ {
+ }
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Compress(float channel) => LCompanding.Compress(channel);
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Expand(float channel) => LCompanding.Expand(channel);
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020Companding.cs
similarity index 52%
rename from src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs
rename to src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020Companding.cs
index d541c3d97..ba77e78f0 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020Companding.cs
@@ -13,16 +13,24 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// For 10-bits, companding is identical to
///
- public sealed class Rec2020Companding : ICompanding
+ public static class Rec2020Companding
{
- ///
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ /// The channel value.
+ /// The representing the linear channel value.
[MethodImpl(InliningOptions.ShortMethod)]
- public float Expand(float channel)
+ public static float Expand(float channel)
=> channel < 0.08145F ? channel / 4.5F : MathF.Pow((channel + 0.0993F) / 1.0993F, 2.222222F);
- ///
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
+ ///
+ /// The channel value.
+ /// The representing the nonlinear channel value.
[MethodImpl(InliningOptions.ShortMethod)]
- public float Compress(float channel)
+ public static float Compress(float channel)
=> channel < 0.0181F ? 4500F * channel : (1.0993F * channel) - 0.0993F;
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020WorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020WorkingSpace.cs
new file mode 100644
index 000000000..11f1f8401
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec2020WorkingSpace.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Rec. 2020 (ITU-R Recommendation BT.2020F) working space.
+ ///
+ public sealed class Rec2020WorkingSpace : RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ public Rec2020WorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ : base(referenceWhite, chromaticityCoordinates)
+ {
+ }
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Compress(float channel) => Rec2020Companding.Compress(channel);
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Expand(float channel) => Rec2020Companding.Expand(channel);
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709Companding.cs
new file mode 100644
index 000000000..e281339a6
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709Companding.cs
@@ -0,0 +1,35 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Implements the Rec. 709 companding function.
+ ///
+ ///
+ /// http://en.wikipedia.org/wiki/Rec._709
+ ///
+ public static class Rec709Companding
+ {
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ /// The channel value.
+ /// The representing the linear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Expand(float channel)
+ => channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, 2.222222F);
+
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
+ ///
+ /// The channel value.
+ /// The representing the nonlinear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Compress(float channel)
+ => channel < 0.018F ? 4500F * channel : (1.099F * channel) - 0.099F;
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709WorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709WorkingSpace.cs
new file mode 100644
index 000000000..090efcd79
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/Rec709WorkingSpace.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Rec. 709 (ITU-R Recommendation BT.709) working space.
+ ///
+ public sealed class Rec709WorkingSpace : RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ public Rec709WorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ : base(referenceWhite, chromaticityCoordinates)
+ {
+ }
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Compress(float channel) => Rec709Companding.Compress(channel);
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Expand(float channel) => Rec709Companding.Expand(channel);
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpaceBase.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpaceBase.cs
new file mode 100644
index 000000000..5a89321c8
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpaceBase.cs
@@ -0,0 +1,83 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Base class for all implementations of .
+ ///
+ public abstract class RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ protected RgbWorkingSpaceBase(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ {
+ this.WhitePoint = referenceWhite;
+ this.ChromaticityCoordinates = chromaticityCoordinates;
+ }
+
+ ///
+ /// Gets the reference white point
+ ///
+ public CieXyz WhitePoint { get; }
+
+ ///
+ /// Gets the chromaticity of the rgb primaries.
+ ///
+ public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
+
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ /// The channel value.
+ /// The representing the linear channel value.
+ public abstract float Expand(float channel);
+
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent (depends on the RGB color system).
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ /// The channel value.
+ /// The representing the nonlinear channel value.
+ public abstract float Compress(float channel);
+
+ ///
+ public override bool Equals(object obj)
+ {
+ if (obj is null)
+ {
+ return false;
+ }
+
+ if (ReferenceEquals(this, obj))
+ {
+ return true;
+ }
+
+ if (obj is RgbWorkingSpaceBase other)
+ {
+ return this.WhitePoint.Equals(other.WhitePoint)
+ && this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
+ }
+
+ return false;
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ int hash = this.WhitePoint.GetHashCode();
+ return HashHelpers.Combine(hash, this.ChromaticityCoordinates.GetHashCode());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbCompanding.cs
new file mode 100644
index 000000000..61b3b1cf1
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbCompanding.cs
@@ -0,0 +1,35 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// Implements sRGB companding
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ ///
+ public static class SRgbCompanding
+ {
+ ///
+ /// Expands a companded channel to its linear equivalent with respect to the energy.
+ ///
+ /// The channel value
+ /// The representing the linear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Expand(float channel) => channel <= 0.04045F ? channel / 12.92F : MathF.Pow((channel + 0.055F) / 1.055F, 2.4F);
+
+ ///
+ /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
+ ///
+ /// The channel value
+ /// The representing the nonlinear channel value.
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static float Compress(float channel) => channel <= 0.0031308F ? 12.92F * channel : (1.055F * MathF.Pow(channel, 0.416666666666667F)) - 0.055F;
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbWorkingSpace.cs
new file mode 100644
index 000000000..369f91c76
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/SRgbWorkingSpace.cs
@@ -0,0 +1,31 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
+{
+ ///
+ /// The sRgb working space.
+ ///
+ public sealed class SRgbWorkingSpace : RgbWorkingSpaceBase
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The reference white point.
+ /// The chromaticity of the rgb primaries.
+ public SRgbWorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
+ : base(referenceWhite, chromaticityCoordinates)
+ {
+ }
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Compress(float channel) => SRgbCompanding.Compress(channel);
+
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public override float Expand(float channel) => SRgbCompanding.Expand(channel);
+ }
+}
diff --git a/src/ImageSharp/ColorSpaces/LinearRgb.cs b/src/ImageSharp/ColorSpaces/LinearRgb.cs
index 9ecef0a31..09a2d83cb 100644
--- a/src/ImageSharp/ColorSpaces/LinearRgb.cs
+++ b/src/ImageSharp/ColorSpaces/LinearRgb.cs
@@ -9,7 +9,7 @@ using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation;
namespace SixLabors.ImageSharp.ColorSpaces
{
///
- /// Represents an linear Rgb color with specified working space
+ /// Represents an linear Rgb color with specified working space
///
public readonly struct LinearRgb : IEquatable
{
@@ -19,7 +19,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
///
/// The default LinearRgb working space.
///
- public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
+ public static readonly RgbWorkingSpaceBase DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
///
/// Gets the red component.
@@ -42,7 +42,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
///
/// Gets the LinearRgb color space
///
- public readonly RgbWorkingSpace WorkingSpace;
+ public readonly RgbWorkingSpaceBase WorkingSpace;
///
/// Initializes a new instance of the struct.
@@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// The blue component ranging between 0 and 1.
/// The rgb working space.
[MethodImpl(InliningOptions.ShortMethod)]
- public LinearRgb(float r, float g, float b, RgbWorkingSpace workingSpace)
+ public LinearRgb(float r, float g, float b, RgbWorkingSpaceBase workingSpace)
: this(new Vector3(r, g, b), workingSpace)
{
}
@@ -85,7 +85,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// The vector representing the r, g, b components.
/// The LinearRgb working space.
[MethodImpl(InliningOptions.ShortMethod)]
- public LinearRgb(Vector3 vector, RgbWorkingSpace workingSpace)
+ public LinearRgb(Vector3 vector, RgbWorkingSpaceBase workingSpace)
{
// Clamp to 0-1 range.
vector = Vector3.Clamp(vector, Min, Max);
diff --git a/src/ImageSharp/ColorSpaces/Rgb.cs b/src/ImageSharp/ColorSpaces/Rgb.cs
index 5a0293699..070083051 100644
--- a/src/ImageSharp/ColorSpaces/Rgb.cs
+++ b/src/ImageSharp/ColorSpaces/Rgb.cs
@@ -10,7 +10,7 @@ using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.ColorSpaces
{
///
- /// Represents an RGB color with specified working space.
+ /// Represents an RGB color with specified working space.
///
public readonly struct Rgb : IEquatable
{
@@ -20,7 +20,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
///
/// The default rgb working space
///
- public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
+ public static readonly RgbWorkingSpaceBase DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
///
/// Gets the red component.
@@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
///
/// Gets the Rgb color space
///
- public readonly RgbWorkingSpace WorkingSpace;
+ public readonly RgbWorkingSpaceBase WorkingSpace;
///
/// Initializes a new instance of the struct.
@@ -65,7 +65,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// The blue component ranging between 0 and 1.
/// The rgb working space.
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgb(float r, float g, float b, RgbWorkingSpace workingSpace)
+ public Rgb(float r, float g, float b, RgbWorkingSpaceBase workingSpace)
: this(new Vector3(r, g, b), workingSpace)
{
}
@@ -86,7 +86,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// The vector representing the r, g, b components.
/// The rgb working space.
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgb(Vector3 vector, RgbWorkingSpace workingSpace)
+ public Rgb(Vector3 vector, RgbWorkingSpaceBase workingSpace)
{
vector = Vector3.Clamp(vector, Min, Max);
this.R = vector.X;
diff --git a/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs b/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
index 62bf7d629..11884ca81 100644
--- a/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
+++ b/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
@@ -19,97 +19,97 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// Uses proper companding function, according to:
///
///
- public static readonly RgbWorkingSpace SRgb = new RgbWorkingSpace(Illuminants.D65, new SRgbCompanding(), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.3000F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly RgbWorkingSpaceBase SRgb = new SRgbWorkingSpace(Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.3000F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
///
/// Simplified sRgb working space (uses gamma companding instead of ).
/// See also .
///
- public static readonly RgbWorkingSpace SRgbSimplified = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.3000F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly RgbWorkingSpaceBase SRgbSimplified = new GammaWorkingSpace(2.2F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.3000F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
///
/// Rec. 709 (ITU-R Recommendation BT.709) working space.
///
- public static readonly RgbWorkingSpace Rec709 = new RgbWorkingSpace(Illuminants.D65, new Rec709Companding(), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.64F, 0.33F), new CieXyChromaticityCoordinates(0.30F, 0.60F), new CieXyChromaticityCoordinates(0.15F, 0.06F)));
+ public static readonly RgbWorkingSpaceBase Rec709 = new Rec709WorkingSpace(Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.64F, 0.33F), new CieXyChromaticityCoordinates(0.30F, 0.60F), new CieXyChromaticityCoordinates(0.15F, 0.06F)));
///
/// Rec. 2020 (ITU-R Recommendation BT.2020F) working space.
///
- public static readonly RgbWorkingSpace Rec2020 = new RgbWorkingSpace(Illuminants.D65, new Rec2020Companding(), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.708F, 0.292F), new CieXyChromaticityCoordinates(0.170F, 0.797F), new CieXyChromaticityCoordinates(0.131F, 0.046F)));
+ public static readonly RgbWorkingSpaceBase Rec2020 = new Rec2020WorkingSpace(Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.708F, 0.292F), new CieXyChromaticityCoordinates(0.170F, 0.797F), new CieXyChromaticityCoordinates(0.131F, 0.046F)));
///
/// ECI Rgb v2 working space.
///
- public static readonly RgbWorkingSpace ECIRgbv2 = new RgbWorkingSpace(Illuminants.D50, new LCompanding(), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6700F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1400F, 0.0800F)));
+ public static readonly RgbWorkingSpaceBase ECIRgbv2 = new LWorkingSpace(Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6700F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1400F, 0.0800F)));
///
/// Adobe Rgb (1998) working space.
///
- public static readonly RgbWorkingSpace AdobeRgb1998 = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly RgbWorkingSpaceBase AdobeRgb1998 = new GammaWorkingSpace(2.2F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
///
/// Apple sRgb working space.
///
- public static readonly RgbWorkingSpace ApplesRgb = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(1.8F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6250F, 0.3400F), new CieXyChromaticityCoordinates(0.2800F, 0.5950F), new CieXyChromaticityCoordinates(0.1550F, 0.0700F)));
+ public static readonly RgbWorkingSpaceBase ApplesRgb = new GammaWorkingSpace(1.8F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6250F, 0.3400F), new CieXyChromaticityCoordinates(0.2800F, 0.5950F), new CieXyChromaticityCoordinates(0.1550F, 0.0700F)));
///
/// Best Rgb working space.
///
- public static readonly RgbWorkingSpace BestRgb = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7347F, 0.2653F), new CieXyChromaticityCoordinates(0.2150F, 0.7750F), new CieXyChromaticityCoordinates(0.1300F, 0.0350F)));
+ public static readonly RgbWorkingSpaceBase BestRgb = new GammaWorkingSpace(2.2F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7347F, 0.2653F), new CieXyChromaticityCoordinates(0.2150F, 0.7750F), new CieXyChromaticityCoordinates(0.1300F, 0.0350F)));
///
/// Beta Rgb working space.
///
- public static readonly RgbWorkingSpace BetaRgb = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6888F, 0.3112F), new CieXyChromaticityCoordinates(0.1986F, 0.7551F), new CieXyChromaticityCoordinates(0.1265F, 0.0352F)));
+ public static readonly RgbWorkingSpaceBase BetaRgb = new GammaWorkingSpace(2.2F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6888F, 0.3112F), new CieXyChromaticityCoordinates(0.1986F, 0.7551F), new CieXyChromaticityCoordinates(0.1265F, 0.0352F)));
///
/// Bruce Rgb working space.
///
- public static readonly RgbWorkingSpace BruceRgb = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2800F, 0.6500F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly RgbWorkingSpaceBase BruceRgb = new GammaWorkingSpace(2.2F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2800F, 0.6500F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
///
/// CIE Rgb working space.
///
- public static readonly RgbWorkingSpace CIERgb = new RgbWorkingSpace(Illuminants.E, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7350F, 0.2650F), new CieXyChromaticityCoordinates(0.2740F, 0.7170F), new CieXyChromaticityCoordinates(0.1670F, 0.0090F)));
+ public static readonly RgbWorkingSpaceBase CIERgb = new GammaWorkingSpace(2.2F, Illuminants.E, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7350F, 0.2650F), new CieXyChromaticityCoordinates(0.2740F, 0.7170F), new CieXyChromaticityCoordinates(0.1670F, 0.0090F)));
///
/// ColorMatch Rgb working space.
///
- public static readonly RgbWorkingSpace ColorMatchRgb = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(1.8F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6300F, 0.3400F), new CieXyChromaticityCoordinates(0.2950F, 0.6050F), new CieXyChromaticityCoordinates(0.1500F, 0.0750F)));
+ public static readonly RgbWorkingSpaceBase ColorMatchRgb = new GammaWorkingSpace(1.8F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6300F, 0.3400F), new CieXyChromaticityCoordinates(0.2950F, 0.6050F), new CieXyChromaticityCoordinates(0.1500F, 0.0750F)));
///
/// Don Rgb 4 working space.
///
- public static readonly RgbWorkingSpace DonRgb4 = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6960F, 0.3000F), new CieXyChromaticityCoordinates(0.2150F, 0.7650F), new CieXyChromaticityCoordinates(0.1300F, 0.0350F)));
+ public static readonly RgbWorkingSpaceBase DonRgb4 = new GammaWorkingSpace(2.2F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6960F, 0.3000F), new CieXyChromaticityCoordinates(0.2150F, 0.7650F), new CieXyChromaticityCoordinates(0.1300F, 0.0350F)));
///
/// Ekta Space PS5 working space.
///
- public static readonly RgbWorkingSpace EktaSpacePS5 = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6950F, 0.3050F), new CieXyChromaticityCoordinates(0.2600F, 0.7000F), new CieXyChromaticityCoordinates(0.1100F, 0.0050F)));
+ public static readonly RgbWorkingSpaceBase EktaSpacePS5 = new GammaWorkingSpace(2.2F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6950F, 0.3050F), new CieXyChromaticityCoordinates(0.2600F, 0.7000F), new CieXyChromaticityCoordinates(0.1100F, 0.0050F)));
///
/// NTSC Rgb working space.
///
- public static readonly RgbWorkingSpace NTSCRgb = new RgbWorkingSpace(Illuminants.C, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6700F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1400F, 0.0800F)));
+ public static readonly RgbWorkingSpaceBase NTSCRgb = new GammaWorkingSpace(2.2F, Illuminants.C, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6700F, 0.3300F), new CieXyChromaticityCoordinates(0.2100F, 0.7100F), new CieXyChromaticityCoordinates(0.1400F, 0.0800F)));
///
/// PAL/SECAM Rgb working space.
///
- public static readonly RgbWorkingSpace PALSECAMRgb = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2900F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly RgbWorkingSpaceBase PALSECAMRgb = new GammaWorkingSpace(2.2F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6400F, 0.3300F), new CieXyChromaticityCoordinates(0.2900F, 0.6000F), new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
///
/// ProPhoto Rgb working space.
///
- public static readonly RgbWorkingSpace ProPhotoRgb = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(1.8F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7347F, 0.2653F), new CieXyChromaticityCoordinates(0.1596F, 0.8404F), new CieXyChromaticityCoordinates(0.0366F, 0.0001F)));
+ public static readonly RgbWorkingSpaceBase ProPhotoRgb = new GammaWorkingSpace(1.8F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7347F, 0.2653F), new CieXyChromaticityCoordinates(0.1596F, 0.8404F), new CieXyChromaticityCoordinates(0.0366F, 0.0001F)));
///
/// SMPTE-C Rgb working space.
///
- public static readonly RgbWorkingSpace SMPTECRgb = new RgbWorkingSpace(Illuminants.D65, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6300F, 0.3400F), new CieXyChromaticityCoordinates(0.3100F, 0.5950F), new CieXyChromaticityCoordinates(0.1550F, 0.0700F)));
+ public static readonly RgbWorkingSpaceBase SMPTECRgb = new GammaWorkingSpace(2.2F, Illuminants.D65, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.6300F, 0.3400F), new CieXyChromaticityCoordinates(0.3100F, 0.5950F), new CieXyChromaticityCoordinates(0.1550F, 0.0700F)));
///
/// Wide Gamut Rgb working space.
///
- public static readonly RgbWorkingSpace WideGamutRgb = new RgbWorkingSpace(Illuminants.D50, new GammaCompanding(2.2F), new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7350F, 0.2650F), new CieXyChromaticityCoordinates(0.1150F, 0.8260F), new CieXyChromaticityCoordinates(0.1570F, 0.0180F)));
+ public static readonly RgbWorkingSpaceBase WideGamutRgb = new GammaWorkingSpace(2.2F, Illuminants.D50, new RgbPrimariesChromaticityCoordinates(new CieXyChromaticityCoordinates(0.7350F, 0.2650F), new CieXyChromaticityCoordinates(0.1150F, 0.8260F), new CieXyChromaticityCoordinates(0.1570F, 0.0180F)));
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs b/tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs
index 19b8c2272..57da2ff17 100644
--- a/tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs
+++ b/tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs
@@ -27,7 +27,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
IEqualityComparer,
IEqualityComparer,
IEqualityComparer,
- IEqualityComparer
+ IEqualityComparer,
+ IEqualityComparer
{
private readonly float Epsilon;
@@ -205,20 +206,30 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
public int GetHashCode(RgbPrimariesChromaticityCoordinates obj) => obj.GetHashCode();
///
- public bool Equals(RgbWorkingSpace x, RgbWorkingSpace y)
+ public bool Equals(GammaWorkingSpace x, GammaWorkingSpace y)
{
- if (x is RgbWorkingSpace g1 && y is RgbWorkingSpace g2)
+ if (x is GammaWorkingSpace g1 && y is GammaWorkingSpace g2)
{
- return this.Equals(g1.WhitePoint, g2.WhitePoint)
+ return this.Equals(g1.Gamma, g2.Gamma)
+ && this.Equals(g1.WhitePoint, g2.WhitePoint)
&& this.Equals(g1.ChromaticityCoordinates, g2.ChromaticityCoordinates);
}
+ return false;
+ }
+
+ ///
+ public int GetHashCode(GammaWorkingSpace obj) => obj.GetHashCode();
+
+ ///
+ public bool Equals(RgbWorkingSpaceBase x, RgbWorkingSpaceBase y)
+ {
return this.Equals(x.WhitePoint, y.WhitePoint)
&& this.Equals(x.ChromaticityCoordinates, y.ChromaticityCoordinates);
}
///
- public int GetHashCode(RgbWorkingSpace obj) => obj.GetHashCode();
+ public int GetHashCode(RgbWorkingSpaceBase obj) => obj.GetHashCode();
private bool Equals(float x, float y)
{
diff --git a/tests/ImageSharp.Tests/Colorspaces/Conversion/CompandingTests.cs b/tests/ImageSharp.Tests/Colorspaces/Conversion/CompandingTests.cs
index adf0263a0..125f8f994 100644
--- a/tests/ImageSharp.Tests/Colorspaces/Conversion/CompandingTests.cs
+++ b/tests/ImageSharp.Tests/Colorspaces/Conversion/CompandingTests.cs
@@ -18,38 +18,51 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
[Fact]
public void Rec2020CompandingIsCorrect()
{
- CompandingIsCorrectImpl(new Rec2020Companding(), .667F, .4484759F, .3937096F);
+ const float input = .667F;
+ float e = Rec2020Companding.Expand(input);
+ float c = Rec2020Companding.Compress(e);
+ CompandingIsCorrectImpl(e, c, .4484759F, .3937096F);
}
[Fact]
public void Rec709CompandingIsCorrect()
{
- CompandingIsCorrectImpl(new Rec709Companding(), .667F, .4483577F, .3937451F);
+ const float input = .667F;
+ float e = Rec709Companding.Expand(input);
+ float c = Rec709Companding.Compress(e);
+ CompandingIsCorrectImpl(e, c, .4483577F, .3937451F);
}
[Fact]
public void SRgbCompandingIsCorrect()
{
- CompandingIsCorrectImpl(new SRgbCompanding(), .667F, .40242353F, .667F);
+ const float input = .667F;
+ float e = SRgbCompanding.Expand(input);
+ float c = SRgbCompanding.Compress(e);
+ CompandingIsCorrectImpl(e, c, .40242353F, .667F);
}
[Fact]
public void GammaCompandingIsCorrect()
{
- CompandingIsCorrectImpl(new GammaCompanding(2.2F), .667F, .41027668F, .667F);
+ const float gamma = 2.2F;
+ const float input = .667F;
+ float e = GammaCompanding.Expand(input, gamma);
+ float c = GammaCompanding.Compress(e, gamma);
+ CompandingIsCorrectImpl(e, c, .41027668F, .667F);
}
[Fact]
public void LCompandingIsCorrect()
{
- CompandingIsCorrectImpl(new LCompanding(), .667F, .36236193F, .58908917F);
+ const float input = .667F;
+ float e = LCompanding.Expand(input);
+ float c = LCompanding.Compress(e);
+ CompandingIsCorrectImpl(e, c, .36236193F, .58908917F);
}
- private static void CompandingIsCorrectImpl(ICompanding companding, float input, float expanded, float compressed)
+ private static void CompandingIsCorrectImpl(float e, float c, float expanded, float compressed)
{
- float e = companding.Expand(input);
- float c = companding.Compress(e);
-
Assert.Equal(expanded, e, FloatComparer);
Assert.Equal(compressed, c, FloatComparer);
}
diff --git a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
index f0e255c7c..854e57d8f 100644
--- a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
+++ b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using System;
using System.Collections.Generic;
using System.Numerics;
@@ -20,11 +19,9 @@ namespace SixLabors.ImageSharp.Tests
/// Initializes a new instance of the class.
///
/// The comparison error difference epsilon to use.
- public ApproximateFloatComparer(float epsilon = 1f)
- {
- this.Epsilon = epsilon;
- }
+ public ApproximateFloatComparer(float epsilon = 1f) => this.Epsilon = epsilon;
+ ///
public bool Equals(float x, float y)
{
float d = x - y;
@@ -32,19 +29,13 @@ namespace SixLabors.ImageSharp.Tests
return d >= -this.Epsilon && d <= this.Epsilon;
}
- public int GetHashCode(float obj)
- {
- return obj.GetHashCode();
- }
+ ///
+ public int GetHashCode(float obj) => obj.GetHashCode();
- public bool Equals(Vector4 x, Vector4 y)
- {
- return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W);
- }
+ ///
+ public bool Equals(Vector4 x, Vector4 y) => this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W);
- public int GetHashCode(Vector4 obj)
- {
- return obj.GetHashCode();
- }
+ ///
+ public int GetHashCode(Vector4 obj) => obj.GetHashCode();
}
}
\ No newline at end of file