WebPSharedLossless.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /*
  2. * Copyright (c) 2024, Nico Weber <thakis@chromium.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibCompress/Deflate.h>
  8. namespace Gfx {
  9. // WebP-lossless's CanonicalCodes are almost identical to deflate's.
  10. // One difference is that codes with a single element in webp-lossless consume 0 bits to produce that single element,
  11. // while they consume 1 bit in Compress::CanonicalCode. This class wraps Compress::CanonicalCode to handle the case
  12. // where the codes contain just a single element, and dispatches to Compress::CanonicalCode else.
  13. class CanonicalCode {
  14. public:
  15. CanonicalCode()
  16. : m_code(0)
  17. {
  18. }
  19. static ErrorOr<CanonicalCode> from_bytes(ReadonlyBytes);
  20. ErrorOr<u32> read_symbol(LittleEndianInputBitStream&) const;
  21. ErrorOr<void> write_symbol(LittleEndianOutputBitStream&, u32) const;
  22. private:
  23. explicit CanonicalCode(u32 single_symbol)
  24. : m_code(single_symbol)
  25. {
  26. }
  27. explicit CanonicalCode(Compress::CanonicalCode code)
  28. : m_code(move(code))
  29. {
  30. }
  31. Variant<u32, Compress::CanonicalCode> m_code;
  32. };
  33. // https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification#61_overview
  34. // "From here on, we refer to this set as a prefix code group."
  35. class PrefixCodeGroup {
  36. public:
  37. PrefixCodeGroup() = default;
  38. PrefixCodeGroup(PrefixCodeGroup&&) = default;
  39. PrefixCodeGroup(PrefixCodeGroup const&) = delete;
  40. CanonicalCode& operator[](int i) { return m_codes[i]; }
  41. CanonicalCode const& operator[](int i) const { return m_codes[i]; }
  42. private:
  43. Array<CanonicalCode, 5> m_codes;
  44. };
  45. }