WebPSharedLossless.cpp 952 B

1234567891011121314151617181920212223242526272829303132333435
  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. }