/* * Copyright (c) 2024, Nico Weber * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include namespace Gfx { // WebP-lossless's CanonicalCodes are almost identical to deflate's. // One difference is that codes with a single element in webp-lossless consume 0 bits to produce that single element, // while they consume 1 bit in Compress::CanonicalCode. This class wraps Compress::CanonicalCode to handle the case // where the codes contain just a single element, and dispatches to Compress::CanonicalCode else. class CanonicalCode { public: CanonicalCode() : m_code(0) { } static ErrorOr from_bytes(ReadonlyBytes); ErrorOr read_symbol(LittleEndianInputBitStream&) const; ErrorOr write_symbol(LittleEndianOutputBitStream&, u32) const; private: explicit CanonicalCode(u32 single_symbol) : m_code(single_symbol) { } explicit CanonicalCode(Compress::CanonicalCode code) : m_code(move(code)) { } Variant m_code; }; // https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification#61_overview // "From here on, we refer to this set as a prefix code group." class PrefixCodeGroup { public: PrefixCodeGroup() = default; PrefixCodeGroup(PrefixCodeGroup&&) = default; PrefixCodeGroup(PrefixCodeGroup const&) = delete; CanonicalCode& operator[](int i) { return m_codes[i]; } CanonicalCode const& operator[](int i) const { return m_codes[i]; } private: Array m_codes; }; }