diff --git a/src/ImageSharp/Common/Helpers/InliningOptions.cs b/src/ImageSharp/Common/Helpers/InliningOptions.cs
index 4bc8ef3c87..1ae880787e 100644
--- a/src/ImageSharp/Common/Helpers/InliningOptions.cs
+++ b/src/ImageSharp/Common/Helpers/InliningOptions.cs
@@ -12,6 +12,10 @@ namespace SixLabors.ImageSharp
///
internal static class InliningOptions
{
+ ///
+ /// regardless of the build conditions.
+ ///
+ public const MethodImplOptions AlwaysInline = MethodImplOptions.AggressiveInlining;
#if PROFILING
public const MethodImplOptions HotPath = MethodImplOptions.NoInlining;
public const MethodImplOptions ShortMethod = MethodImplOptions.NoInlining;
diff --git a/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs b/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs
index 60e7fdd33d..cd96b51e92 100644
--- a/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs
+++ b/src/ImageSharp/Common/Helpers/SimdUtils.HwIntrinsics.cs
@@ -537,7 +537,7 @@ private static void Shuffle4Slice3(
/// The first vector to multiply.
/// The second vector to multiply.
/// The .
- [MethodImpl(InliningOptions.ShortMethod)]
+ [MethodImpl(InliningOptions.AlwaysInline)]
public static Vector256 MultiplyAdd(
in Vector256 va,
in Vector256 vm0,
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykAvx2.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykAvx2.cs
index f9334de73b..216c12735f 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykAvx2.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykAvx2.cs
@@ -22,60 +22,39 @@ public FromCmykAvx2(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
#if SUPPORTS_RUNTIME_INTRINSICS
- ref Vector256 cBase =
+ ref Vector256 c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector256 mBase =
+ ref Vector256 c1Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
- ref Vector256 yBase =
+ ref Vector256 c2Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
- ref Vector256 kBase =
+ ref Vector256 c3Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component3));
- ref Vector256 resultBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(result));
-
// Used for the color conversion
var scale = Vector256.Create(1 / this.MaximumValue);
- var one = Vector256.Create(1F);
-
- // Used for packing
- ref byte control = ref MemoryMarshal.GetReference(HwIntrinsics.PermuteMaskEvenOdd8x32);
- Vector256 vcontrol = Unsafe.As>(ref control);
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
- Vector256 k = Avx2.PermuteVar8x32(Unsafe.Add(ref kBase, i), vcontrol);
- Vector256 c = Avx2.PermuteVar8x32(Unsafe.Add(ref cBase, i), vcontrol);
- Vector256 m = Avx2.PermuteVar8x32(Unsafe.Add(ref mBase, i), vcontrol);
- Vector256 y = Avx2.PermuteVar8x32(Unsafe.Add(ref yBase, i), vcontrol);
+ ref Vector256 c = ref Unsafe.Add(ref c0Base, i);
+ ref Vector256 m = ref Unsafe.Add(ref c1Base, i);
+ ref Vector256 y = ref Unsafe.Add(ref c2Base, i);
+ Vector256 k = Unsafe.Add(ref c3Base, i);
k = Avx.Multiply(k, scale);
-
c = Avx.Multiply(Avx.Multiply(c, k), scale);
m = Avx.Multiply(Avx.Multiply(m, k), scale);
y = Avx.Multiply(Avx.Multiply(y, k), scale);
-
- Vector256 cmLo = Avx.UnpackLow(c, m);
- Vector256 yoLo = Avx.UnpackLow(y, one);
- Vector256 cmHi = Avx.UnpackHigh(c, m);
- Vector256 yoHi = Avx.UnpackHigh(y, one);
-
- ref Vector256 destination = ref Unsafe.Add(ref resultBase, i * 4);
-
- destination = Avx.Shuffle(cmLo, yoLo, 0b01_00_01_00);
- Unsafe.Add(ref destination, 1) = Avx.Shuffle(cmLo, yoLo, 0b11_10_11_10);
- Unsafe.Add(ref destination, 2) = Avx.Shuffle(cmHi, yoHi, 0b01_00_01_00);
- Unsafe.Add(ref destination, 3) = Avx.Shuffle(cmHi, yoHi, 0b11_10_11_10);
}
#endif
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromCmykBasic.ConvertCore(values, result, this.MaximumValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromCmykBasic.ConvertCoreInplace(values, this.MaximumValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykBasic.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykBasic.cs
index 6cbd52ec3d..b0ad50301b 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykBasic.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykBasic.cs
@@ -15,38 +15,27 @@ public FromCmykBasic(int precision)
{
}
- public override void ConvertToRgba(in ComponentValues values, Span result)
- {
- ConvertCore(values, result, this.MaximumValue);
- }
+ public override void ConvertToRgbInplace(in ComponentValues values) =>
+ ConvertCoreInplace(values, this.MaximumValue);
- internal static void ConvertCore(in ComponentValues values, Span result, float maxValue)
+ internal static void ConvertCoreInplace(in ComponentValues values, float maxValue)
{
- ReadOnlySpan cVals = values.Component0;
- ReadOnlySpan mVals = values.Component1;
- ReadOnlySpan yVals = values.Component2;
- ReadOnlySpan kVals = values.Component3;
-
- var v = new Vector4(0, 0, 0, 1F);
-
- var maximum = 1 / maxValue;
- var scale = new Vector4(maximum, maximum, maximum, 1F);
+ Span c0 = values.Component0;
+ Span c1 = values.Component1;
+ Span c2 = values.Component2;
+ Span c3 = values.Component3;
- for (int i = 0; i < result.Length; i++)
+ float scale = 1 / maxValue;
+ for (int i = 0; i < c0.Length; i++)
{
- float c = cVals[i];
- float m = mVals[i];
- float y = yVals[i];
- float k = kVals[i] / maxValue;
-
- v.X = c * k;
- v.Y = m * k;
- v.Z = y * k;
- v.W = 1F;
-
- v *= scale;
-
- result[i] = v;
+ float c = c0[i];
+ float m = c1[i];
+ float y = c2[i];
+ float k = c3[i] / maxValue;
+
+ c0[i] = c * k * scale;
+ c1[i] = m * k * scale;
+ c2[i] = y * k * scale;
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykVector8.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykVector8.cs
index e75634b0fa..0da4c9ec23 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykVector8.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromCmykVector8.cs
@@ -18,7 +18,7 @@ public FromCmykVector8(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
ref Vector cBase =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
@@ -29,43 +29,25 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span kBase =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component3));
- ref Vector4Octet resultBase =
- ref Unsafe.As(ref MemoryMarshal.GetReference(result));
-
- Vector4Pair cc = default;
- Vector4Pair mm = default;
- Vector4Pair yy = default;
- ref Vector ccRefAsVector = ref Unsafe.As>(ref cc);
- ref Vector mmRefAsVector = ref Unsafe.As>(ref mm);
- ref Vector yyRefAsVector = ref Unsafe.As>(ref yy);
-
var scale = new Vector(1 / this.MaximumValue);
// Walking 8 elements at one step:
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
- Vector c = Unsafe.Add(ref cBase, i);
- Vector m = Unsafe.Add(ref mBase, i);
- Vector y = Unsafe.Add(ref yBase, i);
+ ref Vector c = ref Unsafe.Add(ref cBase, i);
+ ref Vector m = ref Unsafe.Add(ref mBase, i);
+ ref Vector y = ref Unsafe.Add(ref yBase, i);
Vector k = Unsafe.Add(ref kBase, i) * scale;
c = (c * k) * scale;
m = (m * k) * scale;
y = (y * k) * scale;
-
- ccRefAsVector = c;
- mmRefAsVector = m;
- yyRefAsVector = y;
-
- // Collect (c0,c1...c8) (m0,m1...m8) (y0,y1...y8) vector values in the expected (r0,g0,g1,1), (r1,g1,g2,1) ... order:
- ref Vector4Octet destination = ref Unsafe.Add(ref resultBase, i);
- destination.Pack(ref cc, ref mm, ref yy);
}
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromCmykBasic.ConvertCore(values, result, this.MaximumValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromCmykBasic.ConvertCoreInplace(values, this.MaximumValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleAvx2.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleAvx2.cs
index 45846a6b56..eca6b62920 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleAvx2.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleAvx2.cs
@@ -22,42 +22,26 @@ public FromGrayscaleAvx2(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
#if SUPPORTS_RUNTIME_INTRINSICS
- ref Vector256 gBase =
+ ref Vector256 c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector256 resultBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(result));
-
// Used for the color conversion
var scale = Vector256.Create(1 / this.MaximumValue);
- var one = Vector256.Create(1F);
-
- // Used for packing
- ref byte control = ref MemoryMarshal.GetReference(HwIntrinsics.PermuteMaskEvenOdd8x32);
- Vector256 vcontrol = Unsafe.As>(ref control);
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
- Vector256 g = Avx.Multiply(Unsafe.Add(ref gBase, i), scale);
-
- g = Avx2.PermuteVar8x32(g, vcontrol);
-
- ref Vector256 destination = ref Unsafe.Add(ref resultBase, i * 4);
-
- destination = Avx.Blend(Avx.Permute(g, 0b00_00_00_00), one, 0b1000_1000);
- Unsafe.Add(ref destination, 1) = Avx.Blend(Avx.Shuffle(g, g, 0b01_01_01_01), one, 0b1000_1000);
- Unsafe.Add(ref destination, 2) = Avx.Blend(Avx.Shuffle(g, g, 0b10_10_10_10), one, 0b1000_1000);
- Unsafe.Add(ref destination, 3) = Avx.Blend(Avx.Shuffle(g, g, 0b11_11_11_11), one, 0b1000_1000);
+ ref Vector256 c0 = ref Unsafe.Add(ref c0Base, i);
+ c0 = Avx.Multiply(c0, scale);
}
#endif
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromGrayscaleBasic.ConvertCore(values, result, this.MaximumValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromGrayscaleBasic.ScaleValues(values.Component0, this.MaximumValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleBasic.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleBasic.cs
index 0b7a220d94..76d57bf069 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleBasic.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromGrayScaleBasic.cs
@@ -17,25 +17,35 @@ public FromGrayscaleBasic(int precision)
{
}
- public override void ConvertToRgba(in ComponentValues values, Span result)
- {
- ConvertCore(values, result, this.MaximumValue);
- }
+ public override void ConvertToRgbInplace(in ComponentValues values) =>
+ ScaleValues(values.Component0, this.MaximumValue);
- internal static void ConvertCore(in ComponentValues values, Span result, float maxValue)
+ internal static void ScaleValues(Span values, float maxValue)
{
- var maximum = 1 / maxValue;
- var scale = new Vector4(maximum, maximum, maximum, 1F);
+ Span vecValues = MemoryMarshal.Cast(values);
- ref float sBase = ref MemoryMarshal.GetReference(values.Component0);
- ref Vector4 dBase = ref MemoryMarshal.GetReference(result);
+ var scaleVector = new Vector4(1 / maxValue);
- for (int i = 0; i < result.Length; i++)
+ for (int i = 0; i < vecValues.Length; i++)
{
- var v = new Vector4(Unsafe.Add(ref sBase, i));
- v.W = 1f;
- v *= scale;
- Unsafe.Add(ref dBase, i) = v;
+ vecValues[i] *= scaleVector;
+ }
+
+ values = values.Slice(vecValues.Length * 4);
+ if (!values.IsEmpty)
+ {
+ float scaleValue = 1f / maxValue;
+ values[0] *= scaleValue;
+
+ if ((uint)values.Length > 1)
+ {
+ values[1] *= scaleValue;
+
+ if ((uint)values.Length > 2)
+ {
+ values[2] *= scaleValue;
+ }
+ }
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbAvx2.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbAvx2.cs
index 8f04c91528..557e4e4173 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbAvx2.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbAvx2.cs
@@ -22,7 +22,7 @@ public FromRgbAvx2(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
#if SUPPORTS_RUNTIME_INTRINSICS
ref Vector256 rBase =
@@ -32,41 +32,23 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span bBase =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
- ref Vector256 resultBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(result));
-
// Used for the color conversion
var scale = Vector256.Create(1 / this.MaximumValue);
- var one = Vector256.Create(1F);
-
- // Used for packing
- ref byte control = ref MemoryMarshal.GetReference(HwIntrinsics.PermuteMaskEvenOdd8x32);
- Vector256 vcontrol = Unsafe.As>(ref control);
-
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
- Vector256 r = Avx.Multiply(Avx2.PermuteVar8x32(Unsafe.Add(ref rBase, i), vcontrol), scale);
- Vector256 g = Avx.Multiply(Avx2.PermuteVar8x32(Unsafe.Add(ref gBase, i), vcontrol), scale);
- Vector256 b = Avx.Multiply(Avx2.PermuteVar8x32(Unsafe.Add(ref bBase, i), vcontrol), scale);
-
- Vector256 rgLo = Avx.UnpackLow(r, g);
- Vector256 boLo = Avx.UnpackLow(b, one);
- Vector256 rgHi = Avx.UnpackHigh(r, g);
- Vector256 boHi = Avx.UnpackHigh(b, one);
-
- ref Vector256 destination = ref Unsafe.Add(ref resultBase, i * 4);
-
- destination = Avx.Shuffle(rgLo, boLo, 0b01_00_01_00);
- Unsafe.Add(ref destination, 1) = Avx.Shuffle(rgLo, boLo, 0b11_10_11_10);
- Unsafe.Add(ref destination, 2) = Avx.Shuffle(rgHi, boHi, 0b01_00_01_00);
- Unsafe.Add(ref destination, 3) = Avx.Shuffle(rgHi, boHi, 0b11_10_11_10);
+ ref Vector256 r = ref Unsafe.Add(ref rBase, i);
+ ref Vector256 g = ref Unsafe.Add(ref gBase, i);
+ ref Vector256 b = ref Unsafe.Add(ref bBase, i);
+ r = Avx.Multiply(r, scale);
+ g = Avx.Multiply(g, scale);
+ b = Avx.Multiply(b, scale);
}
#endif
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromRgbBasic.ConvertCore(values, result, this.MaximumValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromRgbBasic.ConvertCoreInplace(values, this.MaximumValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbBasic.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbBasic.cs
index ddca3fe2f6..1425e7b584 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbBasic.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbBasic.cs
@@ -3,6 +3,7 @@
using System;
using System.Numerics;
+using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters
{
@@ -15,36 +16,16 @@ public FromRgbBasic(int precision)
{
}
- public override void ConvertToRgba(in ComponentValues values, Span result)
+ public override void ConvertToRgbInplace(in ComponentValues values)
{
- ConvertCore(values, result, this.MaximumValue);
+ ConvertCoreInplace(values, this.MaximumValue);
}
- internal static void ConvertCore(in ComponentValues values, Span result, float maxValue)
+ internal static void ConvertCoreInplace(ComponentValues values, float maxValue)
{
- ReadOnlySpan rVals = values.Component0;
- ReadOnlySpan gVals = values.Component1;
- ReadOnlySpan bVals = values.Component2;
-
- var v = new Vector4(0, 0, 0, 1);
-
- var maximum = 1 / maxValue;
- var scale = new Vector4(maximum, maximum, maximum, 1F);
-
- for (int i = 0; i < result.Length; i++)
- {
- float r = rVals[i];
- float g = gVals[i];
- float b = bVals[i];
-
- v.X = r;
- v.Y = g;
- v.Z = b;
-
- v *= scale;
-
- result[i] = v;
- }
+ FromGrayscaleBasic.ScaleValues(values.Component0, maxValue);
+ FromGrayscaleBasic.ScaleValues(values.Component1, maxValue);
+ FromGrayscaleBasic.ScaleValues(values.Component2, maxValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbVector8.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbVector8.cs
index 763064d1e0..a00361d970 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbVector8.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromRgbVector8.cs
@@ -18,50 +18,32 @@ public FromRgbVector8(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
ref Vector rBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
+ ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
ref Vector gBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
+ ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
ref Vector bBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
-
- ref Vector4Octet resultBase =
- ref Unsafe.As(ref MemoryMarshal.GetReference(result));
-
- Vector4Pair rr = default;
- Vector4Pair gg = default;
- Vector4Pair bb = default;
- ref Vector rrRefAsVector = ref Unsafe.As>(ref rr);
- ref Vector ggRefAsVector = ref Unsafe.As>(ref gg);
- ref Vector bbRefAsVector = ref Unsafe.As>(ref bb);
+ ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
var scale = new Vector(1 / this.MaximumValue);
// Walking 8 elements at one step:
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
- Vector r = Unsafe.Add(ref rBase, i);
- Vector g = Unsafe.Add(ref gBase, i);
- Vector b = Unsafe.Add(ref bBase, i);
+ ref Vector r = ref Unsafe.Add(ref rBase, i);
+ ref Vector g = ref Unsafe.Add(ref gBase, i);
+ ref Vector b = ref Unsafe.Add(ref bBase, i);
r *= scale;
g *= scale;
b *= scale;
-
- rrRefAsVector = r;
- ggRefAsVector = g;
- bbRefAsVector = b;
-
- // Collect (r0,r1...r8) (g0,g1...g8) (b0,b1...b8) vector values in the expected (r0,g0,g1,1), (r1,g1,g2,1) ... order:
- ref Vector4Octet destination = ref Unsafe.Add(ref resultBase, i);
- destination.Pack(ref rr, ref gg, ref bb);
}
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromRgbBasic.ConvertCore(values, result, this.MaximumValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromRgbBasic.ConvertCoreInplace(values, this.MaximumValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrAvx2.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrAvx2.cs
index f3a0636200..5aae1faa27 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrAvx2.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrAvx2.cs
@@ -23,19 +23,16 @@ public FromYCbCrAvx2(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
- #if SUPPORTS_RUNTIME_INTRINSICS
- ref Vector256 yBase =
+#if SUPPORTS_RUNTIME_INTRINSICS
+ ref Vector256 c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector256 cbBase =
+ ref Vector256 c1Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
- ref Vector256 crBase =
+ ref Vector256 c2Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
- ref Vector256 resultBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(result));
-
// Used for the color conversion
var chromaOffset = Vector256.Create(-this.HalfValue);
var scale = Vector256.Create(1 / this.MaximumValue);
@@ -50,19 +47,19 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span vcontrol = Unsafe.As>(ref control);
// Walking 8 elements at one step:
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
// y = yVals[i];
// cb = cbVals[i] - 128F;
// cr = crVals[i] - 128F;
- Vector256 y = Unsafe.Add(ref yBase, i);
- Vector256 cb = Avx.Add(Unsafe.Add(ref cbBase, i), chromaOffset);
- Vector256 cr = Avx.Add(Unsafe.Add(ref crBase, i), chromaOffset);
+ ref Vector256 c0 = ref Unsafe.Add(ref c0Base, i);
+ ref Vector256 c1 = ref Unsafe.Add(ref c1Base, i);
+ ref Vector256 c2 = ref Unsafe.Add(ref c2Base, i);
- y = Avx2.PermuteVar8x32(y, vcontrol);
- cb = Avx2.PermuteVar8x32(cb, vcontrol);
- cr = Avx2.PermuteVar8x32(cr, vcontrol);
+ Vector256 y = c0;
+ Vector256 cb = Avx.Add(c1, chromaOffset);
+ Vector256 cr = Avx.Add(c2, chromaOffset);
// r = y + (1.402F * cr);
// g = y - (0.344136F * cb) - (0.714136F * cr);
@@ -72,30 +69,19 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span g = HwIntrinsics.MultiplyAdd(HwIntrinsics.MultiplyAdd(y, cb, gCbMult), cr, gCrMult);
Vector256 b = HwIntrinsics.MultiplyAdd(y, cb, bCbMult);
- // TODO: We should be saving to RGBA not Vector4
r = Avx.Multiply(Avx.RoundToNearestInteger(r), scale);
g = Avx.Multiply(Avx.RoundToNearestInteger(g), scale);
b = Avx.Multiply(Avx.RoundToNearestInteger(b), scale);
- Vector256 vte = Avx.UnpackLow(r, b);
- Vector256 vto = Avx.UnpackLow(g, va);
-
- ref Vector256 destination = ref Unsafe.Add(ref resultBase, i * 4);
-
- destination = Avx.UnpackLow(vte, vto);
- Unsafe.Add(ref destination, 1) = Avx.UnpackHigh(vte, vto);
-
- vte = Avx.UnpackHigh(r, b);
- vto = Avx.UnpackHigh(g, va);
-
- Unsafe.Add(ref destination, 2) = Avx.UnpackLow(vte, vto);
- Unsafe.Add(ref destination, 3) = Avx.UnpackHigh(vte, vto);
+ c0 = r;
+ c1 = g;
+ c2 = b;
}
#endif
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromYCbCrBasic.ConvertCore(values, result, this.MaximumValue, this.HalfValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromYCbCrBasic.ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrBasic.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrBasic.cs
index 352e4acb7e..990d29aa01 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrBasic.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrBasic.cs
@@ -15,35 +15,26 @@ public FromYCbCrBasic(int precision)
{
}
- public override void ConvertToRgba(in ComponentValues values, Span result)
- {
- ConvertCore(values, result, this.MaximumValue, this.HalfValue);
- }
+ public override void ConvertToRgbInplace(in ComponentValues values)
+ => ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
- internal static void ConvertCore(in ComponentValues values, Span result, float maxValue, float halfValue)
+ internal static void ConvertCoreInplace(in ComponentValues values, float maxValue, float halfValue)
{
- // TODO: We can optimize a lot here with Vector and SRCS.Unsafe()!
- ReadOnlySpan yVals = values.Component0;
- ReadOnlySpan cbVals = values.Component1;
- ReadOnlySpan crVals = values.Component2;
-
- var v = new Vector4(0, 0, 0, 1);
+ Span c0 = values.Component0;
+ Span c1 = values.Component1;
+ Span c2 = values.Component2;
- var scale = new Vector4(1 / maxValue, 1 / maxValue, 1 / maxValue, 1F);
+ var scale = 1 / maxValue;
- for (int i = 0; i < result.Length; i++)
+ for (int i = 0; i < c0.Length; i++)
{
- float y = yVals[i];
- float cb = cbVals[i] - halfValue;
- float cr = crVals[i] - halfValue;
-
- v.X = MathF.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero);
- v.Y = MathF.Round(y - (0.344136F * cb) - (0.714136F * cr), MidpointRounding.AwayFromZero);
- v.Z = MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero);
-
- v *= scale;
+ float y = c0[i];
+ float cb = c1[i] - halfValue;
+ float cr = c2[i] - halfValue;
- result[i] = v;
+ c0[i] = MathF.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero) * scale;
+ c1[i] = MathF.Round(y - (0.344136F * cb) - (0.714136F * cr), MidpointRounding.AwayFromZero) * scale;
+ c2[i] = MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero) * scale;
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector4.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector4.cs
index 42f8eef5a1..1ebc3e879d 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector4.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector4.cs
@@ -20,58 +20,54 @@ public FromYCbCrVector4(int precision)
protected override bool IsAvailable => SimdUtils.HasVector4;
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
- // TODO: Find a way to properly run & test this path on AVX2 PC-s! (Have I already mentioned that Vector is terrible?)
- DebugGuard.IsTrue(result.Length % 8 == 0, nameof(result), "result.Length should be divisible by 8!");
+ DebugGuard.IsTrue(values.Component0.Length % 8 == 0, nameof(values), "Length should be divisible by 8!");
- ref Vector4Pair yBase =
+ ref Vector4Pair c0Base =
ref Unsafe.As(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector4Pair cbBase =
+ ref Vector4Pair c1Base =
ref Unsafe.As(ref MemoryMarshal.GetReference(values.Component1));
- ref Vector4Pair crBase =
+ ref Vector4Pair c2Base =
ref Unsafe.As(ref MemoryMarshal.GetReference(values.Component2));
- ref Vector4Octet resultBase =
- ref Unsafe.As(ref MemoryMarshal.GetReference(result));
-
var chromaOffset = new Vector4(-this.HalfValue);
var maxValue = this.MaximumValue;
// Walking 8 elements at one step:
- int n = result.Length / 8;
+ nint n = values.Component0.Length / 8;
- for (int i = 0; i < n; i++)
+ for (nint i = 0; i < n; i++)
{
// y = yVals[i];
- Vector4Pair y = Unsafe.Add(ref yBase, i);
+ ref Vector4Pair c0 = ref Unsafe.Add(ref c0Base, i);
// cb = cbVals[i] - halfValue);
- Vector4Pair cb = Unsafe.Add(ref cbBase, i);
- cb.AddInplace(chromaOffset);
+ ref Vector4Pair c1 = ref Unsafe.Add(ref c1Base, i);
+ c1.AddInplace(chromaOffset);
// cr = crVals[i] - halfValue;
- Vector4Pair cr = Unsafe.Add(ref crBase, i);
- cr.AddInplace(chromaOffset);
+ ref Vector4Pair c2 = ref Unsafe.Add(ref c2Base, i);
+ c2.AddInplace(chromaOffset);
// r = y + (1.402F * cr);
- Vector4Pair r = y;
- Vector4Pair tmp = cr;
+ Vector4Pair r = c0;
+ Vector4Pair tmp = c2;
tmp.MultiplyInplace(1.402F);
r.AddInplace(ref tmp);
// g = y - (0.344136F * cb) - (0.714136F * cr);
- Vector4Pair g = y;
- tmp = cb;
+ Vector4Pair g = c0;
+ tmp = c1;
tmp.MultiplyInplace(-0.344136F);
g.AddInplace(ref tmp);
- tmp = cr;
+ tmp = c2;
tmp.MultiplyInplace(-0.714136F);
g.AddInplace(ref tmp);
// b = y + (1.772F * cb);
- Vector4Pair b = y;
- tmp = cb;
+ Vector4Pair b = c0;
+ tmp = c1;
tmp.MultiplyInplace(1.772F);
b.AddInplace(ref tmp);
@@ -79,14 +75,14 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span result) =>
- FromYCbCrBasic.ConvertCore(values, result, this.MaximumValue, this.HalfValue);
+ protected override void ConvertCoreInplace(in ComponentValues values)
+ => FromYCbCrBasic.ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector8.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector8.cs
index abacf7161b..a077b9ed82 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector8.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYCbCrVector8.cs
@@ -19,41 +19,32 @@ public FromYCbCrVector8(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
- ref Vector yBase =
+ ref Vector c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector cbBase =
+ ref Vector c1Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
- ref Vector crBase =
+ ref Vector c2Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
- ref Vector4Octet resultBase =
- ref Unsafe.As(ref MemoryMarshal.GetReference(result));
-
var chromaOffset = new Vector(-this.HalfValue);
// Walking 8 elements at one step:
- int n = result.Length / 8;
-
- Vector4Pair rr = default;
- Vector4Pair gg = default;
- Vector4Pair bb = default;
-
- ref Vector rrRefAsVector = ref Unsafe.As>(ref rr);
- ref Vector ggRefAsVector = ref Unsafe.As>(ref gg);
- ref Vector bbRefAsVector = ref Unsafe.As>(ref bb);
-
+ nint n = values.Component0.Length / 8;
var scale = new Vector(1 / this.MaximumValue);
- for (int i = 0; i < n; i++)
+ for (nint i = 0; i < n; i++)
{
// y = yVals[i];
// cb = cbVals[i] - 128F;
// cr = crVals[i] - 128F;
- Vector y = Unsafe.Add(ref yBase, i);
- Vector cb = Unsafe.Add(ref cbBase, i) + chromaOffset;
- Vector cr = Unsafe.Add(ref crBase, i) + chromaOffset;
+ ref Vector c0 = ref Unsafe.Add(ref c0Base, i);
+ ref Vector c1 = ref Unsafe.Add(ref c1Base, i);
+ ref Vector c2 = ref Unsafe.Add(ref c2Base, i);
+ Vector y = Unsafe.Add(ref c0Base, i);
+ Vector cb = Unsafe.Add(ref c1Base, i) + chromaOffset;
+ Vector cr = Unsafe.Add(ref c2Base, i) + chromaOffset;
// r = y + (1.402F * cr);
// g = y - (0.344136F * cb) - (0.714136F * cr);
@@ -70,18 +61,14 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span result) =>
- FromYCbCrBasic.ConvertCore(values, result, this.MaximumValue, this.HalfValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromYCbCrBasic.ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKAvx2.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKAvx2.cs
index ea0132e1e9..a3500a096a 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKAvx2.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKAvx2.cs
@@ -22,52 +22,42 @@ public FromYccKAvx2(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
#if SUPPORTS_RUNTIME_INTRINSICS
- ref Vector256 yBase =
+ ref Vector256 c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector256 cbBase =
+ ref Vector256 c1Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component1));
- ref Vector256 crBase =
+ ref Vector256 c2Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component2));
ref Vector256 kBase =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component3));
- ref Vector256 resultBase =
- ref Unsafe.As>(ref MemoryMarshal.GetReference(result));
-
// Used for the color conversion
var chromaOffset = Vector256.Create(-this.HalfValue);
- var scale = Vector256.Create(1 / this.MaximumValue);
+ var scale = Vector256.Create(1 / (this.MaximumValue * this.MaximumValue));
var max = Vector256.Create(this.MaximumValue);
var rCrMult = Vector256.Create(1.402F);
var gCbMult = Vector256.Create(-0.344136F);
var gCrMult = Vector256.Create(-0.714136F);
var bCbMult = Vector256.Create(1.772F);
- // Used for packing.
- var va = Vector256.Create(1F);
- ref byte control = ref MemoryMarshal.GetReference(HwIntrinsics.PermuteMaskEvenOdd8x32);
- Vector256 vcontrol = Unsafe.As>(ref control);
-
// Walking 8 elements at one step:
- int n = result.Length / 8;
- for (int i = 0; i < n; i++)
+ nint n = values.Component0.Length / 8;
+ for (nint i = 0; i < n; i++)
{
// y = yVals[i];
// cb = cbVals[i] - 128F;
// cr = crVals[i] - 128F;
// k = kVals[i] / 256F;
- Vector256 y = Unsafe.Add(ref yBase, i);
- Vector256 cb = Avx.Add(Unsafe.Add(ref cbBase, i), chromaOffset);
- Vector256 cr = Avx.Add(Unsafe.Add(ref crBase, i), chromaOffset);
- Vector256 k = Avx.Divide(Unsafe.Add(ref kBase, i), max);
-
- y = Avx2.PermuteVar8x32(y, vcontrol);
- cb = Avx2.PermuteVar8x32(cb, vcontrol);
- cr = Avx2.PermuteVar8x32(cr, vcontrol);
- k = Avx2.PermuteVar8x32(k, vcontrol);
+ ref Vector256 c0 = ref Unsafe.Add(ref c0Base, i);
+ ref Vector256 c1 = ref Unsafe.Add(ref c1Base, i);
+ ref Vector256 c2 = ref Unsafe.Add(ref c2Base, i);
+ Vector256 y = c0;
+ Vector256 cb = Avx.Add(c1, chromaOffset);
+ Vector256 cr = Avx.Add(c2, chromaOffset);
+ Vector256 scaledK = Avx.Multiply(Unsafe.Add(ref kBase, i), scale);
// r = y + (1.402F * cr);
// g = y - (0.344136F * cb) - (0.714136F * cr);
@@ -82,29 +72,19 @@ protected override void ConvertCoreVectorized(in ComponentValues values, Span vte = Avx.UnpackLow(r, b);
- Vector256 vto = Avx.UnpackLow(g, va);
-
- ref Vector256 destination = ref Unsafe.Add(ref resultBase, i * 4);
-
- destination = Avx.UnpackLow(vte, vto);
- Unsafe.Add(ref destination, 1) = Avx.UnpackHigh(vte, vto);
-
- vte = Avx.UnpackHigh(r, b);
- vto = Avx.UnpackHigh(g, va);
+ r = Avx.Multiply(r, scaledK);
+ g = Avx.Multiply(g, scaledK);
+ b = Avx.Multiply(b, scaledK);
- Unsafe.Add(ref destination, 2) = Avx.UnpackLow(vte, vto);
- Unsafe.Add(ref destination, 3) = Avx.UnpackHigh(vte, vto);
+ c0 = r;
+ c1 = g;
+ c2 = b;
}
#endif
}
- protected override void ConvertCore(in ComponentValues values, Span result) =>
- FromYccKBasic.ConvertCore(values, result, this.MaximumValue, this.HalfValue);
+ protected override void ConvertCoreInplace(in ComponentValues values) =>
+ FromYccKBasic.ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKBasic.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKBasic.cs
index 778e5325ff..4833f48683 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKBasic.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKBasic.cs
@@ -15,39 +15,30 @@ public FromYccKBasic(int precision)
{
}
- public override void ConvertToRgba(in ComponentValues values, Span result)
- {
- ConvertCore(values, result, this.MaximumValue, this.HalfValue);
- }
+ public override void ConvertToRgbInplace(in ComponentValues values) =>
+ ConvertCoreInplace(values, this.MaximumValue, this.HalfValue);
- internal static void ConvertCore(in ComponentValues values, Span result, float maxValue, float halfValue)
+ internal static void ConvertCoreInplace(in ComponentValues values, float maxValue, float halfValue)
{
- // TODO: We can optimize a lot here with Vector and SRCS.Unsafe()!
- ReadOnlySpan yVals = values.Component0;
- ReadOnlySpan cbVals = values.Component1;
- ReadOnlySpan crVals = values.Component2;
- ReadOnlySpan kVals = values.Component3;
+ Span c0 = values.Component0;
+ Span c1 = values.Component1;
+ Span c2 = values.Component2;
+ Span c3 = values.Component3;
var v = new Vector4(0, 0, 0, 1F);
- var maximum = 1 / maxValue;
- var scale = new Vector4(maximum, maximum, maximum, 1F);
+ var scale = 1 / (maxValue * maxValue);
- for (int i = 0; i < result.Length; i++)
+ for (int i = 0; i < values.Component0.Length; i++)
{
- float y = yVals[i];
- float cb = cbVals[i] - halfValue;
- float cr = crVals[i] - halfValue;
- float k = kVals[i] / maxValue;
-
- v.X = (maxValue - MathF.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero)) * k;
- v.Y = (maxValue - MathF.Round(y - (0.344136F * cb) - (0.714136F * cr), MidpointRounding.AwayFromZero)) * k;
- v.Z = (maxValue - MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * k;
- v.W = 1F;
-
- v *= scale;
-
- result[i] = v;
+ float y = c0[i];
+ float cb = c1[i] - halfValue;
+ float cr = c2[i] - halfValue;
+ float scaledK = c3[i] * scale;
+
+ c0[i] = (maxValue - MathF.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero)) * scaledK;
+ c1[i] = (maxValue - MathF.Round(y - (0.344136F * cb) - (0.714136F * cr), MidpointRounding.AwayFromZero)) * scaledK;
+ c2[i] = (maxValue - MathF.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * scaledK;
}
}
}
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKVector8.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKVector8.cs
index c360392de8..f830e5042c 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKVector8.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/ColorConverters/JpegColorConverter.FromYccKVector8.cs
@@ -18,46 +18,39 @@ public FromYccKVector8(int precision)
{
}
- protected override void ConvertCoreVectorized(in ComponentValues values, Span result)
+ protected override void ConvertCoreVectorizedInplace(in ComponentValues values)
{
- ref Vector yBase =
+ ref Vector c0Base =
ref Unsafe.As>(ref MemoryMarshal.GetReference(values.Component0));
- ref Vector cbBase =
+ ref Vector c1Base =
ref Unsafe.As