|
|
|
@ -85,6 +85,8 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Load raw 32bit floating point data from source
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">block pointer</param>
|
|
|
|
/// <param name="source">source</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
public static unsafe void LoadFrom(Block8x8F* blockPtr, MutableSpan<float> source) |
|
|
|
{ |
|
|
|
@ -94,6 +96,8 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">block pointer</param>
|
|
|
|
/// <param name="dest">destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
public static unsafe void CopyTo(Block8x8F* blockPtr, MutableSpan<float> dest) |
|
|
|
{ |
|
|
|
@ -103,6 +107,7 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Load raw 32bit floating point data from source
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">source</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
public unsafe void LoadFrom(MutableSpan<float> source) |
|
|
|
{ |
|
|
|
@ -115,6 +120,7 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
public unsafe void CopyTo(MutableSpan<float> dest) |
|
|
|
{ |
|
|
|
@ -127,6 +133,7 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
public unsafe void CopyTo(float[] dest) |
|
|
|
{ |
|
|
|
@ -161,17 +168,17 @@ namespace ImageSharp.Formats |
|
|
|
/// Apply floating point IDCT transformation into dest, using a temporary block 'temp' provided by the caller (optimization)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">Destination</param>
|
|
|
|
/// <param name="temp">Temporary block provided by the caller</param>
|
|
|
|
public void TransformIDCTInto(ref Block8x8F dest, ref Block8x8F temp) |
|
|
|
/// <param name="tempBlockPtr">Temporary block provided by the caller</param>
|
|
|
|
public void TransformIDCTInto(ref Block8x8F dest, ref Block8x8F tempBlockPtr) |
|
|
|
{ |
|
|
|
this.TransposeInto(ref temp); |
|
|
|
temp.IDCT8x4_LeftPart(ref dest); |
|
|
|
temp.IDCT8x4_RightPart(ref dest); |
|
|
|
this.TransposeInto(ref tempBlockPtr); |
|
|
|
tempBlockPtr.IDCT8x4_LeftPart(ref dest); |
|
|
|
tempBlockPtr.IDCT8x4_RightPart(ref dest); |
|
|
|
|
|
|
|
dest.TransposeInto(ref temp); |
|
|
|
dest.TransposeInto(ref tempBlockPtr); |
|
|
|
|
|
|
|
temp.IDCT8x4_LeftPart(ref dest); |
|
|
|
temp.IDCT8x4_RightPart(ref dest); |
|
|
|
tempBlockPtr.IDCT8x4_LeftPart(ref dest); |
|
|
|
tempBlockPtr.IDCT8x4_RightPart(ref dest); |
|
|
|
|
|
|
|
dest.MultiplyAllInplace(C_0_125); |
|
|
|
} |
|
|
|
@ -179,6 +186,8 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Pointer-based "Indexer" (getter part)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">block pointer</param>
|
|
|
|
/// <param name="idx">index</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
internal static unsafe float GetScalarAt(Block8x8F* blockPtr, int idx) |
|
|
|
{ |
|
|
|
@ -189,6 +198,9 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Pointer-based "Indexer" (setter part)
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">block pointer</param>
|
|
|
|
/// <param name="idx">index</param>
|
|
|
|
/// <param name="value">value</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
internal static unsafe void SetScalarAt(Block8x8F* blockPtr, int idx, float value) |
|
|
|
{ |
|
|
|
@ -196,11 +208,17 @@ namespace ImageSharp.Formats |
|
|
|
fp[idx] = value; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Un-zig
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">block pointer</param>
|
|
|
|
/// <param name="qtPtr">qt pointer</param>
|
|
|
|
/// <param name="unzigPtr">unzig pointer</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
internal static unsafe void UnZig(Block8x8F* block, Block8x8F* qt, int* unzigPtr) |
|
|
|
internal static unsafe void UnZig(Block8x8F* blockPtr, Block8x8F* qtPtr, int* unzigPtr) |
|
|
|
{ |
|
|
|
float* b = (float*)block; |
|
|
|
float* qtp = (float*)qt; |
|
|
|
float* b = (float*)blockPtr; |
|
|
|
float* qtp = (float*)qtPtr; |
|
|
|
for (int zig = 0; zig < BlockF.BlockSize; zig++) |
|
|
|
{ |
|
|
|
float* unzigPos = b + unzigPtr[zig]; |
|
|
|
@ -213,6 +231,7 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">destination</param>
|
|
|
|
internal unsafe void CopyTo(MutableSpan<int> dest) |
|
|
|
{ |
|
|
|
fixed (Vector4* ptr = &this.V0L) |
|
|
|
@ -228,6 +247,7 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Load raw 32bit floating point data from source
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">source</param>
|
|
|
|
internal unsafe void LoadFrom(MutableSpan<int> source) |
|
|
|
{ |
|
|
|
fixed (Vector4* ptr = &this.V0L) |
|
|
|
@ -301,8 +321,9 @@ namespace ImageSharp.Formats |
|
|
|
/// Original source:
|
|
|
|
/// https://github.com/norishigefukushima/dct_simd/blob/master/dct/dct8x8_simd.cpp#L261
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="destBlockPtr">destination block pointer</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
internal void IDCT8x4_RightPart(ref Block8x8F d) |
|
|
|
internal void IDCT8x4_RightPart(ref Block8x8F destBlockPtr) |
|
|
|
{ |
|
|
|
Vector4 my1 = this.V1R; |
|
|
|
Vector4 my7 = this.V7R; |
|
|
|
@ -342,14 +363,14 @@ namespace ImageSharp.Formats |
|
|
|
my1 = mz1 + mz2; |
|
|
|
my2 = mz1 - mz2; |
|
|
|
|
|
|
|
d.V0R = my0 + mb0; |
|
|
|
d.V7R = my0 - mb0; |
|
|
|
d.V1R = my1 + mb1; |
|
|
|
d.V6R = my1 - mb1; |
|
|
|
d.V2R = my2 + mb2; |
|
|
|
d.V5R = my2 - mb2; |
|
|
|
d.V3R = my3 + mb3; |
|
|
|
d.V4R = my3 - mb3; |
|
|
|
destBlockPtr.V0R = my0 + mb0; |
|
|
|
destBlockPtr.V7R = my0 - mb0; |
|
|
|
destBlockPtr.V1R = my1 + mb1; |
|
|
|
destBlockPtr.V6R = my1 - mb1; |
|
|
|
destBlockPtr.V2R = my2 + mb2; |
|
|
|
destBlockPtr.V5R = my2 - mb2; |
|
|
|
destBlockPtr.V3R = my3 + mb3; |
|
|
|
destBlockPtr.V4R = my3 - mb3; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -383,12 +404,15 @@ namespace ImageSharp.Formats |
|
|
|
/// <summary>
|
|
|
|
/// Level shift by +128, clip to [0, 255], and write to buffer.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="buffer">color buffer</param>
|
|
|
|
/// <param name="stride">stride offset</param>
|
|
|
|
/// <param name="tempBlockPtr">temp block pointer</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
internal unsafe void CopyColorsTo(MutableSpan<byte> buffer, int stride, Block8x8F* temp) |
|
|
|
internal unsafe void CopyColorsTo(MutableSpan<byte> buffer, int stride, Block8x8F* tempBlockPtr) |
|
|
|
{ |
|
|
|
this.TransformByteConvetibleColorValuesInto(ref *temp); |
|
|
|
this.TransformByteConvetibleColorValuesInto(ref *tempBlockPtr); |
|
|
|
|
|
|
|
float* src = (float*)temp; |
|
|
|
float* src = (float*)tempBlockPtr; |
|
|
|
for (int i = 0; i < 8; i++) |
|
|
|
{ |
|
|
|
buffer[0] = (byte)src[0]; |
|
|
|
|