/* * Copyright (c) 2023, Lucas Chollet * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include namespace Gfx::CCITT { // You can find a great overview of CCITT compression schemes here: // https://www.fileformat.info/mirror/egff/ch09_05.htm // The CCITT3 specification is accessible at this page: // https://www.itu.int/rec/T-REC-T.4/en // And CCITT4's specification is available here: // https://www.itu.int/rec/T-REC-T.6/en // The unidimensional scheme is originally described in: // 4.1 One-dimensional coding scheme // However, this function implements the TIFF variant (see TIFFLoader.h for a spec link), // differences are detailed in section: // Section 10: Modified Huffman Compression ErrorOr decode_ccitt_rle(ReadonlyBytes bytes, u32 image_width, u32 image_height); // While this is named for a CCITT context, this struct holds data like TIFF's T4Options tag struct Group3Options { enum class Mode : u8 { OneDimension, TwoDimensions, }; enum class Compression : u8 { Uncompressed, Compressed, }; enum class UseFillBits : u8 { No = 0, Yes = 1, }; Mode dimensions = Mode::OneDimension; Compression compression = Compression::Compressed; UseFillBits use_fill_bits = UseFillBits::No; }; ErrorOr decode_ccitt_group3(ReadonlyBytes bytes, u32 image_width, u32 image_height, Group3Options const& options); ErrorOr decode_ccitt_group4(ReadonlyBytes bytes, u32 image_width, u32 image_height); }