Browse Source

Add ANS hybrid uint configuration & LZ77 parameters model

pull/3153/head
winscripter 15 hours ago
parent
commit
3ed56c954f
  1. 60
      src/ImageSharp/Formats/Jxl/IO/JxlAnsHybridUIntConfiguration.cs
  2. 21
      src/ImageSharp/Formats/Jxl/IO/JxlAnsLz77Parameters.cs

60
src/ImageSharp/Formats/Jxl/IO/JxlAnsHybridUIntConfiguration.cs

@ -0,0 +1,60 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Diagnostics;
using SixLabors.ImageSharp.Formats.Jxl.Fields;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
internal sealed class JxlAnsHybridUIntConfiguration : IJxlFields
{
public JxlAnsHybridUIntConfiguration(uint splitExponent = 4, uint msbInToken = 2, uint lsbInToken = 0)
{
this.SplitExponent = splitExponent;
this.SplitToken = 1u << (int)splitExponent;
this.MsbInToken = msbInToken;
this.LsbInToken = lsbInToken;
Debug.Assert(splitExponent >= msbInToken + lsbInToken, "Split exponent should be < msbInToken + lsbInToken");
}
public uint SplitExponent { get; set; }
public uint SplitToken { get; set; }
public uint MsbInToken { get; set; } // Most significant bit
public uint LsbInToken { get; set; } // Least significant bit
public uint LsbMask => (1u << (int)this.LsbInToken) - 1;
public void Encode(uint value, ref uint token, ref uint bitCount, ref uint bits)
{
if (value < this.SplitToken)
{
token = value;
bitCount = 0;
bits = 0;
}
else
{
uint n = FloorLog2Nonzero(value);
uint m = value - (1u << (int)n);
unchecked
{
// The following expression is quite complex.
// See https://github.com/libjxl/libjxl/blob/main/lib/jxl/dec_ans.h#L83C16-L86C47.
token = this.SplitToken +
(uint)(((n - this.SplitExponent) << (int)(this.MsbInToken + this.LsbInToken)) +
((m >> (int)(n - this.MsbInToken)) << (int)this.LsbInToken) +
(m & ((1 << (int)this.LsbInToken) - 1)));
bitCount = n - this.MsbInToken - this.LsbInToken;
bits = (value >> (int)this.LsbInToken) & ((1u << (int)bitCount) - 1);
}
}
}
public bool Visit(JxlVisitor visitor) => throw new NotImplementedException();
}

21
src/ImageSharp/Formats/Jxl/IO/JxlAnsLz77Parameters.cs

@ -0,0 +1,21 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using SixLabors.ImageSharp.Formats.Jxl.Fields;
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
internal sealed class JxlAnsLz77Parameters : IJxlFields
{
public bool Enabled { get; set; }
public uint MinimumSymbol { get; set; }
public uint MinimumLength { get; set; }
public JxlAnsHybridUIntConfiguration LengthUintConfig { get; set; } = new(0, 0, 0);
public int NonserializedDistanceContext { get; set; }
public bool Visit(JxlVisitor visitor) => throw new NotImplementedException();
}
Loading…
Cancel
Save