Browse Source

Implement field encodings, move IJxlFields

This is an implementation of field_encodings.h.

Note that I avoided implementing EnumValid() and Values() functions, as we have dedicated methods in .NET to do exactly that (Enum.IsDefined, Enum.GetValues)
pull/3153/head
winscripter 2 days ago
parent
commit
487410e55f
  1. 2
      src/ImageSharp/Formats/Jxl/Fields/IJxlFields.cs
  2. 21
      src/ImageSharp/Formats/Jxl/Fields/JxlFieldExpressions.cs
  3. 17
      src/ImageSharp/Formats/Jxl/Fields/JxlU32Distribution.cs
  4. 26
      src/ImageSharp/Formats/Jxl/Fields/JxlU32Enc.cs

2
src/ImageSharp/Formats/Jxl/IO/IJxlFields.cs → src/ImageSharp/Formats/Jxl/Fields/IJxlFields.cs

@ -1,7 +1,7 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.IO;
namespace SixLabors.ImageSharp.Formats.Jxl.Fields;
/// <summary>
/// Abstracts enumeration of all fields into a visitor.

21
src/ImageSharp/Formats/Jxl/Fields/JxlFieldExpressions.cs

@ -0,0 +1,21 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Fields;
internal static class JxlFieldExpressions
{
public static JxlU32Distribution Value(uint value)
{
const uint directConstant = JxlU32Distribution.DirectConstant;
return new(value | directConstant);
}
public static JxlU32Distribution BitsOffset(uint bits, uint offset)
=> new(((bits - 1u) & 0x1Fu) + ((offset & 0x3FFFFFFu) << 5));
public static JxlU32Distribution Bits(uint value) => BitsOffset(value, 0u);
public static int MakeBit(int index) => 1 << index;
}

17
src/ImageSharp/Formats/Jxl/Fields/JxlU32Distribution.cs

@ -0,0 +1,17 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Jxl.Fields;
internal struct JxlU32Distribution(uint d)
{
public const uint DirectConstant = 0x80000000u;
public readonly bool IsDirect => (d & DirectConstant) != 0;
public readonly uint Direct => d & (DirectConstant - 1u);
public readonly uint ExtraBits => (d & 0x1Fu) + 1u;
public readonly uint Offset => (d >> 5) & 0x3FFFFFF;
}

26
src/ImageSharp/Formats/Jxl/Fields/JxlU32Enc.cs

@ -0,0 +1,26 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Diagnostics;
namespace SixLabors.ImageSharp.Formats.Jxl.Fields;
internal readonly struct JxlU32Enc
{
private readonly InlineArray4<JxlU32Distribution> d = default;
public JxlU32Enc(JxlU32Distribution d0, JxlU32Distribution d1, JxlU32Distribution d2, JxlU32Distribution d3)
{
this.d[0] = d0;
this.d[1] = d1;
this.d[2] = d2;
this.d[3] = d3;
}
public JxlU32Distribution GetDistribution(int selector)
{
Debug.Assert(selector < 4, "Selector out of range");
return this.d[selector];
}
}
Loading…
Cancel
Save