|
|
|
@ -57,7 +57,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// <returns>The float value at the specified index</returns>
|
|
|
|
public float this[int idx] |
|
|
|
{ |
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
get |
|
|
|
{ |
|
|
|
GuardBlockIndex(idx); |
|
|
|
@ -65,7 +65,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
return Unsafe.Add(ref selfRef, idx); |
|
|
|
} |
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
set |
|
|
|
{ |
|
|
|
GuardBlockIndex(idx); |
|
|
|
@ -149,7 +149,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// <summary>
|
|
|
|
/// Fill the block with defaults (zeroes)
|
|
|
|
/// </summary>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void Clear() |
|
|
|
{ |
|
|
|
// The cheapest way to do this in C#:
|
|
|
|
@ -160,7 +160,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// Load raw 32bit floating point data from source
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="source">Source</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void LoadFrom(Span<float> source) |
|
|
|
{ |
|
|
|
ref byte s = ref Unsafe.As<float, byte>(ref MemoryMarshal.GetReference(source)); |
|
|
|
@ -174,7 +174,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">Block pointer</param>
|
|
|
|
/// <param name="source">Source</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public static unsafe void LoadFrom(Block8x8F* blockPtr, Span<float> source) |
|
|
|
{ |
|
|
|
blockPtr->LoadFrom(source); |
|
|
|
@ -200,7 +200,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">Destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void CopyTo(Span<float> dest) |
|
|
|
{ |
|
|
|
ref byte d = ref Unsafe.As<float, byte>(ref MemoryMarshal.GetReference(dest)); |
|
|
|
@ -214,7 +214,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">Pointer to block</param>
|
|
|
|
/// <param name="dest">Destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public static unsafe void CopyTo(Block8x8F* blockPtr, Span<byte> dest) |
|
|
|
{ |
|
|
|
float* fPtr = (float*)blockPtr; |
|
|
|
@ -230,7 +230,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// </summary>
|
|
|
|
/// <param name="blockPtr">Block pointer</param>
|
|
|
|
/// <param name="dest">Destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public static unsafe void CopyTo(Block8x8F* blockPtr, Span<float> dest) |
|
|
|
{ |
|
|
|
blockPtr->CopyTo(dest); |
|
|
|
@ -240,7 +240,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// Copy raw 32bit floating point data to dest
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="dest">Destination</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public unsafe void CopyTo(float[] dest) |
|
|
|
{ |
|
|
|
fixed (void* ptr = &this.V0L) |
|
|
|
@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// Multiply all elements of the block.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="value">The value to multiply by</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void MultiplyInplace(float value) |
|
|
|
{ |
|
|
|
this.V0L *= value; |
|
|
|
@ -300,7 +300,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// <summary>
|
|
|
|
/// Multiply all elements of the block by the corresponding elements of 'other'
|
|
|
|
/// </summary>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void MultiplyInplace(ref Block8x8F other) |
|
|
|
{ |
|
|
|
this.V0L *= other.V0L; |
|
|
|
@ -325,7 +325,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
/// Adds a vector to all elements of the block.
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="diff">The added vector</param>
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
public void AddToAllInplace(Vector4 diff) |
|
|
|
{ |
|
|
|
this.V0L += diff; |
|
|
|
@ -420,7 +420,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
private static void DivideRoundAll(ref Block8x8F a, ref Block8x8F b) |
|
|
|
{ |
|
|
|
a.V0L = DivideRound(a.V0L, b.V0L); |
|
|
|
@ -511,7 +511,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
return sb.ToString(); |
|
|
|
} |
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
private static Vector<float> NormalizeAndRound(Vector<float> row, Vector<float> off, Vector<float> max) |
|
|
|
{ |
|
|
|
row += off; |
|
|
|
@ -520,7 +520,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components |
|
|
|
return row.FastRound(); |
|
|
|
} |
|
|
|
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
|
|
[MethodImpl(InliningOptions.ShortMethod)] |
|
|
|
private static Vector4 DivideRound(Vector4 dividend, Vector4 divisor) |
|
|
|
{ |
|
|
|
// sign(dividend) = max(min(dividend, 1), -1)
|
|
|
|
|