Browse Source

copy companding refactor from #847

pull/869/head
Anton Firszov 7 years ago
parent
commit
b0ff7cf6b6
  1. 24
      src/ImageSharp/ColorSpaces/Companding/SRgbCompanding.cs
  2. 16
      src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
  3. 20
      src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs
  4. 14
      src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
  5. 20
      tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs

24
src/ImageSharp/ColorSpaces/Companding/SRgbCompanding.cs

@ -30,9 +30,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
for (int i = 0; i < vectors.Length; i++)
{
ref Vector4 v = ref Unsafe.Add(ref baseRef, i);
v.X = Expand(v.X);
v.Y = Expand(v.Y);
v.Z = Expand(v.Z);
Expand(ref v);
}
}
@ -48,9 +46,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
for (int i = 0; i < vectors.Length; i++)
{
ref Vector4 v = ref Unsafe.Add(ref baseRef, i);
v.X = Compress(v.X);
v.Y = Compress(v.Y);
v.Z = Compress(v.Z);
Compress(ref v);
}
}
@ -58,17 +54,25 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// Expands a companded vector to its linear equivalent with respect to the energy.
/// </summary>
/// <param name="vector">The vector.</param>
/// <returns>The <see cref="Vector4"/> representing the linear channel values.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static Vector4 Expand(Vector4 vector) => new Vector4(Expand(vector.X), Expand(vector.Y), Expand(vector.Z), vector.W);
public static void Expand(ref Vector4 vector)
{
vector.X = Expand(vector.X);
vector.Y = Expand(vector.Y);
vector.Z = Expand(vector.Z);
}
/// <summary>
/// Compresses an uncompanded vector (linear) to its nonlinear equivalent.
/// </summary>
/// <param name="vector">The vector.</param>
/// <returns>The <see cref="Vector4"/> representing the nonlinear channel values.</returns>
[MethodImpl(InliningOptions.ShortMethod)]
public static Vector4 Compress(Vector4 vector) => new Vector4(Compress(vector.X), Compress(vector.Y), Compress(vector.Z), vector.W);
public static void Compress(ref Vector4 vector)
{
vector.X = Compress(vector.X);
vector.Y = Compress(vector.Y);
vector.Z = Compress(vector.Z);
}
/// <summary>
/// Expands a companded channel to its linear equivalent with respect to the energy.

16
src/ImageSharp/PixelFormats/PixelConversionModifiers.cs

@ -0,0 +1,16 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
namespace SixLabors.ImageSharp.PixelFormats
{
[Flags]
internal enum PixelConversionModifiers
{
None = 0,
Scale = 1 << 0,
Premultiply = 1 << 1,
SRgbCompand = 1 << 2,
}
}

20
src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs

@ -0,0 +1,20 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.PixelFormats
{
internal static class PixelConversionModifiersExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsDefined(this PixelConversionModifiers modifiers, PixelConversionModifiers expected) =>
(modifiers & expected) == expected;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static PixelConversionModifiers Remove(
this PixelConversionModifiers modifiers,
PixelConversionModifiers removeThis) =>
modifiers & ~removeThis;
}
}

14
src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs

@ -9,20 +9,6 @@ using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.PixelFormats
{
internal enum PixelConversionModifiers
{
None = 0,
Scale = 1 << 0,
Premultiply = 1 << 1,
SRgbCompand = 1 << 2,
}
internal static class PixelConversionModifiersExtensions
{
public static bool IsDefined(this PixelConversionModifiers modifiers, PixelConversionModifiers expected) =>
(modifiers & expected) == expected;
}
/// <summary>
/// A stateless class implementing Strategy Pattern for batched pixel-data conversion operations
/// for pixel buffers of type <typeparamref name="TPixel"/>.

20
tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs

@ -53,7 +53,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
{
var rnd = new Random(42);
Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1);
Vector4[] expected = source.Select(v => SRgbCompanding.Expand(v)).ToArray();
var expected = new Vector4[source.Length];
for (int i = 0; i < source.Length; i++)
{
Vector4 s = source[i];
ref Vector4 e = ref expected[i];
SRgbCompanding.Expand(ref s);
e = s;
}
SRgbCompanding.Expand(source);
@ -68,7 +76,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
{
var rnd = new Random(42);
Vector4[] source = rnd.GenerateRandomVectorArray(length, 0, 1);
Vector4[] expected = source.Select(v => SRgbCompanding.Compress(v)).ToArray();
var expected = new Vector4[source.Length];
for (int i = 0; i < source.Length; i++)
{
Vector4 s = source[i];
ref Vector4 e = ref expected[i];
SRgbCompanding.Compress(ref s);
e = s;
}
SRgbCompanding.Compress(source);

Loading…
Cancel
Save