Browse Source

Use cache to make type threadsafe

pull/2326/head
James Jackson-South 3 years ago
parent
commit
7f1fc960ed
  1. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.Adapt.cs
  2. 18
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieXyz.cs
  3. 3
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
  4. 4
      src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs

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

@ -129,7 +129,7 @@ public partial class ColorSpaceConverter
}
// Conversion to XYZ
LinearRgbToCieXyzConverter converterToXYZ = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace);
LinearRgbToCieXyzConverter converterToXYZ = GetLinearRgbToCieXyzConverter(color.WorkingSpace);
CieXyz unadapted = converterToXYZ.Convert(color);
// Adaptation

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

@ -1,6 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Collections.Concurrent;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@ -11,9 +12,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion;
/// </content>
public partial class ColorSpaceConverter
{
private static readonly HunterLabToCieXyzConverter HunterLabToCieXyzConverter = new();
private LinearRgbToCieXyzConverter? linearRgbToCieXyzConverter;
private static readonly ConcurrentDictionary<RgbWorkingSpace, LinearRgbToCieXyzConverter> ConverterCache = new();
/// <summary>
/// Converts a <see cref="CieLab"/> into a <see cref="CieXyz"/>.
@ -327,7 +326,7 @@ public partial class ColorSpaceConverter
public CieXyz ToCieXyz(in LinearRgb color)
{
// Conversion
LinearRgbToCieXyzConverter converter = this.GetLinearRgbToCieXyzConverter(color.WorkingSpace);
LinearRgbToCieXyzConverter converter = GetLinearRgbToCieXyzConverter(color.WorkingSpace);
CieXyz unadapted = converter.Convert(color);
return this.Adapt(unadapted, color.WorkingSpace.WhitePoint);
@ -454,13 +453,6 @@ public partial class ColorSpaceConverter
/// </summary>
/// <param name="workingSpace">The source working space</param>
/// <returns>The <see cref="LinearRgbToCieXyzConverter"/></returns>
private LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
{
if (this.linearRgbToCieXyzConverter?.SourceWorkingSpace.Equals(workingSpace) == true)
{
return this.linearRgbToCieXyzConverter;
}
return this.linearRgbToCieXyzConverter = new LinearRgbToCieXyzConverter(workingSpace);
}
private static LinearRgbToCieXyzConverter GetLinearRgbToCieXyzConverter(RgbWorkingSpace workingSpace)
=> ConverterCache.GetOrAdd(workingSpace, (key) => new LinearRgbToCieXyzConverter(key));
}

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

@ -1,7 +1,6 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion;
@ -12,7 +11,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion;
public partial class ColorSpaceConverter
{
// Options.
private static readonly ColorSpaceConverterOptions DefaultOptions = new ColorSpaceConverterOptions();
private static readonly ColorSpaceConverterOptions DefaultOptions = new();
private readonly Matrix4x4 lmsAdaptationMatrix;
private readonly CieXyz whitePoint;
private readonly CieXyz targetLuvWhitePoint;

4
src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/RgbWorkingSpace.cs

@ -75,7 +75,5 @@ public abstract class RgbWorkingSpace
/// <inheritdoc/>
public override int GetHashCode()
{
return HashCode.Combine(this.WhitePoint, this.ChromaticityCoordinates);
}
=> HashCode.Combine(this.WhitePoint, this.ChromaticityCoordinates);
}

Loading…
Cancel
Save