|
|
|
@ -1,6 +1,8 @@ |
|
|
|
// Copyright (c) Six Labors and contributors.
|
|
|
|
// Licensed under the Apache License, Version 2.0.
|
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation; |
|
|
|
|
|
|
|
namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
@ -24,7 +26,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
{ |
|
|
|
Guard.NotNull(color, nameof(color)); |
|
|
|
|
|
|
|
// Conversion (perserving white point)
|
|
|
|
// Conversion (preserving white point)
|
|
|
|
CieLab unadapted = CieLchToCieLabConverter.Convert(color); |
|
|
|
|
|
|
|
if (!this.IsChromaticAdaptationPerformed) |
|
|
|
@ -36,6 +38,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.Adapt(unadapted); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="CieLch"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<CieLch> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref CieLch sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref CieLch sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="CieLchuv"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -49,6 +72,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="CieLchuv"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<CieLchuv> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref CieLchuv sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref CieLchuv sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="CieLuv"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -62,6 +106,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="CieLuv"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<CieLuv> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref CieLuv sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref CieLuv sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="CieXyy"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -75,6 +140,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="CieXyy"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<CieXyy> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref CieXyy sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref CieXyy sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="CieXyz"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -94,6 +180,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return converter.Convert(adapted); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="CieXyz"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<CieXyz> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref CieXyz sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref CieXyz sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="Cmyk"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -107,6 +214,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="Cmyk"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<Cmyk> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref Cmyk sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Cmyk sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="Hsl"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -120,6 +248,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="Hsl"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<Hsl> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref Hsl sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Hsl sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="Hsv"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -133,6 +282,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="Hsv"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<Hsv> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref Hsv sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Hsv sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="HunterLab"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -146,6 +316,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="HunterLab"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<HunterLab> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref HunterLab sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref HunterLab sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="Lms"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -159,6 +350,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="Lms"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<Lms> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref Lms sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Lms sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="LinearRgb"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -172,6 +384,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="LinearRgb"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<LinearRgb> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref LinearRgb sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref LinearRgb sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="Rgb"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -185,6 +418,27 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="LinearRgb"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<Rgb> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref Rgb sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Rgb sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Converts a <see cref="YCbCr"/> into a <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
@ -197,5 +451,26 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion |
|
|
|
var xyzColor = this.ToCieXyz(color); |
|
|
|
return this.ToCieLab(xyzColor); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Performs the bulk conversion from <see cref="YCbCr"/> into <see cref="CieLab"/>
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">The span to the source colors</param>
|
|
|
|
/// <param name="destination">The span to the destination colors</param>
|
|
|
|
/// <param name="count">The number of colors to convert.</param>
|
|
|
|
public void Convert(Span<YCbCr> source, Span<CieLab> destination, int count) |
|
|
|
{ |
|
|
|
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count); |
|
|
|
|
|
|
|
ref YCbCr sourceRef = ref source.DangerousGetPinnableReference(); |
|
|
|
ref CieLab destRef = ref destination.DangerousGetPinnableReference(); |
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) |
|
|
|
{ |
|
|
|
ref Rgb sp = ref Unsafe.Add(ref sourceRef, i); |
|
|
|
ref CieLab dp = ref Unsafe.Add(ref destRef, i); |
|
|
|
dp = this.ToCieLab(sp); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |