diff --git a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepth.cs b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepthMetadata.cs similarity index 96% rename from src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepth.cs rename to src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepthMetadata.cs index 0a9db0f57..a6c9f7248 100644 --- a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepth.cs +++ b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlBitDepthMetadata.cs @@ -8,15 +8,15 @@ namespace SixLabors.ImageSharp.Formats.Jxl.IO.Metadata; /// /// Represents the JPEG XL Bit Depth image metadata. /// -internal sealed class JxlBitDepth : IJxlFields +internal sealed class JxlBitDepthMetadata : IJxlFields { private uint bitsPerSample; private uint exponentBitsPerSample; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// - public JxlBitDepth() => JxlBundle.Init(this); + public JxlBitDepthMetadata() => JxlBundle.Init(this); /// /// Gets or sets a value indicating whether diff --git a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlExtraChannelInfo.cs b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlExtraChannelInfo.cs index 5b492b102..16e149d1d 100644 --- a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlExtraChannelInfo.cs +++ b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlExtraChannelInfo.cs @@ -11,7 +11,7 @@ internal sealed class JxlExtraChannelInfo : IJxlFields public JxlExtraChannel Type { get; set; } - public JxlBitDepth? BitDepth { get; set; } + public JxlBitDepthMetadata? BitDepth { get; set; } public int DimensionShift { get; set; } diff --git a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlImageMetadata.cs b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlImageMetadata.cs index 1fcf00b6f..e05bb0951 100644 --- a/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlImageMetadata.cs +++ b/src/ImageSharp/Formats/Jxl/IO/Metadata/JxlImageMetadata.cs @@ -10,7 +10,7 @@ internal sealed class JxlImageMetadata : IJxlFields { public bool AllDefault { get; set; } - public JxlBitDepth? BitDepth { get; set; } + public JxlBitDepthMetadata? BitDepth { get; set; } public bool Modular16BitBufferSufficient { get; set; } // Otherwise, 32 is diff --git a/src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlDecoderCore.cs b/src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlDecoderCore.cs index 30dc630ff..35c52cc46 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlDecoderCore.cs +++ b/src/ImageSharp/Formats/Jxl/Processing/Decoder/JxlDecoderCore.cs @@ -442,7 +442,7 @@ internal sealed class JxlDecoderCore : ImageDecoderCore, IDisposable /// /// Bit depth for image output. /// - private JxlBitDepth imageOutputBitDepth = new(); + private JxlBitDepthMetadata imageOutputBitDepth = new(); public JxlDecoderCore(DecoderOptions options) : base(options) @@ -595,32 +595,6 @@ internal sealed class JxlDecoderCore : ImageDecoderCore, IDisposable Container } - /// - /// Represents a data type. - /// - private enum JxlDataType : byte - { - /// - /// - /// - UInt8, - - /// - /// - /// - UInt16, - - /// - /// - /// - Float, - - /// - /// - /// - Float16 - } - /// /// Frame stage for this decoder. /// @@ -858,12 +832,12 @@ internal sealed class JxlDecoderCore : ImageDecoderCore, IDisposable return JxlSignature.Invalid; } - private static int BitsPerChannel(JxlDataType dataType) + private static uint BitsPerChannel(JxlDataType dataType) => dataType switch { - JxlDataType.UInt8 => 8, - JxlDataType.UInt16 or JxlDataType.Float16 => 16, - JxlDataType.Float => 32, + JxlDataType.Byte => 8, + JxlDataType.UInt16 or JxlDataType.Half => 16, + JxlDataType.Single => 32, _ => 0 }; diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepth.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepth.cs new file mode 100644 index 000000000..52b384bb9 --- /dev/null +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepth.cs @@ -0,0 +1,27 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jxl.Processing; + +/// +/// Describes the interpretation of the input and output +/// buffers. +/// +internal struct JxlBitDepth +{ + /// + /// Gets or sets the kind of bit depth. + /// + public JxlBitDepthType Type { get; set; } + + /// + /// Gets or sets the number of bits per sample when the + /// bit depth type is custom. + /// + public uint BitsPerSample { get; set; } + + /// + /// Gets or sets the custom exponent bits per sample. + /// + public uint ExponentBitsPerSample { get; set; } +} diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepthType.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepthType.cs new file mode 100644 index 000000000..e942d57a4 --- /dev/null +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlBitDepthType.cs @@ -0,0 +1,35 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jxl.Processing; + +/// +/// Specifies the kind of bit depth. +/// +internal enum JxlBitDepthType : byte +{ + /// + /// Default setting, where the encoder expects the + /// input pixels to use the full range of the pixel format + /// data type (e.g. for ushort, the input range is 0..65535 + /// and the value 65535 is mapped to 1.0 when converting + /// to float), and the decoder uses the full range to output + /// pixels. + /// + FromPixelFormat, + + /// + /// When selected, the encoder expects the input pixels + /// to be in the range defined by the bits per sample value of the + /// basic info (e.g., for 12-bit images using ushort data types + /// the range is 0..4095 and the 4095 value is mapped to 1.0 when + /// converting to float), and the decoder outputs pixels in + /// this range. + /// + FromCodeStream, + + /// + /// Specifies custom ranges for pixel outputs. + /// + Custom = 2, +} diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlDataType.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlDataType.cs new file mode 100644 index 000000000..a9c8057e6 --- /dev/null +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlDataType.cs @@ -0,0 +1,31 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jxl.Processing; + +/// +/// Specifies which data type to use for sample values +/// per channel per pixel. +/// +internal enum JxlDataType : byte +{ + /// + /// Use float + /// + Single = 0, + + /// + /// Use byte. May clip wide color gamut data. + /// + Byte = 2, + + /// + /// Use ushort. May clip wide color gamut data. + /// + UInt16 = 3, + + /// + /// Use 16-bit IEEE 754 half-precision floating-point values. + /// + Half = 5 +} diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlEndianness.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlEndianness.cs new file mode 100644 index 000000000..a7c9dbc1a --- /dev/null +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlEndianness.cs @@ -0,0 +1,25 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jxl.Processing; + +/// +/// Specifies the ordering of multi-byte data. +/// +internal enum JxlEndianness : byte +{ + /// + /// Use endianness of the CPU/system. + /// + Native, + + /// + /// Force little endian. + /// + Little, + + /// + /// Force big endian. + /// + Big +} diff --git a/src/ImageSharp/Formats/Jxl/Processing/JxlPixelFormat.cs b/src/ImageSharp/Formats/Jxl/Processing/JxlPixelFormat.cs new file mode 100644 index 000000000..15aa58715 --- /dev/null +++ b/src/ImageSharp/Formats/Jxl/Processing/JxlPixelFormat.cs @@ -0,0 +1,34 @@ +// Copyright (c) Six Labors. +// Licensed under the Six Labors Split License. + +namespace SixLabors.ImageSharp.Formats.Jxl.Processing; + +/// +/// Data type for the sample values per channel per pixel +/// for the output buffer for pixels. +/// +internal struct JxlPixelFormat +{ + /// + /// Gets or sets the amount of channels available in a pixel buffer. + /// + public int Channels { get; set; } + + /// + /// Gets or sets the data type of each channel. + /// + public JxlDataType DataType { get; set; } + + /// + /// Gets or sets a value that denotes whether multi-byte data types are represented in + /// big-endian or little-endian format. Applies to ushort + /// and float data types. + /// + public JxlEndianness Endianness { get; set; } + + /// + /// Gets or sets the alignment of scanlines to a multiple of + /// align bytes. + /// + public int Align { get; set; } +}