|
|
|
@ -632,22 +632,55 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
private void TransposeInplace_Scalar() |
|
|
|
{ |
|
|
|
float tmp; |
|
|
|
int horIndex, verIndex; |
|
|
|
|
|
|
|
// We don't care about the last row as it consists of a single element
|
|
|
|
// Which won't be swapped with anything
|
|
|
|
for (int i = 0; i < 7; i++) |
|
|
|
ref float elemRef = ref Unsafe.As<Block8x8F, float>(ref this); |
|
|
|
|
|
|
|
// row #0
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 1), ref Unsafe.Add(ref elemRef, 8)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 2), ref Unsafe.Add(ref elemRef, 16)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 3), ref Unsafe.Add(ref elemRef, 24)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 4), ref Unsafe.Add(ref elemRef, 32)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 5), ref Unsafe.Add(ref elemRef, 40)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 6), ref Unsafe.Add(ref elemRef, 48)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 7), ref Unsafe.Add(ref elemRef, 56)); |
|
|
|
|
|
|
|
// row #1
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 10), ref Unsafe.Add(ref elemRef, 17)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 11), ref Unsafe.Add(ref elemRef, 25)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 12), ref Unsafe.Add(ref elemRef, 33)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 13), ref Unsafe.Add(ref elemRef, 41)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 14), ref Unsafe.Add(ref elemRef, 49)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 15), ref Unsafe.Add(ref elemRef, 57)); |
|
|
|
|
|
|
|
// row #2
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 19), ref Unsafe.Add(ref elemRef, 26)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 20), ref Unsafe.Add(ref elemRef, 34)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 21), ref Unsafe.Add(ref elemRef, 42)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 22), ref Unsafe.Add(ref elemRef, 50)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 23), ref Unsafe.Add(ref elemRef, 58)); |
|
|
|
|
|
|
|
// row #3
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 28), ref Unsafe.Add(ref elemRef, 35)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 29), ref Unsafe.Add(ref elemRef, 43)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 30), ref Unsafe.Add(ref elemRef, 51)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 31), ref Unsafe.Add(ref elemRef, 59)); |
|
|
|
|
|
|
|
// row #4
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 37), ref Unsafe.Add(ref elemRef, 44)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 38), ref Unsafe.Add(ref elemRef, 52)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 39), ref Unsafe.Add(ref elemRef, 60)); |
|
|
|
|
|
|
|
// row #5
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 46), ref Unsafe.Add(ref elemRef, 53)); |
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 47), ref Unsafe.Add(ref elemRef, 61)); |
|
|
|
|
|
|
|
// row #6
|
|
|
|
Swap(ref Unsafe.Add(ref elemRef, 55), ref Unsafe.Add(ref elemRef, 62)); |
|
|
|
|
|
|
|
static void Swap(ref float a, ref float b) |
|
|
|
{ |
|
|
|
// We don't care about the first element in each row as it's not swapped
|
|
|
|
for (int j = i + 1; j < 8; j++) |
|
|
|
{ |
|
|
|
horIndex = (i * 8) + j; |
|
|
|
verIndex = (j * 8) + i; |
|
|
|
tmp = this[horIndex]; |
|
|
|
this[horIndex] = this[verIndex]; |
|
|
|
this[verIndex] = tmp; |
|
|
|
} |
|
|
|
float tmp = a; |
|
|
|
a = b; |
|
|
|
b = tmp; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|