mirror of https://github.com/SixLabors/ImageSharp
2 changed files with 81 additions and 0 deletions
@ -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(); |
|||
} |
|||
@ -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…
Reference in new issue