diff --git a/src/ImageSharp/Formats/Jxl/Processing/Jpeg/Data/JpegDataConstants.cs b/src/ImageSharp/Formats/Jxl/Processing/Jpeg/Data/JpegDataConstants.cs index 525d3f4c0..7dd73a50c 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/Jpeg/Data/JpegDataConstants.cs +++ b/src/ImageSharp/Formats/Jxl/Processing/Jpeg/Data/JpegDataConstants.cs @@ -17,4 +17,89 @@ internal static class JpegDataConstants /// Maximum number of quantizer tables. /// public const int MaximumQuantizationTables = 4; + + /// + /// Maximum number of Huffman code tables. + /// + public const int MaxHuffmanTables = 4; + + /// + /// Maximum number of bits for a Huffman code. + /// + public const int JpegHuffmanMaxBitLength = 16; + + /// + /// Alphabet size for Huffman tables used in the JPEG format. + /// + public const int JpegHuffmanAlphabetSize = 256; + + /// + /// Alphabet size for Huffman tables used in the JPEG format. + /// + /// + /// This is specific to the DC coefficients of the Discrete + /// Cosine Transform. + /// + public const int JpegDcAlphabetSize = 12; + + /// + /// Maximum number of DHT "Define Huffman Tables" markers. + /// + public const int MaxDhtMarkers = 512; + + /// + /// Largest value for width OR height. + /// + public const int MaxDimPixels = 65535; + + /// + /// Marker that specifies APP1. + /// + public const int App1 = 0xE1; + + /// + /// Marker that specifies APP2. + /// + public const int App2 = 0xE2; + + /// + /// Gets the tag bytes specifying the ICC profile. + /// + public static ReadOnlySpan IccProfileTag => "ICC_PROFILE\0"u8; + + /// + /// Gets the tag bytes specifying the EXIF profile. + /// + public static ReadOnlySpan ExifTag => "Exif\0\0"u8; + + /// + /// Gets the tag bytes specifying the XMP profile. + /// + public static ReadOnlySpan XmpTag => "http://ns.adobe.com/xap/1.0/\0"u8; + + public static ReadOnlySpan JpegNaturalOrder => + [ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63 + ]; + + public static ReadOnlySpan JpegZigZagOrder => + [ + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 + ]; } diff --git a/src/ImageSharp/Formats/Jxl/Processing/Jpeg/README.md b/src/ImageSharp/Formats/Jxl/Processing/Jpeg/README.md index 4b98e0aff..bde5de389 100644 --- a/src/ImageSharp/Formats/Jxl/Processing/Jpeg/README.md +++ b/src/ImageSharp/Formats/Jxl/Processing/Jpeg/README.md @@ -7,3 +7,5 @@ This folder contains logic to: - JXL to JPEG This does not contain a JPEG codec. + +Logic in this folder is used for JPEG<->JXL lossless compression.