Browse Source

Eliminate virtual calls from unnecessary IRgbWorkingSpace abstraction

af/merge-core
Jason Nelson 8 years ago
parent
commit
01714d96d6
  1. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
  2. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.LinearRgb.cs
  3. 4
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
  4. 6
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/CieXyzToLinearRgbConverter.cs
  5. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs
  6. 6
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToCieXyzConverter.cs
  7. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs
  8. 8
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs
  9. 4
      src/ImageSharp/ColorSpaces/ICompanding.cs
  10. 31
      src/ImageSharp/ColorSpaces/IRgbWorkingSpace.cs
  11. 12
      src/ImageSharp/ColorSpaces/LinearRgb.cs
  12. 13
      src/ImageSharp/ColorSpaces/Rgb.cs
  13. 8
      tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs

@ -211,7 +211,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// </summary> /// </summary>
/// <param name="workingSpace">The source working space</param> /// <param name="workingSpace">The source working space</param>
/// <returns>The <see cref="LinearRgbToCieXyzConverter"/></returns> /// <returns>The <see cref="LinearRgbToCieXyzConverter"/></returns>
private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(IRgbWorkingSpace workingSpace) private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
{ {
if (this.linearRgbToCieXyzConverter != null && this.linearRgbToCieXyzConverter.SourceWorkingSpace.Equals(workingSpace)) if (this.linearRgbToCieXyzConverter != null && this.linearRgbToCieXyzConverter.SourceWorkingSpace.Equals(workingSpace))
{ {

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.LinearRgb.cs

@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// </summary> /// </summary>
/// <param name="workingSpace">The target working space</param> /// <param name="workingSpace">The target working space</param>
/// <returns>The <see cref="CieXyzToLinearRgbConverter"/></returns> /// <returns>The <see cref="CieXyzToLinearRgbConverter"/></returns>
private CieXyzToLinearRgbConverter GetCieXyxToLinearRgbConverter(IRgbWorkingSpace workingSpace) private CieXyzToLinearRgbConverter GetCieXyxToLinearRgbConverter(RgbWorkingSpace workingSpace)
{ {
if (this.cieXyzToLinearRgbConverter != null && this.cieXyzToLinearRgbConverter.TargetWorkingSpace.Equals(workingSpace)) if (this.cieXyzToLinearRgbConverter != null && this.cieXyzToLinearRgbConverter.TargetWorkingSpace.Equals(workingSpace))
{ {

4
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs

@ -2,8 +2,8 @@
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System.Numerics; using System.Numerics;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.LmsColorSapce; using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.LmsColorSapce;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion namespace SixLabors.ImageSharp.ColorSpaces.Conversion
{ {
@ -64,7 +64,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) /// 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: <see cref="Rgb.DefaultWorkingSpace"/>. /// Defaults to: <see cref="Rgb.DefaultWorkingSpace"/>.
/// </summary> /// </summary>
public IRgbWorkingSpace TargetRgbWorkingSpace { get; set; } public RgbWorkingSpace TargetRgbWorkingSpace { get; set; }
/// <summary> /// <summary>
/// Gets or sets the chromatic adaptation method used. When null, no adaptation will be performed. /// Gets or sets the chromatic adaptation method used. When null, no adaptation will be performed.

6
src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/CieXyzToLinearRgbConverter.cs

@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// <summary> /// <summary>
/// Color converter between CieXyz and LinearRgb /// Color converter between CieXyz and LinearRgb
/// </summary> /// </summary>
internal class CieXyzToLinearRgbConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<CieXyz, LinearRgb> internal sealed class CieXyzToLinearRgbConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<CieXyz, LinearRgb>
{ {
private readonly Matrix4x4 conversionMatrix; private readonly Matrix4x4 conversionMatrix;
@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// Initializes a new instance of the <see cref="CieXyzToLinearRgbConverter"/> class. /// Initializes a new instance of the <see cref="CieXyzToLinearRgbConverter"/> class.
/// </summary> /// </summary>
/// <param name="workingSpace">The target working space.</param> /// <param name="workingSpace">The target working space.</param>
public CieXyzToLinearRgbConverter(IRgbWorkingSpace workingSpace) public CieXyzToLinearRgbConverter(RgbWorkingSpace workingSpace)
{ {
this.TargetWorkingSpace = workingSpace; this.TargetWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace); this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// <summary> /// <summary>
/// Gets the target working space /// Gets the target working space
/// </summary> /// </summary>
public IRgbWorkingSpace TargetWorkingSpace { get; } public RgbWorkingSpace TargetWorkingSpace { get; }
/// <inheritdoc/> /// <inheritdoc/>
public LinearRgb Convert(in CieXyz input) public LinearRgb Convert(in CieXyz input)

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbAndCieXyzConverterBase.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// </summary> /// </summary>
/// <param name="workingSpace">The Rgb working space.</param> /// <param name="workingSpace">The Rgb working space.</param>
/// <returns>The <see cref="Matrix4x4"/> based on the chromaticity and working space.</returns> /// <returns>The <see cref="Matrix4x4"/> based on the chromaticity and working space.</returns>
public static Matrix4x4 GetRgbToCieXyzMatrix(IRgbWorkingSpace workingSpace) public static Matrix4x4 GetRgbToCieXyzMatrix(RgbWorkingSpace workingSpace)
{ {
DebugGuard.NotNull(workingSpace, nameof(workingSpace)); DebugGuard.NotNull(workingSpace, nameof(workingSpace));

6
src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/LinearRgbToCieXyzConverter.cs

@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// <summary> /// <summary>
/// Color converter between LinearRgb and CieXyz /// Color converter between LinearRgb and CieXyz
/// </summary> /// </summary>
internal class LinearRgbToCieXyzConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<LinearRgb, CieXyz> internal sealed class LinearRgbToCieXyzConverter : LinearRgbAndCieXyzConverterBase, IColorConversion<LinearRgb, CieXyz>
{ {
private readonly Matrix4x4 conversionMatrix; private readonly Matrix4x4 conversionMatrix;
@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// Initializes a new instance of the <see cref="LinearRgbToCieXyzConverter"/> class. /// Initializes a new instance of the <see cref="LinearRgbToCieXyzConverter"/> class.
/// </summary> /// </summary>
/// <param name="workingSpace">The target working space.</param> /// <param name="workingSpace">The target working space.</param>
public LinearRgbToCieXyzConverter(IRgbWorkingSpace workingSpace) public LinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
{ {
this.SourceWorkingSpace = workingSpace; this.SourceWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace); this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
/// <summary> /// <summary>
/// Gets the source working space /// Gets the source working space
/// </summary> /// </summary>
public IRgbWorkingSpace SourceWorkingSpace { get; } public RgbWorkingSpace SourceWorkingSpace { get; }
/// <inheritdoc/> /// <inheritdoc/>
public CieXyz Convert(in LinearRgb input) public CieXyz Convert(in LinearRgb input)

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RGBPrimariesChromaticityCoordinates.cs

@ -7,7 +7,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
{ {
/// <summary> /// <summary>
/// Represents the chromaticity coordinates of RGB primaries. /// Represents the chromaticity coordinates of RGB primaries.
/// One of the specifiers of <see cref="IRgbWorkingSpace"/>. /// One of the specifiers of <see cref="RgbWorkingSpace"/>.
/// </summary> /// </summary>
internal readonly struct RgbPrimariesChromaticityCoordinates : IEquatable<RgbPrimariesChromaticityCoordinates> internal readonly struct RgbPrimariesChromaticityCoordinates : IEquatable<RgbPrimariesChromaticityCoordinates>
{ {

8
src/ImageSharp/ColorSpaces/Conversion/Implementation/Rgb/RgbWorkingSpace.cs

@ -4,9 +4,9 @@
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce
{ {
/// <summary> /// <summary>
/// Trivial implementation of <see cref="IRgbWorkingSpace"/> /// Trivial implementation of <see cref="RgbWorkingSpace"/>
/// </summary> /// </summary>
internal class RgbWorkingSpace : IRgbWorkingSpace internal class RgbWorkingSpace
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="RgbWorkingSpace"/> class. /// Initializes a new instance of the <see cref="RgbWorkingSpace"/> class.
@ -70,14 +70,12 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSap
return !Equals(left, right); return !Equals(left, right);
} }
/// <inheritdoc/>
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
return obj is RgbWorkingSpace other && this.Equals(other); return obj is RgbWorkingSpace other && this.Equals(other);
} }
/// <inheritdoc/> public bool Equals(RgbWorkingSpace other)
public bool Equals(IRgbWorkingSpace other)
{ {
// TODO: Object.Equals for ICompanding will be slow. // TODO: Object.Equals for ICompanding will be slow.
return this.WhitePoint.Equals(other.WhitePoint) return this.WhitePoint.Equals(other.WhitePoint)

4
src/ImageSharp/ColorSpaces/ICompanding.cs

@ -4,9 +4,9 @@
namespace SixLabors.ImageSharp.ColorSpaces namespace SixLabors.ImageSharp.ColorSpaces
{ {
/// <summary> /// <summary>
/// Pair of companding functions for <see cref="IRgbWorkingSpace"/>. /// Pair of companding functions for <see cref="RgbWorkingSpace"/>.
/// Used for conversion to <see cref="CieXyz"/> and backwards. /// Used for conversion to <see cref="CieXyz"/> and backwards.
/// See also: <seealso cref="IRgbWorkingSpace.Companding"/> /// See also: <seealso cref="RgbWorkingSpace.Companding"/>
/// </summary> /// </summary>
internal interface ICompanding internal interface ICompanding
{ {

31
src/ImageSharp/ColorSpaces/IRgbWorkingSpace.cs

@ -1,31 +0,0 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce;
namespace SixLabors.ImageSharp.ColorSpaces
{
/// <summary>
/// Encasulates the RGB working color space
/// </summary>
internal interface IRgbWorkingSpace : IEquatable<IRgbWorkingSpace>
{
/// <summary>
/// Gets the reference white of the color space.
/// </summary>
CieXyz WhitePoint { get; }
/// <summary>
/// Gets the chromaticity coordinates of the primaries.
/// </summary>
RgbPrimariesChromaticityCoordinates ChromaticityCoordinates { get; }
/// <summary>
/// Gets the companding function associated with the RGB color system. Used for conversion to XYZ and backwards.
/// <see href="http://www.brucelindbloom.com/index.html?Eqn_RGB_to_XYZ.html"/>
/// <see href="http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_RGB.html"/>
/// </summary>
ICompanding Companding { get; }
}
}

12
src/ImageSharp/ColorSpaces/LinearRgb.cs

@ -2,21 +2,21 @@
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System; using System;
using System.ComponentModel;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce;
namespace SixLabors.ImageSharp.ColorSpaces namespace SixLabors.ImageSharp.ColorSpaces
{ {
/// <summary> /// <summary>
/// Represents an linear Rgb color with specified <see cref="IRgbWorkingSpace"/> working space /// Represents an linear Rgb color with specified <see cref="RgbWorkingSpace"/> working space
/// </summary> /// </summary>
internal readonly struct LinearRgb : IColorVector, IEquatable<LinearRgb>, IAlmostEquatable<LinearRgb, float> internal readonly struct LinearRgb : IColorVector, IEquatable<LinearRgb>, IAlmostEquatable<LinearRgb, float>
{ {
/// <summary> /// <summary>
/// The default LinearRgb working space. /// The default LinearRgb working space.
/// </summary> /// </summary>
public static readonly IRgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb; public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
/// <summary> /// <summary>
/// The backing vector for SIMD support. /// The backing vector for SIMD support.
@ -43,7 +43,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="b">The blue component ranging between 0 and 1.</param> /// <param name="b">The blue component ranging between 0 and 1.</param>
/// <param name="workingSpace">The rgb working space.</param> /// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public LinearRgb(float r, float g, float b, IRgbWorkingSpace workingSpace) public LinearRgb(float r, float g, float b, RgbWorkingSpace workingSpace)
: this(new Vector3(r, g, b), workingSpace) : this(new Vector3(r, g, b), workingSpace)
{ {
} }
@ -64,7 +64,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="vector">The vector representing the r, g, b components.</param> /// <param name="vector">The vector representing the r, g, b components.</param>
/// <param name="workingSpace">The LinearRgb working space.</param> /// <param name="workingSpace">The LinearRgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public LinearRgb(Vector3 vector, IRgbWorkingSpace workingSpace) public LinearRgb(Vector3 vector, RgbWorkingSpace workingSpace)
: this() : this()
{ {
// Clamp to 0-1 range. // Clamp to 0-1 range.
@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <summary> /// <summary>
/// Gets the LinearRgb color space <seealso cref="RgbWorkingSpaces"/> /// Gets the LinearRgb color space <seealso cref="RgbWorkingSpaces"/>
/// </summary> /// </summary>
public IRgbWorkingSpace WorkingSpace { get; } public RgbWorkingSpace WorkingSpace { get; }
/// <inheritdoc /> /// <inheritdoc />
public Vector3 Vector => this.backingVector; public Vector3 Vector => this.backingVector;

13
src/ImageSharp/ColorSpaces/Rgb.cs

@ -2,23 +2,22 @@
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System; using System;
using System.ComponentModel;
using System.Numerics; using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation.RgbColorSapce;
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp.ColorSpaces namespace SixLabors.ImageSharp.ColorSpaces
{ {
/// <summary> /// <summary>
/// Represents an RGB color with specified <see cref="IRgbWorkingSpace"/> working space /// Represents an RGB color with specified <see cref="RgbWorkingSpace"/> working space
/// </summary> /// </summary>
internal readonly struct Rgb : IColorVector, IEquatable<Rgb>, IAlmostEquatable<Rgb, float> internal readonly struct Rgb : IColorVector, IEquatable<Rgb>, IAlmostEquatable<Rgb, float>
{ {
/// <summary> /// <summary>
/// The default rgb working space /// The default rgb working space
/// </summary> /// </summary>
public static readonly IRgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb; public static readonly RgbWorkingSpace DefaultWorkingSpace = RgbWorkingSpaces.SRgb;
/// <summary> /// <summary>
/// The backing vector for SIMD support. /// The backing vector for SIMD support.
@ -45,7 +44,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="b">The blue component ranging between 0 and 1.</param> /// <param name="b">The blue component ranging between 0 and 1.</param>
/// <param name="workingSpace">The rgb working space.</param> /// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Rgb(float r, float g, float b, IRgbWorkingSpace workingSpace) public Rgb(float r, float g, float b, RgbWorkingSpace workingSpace)
: this(new Vector3(r, g, b), workingSpace) : this(new Vector3(r, g, b), workingSpace)
{ {
} }
@ -66,7 +65,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="vector">The vector representing the r, g, b components.</param> /// <param name="vector">The vector representing the r, g, b components.</param>
/// <param name="workingSpace">The rgb working space.</param> /// <param name="workingSpace">The rgb working space.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public Rgb(Vector3 vector, IRgbWorkingSpace workingSpace) public Rgb(Vector3 vector, RgbWorkingSpace workingSpace)
: this() : this()
{ {
// Clamp to 0-1 range. // Clamp to 0-1 range.
@ -107,7 +106,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <summary> /// <summary>
/// Gets the Rgb color space <seealso cref="RgbWorkingSpaces"/> /// Gets the Rgb color space <seealso cref="RgbWorkingSpaces"/>
/// </summary> /// </summary>
public IRgbWorkingSpace WorkingSpace { get; } public RgbWorkingSpace WorkingSpace { get; }
/// <inheritdoc /> /// <inheritdoc />
public Vector3 Vector => this.backingVector; public Vector3 Vector => this.backingVector;

8
tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Tests
IEqualityComparer<CieXyChromaticityCoordinates>, IEqualityComparer<CieXyChromaticityCoordinates>,
IEqualityComparer<RgbPrimariesChromaticityCoordinates>, IEqualityComparer<RgbPrimariesChromaticityCoordinates>,
IEqualityComparer<CieXyz>, IEqualityComparer<CieXyz>,
IEqualityComparer<IRgbWorkingSpace> IEqualityComparer<RgbWorkingSpace>
{ {
private readonly float Eps; private readonly float Eps;
@ -76,9 +76,9 @@ namespace SixLabors.ImageSharp.Tests
throw new NotImplementedException(); throw new NotImplementedException();
} }
public bool Equals(IRgbWorkingSpace x, IRgbWorkingSpace y) public bool Equals(RgbWorkingSpace x, RgbWorkingSpace y)
{ {
if (x is IRgbWorkingSpace g1 && y is IRgbWorkingSpace g2) if (x is RgbWorkingSpace g1 && y is RgbWorkingSpace g2)
{ {
return this.Equals(g1.WhitePoint, g2.WhitePoint) return this.Equals(g1.WhitePoint, g2.WhitePoint)
&& this.Equals(g1.ChromaticityCoordinates, g2.ChromaticityCoordinates); && this.Equals(g1.ChromaticityCoordinates, g2.ChromaticityCoordinates);
@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Tests
&& this.Equals(x.ChromaticityCoordinates, y.ChromaticityCoordinates); && this.Equals(x.ChromaticityCoordinates, y.ChromaticityCoordinates);
} }
public int GetHashCode(IRgbWorkingSpace obj) public int GetHashCode(RgbWorkingSpace obj)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

Loading…
Cancel
Save