Browse Source

Unroll XYZWShuffle4Slice3

js/color-alpha-handling
James Jackson-South 6 years ago
parent
commit
da4764645e
  1. 22
      src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs

22
src/ImageSharp/Common/Helpers/Shuffle/IShuffle4Slice3.cs

@ -65,9 +65,27 @@ namespace SixLabors.ImageSharp
ref Byte3 dBase = ref Unsafe.As<byte, Byte3>(ref MemoryMarshal.GetReference(dest));
int n = source.Length / 4;
for (int i = 0; i < n; i++)
int m = ImageMaths.Modulo4(n);
int u = n - m;
ref Byte3 dEnd = ref Unsafe.Add(ref dBase, u);
while (Unsafe.IsAddressLessThan(ref dBase, ref dEnd))
{
Unsafe.Add(ref dBase, 0) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, 0));
Unsafe.Add(ref dBase, 1) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, 1));
Unsafe.Add(ref dBase, 2) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, 2));
Unsafe.Add(ref dBase, 3) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, 3));
dBase = ref Unsafe.Add(ref dBase, 4);
sBase = ref Unsafe.Add(ref sBase, 4);
}
if (m > 0)
{
Unsafe.Add(ref dBase, i) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, i));
for (int i = u; i < n; i++)
{
Unsafe.Add(ref dBase, i) = Unsafe.As<uint, Byte3>(ref Unsafe.Add(ref sBase, i));
}
}
}
}

Loading…
Cancel
Save