From 96dbbd62d9a38db71e0761227be2cb1747971f98 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 15 Feb 2018 23:54:02 +1100 Subject: [PATCH] Revert most colorspace changes. --- .../CieXyChromaticityCoordinates.cs | 9 +- .../Conversion/ColorSpaceConverter.Rgb.cs | 5 +- .../Implementation/Rgb/GammaCompanding.cs | 46 +++++ .../Implementation/Rgb/LCompanding.cs | 35 ++++ .../Rgb/LinearRgbToRgbConverter.cs | 6 +- .../RGBPrimariesChromaticityCoordinates.cs | 25 ++- .../Implementation/Rgb/Rec2020Companding.cs | 32 ++++ .../Implementation/Rgb/Rec709Companding.cs | 31 ++++ .../Rgb/RgbGammaWorkingSpace.cs | 89 --------- .../Implementation/Rgb/RgbLWorkingSpace.cs | 82 --------- .../Rgb/RgbRec2020WorkingSpace.cs | 79 -------- .../Rgb/RgbRec709WorkingSpace.cs | 78 -------- .../Implementation/Rgb/RgbSRgbWorkingSpace.cs | 80 --------- .../Rgb/RgbToLinearRgbConverter.cs | 6 +- .../Implementation/Rgb/RgbWorkingSpace.cs | 105 +++++++++++ .../Implementation/Rgb/SRgbCompanding.cs | 33 ++++ src/ImageSharp/ColorSpaces/ICompanding.cs | 35 ++++ .../ColorSpaces/IRgbWorkingSpace.cs | 23 +-- .../ColorSpaces/RgbWorkingSpaces.cs | 169 +++--------------- .../TestUtilities/ApproximateFloatComparer.cs | 2 +- 20 files changed, 371 insertions(+), 599 deletions(-) create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/GammaCompanding.cs create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LCompanding.cs create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec2020Companding.cs create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/Rec709Companding.cs delete mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbGammaWorkingSpace.cs delete mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbLWorkingSpace.cs delete mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec2020WorkingSpace.cs delete mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbRec709WorkingSpace.cs delete mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbSRgbWorkingSpace.cs create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs create mode 100644 src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/SRgbCompanding.cs create mode 100644 src/ImageSharp/ColorSpaces/ICompanding.cs 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);