diff --git a/src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs b/src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs
index 94ba6de782..d9767d45ea 100644
--- a/src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs
+++ b/src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs
@@ -124,14 +124,19 @@ namespace SixLabors.ImageSharp.ColorSpaces
return "CieXyChromaticityCoordinates [Empty]";
}
- return $"CieXyChromaticityCoordinates [ X={this.X}, Y={this.Y}]";
+ return $"CieXyChromaticityCoordinates [ X={this.X:#0.##}, Y={this.Y:#0.##}]";
}
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override bool Equals(object obj)
{
- return obj is CieXyChromaticityCoordinates coordinates && this.Equals(coordinates);
+ if (obj is CieXyChromaticityCoordinates)
+ {
+ return this.Equals((CieXyChromaticityCoordinates)obj);
+ }
+
+ return false;
}
///
diff --git a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Rgb.cs b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Rgb.cs
index f3803b9bd5..6844e3a3ca 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Rgb.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Rgb.cs
@@ -181,7 +181,10 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
Guard.NotNull(color, nameof(color));
// Conversion
- return YCbCrAndRgbConverter.Convert(color);
+ Rgb rgb = YCbCrAndRgbConverter.Convert(color);
+
+ // Adaptation
+ return this.Adapt(rgb);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/GammaCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/GammaCompanding.cs
new file mode 100644
index 0000000000..21a80225ee
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/GammaCompanding.cs
@@ -0,0 +1,46 @@
+// 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.RgbColorSapce
+{
+ ///
+ /// Implements gamma companding
+ ///
+ ///
+ ///
+ ///
+ ///
+ public 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(MethodImplOptions.AggressiveInlining)]
+ public float Expand(float channel)
+ {
+ return MathF.Pow(channel, this.Gamma);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Compress(float channel)
+ {
+ return MathF.Pow(channel, 1 / this.Gamma);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LCompanding.cs
new file mode 100644
index 0000000000..132861b476
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LCompanding.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.RgbColorSapce
+{
+ ///
+ /// Implements L* companding
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ ///
+ public class LCompanding : ICompanding
+ {
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Expand(float channel)
+ {
+ return channel <= 0.08 ? 100 * channel / CieConstants.Kappa : MathF.Pow((channel + 0.16F) / 1.16F, 3);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Compress(float channel)
+ {
+ return channel <= CieConstants.Epsilon
+ ? channel * CieConstants.Kappa / 100F
+ : MathF.Pow(1.16F * channel, 0.3333333F) - 0.16F;
+ }
+ }
+}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToRgbConverter.cs
index 25dbc746b0..29ea0f3148 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToRgbConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToRgbConverter.cs
@@ -16,9 +16,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
DebugGuard.NotNull(input, nameof(input));
Vector3 vector = input.Vector;
- vector.X = input.WorkingSpace.Compress(vector.X);
- vector.Y = input.WorkingSpace.Compress(vector.Y);
- vector.Z = input.WorkingSpace.Compress(vector.Z);
+ vector.X = input.WorkingSpace.Companding.Compress(vector.X);
+ vector.Y = input.WorkingSpace.Companding.Compress(vector.Y);
+ vector.Z = input.WorkingSpace.Companding.Compress(vector.Z);
return new Rgb(vector, input.WorkingSpace);
}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs
index 062398f94e..d279aba850 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs
@@ -14,9 +14,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
///
/// Initializes a new instance of the struct.
///
- /// The chromaticity coordinates of the red channel.
- /// The chromaticity coordinates of the green channel.
- /// The chromaticity coordinates of the blue channel.
+ /// The chomaticity coordinates of the red channel.
+ /// The chomaticity coordinates of the green channel.
+ /// The chomaticity coordinates of the blue channel.
public RgbPrimariesChromaticityCoordinates(CieXyChromaticityCoordinates r, CieXyChromaticityCoordinates g, CieXyChromaticityCoordinates b)
{
this.R = r;
@@ -25,17 +25,17 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
}
///
- /// Gets the chromaticity coordinates of the red channel.
+ /// Gets the chomaticity coordinates of the red channel.
///
public CieXyChromaticityCoordinates R { get; }
///
- /// Gets the chromaticity coordinates of the green channel.
+ /// Gets the chomaticity coordinates of the green channel.
///
public CieXyChromaticityCoordinates G { get; }
///
- /// Gets the chromaticity coordinates of the blue channel.
+ /// Gets the chomaticity coordinates of the blue channel.
///
public CieXyChromaticityCoordinates B { get; }
@@ -76,7 +76,12 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
///
public override bool Equals(object obj)
{
- return obj is RgbPrimariesChromaticityCoordinates coordinates && this.Equals(coordinates);
+ if (obj is RgbPrimariesChromaticityCoordinates)
+ {
+ return this.Equals((RgbPrimariesChromaticityCoordinates)obj);
+ }
+
+ return false;
}
///
@@ -85,12 +90,6 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
return this.R.Equals(other.R) && this.G.Equals(other.G) && this.B.Equals(other.B);
}
- ///
- public override string ToString()
- {
- return $"RgbPrimariesChromaticityCoordinates [ R={this.R}, G={this.G}, B={this.B}]";
- }
-
///
public override int GetHashCode()
{
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec2020Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec2020Companding.cs
new file mode 100644
index 0000000000..11761f0e4d
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec2020Companding.cs
@@ -0,0 +1,32 @@
+// 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.RgbColorSapce
+{
+ ///
+ /// Implements Rec. 2020 companding function (for 12-bits).
+ ///
+ ///
+ ///
+ /// For 10-bits, companding is identical to
+ ///
+ public class Rec2020Companding : ICompanding
+ {
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Expand(float channel)
+ {
+ return channel < 0.08145F ? channel / 4.5F : MathF.Pow((channel + 0.0993F) / 1.0993F, 2.222222F);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Compress(float channel)
+ {
+ return channel < 0.0181F ? 4500F * channel : (1.0993F * channel) - 0.0993F;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec709Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec709Companding.cs
new file mode 100644
index 0000000000..ccda6bf521
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec709Companding.cs
@@ -0,0 +1,31 @@
+// 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.RgbColorSapce
+{
+ ///
+ /// Implements the Rec. 709 companding function
+ ///
+ ///
+ /// http://en.wikipedia.org/wiki/Rec._709
+ ///
+ public class Rec709Companding : ICompanding
+ {
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Expand(float channel)
+ {
+ return channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, 2.222222F);
+ }
+
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public float Compress(float channel)
+ {
+ return channel < 0.018F ? 4500F * channel : (1.099F * channel) - 0.099F;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbGammaWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbGammaWorkingSpace.cs
deleted file mode 100644
index 891beba1ac..0000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbGammaWorkingSpace.cs
+++ /dev/null
@@ -1,89 +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.RgbColorSapce
-{
- ///
- /// Represents an that implements gamma companding
- ///
- ///
- ///
- ///
- ///
- internal class RgbGammaWorkingSpace : IRgbWorkingSpace, IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The gamma value.
- /// The chromaticity of the rgb primaries.
- public RgbGammaWorkingSpace(CieXyz referenceWhite, float gamma, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.Gamma = gamma;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- /// Gets the gamma value
- ///
- public float Gamma { get; }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Expand(float channel)
- {
- return MathF.Pow(channel, this.Gamma);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Compress(float channel)
- {
- return MathF.Pow(channel, 1 / this.Gamma);
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbGammaWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(IRgbWorkingSpace other)
- {
- return other is RgbGammaWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(RgbGammaWorkingSpace other)
- {
- return other != null &&
- this.WhitePoint.Equals(other.WhitePoint) &&
- this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates) &&
- this.Gamma == other.Gamma;
- }
-
- ///
- public override int GetHashCode()
- {
- return HashHelpers.Combine(
- this.WhitePoint.GetHashCode(),
- HashHelpers.Combine(
- this.ChromaticityCoordinates.GetHashCode(),
- this.Gamma.GetHashCode()));
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbLWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbLWorkingSpace.cs
deleted file mode 100644
index c2d75cd90b..0000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbLWorkingSpace.cs
+++ /dev/null
@@ -1,82 +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.RgbColorSapce
-{
- ///
- /// Represents an that implements L* companding
- ///
- ///
- /// For more info see:
- ///
- ///
- ///
- internal class RgbLWorkingSpace : IRgbWorkingSpace, IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The chromaticity of the rgb primaries.
- public RgbLWorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Expand(float channel)
- {
- return channel <= 0.08 ? 100 * channel / CieConstants.Kappa : MathF.Pow((channel + 0.16F) / 1.16F, 3);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Compress(float channel)
- {
- return channel <= CieConstants.Epsilon
- ? channel * CieConstants.Kappa / 100F
- : MathF.Pow(1.16F * channel, 0.3333333F) - 0.16F;
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbLWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(IRgbWorkingSpace other)
- {
- return other is RgbLWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(RgbLWorkingSpace other)
- {
- return other != null &&
- this.WhitePoint.Equals(other.WhitePoint) &&
- this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
- }
-
- ///
- public override int GetHashCode()
- {
- return HashHelpers.Combine(
- this.WhitePoint.GetHashCode(),
- this.ChromaticityCoordinates.GetHashCode());
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec2020WorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec2020WorkingSpace.cs
deleted file mode 100644
index cc814e9b31..0000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec2020WorkingSpace.cs
+++ /dev/null
@@ -1,79 +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.RgbColorSapce
-{
- ///
- /// Represents an that implements Rec. 2020 companding (for 12-bits).
- ///
- ///
- ///
- /// For 10-bits, companding is identical to
- ///
- internal class RgbRec2020WorkingSpace : IRgbWorkingSpace, IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The chromaticity of the rgb primaries.
- public RgbRec2020WorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Expand(float channel)
- {
- return channel < 0.08145F ? channel / 4.5F : MathF.Pow((channel + 0.0993F) / 1.0993F, 2.222222F);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Compress(float channel)
- {
- return channel < 0.0181F ? 4500F * channel : (1.0993F * channel) - 0.0993F;
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbRec2020WorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(IRgbWorkingSpace other)
- {
- return other is RgbRec2020WorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(RgbRec2020WorkingSpace other)
- {
- return other != null &&
- this.WhitePoint.Equals(other.WhitePoint) &&
- this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
- }
-
- ///
- public override int GetHashCode()
- {
- return HashHelpers.Combine(
- this.WhitePoint.GetHashCode(),
- this.ChromaticityCoordinates.GetHashCode());
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec709WorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec709WorkingSpace.cs
deleted file mode 100644
index 87301dd657..0000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec709WorkingSpace.cs
+++ /dev/null
@@ -1,78 +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.RgbColorSapce
-{
- ///
- /// Represents an that implements Rec. 709 companding.
- ///
- ///
- ///
- ///
- internal class RgbRec709WorkingSpace : IRgbWorkingSpace, IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The chromaticity of the rgb primaries.
- public RgbRec709WorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Expand(float channel)
- {
- return channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, 2.222222F);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public float Compress(float channel)
- {
- return channel < 0.018F ? 4500F * channel : (1.099F * channel) - 0.099F;
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbRec709WorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(IRgbWorkingSpace other)
- {
- return other is RgbRec709WorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(RgbRec709WorkingSpace other)
- {
- return other != null &&
- this.WhitePoint.Equals(other.WhitePoint) &&
- this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
- }
-
- ///
- public override int GetHashCode()
- {
- return HashHelpers.Combine(
- this.WhitePoint.GetHashCode(),
- this.ChromaticityCoordinates.GetHashCode());
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbSRgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbSRgbWorkingSpace.cs
deleted file mode 100644
index 98edaa0b37..0000000000
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbSRgbWorkingSpace.cs
+++ /dev/null
@@ -1,80 +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.RgbColorSapce
-{
- ///
- /// Represents an that implements sRGB companding
- ///
- ///
- /// For more info see:
- ///
- ///
- ///
- internal class RgbSRgbWorkingSpace : IRgbWorkingSpace, IEquatable
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The reference white point.
- /// The chromaticity of the rgb primaries.
- public RgbSRgbWorkingSpace(CieXyz referenceWhite, RgbPrimariesChromaticityCoordinates chromaticityCoordinates)
- {
- this.WhitePoint = referenceWhite;
- this.ChromaticityCoordinates = chromaticityCoordinates;
- }
-
- ///
- public CieXyz WhitePoint { get; }
-
- ///
- public RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
-
- ///
- [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;
- }
-
- ///
- public override bool Equals(object obj)
- {
- return obj is RgbSRgbWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(IRgbWorkingSpace other)
- {
- return other is RgbSRgbWorkingSpace space && this.Equals(space);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public bool Equals(RgbSRgbWorkingSpace other)
- {
- return other != null &&
- this.WhitePoint.Equals(other.WhitePoint) &&
- this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates);
- }
-
- ///
- public override int GetHashCode()
- {
- return HashHelpers.Combine(
- this.WhitePoint.GetHashCode(),
- this.ChromaticityCoordinates.GetHashCode());
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbToLinearRgbConverter.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbToLinearRgbConverter.cs
index 89a57051f7..e40ecc192e 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbToLinearRgbConverter.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbToLinearRgbConverter.cs
@@ -16,9 +16,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
Guard.NotNull(input, nameof(input));
Vector3 vector = input.Vector;
- vector.X = input.WorkingSpace.Expand(vector.X);
- vector.Y = input.WorkingSpace.Expand(vector.Y);
- vector.Z = input.WorkingSpace.Expand(vector.Z);
+ vector.X = input.WorkingSpace.Companding.Expand(vector.X);
+ vector.Y = input.WorkingSpace.Companding.Expand(vector.Y);
+ vector.Z = input.WorkingSpace.Companding.Expand(vector.Z);
return new LinearRgb(vector, input.WorkingSpace);
}
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs
new file mode 100644
index 0000000000..8a2c66a80c
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs
@@ -0,0 +1,105 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce
+{
+ ///
+ /// Trivial implementation of
+ ///
+ internal struct RgbWorkingSpace : IRgbWorkingSpace
+ {
+ ///
+ /// Initializes a new instance of the struct.
+ ///
+ /// 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)
+ {
+ if (obj is RgbWorkingSpace)
+ {
+ return this.Equals((RgbWorkingSpace)obj);
+ }
+
+ return false;
+ }
+
+ ///
+ public bool Equals(IRgbWorkingSpace other)
+ {
+ // TODO: Object.Equals for ICompanding will be slow.
+ return this.WhitePoint.Equals(other.WhitePoint)
+ && this.ChromaticityCoordinates.Equals(other.ChromaticityCoordinates)
+ && Equals(this.Companding, other.Companding);
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ unchecked
+ {
+ int hashCode = this.WhitePoint.GetHashCode();
+ hashCode = (hashCode * 397) ^ this.ChromaticityCoordinates.GetHashCode();
+ hashCode = (hashCode * 397) ^ (this.Companding?.GetHashCode() ?? 0);
+ return hashCode;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/SRgbCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/SRgbCompanding.cs
new file mode 100644
index 0000000000..ce8ea7c6e5
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/SRgbCompanding.cs
@@ -0,0 +1,33 @@
+// 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.RgbColorSapce
+{
+ ///
+ /// Implements sRGB companding
+ ///
+ ///
+ /// For more info see:
+ ///
+ ///
+ ///
+ public 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/ICompanding.cs b/src/ImageSharp/ColorSpaces/ICompanding.cs
new file mode 100644
index 0000000000..2dfa575ed9
--- /dev/null
+++ b/src/ImageSharp/ColorSpaces/ICompanding.cs
@@ -0,0 +1,35 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+namespace SixLabors.ImageSharp.ColorSpaces
+{
+ ///
+ /// Pair of companding functions for .
+ /// Used for conversion to and backwards.
+ /// See also:
+ ///
+ internal 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/IRgbWorkingSpace.cs b/src/ImageSharp/ColorSpaces/IRgbWorkingSpace.cs
index 1af3a219d6..156e94ed3c 100644
--- a/src/ImageSharp/ColorSpaces/IRgbWorkingSpace.cs
+++ b/src/ImageSharp/ColorSpaces/IRgbWorkingSpace.cs
@@ -7,7 +7,7 @@ using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce;
namespace SixLabors.ImageSharp.ColorSpaces
{
///
- /// Encapsulates the RGB working color space
+ /// Encasulates the RGB working color space
///
internal interface IRgbWorkingSpace : IEquatable
{
@@ -22,25 +22,10 @@ namespace SixLabors.ImageSharp.ColorSpaces
RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
///
- /// Expands a compressed channel to its linear equivalent with respect to the energy.
- ///
- ///
- /// For more info see:
+ /// Gets the companding function associated with the RGB color system. Used for conversion to XYZ and backwards.
///
- ///
- /// The channel value
- /// The linear channel value
- float Expand(float channel);
-
- ///
- /// Compresses an expanded 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);
+ ///
+ ICompanding Companding { get; }
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs b/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
index 93557154d9..098ca9a4a4 100644
--- a/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
+++ b/src/ImageSharp/ColorSpaces/RgbWorkingSpaces.cs
@@ -19,226 +19,97 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// Uses proper companding function, according to:
///
///
- public static readonly IRgbWorkingSpace SRgb =
- new RgbSRgbWorkingSpace(
- Illuminants.D65,
- new RgbPrimariesChromaticityCoordinates(
- new CieXyChromaticityCoordinates(0.6400F, 0.3300F),
- new CieXyChromaticityCoordinates(0.3000F, 0.6000F),
- new CieXyChromaticityCoordinates(0.1500F, 0.0600F)));
+ public static readonly IRgbWorkingSpace 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)));
///
- /// Simplified sRgb working space that uses gamma companding instead of srgb companding.
+ /// Simplified sRgb working space (uses gamma companding instead of ).
/// See also .
///
- public static readonly IRgbWorkingSpace SRgbSimplified =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// Rec. 709 (ITU-R Recommendation BT.709) working space
///
- public static readonly IRgbWorkingSpace Rec709 =
- new RgbRec709WorkingSpace(
- Illuminants.D65,
- new RgbPrimariesChromaticityCoordinates(
- new CieXyChromaticityCoordinates(0.64F, 0.33F),
- new CieXyChromaticityCoordinates(0.30F, 0.60F),
- new CieXyChromaticityCoordinates(0.15F, 0.06F)));
+ public static readonly IRgbWorkingSpace 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)));
///
/// Rec. 2020 (ITU-R Recommendation BT.2020F) working space
///
- public static readonly IRgbWorkingSpace Rec2020 =
- new RgbRec2020WorkingSpace(
- Illuminants.D65,
- new RgbPrimariesChromaticityCoordinates(
- new CieXyChromaticityCoordinates(0.708F, 0.292F),
- new CieXyChromaticityCoordinates(0.170F, 0.797F),
- new CieXyChromaticityCoordinates(0.131F, 0.046F)));
+ public static readonly IRgbWorkingSpace 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)));
///
/// ECI Rgb v2 working space
///
- public static readonly IRgbWorkingSpace ECIRgbv2 =
- new RgbLWorkingSpace(
- Illuminants.D50,
- new RgbPrimariesChromaticityCoordinates(
- new CieXyChromaticityCoordinates(0.6700F, 0.3300F),
- new CieXyChromaticityCoordinates(0.2100F, 0.7100F),
- new CieXyChromaticityCoordinates(0.1400F, 0.0800F)));
+ public static readonly IRgbWorkingSpace 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)));
///
/// Adobe Rgb (1998) working space
///
- public static readonly IRgbWorkingSpace AdobeRgb1998 =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// Apple sRgb working space
///
- public static readonly IRgbWorkingSpace ApplesRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// Best Rgb working space
///
- public static readonly IRgbWorkingSpace BestRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// Beta Rgb working space
///
- public static readonly IRgbWorkingSpace BetaRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// Bruce Rgb working space
///
- public static readonly IRgbWorkingSpace BruceRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// CIE Rgb working space
///
- public static readonly IRgbWorkingSpace CIERgb =
- new RgbGammaWorkingSpace(
- Illuminants.E,
- 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 IRgbWorkingSpace 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)));
///
/// ColorMatch Rgb working space
///
- public static readonly IRgbWorkingSpace ColorMatchRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// Don Rgb 4 working space
///
- public static readonly IRgbWorkingSpace DonRgb4 =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// Ekta Space PS5 working space
///
- public static readonly IRgbWorkingSpace EktaSpacePS5 =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// NTSC Rgb working space
///
- public static readonly IRgbWorkingSpace NTSCRgb =
- new RgbGammaWorkingSpace(
- Illuminants.C,
- 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 IRgbWorkingSpace 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)));
///
/// PAL/SECAM Rgb working space
///
- public static readonly IRgbWorkingSpace PALSECAMRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// ProPhoto Rgb working space
///
- public static readonly IRgbWorkingSpace ProPhotoRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
///
/// SMPTE-C Rgb working space
///
- public static readonly IRgbWorkingSpace SMPTECRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D65,
- 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 IRgbWorkingSpace 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)));
///
/// Wide Gamut Rgb working space
///
- public static readonly IRgbWorkingSpace WideGamutRgb =
- new RgbGammaWorkingSpace(
- Illuminants.D50,
- 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 IRgbWorkingSpace 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)));
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
index 1bd80073e5..24363173ae 100644
--- a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
+++ b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs
@@ -78,7 +78,7 @@ namespace SixLabors.ImageSharp.Tests
public bool Equals(IRgbWorkingSpace x, IRgbWorkingSpace y)
{
- if (x is RgbGammaWorkingSpace g1 && y is RgbGammaWorkingSpace g2)
+ if (x is IRgbWorkingSpace g1 && y is IRgbWorkingSpace g2)
{
return this.Equals(g1.WhitePoint, g2.WhitePoint)
&& this.Equals(g1.ChromaticityCoordinates, g2.ChromaticityCoordinates);