WebPSharedLossless.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /*
  2. * Copyright (c) 2024, Nico Weber <thakis@chromium.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGfx/ImageFormats/WebPSharedLossless.h>
  7. namespace Gfx {
  8. ErrorOr<CanonicalCode> CanonicalCode::from_bytes(ReadonlyBytes bytes)
  9. {
  10. auto non_zero_symbol_count = 0;
  11. auto last_non_zero_symbol = -1;
  12. for (size_t i = 0; i < bytes.size(); i++) {
  13. if (bytes[i] != 0) {
  14. non_zero_symbol_count++;
  15. last_non_zero_symbol = i;
  16. }
  17. }
  18. if (non_zero_symbol_count == 1)
  19. return CanonicalCode(last_non_zero_symbol);
  20. return CanonicalCode(TRY(Compress::CanonicalCode::from_bytes(bytes)));
  21. }
  22. ErrorOr<u32> CanonicalCode::read_symbol(LittleEndianInputBitStream& bit_stream) const
  23. {
  24. return TRY(m_code.visit(
  25. [](u32 single_code) -> ErrorOr<u32> { return single_code; },
  26. [&bit_stream](Compress::CanonicalCode const& code) { return code.read_symbol(bit_stream); }));
  27. }
  28. ErrorOr<void> CanonicalCode::write_symbol(LittleEndianOutputBitStream& bit_stream, u32 symbol) const
  29. {
  30. TRY(m_code.visit(
  31. [&](u32 single_code) -> ErrorOr<void> { VERIFY(symbol == single_code); return {};},
  32. [&](Compress::CanonicalCode const& code) { return code.write_symbol(bit_stream, symbol); }));
  33. return {};
  34. }
  35. }