Browse Source

Add JsonConstructors

pull/2432/head
Brian Popow 3 years ago
parent
commit
c8d580cbe0
  1. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8BandProbas.cs
  2. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8CostArray.cs
  3. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8Costs.cs
  4. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8ProbaArray.cs
  5. 66
      src/ImageSharp/Formats/Webp/Lossy/Vp8Residual.cs
  6. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8Stats.cs
  7. 9
      src/ImageSharp/Formats/Webp/Lossy/Vp8StatsArray.cs

9
src/ImageSharp/Formats/Webp/Lossy/Vp8BandProbas.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
/// <summary>
@ -20,6 +22,13 @@ internal class Vp8BandProbas
}
}
/// <summary>
/// Initializes a new instance of the <see cref="Vp8BandProbas"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8BandProbas(Vp8ProbaArray[] probabilities) => this.Probabilities = probabilities;
/// <summary>
/// Gets the Probabilities.
/// </summary>

9
src/ImageSharp/Formats/Webp/Lossy/Vp8CostArray.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
internal class Vp8CostArray
@ -10,5 +12,12 @@ internal class Vp8CostArray
/// </summary>
public Vp8CostArray() => this.Costs = new ushort[67 + 1];
/// <summary>
/// Initializes a new instance of the <see cref="Vp8CostArray"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8CostArray(ushort[] costs) => this.Costs = costs;
public ushort[] Costs { get; }
}

9
src/ImageSharp/Formats/Webp/Lossy/Vp8Costs.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
internal class Vp8Costs
@ -17,6 +19,13 @@ internal class Vp8Costs
}
}
/// <summary>
/// Initializes a new instance of the <see cref="Vp8Costs"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8Costs(Vp8CostArray[] costs) => this.Costs = costs;
/// <summary>
/// Gets the Costs.
/// </summary>

9
src/ImageSharp/Formats/Webp/Lossy/Vp8ProbaArray.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
/// <summary>
@ -13,6 +15,13 @@ internal class Vp8ProbaArray
/// </summary>
public Vp8ProbaArray() => this.Probabilities = new byte[WebpConstants.NumProbas];
/// <summary>
/// Initializes a new instance of the <see cref="Vp8ProbaArray"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8ProbaArray(byte[] probabilities) => this.Probabilities = probabilities;
/// <summary>
/// Gets the probabilities.
/// </summary>

66
src/ImageSharp/Formats/Webp/Lossy/Vp8Residual.cs

@ -7,6 +7,7 @@ using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
@ -15,6 +16,22 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
/// </summary>
internal class Vp8Residual
{
public Vp8Residual()
{
}
[JsonConstructor]
public Vp8Residual(int first, int last, int coeffType, short[] coeffs, Vp8BandProbas[] prob, Vp8Stats[] stats, Vp8Costs[] costs)
{
this.First = first;
this.Last = last;
this.CoeffType = coeffType;
this.Coeffs = coeffs;
this.Prob = prob;
this.Stats = stats;
this.Costs = costs;
}
public int First { get; set; }
public int Last { get; set; }
@ -156,6 +173,55 @@ internal class Vp8Residual
return LossyUtils.Vp8BitCost(0, (byte)p0);
}
if (false)
{
Span<byte> scratch = stackalloc byte[32];
Span<byte> ctxs = scratch.Slice(0, 16);
Span<byte> levels = scratch.Slice(16);
Span<ushort> absLevels = stackalloc ushort[16];
// Precompute clamped levels and contexts, packed to 8b.
ref short outputRef = ref MemoryMarshal.GetReference<short>(this.Coeffs);
Vector256<short> c0 = Unsafe.As<short, Vector256<byte>>(ref outputRef).AsInt16();
Vector256<short> d0 = Avx2.Subtract(Vector256<short>.Zero, c0);
Vector256<short> e0 = Avx2.Max(c0, d0); // abs(v), 16b
Vector256<sbyte> f = Avx2.PackSignedSaturate(e0, e0);
Vector256<byte> g = Avx2.Min(f.AsByte(), Vector256.Create((byte)2));
Vector256<byte> h = Avx2.Min(f.AsByte(), Vector256.Create((byte)67)); // clampLevel in [0..67]
ref byte ctxsRef = ref MemoryMarshal.GetReference(ctxs);
ref byte levelsRef = ref MemoryMarshal.GetReference(levels);
ref ushort absLevelsRef = ref MemoryMarshal.GetReference(absLevels);
Unsafe.As<byte, Vector128<byte>>(ref ctxsRef) = g.GetLower();
Unsafe.As<byte, Vector128<byte>>(ref levelsRef) = h.GetLower();
Unsafe.As<ushort, Vector256<ushort>>(ref absLevelsRef) = e0.AsUInt16();
int level;
int flevel;
for (; n < this.Last; ++n)
{
int ctx = ctxs[n];
level = levels[n];
flevel = absLevels[n];
cost += WebpLookupTables.Vp8LevelFixedCosts[flevel] + t.Costs[level];
t = costs[n + 1].Costs[ctx];
}
// Last coefficient is always non-zero.
level = levels[n];
flevel = absLevels[n];
cost += WebpLookupTables.Vp8LevelFixedCosts[flevel] + t.Costs[level];
if (n < 15)
{
int b = WebpConstants.Vp8EncBands[n + 1];
int ctx = ctxs[n];
int lastP0 = this.Prob[b].Probabilities[ctx].Probabilities[0];
cost += LossyUtils.Vp8BitCost(0, (byte)lastP0);
}
return cost;
}
if (Sse2.IsSupported)
{
Span<byte> scratch = stackalloc byte[32];

9
src/ImageSharp/Formats/Webp/Lossy/Vp8Stats.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
internal class Vp8Stats
@ -17,5 +19,12 @@ internal class Vp8Stats
}
}
/// <summary>
/// Initializes a new instance of the <see cref="Vp8Stats"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8Stats(Vp8StatsArray[] stats) => this.Stats = stats;
public Vp8StatsArray[] Stats { get; }
}

9
src/ImageSharp/Formats/Webp/Lossy/Vp8StatsArray.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Text.Json.Serialization;
namespace SixLabors.ImageSharp.Formats.Webp.Lossy;
internal class Vp8StatsArray
@ -10,5 +12,12 @@ internal class Vp8StatsArray
/// </summary>
public Vp8StatsArray() => this.Stats = new uint[WebpConstants.NumProbas];
/// <summary>
/// Initializes a new instance of the <see cref="Vp8StatsArray"/> class.
/// Only used for unit tests.
/// </summary>
[JsonConstructor]
public Vp8StatsArray(uint[] stats) => this.Stats = stats;
public uint[] Stats { get; }
}

Loading…
Cancel
Save