Browse Source

Use nint and rename scalar fallback

pull/1830/head
James Jackson-South 5 years ago
parent
commit
00d20b8ee5
  1. 56
      src/ImageSharp/Formats/Webp/Lossless/LosslessUtils.cs

56
src/ImageSharp/Formats/Webp/Lossless/LosslessUtils.cs

@ -128,7 +128,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (Avx2.IsSupported) if (Avx2.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 8; i += 8) for (i = 0; i <= numPixels - 8; i += 8)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -140,13 +140,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
AddGreenToBlueAndRedNoneVectorized(pixelData.Slice(i)); AddGreenToBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else if (Ssse3.IsSupported) else if (Ssse3.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 4; i += 4) for (i = 0; i <= numPixels - 4; i += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -158,13 +158,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
AddGreenToBlueAndRedNoneVectorized(pixelData.Slice(i)); AddGreenToBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else if (Sse2.IsSupported) else if (Sse2.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 4; i += 4) for (i = 0; i <= numPixels - 4; i += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -178,17 +178,17 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
AddGreenToBlueAndRedNoneVectorized(pixelData.Slice(i)); AddGreenToBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else else
#endif #endif
{ {
AddGreenToBlueAndRedNoneVectorized(pixelData); AddGreenToBlueAndRedScalar(pixelData);
} }
} }
private static void AddGreenToBlueAndRedNoneVectorized(Span<uint> pixelData) private static void AddGreenToBlueAndRedScalar(Span<uint> pixelData)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
for (int i = 0; i < numPixels; i++) for (int i = 0; i < numPixels; i++)
@ -208,7 +208,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (Avx2.IsSupported) if (Avx2.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 8; i += 8) for (i = 0; i <= numPixels - 8; i += 8)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -220,13 +220,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
SubtractGreenFromBlueAndRedNoneVectorized(pixelData.Slice(i)); SubtractGreenFromBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else if (Ssse3.IsSupported) else if (Ssse3.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 4; i += 4) for (i = 0; i <= numPixels - 4; i += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -238,13 +238,13 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
SubtractGreenFromBlueAndRedNoneVectorized(pixelData.Slice(i)); SubtractGreenFromBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else if (Sse2.IsSupported) else if (Sse2.IsSupported)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
int i; nint i;
for (i = 0; i <= numPixels - 4; i += 4) for (i = 0; i <= numPixels - 4; i += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), i);
@ -258,17 +258,17 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (i != numPixels) if (i != numPixels)
{ {
SubtractGreenFromBlueAndRedNoneVectorized(pixelData.Slice(i)); SubtractGreenFromBlueAndRedScalar(pixelData.Slice((int)i));
} }
} }
else else
#endif #endif
{ {
SubtractGreenFromBlueAndRedNoneVectorized(pixelData); SubtractGreenFromBlueAndRedScalar(pixelData);
} }
} }
private static void SubtractGreenFromBlueAndRedNoneVectorized(Span<uint> pixelData) private static void SubtractGreenFromBlueAndRedScalar(Span<uint> pixelData)
{ {
int numPixels = pixelData.Length; int numPixels = pixelData.Length;
for (int i = 0; i < numPixels; i++) for (int i = 0; i < numPixels; i++)
@ -401,7 +401,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
Vector256<int> multsrb = MkCst32(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue)); Vector256<int> multsrb = MkCst32(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue));
Vector256<int> multsb2 = MkCst32(Cst5b(m.RedToBlue), 0); Vector256<int> multsb2 = MkCst32(Cst5b(m.RedToBlue), 0);
int idx; nint idx;
for (idx = 0; idx <= numPixels - 8; idx += 8) for (idx = 0; idx <= numPixels - 8; idx += 8)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx);
@ -421,14 +421,14 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (idx != numPixels) if (idx != numPixels)
{ {
TransformColorNoneVectorized(m, pixelData.Slice(idx), numPixels - idx); TransformColorScalar(m, pixelData.Slice((int)idx), numPixels - (int)idx);
} }
} }
else if (Sse2.IsSupported) else if (Sse2.IsSupported)
{ {
Vector128<int> multsrb = MkCst16(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue)); Vector128<int> multsrb = MkCst16(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue));
Vector128<int> multsb2 = MkCst16(Cst5b(m.RedToBlue), 0); Vector128<int> multsb2 = MkCst16(Cst5b(m.RedToBlue), 0);
int idx; nint idx;
for (idx = 0; idx <= numPixels - 4; idx += 4) for (idx = 0; idx <= numPixels - 4; idx += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx);
@ -448,17 +448,17 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (idx != numPixels) if (idx != numPixels)
{ {
TransformColorNoneVectorized(m, pixelData.Slice(idx), numPixels - idx); TransformColorScalar(m, pixelData.Slice((int)idx), numPixels - (int)idx);
} }
} }
else else
#endif #endif
{ {
TransformColorNoneVectorized(m, pixelData, numPixels); TransformColorScalar(m, pixelData, numPixels);
} }
} }
private static void TransformColorNoneVectorized(Vp8LMultipliers m, Span<uint> data, int numPixels) private static void TransformColorScalar(Vp8LMultipliers m, Span<uint> data, int numPixels)
{ {
for (int i = 0; i < numPixels; i++) for (int i = 0; i < numPixels; i++)
{ {
@ -488,7 +488,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
{ {
Vector256<int> multsrb = MkCst32(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue)); Vector256<int> multsrb = MkCst32(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue));
Vector256<int> multsb2 = MkCst32(Cst5b(m.RedToBlue), 0); Vector256<int> multsb2 = MkCst32(Cst5b(m.RedToBlue), 0);
int idx; nint idx;
for (idx = 0; idx <= pixelData.Length - 8; idx += 8) for (idx = 0; idx <= pixelData.Length - 8; idx += 8)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx);
@ -509,7 +509,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (idx != pixelData.Length) if (idx != pixelData.Length)
{ {
TransformColorInverseNoneVectorized(m, pixelData.Slice(idx)); TransformColorInverseScalar(m, pixelData.Slice((int)idx));
} }
} }
else if (Sse2.IsSupported) else if (Sse2.IsSupported)
@ -517,7 +517,7 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
Vector128<int> multsrb = MkCst16(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue)); Vector128<int> multsrb = MkCst16(Cst5b(m.GreenToRed), Cst5b(m.GreenToBlue));
Vector128<int> multsb2 = MkCst16(Cst5b(m.RedToBlue), 0); Vector128<int> multsb2 = MkCst16(Cst5b(m.RedToBlue), 0);
int idx; nint idx;
for (idx = 0; idx <= pixelData.Length - 4; idx += 4) for (idx = 0; idx <= pixelData.Length - 4; idx += 4)
{ {
ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx); ref uint pos = ref Unsafe.Add(ref MemoryMarshal.GetReference(pixelData), idx);
@ -538,17 +538,17 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless
if (idx != pixelData.Length) if (idx != pixelData.Length)
{ {
TransformColorInverseNoneVectorized(m, pixelData.Slice(idx)); TransformColorInverseScalar(m, pixelData.Slice((int)idx));
} }
} }
else else
#endif #endif
{ {
TransformColorInverseNoneVectorized(m, pixelData); TransformColorInverseScalar(m, pixelData);
} }
} }
private static void TransformColorInverseNoneVectorized(Vp8LMultipliers m, Span<uint> pixelData) private static void TransformColorInverseScalar(Vp8LMultipliers m, Span<uint> pixelData)
{ {
for (int i = 0; i < pixelData.Length; i++) for (int i = 0; i < pixelData.Length; i++)
{ {

Loading…
Cancel
Save