diff --git a/src/ImageSharp/ColorSpaces/Companding/SRgbCompanding.cs b/src/ImageSharp/ColorSpaces/Companding/SRgbCompanding.cs
index 5ae4629137..bbd454fbe8 100644
--- a/src/ImageSharp/ColorSpaces/Companding/SRgbCompanding.cs
+++ b/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.
///
/// The vector.
- /// The representing the linear channel values.
[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);
+ }
///
/// Compresses an uncompanded vector (linear) to its nonlinear equivalent.
///
/// The vector.
- /// The representing the nonlinear channel values.
[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);
+ }
///
/// Expands a companded channel to its linear equivalent with respect to the energy.
diff --git a/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs b/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
new file mode 100644
index 0000000000..536a23061a
--- /dev/null
+++ b/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,
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs b/src/ImageSharp/PixelFormats/PixelConversionModifiersExtensions.cs
new file mode 100644
index 0000000000..bf77f85114
--- /dev/null
+++ b/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;
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
index 44c7f2e30f..ea5bc876fe 100644
--- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
+++ b/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;
- }
-
///
/// A stateless class implementing Strategy Pattern for batched pixel-data conversion operations
/// for pixel buffers of type .
diff --git a/tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs b/tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs
index 91cacfe3f0..b2ee030483 100644
--- a/tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs
+++ b/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);