Run script/synch.sh: 0.4.0-alpha.5+3771.20240709
diff --git a/release/c/wuffs-v0.4.c b/release/c/wuffs-v0.4.c
index 54408ab..3fe55ee 100644
--- a/release/c/wuffs-v0.4.c
+++ b/release/c/wuffs-v0.4.c
@@ -81,15 +81,43 @@
 // each major.minor branch, the commit count should increase monotonically.
 //
 // WUFFS_VERSION was overridden by "wuffs gen -version" based on revision
-// a27a7598f09f289e5cf3c9f7d8c0bd8134c6a39d committed on 2024-04-06.
+// 3be81643cc77e83e0125b150502ea273bf02839d committed on 2024-07-09.
 #define WUFFS_VERSION 0x000040000
 #define WUFFS_VERSION_MAJOR 0
 #define WUFFS_VERSION_MINOR 4
 #define WUFFS_VERSION_PATCH 0
-#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.4"
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3742
-#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240406
-#define WUFFS_VERSION_STRING "0.4.0-alpha.4+3742.20240406"
+#define WUFFS_VERSION_PRE_RELEASE_LABEL "alpha.5"
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 3771
+#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 20240709
+#define WUFFS_VERSION_STRING "0.4.0-alpha.5+3771.20240709"
+
+// ---------------- Private Implementation Macros Re-definition Check
+
+// Users (those who #include the "wuffs-vM.N.c" file) should not define any
+// WUFFS_PRIVATE_IMPL__ETC macros, only WUFFS_CONFIG__ETC macros (and
+// WUFFS_IMPLEMENTATION). Mucking about with the private implementation macros
+// is not supported and may break when upgrading to newer Wuffs versions.
+
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ||       \
+    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ||        \
+    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ||          \
+    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ||       \
+    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ||       \
+    defined(WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) || \
+    defined(WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) ||     \
+    defined(WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) ||      \
+    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16) ||        \
+    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32) ||        \
+    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64) ||        \
+    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8)
+
+#if defined(__GNUC__) || defined(__clang__)
+#warning "Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported"
+#elif defined(_MSC_VER)
+#pragma message("Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported")
+#endif
+
+#endif
 
 // ---------------- Configuration
 
@@ -117,11 +145,11 @@
 // intrinsics. Look for __ARM_FEATURE_CRC32 instead.
 #if defined(__ARM_FEATURE_CRC32)
 #include <arm_acle.h>
-#define WUFFS_BASE__CPU_ARCH__ARM_CRC32
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32
 #endif  // defined(__ARM_FEATURE_CRC32)
 #if defined(__ARM_NEON)
 #include <arm_neon.h>
-#define WUFFS_BASE__CPU_ARCH__ARM_NEON
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON
 #endif  // defined(__ARM_NEON)
 #endif  // defined(__ARM_FEATURE_UNALIGNED) etc
 
@@ -129,26 +157,32 @@
 // POPCNT. This is checked at runtime via cpuid, not at compile time.
 //
 // Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2.
-#if defined(__i386__) || defined(__x86_64__)
+//
+// ----
+//
+// Technically, we could use the SSE family on 32-bit x86, not just 64-bit x86.
+// But some intrinsics don't compile in 32-bit mode. It's not worth the hassle.
+// https://github.com/google/wuffs/issues/145
+#if defined(__x86_64__)
 #if !defined(__native_client__)
 #include <cpuid.h>
 #include <x86intrin.h>
-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously).
-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY
-#if defined(__x86_64__)
-#define WUFFS_BASE__CPU_ARCH__X86_64
-#endif  // defined(__x86_64__)
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
 #endif  // !defined(__native_client__)
-#endif  // defined(__i386__) || defined(__x86_64__)
+#endif  // defined(__x86_64__)
 
 #elif defined(_MSC_VER)  // (#if-chain ref AVOID_CPU_ARCH_1)
 
-#if defined(_M_IX86) || defined(_M_X64)
-#if defined(__AVX__) || defined(__clang__)
-
+#if defined(_M_X64)
 // We need <intrin.h> for the __cpuid function.
 #include <intrin.h>
-// That's not enough for X64 SIMD, with clang-cl, if we want to use
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
+#if defined(__AVX2__) || defined(__clang__)
+
+// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use
 // "__attribute__((target(arg)))" without e.g. "/arch:AVX".
 //
 // Some web pages suggest that <immintrin.h> is all you need, as it pulls in
@@ -157,24 +191,22 @@
 #include <immintrin.h>  // AVX, AVX2, FMA, POPCNT
 #include <nmmintrin.h>  // SSE4.2
 #include <wmmintrin.h>  // AES, PCLMUL
-// X86_FAMILY means X86 (32-bit) or X86_64 (64-bit, obviously).
-#define WUFFS_BASE__CPU_ARCH__X86_FAMILY
-#if defined(_M_X64)
-#define WUFFS_BASE__CPU_ARCH__X86_64
-#endif  // defined(_M_X64)
+#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
 
-#else  // defined(__AVX__) || defined(__clang__)
+#else  // defined(__AVX2__) || defined(__clang__)
 
 // clang-cl (which defines both __clang__ and _MSC_VER) supports
 // "__attribute__((target(arg)))".
 //
 // For MSVC's cl.exe (unlike clang or gcc), SIMD capability is a compile-time
-// property of the source file (e.g. a /arch:AVX or -mavx compiler flag), not
+// property of the source file (e.g. a /arch:AVX2 or -mavx2 compiler flag), not
 // of individual functions (that can be conditionally selected at runtime).
-#pragma message("Wuffs with MSVC+IX86/X64 needs /arch:AVX for best performance")
+#if !defined(WUFFS_CONFIG__I_KNOW_THAT_WUFFS_MSVC_PERFORMS_BEST_WITH_ARCH_AVX2)
+#pragma message("Wuffs with MSVC+IX86/X64 performs best with /arch:AVX2")
+#endif
 
-#endif  // defined(__AVX__) || defined(__clang__)
-#endif  // defined(_M_IX86) || defined(_M_X64)
+#endif  // defined(__AVX2__) || defined(__clang__)
+#endif  // defined(_M_X64)
 
 #endif  // (#if-chain ref AVOID_CPU_ARCH_1)
 #endif  // (#if-chain ref AVOID_CPU_ARCH_0)
@@ -198,20 +230,20 @@
 
 static inline bool  //
 wuffs_base__cpu_arch__have_arm_crc32(void) {
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
   return true;
 #else
   return false;
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
 }
 
 static inline bool  //
 wuffs_base__cpu_arch__have_arm_neon(void) {
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
   return true;
 #else
   return false;
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 }
 
 static inline bool  //
@@ -220,7 +252,7 @@
     defined(__AVX2__)
   return true;
 #else
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   // GCC defines these macros but MSVC does not.
   //  - bit_AVX2 = (1 <<  5)
   const unsigned int avx2_ebx7 = 0x00000020;
@@ -258,9 +290,9 @@
     }
   }
 #else
-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
 #endif  // defined(__GNUC__); defined(_MSC_VER)
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   return false;
 #endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) &&
         // defined(__AVX2__)
@@ -271,7 +303,7 @@
 #if defined(__BMI2__)
   return true;
 #else
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   // GCC defines these macros but MSVC does not.
   //  - bit_BMI2 = (1 <<  8)
   const unsigned int bmi2_ebx7 = 0x00000100;
@@ -293,9 +325,9 @@
     return true;
   }
 #else
-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
 #endif  // defined(__GNUC__); defined(_MSC_VER)
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   return false;
 #endif  // defined(__BMI2__)
 }
@@ -305,7 +337,7 @@
 #if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
   return true;
 #else
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   // GCC defines these macros but MSVC does not.
   //  - bit_PCLMUL = (1 <<  1)
   //  - bit_POPCNT = (1 << 23)
@@ -329,9 +361,9 @@
     return true;
   }
 #else
-#error "WUFFS_BASE__CPU_ARCH__ETC combined with an unsupported compiler"
+#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
 #endif  // defined(__GNUC__); defined(_MSC_VER)
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
   return false;
 #endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
 }
@@ -13250,6 +13282,140 @@
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA) || defined(WUFFS_NONMONOLITHIC)
 
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+// ---------------- Public Consts
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_vp8__placeholder__struct wuffs_vp8__placeholder;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_vp8__placeholder__initialize(
+    wuffs_vp8__placeholder* self,
+    size_t sizeof_star_self,
+    uint64_t wuffs_version,
+    uint32_t options);
+
+size_t
+sizeof__wuffs_vp8__placeholder(void);
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
+
+wuffs_vp8__placeholder*
+wuffs_vp8__placeholder__alloc(void);
+
+// ---------------- Upcasts
+
+// ---------------- Public Function Prototypes
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_vp8__placeholder__struct {
+  // Do not access the private_impl's or private_data's fields directly. There
+  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+  // the wuffs_foo__bar__baz functions.
+  //
+  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+  struct {
+    uint32_t magic;
+    uint32_t active_coroutine;
+    wuffs_base__vtable null_vtable;
+
+    uint32_t f_placeholder;
+  } private_impl;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+  using unique_ptr = std::unique_ptr<wuffs_vp8__placeholder, wuffs_unique_ptr_deleter>;
+
+  // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+  static inline unique_ptr
+  alloc() {
+    return unique_ptr(wuffs_vp8__placeholder__alloc());
+  }
+#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+  // Disallow constructing or copying an object via standard C++ mechanisms,
+  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+  // size and field layout is not part of the public, stable, memory-safe API.
+  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+  // their first argument) rather than tweaking bar.private_impl.qux fields.
+  //
+  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+  // order to provide convenience methods. These forward on "this", so that you
+  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+  wuffs_vp8__placeholder__struct() = delete;
+  wuffs_vp8__placeholder__struct(const wuffs_vp8__placeholder__struct&) = delete;
+  wuffs_vp8__placeholder__struct& operator=(
+      const wuffs_vp8__placeholder__struct&) = delete;
+#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+  // As above, the size of the struct is not part of the public API, and unless
+  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+  // allocated, not stack allocated. Its size is not intended to be known at
+  // compile time, but it is unfortunately divulged as a side effect of
+  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+  // instead of "sizeof T", invoking the operator. To make the two values
+  // different, so that passing the latter will be rejected by the initialize
+  // function, we add an arbitrary amount of dead weight.
+  uint8_t dead_weight[123000000];  // 123 MB.
+#endif  // !defined(WUFFS_IMPLEMENTATION)
+
+  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+  initialize(
+      size_t sizeof_star_self,
+      uint64_t wuffs_version,
+      uint32_t options) {
+    return wuffs_vp8__placeholder__initialize(
+        this, sizeof_star_self, wuffs_version, options);
+  }
+
+#endif  // __cplusplus
+};  // struct wuffs_vp8__placeholder__struct
+
+#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
+
 #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
 
 // ---------------- Status Codes
@@ -13605,6 +13771,458 @@
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
 
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
+
+// ---------------- Status Codes
+
+extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[];
+extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[];
+extern const char wuffs_webp__error__bad_huffman_code[];
+extern const char wuffs_webp__error__bad_back_reference[];
+extern const char wuffs_webp__error__bad_color_cache[];
+extern const char wuffs_webp__error__bad_header[];
+extern const char wuffs_webp__error__bad_transform[];
+extern const char wuffs_webp__error__short_chunk[];
+extern const char wuffs_webp__error__truncated_input[];
+extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[];
+extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[];
+extern const char wuffs_webp__error__unsupported_webp_file[];
+
+// ---------------- Public Consts
+
+#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
+
+// ---------------- Struct Declarations
+
+typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// ---------------- Public Initializer Prototypes
+
+// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
+// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
+//
+// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
+// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_webp__decoder__initialize(
+    wuffs_webp__decoder* self,
+    size_t sizeof_star_self,
+    uint64_t wuffs_version,
+    uint32_t options);
+
+size_t
+sizeof__wuffs_webp__decoder(void);
+
+// ---------------- Allocs
+
+// These functions allocate and initialize Wuffs structs. They return NULL if
+// memory allocation fails. If they return non-NULL, there is no need to call
+// wuffs_foo__bar__initialize, but the caller is responsible for eventually
+// calling free on the returned pointer. That pointer is effectively a C++
+// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
+
+wuffs_webp__decoder*
+wuffs_webp__decoder__alloc(void);
+
+static inline wuffs_base__image_decoder*
+wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) {
+  return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc());
+}
+
+// ---------------- Upcasts
+
+static inline wuffs_base__image_decoder*
+wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder(
+    wuffs_webp__decoder* p) {
+  return (wuffs_base__image_decoder*)p;
+}
+
+// ---------------- Public Function Prototypes
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__get_quirk(
+    const wuffs_webp__decoder* self,
+    uint32_t a_key);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__set_quirk(
+    wuffs_webp__decoder* self,
+    uint32_t a_key,
+    uint64_t a_value);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_image_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__image_config* a_dst,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_frame_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__frame_config* a_dst,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_frame(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__pixel_blend a_blend,
+    wuffs_base__slice_u8 a_workbuf,
+    wuffs_base__decode_frame_options* a_opts);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
+wuffs_webp__decoder__frame_dirty_rect(
+    const wuffs_webp__decoder* self);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_webp__decoder__num_animation_loops(
+    const wuffs_webp__decoder* self);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__num_decoded_frame_configs(
+    const wuffs_webp__decoder* self);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__num_decoded_frames(
+    const wuffs_webp__decoder* self);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__restart_frame(
+    wuffs_webp__decoder* self,
+    uint64_t a_index,
+    uint64_t a_io_position);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_webp__decoder__set_report_metadata(
+    wuffs_webp__decoder* self,
+    uint32_t a_fourcc,
+    bool a_report);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__tell_me_more(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_dst,
+    wuffs_base__more_information* a_minfo,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_webp__decoder__workbuf_len(
+    const wuffs_webp__decoder* self);
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+// ---------------- Struct Definitions
+
+// These structs' fields, and the sizeof them, are private implementation
+// details that aren't guaranteed to be stable across Wuffs versions.
+//
+// See https://en.wikipedia.org/wiki/Opaque_pointer#C
+
+#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+struct wuffs_webp__decoder__struct {
+  // Do not access the private_impl's or private_data's fields directly. There
+  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
+  // the wuffs_foo__bar__baz functions.
+  //
+  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
+  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
+
+  struct {
+    uint32_t magic;
+    uint32_t active_coroutine;
+    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
+    wuffs_base__vtable null_vtable;
+
+    uint32_t f_pixfmt;
+    uint32_t f_width;
+    uint32_t f_height;
+    uint8_t f_call_sequence;
+    uint8_t f_code_length_code_lengths[19];
+    bool f_sub_chunk_has_padding;
+    uint64_t f_frame_config_io_position;
+    uint32_t f_riff_chunk_length;
+    uint32_t f_sub_chunk_length;
+    uint32_t f_bits;
+    uint32_t f_n_bits;
+    bool f_seen_transform[4];
+    uint8_t f_transform_type[4];
+    uint8_t f_transform_tile_size_log2[4];
+    uint32_t f_n_transforms;
+    uint32_t f_color_cache_bits;
+    uint32_t f_overall_color_cache_bits;
+    uint32_t f_overall_tile_size_log2;
+    uint32_t f_overall_n_huffman_groups;
+    uint32_t f_ht_n_symbols;
+    uint32_t f_ht_code_lengths_remaining;
+    uint32_t f_color_indexing_palette_size;
+    uint32_t f_color_indexing_width;
+    uint32_t f_workbuf_offset_for_transform[4];
+    uint32_t f_workbuf_offset_for_color_indexing;
+    wuffs_base__pixel_swizzler f_swizzler;
+
+    uint32_t p_decode_huffman_groups;
+    uint32_t p_decode_huffman_tree;
+    uint32_t p_decode_huffman_tree_simple;
+    uint32_t p_decode_code_length_code_lengths;
+    uint32_t p_build_code_lengths;
+    uint32_t p_decode_pixels_slow;
+    uint32_t p_decode_image_config;
+    uint32_t p_do_decode_image_config;
+    uint32_t p_do_decode_image_config_limited;
+    uint32_t p_do_decode_image_config_limited_vp8l;
+    uint32_t p_decode_frame_config;
+    uint32_t p_do_decode_frame_config;
+    uint32_t p_decode_frame;
+    uint32_t p_do_decode_frame;
+    uint32_t p_decode_transform;
+    uint32_t p_decode_color_cache_parameters;
+    uint32_t p_decode_hg_table;
+    uint32_t p_decode_pixels;
+  } private_impl;
+
+  struct {
+    uint8_t f_palette[1024];
+    uint32_t f_color_cache[2048];
+    uint16_t f_codes[2328];
+    uint16_t f_code_lengths[2328];
+    uint16_t f_code_lengths_huffman_nodes[37];
+    uint16_t f_huffman_nodes[256][6267];
+
+    struct {
+      uint32_t v_hg;
+      uint32_t v_ht;
+    } s_decode_huffman_groups;
+    struct {
+      uint32_t v_use_second_symbol;
+      uint32_t v_first_symbol_n_bits;
+      uint32_t v_symbol0;
+      uint32_t v_base_offset;
+    } s_decode_huffman_tree_simple;
+    struct {
+      uint32_t v_n_codes;
+      uint32_t v_i;
+    } s_decode_code_length_code_lengths;
+    struct {
+      uint32_t v_length_n_bits;
+      uint16_t v_prev_code_length;
+      uint32_t v_s;
+      uint32_t v_s_max;
+      uint16_t v_node;
+      uint16_t v_repeat_value;
+      uint32_t v_repeat_n_bits;
+    } s_build_code_lengths;
+    struct {
+      uint64_t v_p;
+      uint64_t v_p_max;
+      uint32_t v_tile_size_log2;
+      uint32_t v_width_in_tiles;
+      uint32_t v_x;
+      uint32_t v_y;
+      uint32_t v_hg;
+      uint16_t v_node;
+      uint32_t v_color;
+      uint32_t v_back_ref_len_n_bits;
+      uint32_t v_back_ref_len_minus_1;
+      uint32_t v_back_ref_dist_n_bits;
+      uint32_t v_back_ref_dist_premap_minus_1;
+      uint64_t v_color_cache_p;
+    } s_decode_pixels_slow;
+    struct {
+      uint64_t scratch;
+    } s_do_decode_image_config;
+    struct {
+      uint64_t scratch;
+    } s_do_decode_image_config_limited;
+    struct {
+      uint64_t scratch;
+    } s_do_decode_image_config_limited_vp8l;
+    struct {
+      uint32_t v_width;
+    } s_do_decode_frame;
+    struct {
+      uint32_t v_transform_type;
+      uint32_t v_tile_size_log2;
+    } s_decode_transform;
+    struct {
+      uint32_t v_tile_size_log2;
+    } s_decode_hg_table;
+  } private_data;
+
+#ifdef __cplusplus
+#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+  using unique_ptr = std::unique_ptr<wuffs_webp__decoder, wuffs_unique_ptr_deleter>;
+
+  // On failure, the alloc_etc functions return nullptr. They don't throw.
+
+  static inline unique_ptr
+  alloc() {
+    return unique_ptr(wuffs_webp__decoder__alloc());
+  }
+
+  static inline wuffs_base__image_decoder::unique_ptr
+  alloc_as__wuffs_base__image_decoder() {
+    return wuffs_base__image_decoder::unique_ptr(
+        wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder());
+  }
+#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
+
+#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+  // Disallow constructing or copying an object via standard C++ mechanisms,
+  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
+  // size and field layout is not part of the public, stable, memory-safe API.
+  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
+  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
+  // their first argument) rather than tweaking bar.private_impl.qux fields.
+  //
+  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
+  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
+  // order to provide convenience methods. These forward on "this", so that you
+  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
+  wuffs_webp__decoder__struct() = delete;
+  wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete;
+  wuffs_webp__decoder__struct& operator=(
+      const wuffs_webp__decoder__struct&) = delete;
+#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
+
+#if !defined(WUFFS_IMPLEMENTATION)
+  // As above, the size of the struct is not part of the public API, and unless
+  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
+  // allocated, not stack allocated. Its size is not intended to be known at
+  // compile time, but it is unfortunately divulged as a side effect of
+  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
+  // instead of "sizeof T", invoking the operator. To make the two values
+  // different, so that passing the latter will be rejected by the initialize
+  // function, we add an arbitrary amount of dead weight.
+  uint8_t dead_weight[123000000];  // 123 MB.
+#endif  // !defined(WUFFS_IMPLEMENTATION)
+
+  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+  initialize(
+      size_t sizeof_star_self,
+      uint64_t wuffs_version,
+      uint32_t options) {
+    return wuffs_webp__decoder__initialize(
+        this, sizeof_star_self, wuffs_version, options);
+  }
+
+  inline wuffs_base__image_decoder*
+  upcast_as__wuffs_base__image_decoder() {
+    return (wuffs_base__image_decoder*)this;
+  }
+
+  inline uint64_t
+  get_quirk(
+      uint32_t a_key) const {
+    return wuffs_webp__decoder__get_quirk(this, a_key);
+  }
+
+  inline wuffs_base__status
+  set_quirk(
+      uint32_t a_key,
+      uint64_t a_value) {
+    return wuffs_webp__decoder__set_quirk(this, a_key, a_value);
+  }
+
+  inline wuffs_base__status
+  decode_image_config(
+      wuffs_base__image_config* a_dst,
+      wuffs_base__io_buffer* a_src) {
+    return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src);
+  }
+
+  inline wuffs_base__status
+  decode_frame_config(
+      wuffs_base__frame_config* a_dst,
+      wuffs_base__io_buffer* a_src) {
+    return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src);
+  }
+
+  inline wuffs_base__status
+  decode_frame(
+      wuffs_base__pixel_buffer* a_dst,
+      wuffs_base__io_buffer* a_src,
+      wuffs_base__pixel_blend a_blend,
+      wuffs_base__slice_u8 a_workbuf,
+      wuffs_base__decode_frame_options* a_opts) {
+    return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
+  }
+
+  inline wuffs_base__rect_ie_u32
+  frame_dirty_rect() const {
+    return wuffs_webp__decoder__frame_dirty_rect(this);
+  }
+
+  inline uint32_t
+  num_animation_loops() const {
+    return wuffs_webp__decoder__num_animation_loops(this);
+  }
+
+  inline uint64_t
+  num_decoded_frame_configs() const {
+    return wuffs_webp__decoder__num_decoded_frame_configs(this);
+  }
+
+  inline uint64_t
+  num_decoded_frames() const {
+    return wuffs_webp__decoder__num_decoded_frames(this);
+  }
+
+  inline wuffs_base__status
+  restart_frame(
+      uint64_t a_index,
+      uint64_t a_io_position) {
+    return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position);
+  }
+
+  inline wuffs_base__empty_struct
+  set_report_metadata(
+      uint32_t a_fourcc,
+      bool a_report) {
+    return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report);
+  }
+
+  inline wuffs_base__status
+  tell_me_more(
+      wuffs_base__io_buffer* a_dst,
+      wuffs_base__more_information* a_minfo,
+      wuffs_base__io_buffer* a_src) {
+    return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
+  }
+
+  inline wuffs_base__range_ii_u64
+  workbuf_len() const {
+    return wuffs_webp__decoder__workbuf_len(this);
+  }
+
+#endif  // __cplusplus
+};  // struct wuffs_webp__decoder__struct
+
+#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
+
+#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
+
 #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
 
 // ---------------- Status Codes
@@ -14062,6 +14680,7 @@
 
 // ---------------- Status Codes
 
+extern const char wuffs_xz__error__bad_bcj_offset[];
 extern const char wuffs_xz__error__bad_block_header[];
 extern const char wuffs_xz__error__bad_checksum[];
 extern const char wuffs_xz__error__bad_filter[];
@@ -14251,6 +14870,7 @@
     } s_decode_block_header_with_padding;
     struct {
       uint8_t v_flags;
+      uint8_t v_filter_id;
       uint32_t v_shift;
       uint32_t v_f;
       uint64_t scratch;
@@ -14672,6 +15292,7 @@
   //  - WUFFS_BASE__FOURCC__PNG
   //  - WUFFS_BASE__FOURCC__TGA
   //  - WUFFS_BASE__FOURCC__WBMP
+  //  - WUFFS_BASE__FOURCC__WEBP
   virtual wuffs_base__image_decoder::unique_ptr  //
   SelectDecoder(uint32_t fourcc,
                 wuffs_base__slice_u8 prefix_data,
@@ -21043,7 +21664,7 @@
 
 // ---------------- Pixel Swizzler
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
@@ -21078,7 +21699,7 @@
                                                size_t dst_palette_len,
                                                const uint8_t* src_ptr,
                                                size_t src_len);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
 // --------
 
@@ -21914,7 +22535,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
@@ -21958,7 +22579,7 @@
   }
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -24626,7 +25247,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
@@ -24732,7 +25353,7 @@
 
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -25490,7 +26111,7 @@
 }
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 static uint64_t  //
 wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
@@ -25537,7 +26158,7 @@
 
   return len;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 static uint64_t  //
@@ -25714,6 +26335,87 @@
 // --------
 
 static uint64_t  //
+wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr,
+                                                   size_t dst_len,
+                                                   uint8_t* dst_palette_ptr,
+                                                   size_t dst_palette_len,
+                                                   const uint8_t* src_ptr,
+                                                   size_t src_len) {
+  size_t src_len4 = src_len / 4;
+  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
+  uint8_t* d = dst_ptr;
+  const uint8_t* s = src_ptr;
+  size_t n = len;
+
+  while (n >= 1) {
+    uint32_t s0 =
+        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
+            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
+    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
+
+    s += 1 * 4;
+    d += 1 * 1;
+    n -= 1;
+  }
+
+  return len;
+}
+
+static uint64_t  //
+wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over(
+    uint8_t* dst_ptr,
+    size_t dst_len,
+    uint8_t* dst_palette_ptr,
+    size_t dst_palette_len,
+    const uint8_t* src_ptr,
+    size_t src_len) {
+  size_t src_len4 = src_len / 4;
+  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
+  uint8_t* d = dst_ptr;
+  const uint8_t* s = src_ptr;
+  size_t n = len;
+
+  while (n >= 1) {
+    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
+    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
+        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
+
+    s += 1 * 4;
+    d += 1 * 1;
+    n -= 1;
+  }
+
+  return len;
+}
+
+static uint64_t  //
+wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr,
+                                    size_t dst_len,
+                                    uint8_t* dst_palette_ptr,
+                                    size_t dst_palette_len,
+                                    const uint8_t* src_ptr,
+                                    size_t src_len) {
+  size_t src_len4 = src_len / 4;
+  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
+  uint8_t* d = dst_ptr;
+  const uint8_t* s = src_ptr;
+  size_t n = len;
+
+  while (n >= 1) {
+    uint32_t s0 =
+        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
+    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
+
+    s += 1 * 4;
+    d += 1 * 1;
+    n -= 1;
+  }
+
+  return len;
+}
+
+static uint64_t  //
 wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr,
                                       size_t dst_len,
                                       uint8_t* dst_palette_ptr,
@@ -25858,7 +26560,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_xxxx__y__x86_sse42;
       }
@@ -26329,7 +27031,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__BGRX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
       }
@@ -26347,7 +27049,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
       }
@@ -26365,6 +27067,15 @@
     wuffs_base__slice_u8 src_palette,
     wuffs_base__pixel_blend blend) {
   switch (dst_pixfmt.repr) {
+    case WUFFS_BASE__PIXEL_FORMAT__Y:
+      switch (blend) {
+        case WUFFS_BASE__PIXEL_BLEND__SRC:
+          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src;
+        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
+          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over;
+      }
+      return NULL;
+
     case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
@@ -26427,7 +27138,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26622,7 +27333,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26644,6 +27355,9 @@
     wuffs_base__slice_u8 src_palette,
     wuffs_base__pixel_blend blend) {
   switch (dst_pixfmt.repr) {
+    case WUFFS_BASE__PIXEL_FORMAT__Y:
+      return wuffs_private_impl__swizzle_y__bgrx;
+
     case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
       return wuffs_private_impl__swizzle_bgr_565__bgrx;
 
@@ -26691,7 +27405,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__BGRX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
       }
@@ -26708,7 +27422,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
     case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
     case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
       if (wuffs_base__cpu_arch__have_x86_sse42()) {
         return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
       }
@@ -26747,7 +27461,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -26863,7 +27577,7 @@
     case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
       switch (blend) {
         case WUFFS_BASE__PIXEL_BLEND__SRC:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
           if (wuffs_base__cpu_arch__have_x86_sse42()) {
             return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
           }
@@ -27151,7 +27865,7 @@
 
 // --------
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
 static void  //
 wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
@@ -27188,7 +27902,7 @@
     bool first_column,
     bool last_column);
 #endif
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 
 // --------
 
@@ -28418,7 +29132,7 @@
       case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
       case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
       case WUFFS_BASE__PIXEL_FORMAT__BGRX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
         if (wuffs_base__cpu_arch__have_x86_avx2()) {
           conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2;
           break;
@@ -28429,7 +29143,7 @@
       case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
       case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
       case WUFFS_BASE__PIXEL_FORMAT__RGBX:
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
         if (wuffs_base__cpu_arch__have_x86_avx2()) {
           conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2;
           break;
@@ -28479,7 +29193,7 @@
     upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
     upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle;
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 #if defined(__GNUC__) && !defined(__clang__)
     // Don't use our AVX2 implementation for GCC (but do use it for clang). For
     // some unknown reason, GCC performs noticably better on the non-SIMD
@@ -28531,7 +29245,7 @@
 // --------
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_avx2
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
 static void  //
 wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
@@ -29156,7 +29870,7 @@
   return dst_ptr;
 }
 #endif
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 // ‼ WUFFS MULTI-FILE SECTION -x86_avx2
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) ||
@@ -29410,21 +30124,21 @@
     wuffs_adler32__hasher* self,
     wuffs_base__slice_u8 a_x);
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_adler32__hasher__up_arm_neon(
     wuffs_adler32__hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_adler32__hasher__up_x86_sse42(
     wuffs_adler32__hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
 // ---------------- VTables
 
@@ -29572,10 +30286,10 @@
     self->private_impl.f_started = true;
     self->private_impl.f_state = 1u;
     self->private_impl.choosy_up = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
 #endif
         self->private_impl.choosy_up);
@@ -29698,7 +30412,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +arm_neon
 // -------- func adler32.hasher.up_arm_neon
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_adler32__hasher__up_arm_neon(
@@ -29799,13 +30513,13 @@
   self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 // ‼ WUFFS MULTI-FILE SECTION -arm_neon
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func adler32.hasher.up_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -29892,7 +30606,7 @@
   self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
@@ -31115,6 +31829,8 @@
           (self->private_impl.f_channel_num_bits[2u] > 8u) ||
           (self->private_impl.f_channel_num_bits[3u] > 8u)) {
         v_dst_pixfmt = 2164308923u;
+      } else if (((self->private_impl.f_src_pixfmt == 2198077448u) || (self->private_impl.f_src_pixfmt == 2147485832u) || (self->private_impl.f_src_pixfmt == 2415954056u)) || ((self->private_impl.f_src_pixfmt == 2164308923u) && (self->private_impl.f_channel_masks[3u] == 0u))) {
+        v_dst_pixfmt = 2415954056u;
       }
       wuffs_base__image_config__set(
           a_dst,
@@ -31723,138 +32439,160 @@
         v_dst = wuffs_base__utility__empty_slice_u8();
       }
       while (true) {
-        while (true) {
-          if (v_rle_state == 0u) {
-            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-              goto label__goto_suspend__break;
-            }
-            v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
-            iop_a_src += 1u;
-            if (v_code == 0u) {
-              v_rle_state = 2u;
-              continue;
-            }
-            self->private_impl.f_rle_length = ((uint32_t)(v_code));
-            v_rle_state = 1u;
-            continue;
-          } else if (v_rle_state == 1u) {
-            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-              goto label__goto_suspend__break;
-            }
-            v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
-            iop_a_src += 1u;
-            if (self->private_impl.f_bits_per_pixel == 8u) {
-              v_p0 = 0u;
-              while (v_p0 < self->private_impl.f_rle_length) {
-                self->private_data.f_scratch[v_p0] = v_code;
-                v_p0 += 1u;
-              }
-            } else {
-              v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u))));
-              v_indexes[1u] = ((uint8_t)(v_code & 15u));
-              v_p0 = 0u;
-              while (v_p0 < self->private_impl.f_rle_length) {
-                self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u];
-                self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u];
-                v_p0 += 2u;
-              }
-            }
-            wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length));
-            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
-            v_rle_state = 0u;
-            goto label__middle__continue;
-          } else if (v_rle_state == 2u) {
-            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-              goto label__goto_suspend__break;
-            }
-            v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
-            iop_a_src += 1u;
-            if (v_code < 2u) {
-              if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) {
-                status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
-                goto exit;
-              }
-              wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u);
-              self->private_impl.f_dst_x = 0u;
-              self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
-              if (v_code > 0u) {
-                goto label__outer__break;
-              }
-              v_rle_state = 0u;
-              goto label__outer__continue;
-            } else if (v_code == 2u) {
-              v_rle_state = 4u;
-              continue;
-            }
-            self->private_impl.f_rle_length = ((uint32_t)(v_code));
-            self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u));
-            v_rle_state = 3u;
-            continue;
-          } else if (v_rle_state == 3u) {
-            if (self->private_impl.f_bits_per_pixel == 8u) {
-              v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
-                  &self->private_impl.f_swizzler,
-                  self->private_impl.f_rle_length,
-                  v_dst,
-                  v_dst_palette,
-                  &iop_a_src,
-                  io2_a_src);
-              wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
-              wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n)));
-            } else {
-              v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u);
-              v_p0 = 0u;
-              while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) {
-                v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
-                iop_a_src += 2u;
-                self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
-                self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
-                self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
-                self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
-                v_p0 = ((v_p0 & 255u) + 4u);
-                v_chunk_count -= 1u;
-              }
-              v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length);
-              wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0));
-              wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0);
-              wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0);
-            }
-            if (self->private_impl.f_rle_length > 0u) {
-              goto label__goto_suspend__break;
-            }
-            if (self->private_impl.f_rle_padded) {
-              if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-                goto label__goto_suspend__break;
-              }
-              iop_a_src += 1u;
-              self->private_impl.f_rle_padded = false;
-            }
-            v_rle_state = 0u;
-            goto label__middle__continue;
-          } else if (v_rle_state == 4u) {
-            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-              goto label__goto_suspend__break;
-            }
-            self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
-            iop_a_src += 1u;
-            v_rle_state = 5u;
-            continue;
-          }
+        if (v_rle_state == 0u) {
           if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
-            goto label__goto_suspend__break;
+            break;
           }
           v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
           iop_a_src += 1u;
-          if (self->private_impl.f_rle_delta_x > 0u) {
-            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x)));
-            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
-            self->private_impl.f_rle_delta_x = 0u;
-            if (self->private_impl.f_dst_x > self->private_impl.f_width) {
+          if (v_code == 0u) {
+            v_rle_state = 2u;
+            continue;
+          }
+          self->private_impl.f_rle_length = ((uint32_t)(v_code));
+          v_rle_state = 1u;
+          continue;
+        } else if (v_rle_state == 1u) {
+          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
+            break;
+          }
+          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
+          iop_a_src += 1u;
+          if (self->private_impl.f_bits_per_pixel == 8u) {
+            v_p0 = 0u;
+            while (v_p0 < self->private_impl.f_rle_length) {
+              self->private_data.f_scratch[v_p0] = v_code;
+              v_p0 += 1u;
+            }
+          } else {
+            v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u))));
+            v_indexes[1u] = ((uint8_t)(v_code & 15u));
+            v_p0 = 0u;
+            while (v_p0 < self->private_impl.f_rle_length) {
+              self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u];
+              self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u];
+              v_p0 += 2u;
+            }
+          }
+          wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, self->private_impl.f_rle_length));
+          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
+          v_rle_state = 0u;
+          goto label__middle__continue;
+        } else if (v_rle_state == 2u) {
+          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
+            break;
+          }
+          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
+          iop_a_src += 1u;
+          if (v_code < 2u) {
+            if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) {
               status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
               goto exit;
             }
+            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u);
+            self->private_impl.f_dst_x = 0u;
+            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
+            if (v_code > 0u) {
+              goto label__outer__break;
+            }
+            v_rle_state = 0u;
+            goto label__outer__continue;
+          } else if (v_code == 2u) {
+            v_rle_state = 4u;
+            continue;
           }
-          if (v_code > 0u) {
+          self->private_impl.f_rle_length = ((uint32_t)(v_code));
+          self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u));
+          v_rle_state = 3u;
+          continue;
+        } else if (v_rle_state == 3u) {
+          if (self->private_impl.f_bits_per_pixel == 8u) {
+            v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
+                &self->private_impl.f_swizzler,
+                self->private_impl.f_rle_length,
+                v_dst,
+                v_dst_palette,
+                &iop_a_src,
+                io2_a_src);
+            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
+            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n)));
+          } else {
+            v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u);
+            v_p0 = 0u;
+            while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) {
+              v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
+              iop_a_src += 2u;
+              self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
+              self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
+              self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
+              self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
+              v_p0 = ((v_p0 & 255u) + 4u);
+              v_chunk_count -= 1u;
+            }
+            v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length);
+            wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, v_p0));
+            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0);
+            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0);
+          }
+          if (self->private_impl.f_rle_length > 0u) {
+            break;
+          }
+          if (self->private_impl.f_rle_padded) {
+            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
+              break;
+            }
+            iop_a_src += 1u;
+            self->private_impl.f_rle_padded = false;
+          }
+          v_rle_state = 0u;
+          goto label__middle__continue;
+        } else if (v_rle_state == 4u) {
+          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
+            break;
+          }
+          self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
+          iop_a_src += 1u;
+          v_rle_state = 5u;
+          continue;
+        }
+        if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
+          break;
+        }
+        v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
+        iop_a_src += 1u;
+        if (self->private_impl.f_rle_delta_x > 0u) {
+          wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, ((uint64_t)(self->private_impl.f_rle_delta_x)));
+          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
+          self->private_impl.f_rle_delta_x = 0u;
+          if (self->private_impl.f_dst_x > self->private_impl.f_width) {
+            status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
+            goto exit;
+          }
+        }
+        if (v_code > 0u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_code -= 1u;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+          while (true) {
+            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
+            if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
+              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
+              goto exit;
+            }
+            v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
+            if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
+              v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
+            }
+            if (v_code <= 0u) {
+              wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x)));
+              break;
+            }
+            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
 #if defined(__GNUC__)
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wconversion"
@@ -31863,36 +32601,11 @@
 #if defined(__GNUC__)
 #pragma GCC diagnostic pop
 #endif
-            while (true) {
-              self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
-              if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
-                status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
-                goto exit;
-              }
-              v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
-              if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
-                v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
-              }
-              if (v_code <= 0u) {
-                wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, ((uint64_t)(self->private_impl.f_dst_x)));
-                break;
-              }
-              wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion"
-#endif
-              v_code -= 1u;
-#if defined(__GNUC__)
-#pragma GCC diagnostic pop
-#endif
-            }
           }
-          v_rle_state = 0u;
-          goto label__middle__continue;
         }
+        v_rle_state = 0u;
+        goto label__middle__continue;
       }
-      label__goto_suspend__break:;
       self->private_impl.f_rle_state = v_rle_state;
       status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
       goto ok;
@@ -35635,30 +36348,6 @@
   },
 };
 
-static const uint8_t
-WUFFS_CRC32__IEEE_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  212u, 43u, 68u, 84u, 1u, 0u, 0u, 0u,
-  150u, 21u, 228u, 198u, 1u, 0u, 0u, 0u,
-};
-
-static const uint8_t
-WUFFS_CRC32__IEEE_X86_SSE42_K3K4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  208u, 151u, 25u, 117u, 1u, 0u, 0u, 0u,
-  158u, 0u, 170u, 204u, 0u, 0u, 0u, 0u,
-};
-
-static const uint8_t
-WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  36u, 97u, 205u, 99u, 1u, 0u, 0u, 0u,
-  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
-};
-
-static const uint8_t
-WUFFS_CRC32__IEEE_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  65u, 6u, 113u, 219u, 1u, 0u, 0u, 0u,
-  65u, 22u, 1u, 247u, 1u, 0u, 0u, 0u,
-};
-
 // ---------------- Private Initializer Prototypes
 
 // ---------------- Private Function Prototypes
@@ -35675,29 +36364,21 @@
     wuffs_crc32__ieee_hasher* self,
     wuffs_base__slice_u8 a_x);
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_crc32__ieee_hasher__up_arm_crc32(
     wuffs_crc32__ieee_hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
-WUFFS_BASE__GENERATED_C_CODE
-static wuffs_base__empty_struct
-wuffs_crc32__ieee_hasher__up_x86_avx2(
-    wuffs_crc32__ieee_hasher* self,
-    wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
-
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_crc32__ieee_hasher__up_x86_sse42(
     wuffs_crc32__ieee_hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
 // ---------------- VTables
 
@@ -35843,13 +36524,10 @@
 
   if (self->private_impl.f_state == 0u) {
     self->private_impl.choosy_up = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
         wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
-        wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_crc32__ieee_hasher__up_x86_avx2 :
-#endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
 #endif
         self->private_impl.choosy_up);
@@ -36001,7 +36679,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +arm_crc32
 // -------- func crc32.ieee_hasher.up_arm_crc32
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_crc32__ieee_hasher__up_arm_crc32(
@@ -36071,133 +36749,13 @@
   self->private_impl.f_state = (4294967295u ^ v_s);
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_CRC32)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
 // ‼ WUFFS MULTI-FILE SECTION -arm_crc32
 
-// ‼ WUFFS MULTI-FILE SECTION +x86_avx2
-// -------- func crc32.ieee_hasher.up_x86_avx2
-
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
-WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
-WUFFS_BASE__GENERATED_C_CODE
-static wuffs_base__empty_struct
-wuffs_crc32__ieee_hasher__up_x86_avx2(
-    wuffs_crc32__ieee_hasher* self,
-    wuffs_base__slice_u8 a_x) {
-  uint32_t v_s = 0;
-  wuffs_base__slice_u8 v_p = {0};
-  __m128i v_k = {0};
-  __m128i v_x0 = {0};
-  __m128i v_x1 = {0};
-  __m128i v_x2 = {0};
-  __m128i v_x3 = {0};
-  __m128i v_y0 = {0};
-  __m128i v_y1 = {0};
-  __m128i v_y2 = {0};
-  __m128i v_y3 = {0};
-  uint64_t v_tail_index = 0;
-
-  v_s = (4294967295u ^ self->private_impl.f_state);
-  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
-    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
-    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
-  }
-  if (((uint64_t)(a_x.len)) < 64u) {
-    {
-      wuffs_base__slice_u8 i_slice_p = a_x;
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
-      }
-      v_p.len = 0;
-    }
-    self->private_impl.f_state = (4294967295u ^ v_s);
-    return wuffs_base__make_empty_struct();
-  }
-  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
-  v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
-  v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
-  v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
-  v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2));
-  {
-    wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u);
-    v_p.ptr = i_slice_p.ptr;
-    v_p.len = 64;
-    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64));
-    while (v_p.ptr < i_end0_p) {
-      v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-      v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
-      v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u));
-      v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u));
-      v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-      v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u));
-      v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u));
-      v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u));
-      v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u)));
-      v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)));
-      v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u)));
-      v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u)));
-      v_p.ptr += 64;
-    }
-    v_p.len = 0;
-  }
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4));
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x2);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x3);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u));
-  v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u));
-  v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ));
-  v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u));
-  v_x0 = _mm_and_si128(v_x0, v_x2);
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU));
-  v_x1 = _mm_and_si128(v_x0, v_x2);
-  v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u));
-  v_x1 = _mm_and_si128(v_x1, v_x2);
-  v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u))));
-  v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u);
-  if (v_tail_index < ((uint64_t)(a_x.len))) {
-    {
-      wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
-      }
-      v_p.len = 0;
-    }
-  }
-  self->private_impl.f_state = (4294967295u ^ v_s);
-  return wuffs_base__make_empty_struct();
-}
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
-// ‼ WUFFS MULTI-FILE SECTION -x86_avx2
-
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func crc32.ieee_hasher.up_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -36205,113 +36763,125 @@
     wuffs_crc32__ieee_hasher* self,
     wuffs_base__slice_u8 a_x) {
   uint32_t v_s = 0;
-  wuffs_base__slice_u8 v_p = {0};
-  __m128i v_k = {0};
+  __m128i v_kk = {0};
   __m128i v_x0 = {0};
   __m128i v_x1 = {0};
   __m128i v_x2 = {0};
   __m128i v_x3 = {0};
+  __m128i v_x4 = {0};
+  __m128i v_x5 = {0};
+  __m128i v_x6 = {0};
+  __m128i v_x7 = {0};
   __m128i v_y0 = {0};
   __m128i v_y1 = {0};
   __m128i v_y2 = {0};
   __m128i v_y3 = {0};
-  uint64_t v_tail_index = 0;
+  __m128i v_y4 = {0};
+  __m128i v_y5 = {0};
+  __m128i v_y6 = {0};
+  __m128i v_y7 = {0};
 
   v_s = (4294967295u ^ self->private_impl.f_state);
   while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
     v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
     a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
   }
-  if (((uint64_t)(a_x.len)) < 64u) {
-    {
-      wuffs_base__slice_u8 i_slice_p = a_x;
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
-      }
-      v_p.len = 0;
+  if (((uint64_t)(a_x.len)) >= 128u) {
+    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
+    v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
+    v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
+    v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
+    v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
+    v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
+    v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
+    v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
+    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u));
+    v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
+    a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
+    while (((uint64_t)(a_x.len)) >= 128u) {
+      v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
+      v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
+      v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u));
+      v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u));
+      v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
+      v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
+      v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u));
+      v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u));
+      v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
+      v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
+      v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u));
+      v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u));
+      v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
+      v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
+      v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u));
+      v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u));
+      v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
+      v_x0 = _mm_xor_si128(v_x0, v_y0);
+      v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
+      v_x1 = _mm_xor_si128(v_x1, v_y1);
+      v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
+      v_x2 = _mm_xor_si128(v_x2, v_y2);
+      v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
+      v_x3 = _mm_xor_si128(v_x3, v_y3);
+      v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)));
+      v_x4 = _mm_xor_si128(v_x4, v_y4);
+      v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)));
+      v_x5 = _mm_xor_si128(v_x5, v_y5);
+      v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)));
+      v_x6 = _mm_xor_si128(v_x6, v_y6);
+      v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)));
+      v_x7 = _mm_xor_si128(v_x7, v_y7);
+      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
     }
-    self->private_impl.f_state = (4294967295u ^ v_s);
-    return wuffs_base__make_empty_struct();
+    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u));
+    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
+    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
+    v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
+    v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
+    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
+    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
+    v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
+    v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
+    v_y0 = _mm_xor_si128(v_y0, v_x1);
+    v_x0 = _mm_xor_si128(v_x0, v_y0);
+    v_y2 = _mm_xor_si128(v_y2, v_x3);
+    v_x2 = _mm_xor_si128(v_x2, v_y2);
+    v_y4 = _mm_xor_si128(v_y4, v_x5);
+    v_x4 = _mm_xor_si128(v_x4, v_y4);
+    v_y6 = _mm_xor_si128(v_y6, v_x7);
+    v_x6 = _mm_xor_si128(v_x6, v_y6);
+    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u));
+    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
+    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
+    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
+    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
+    v_y0 = _mm_xor_si128(v_y0, v_x2);
+    v_x0 = _mm_xor_si128(v_x0, v_y0);
+    v_y4 = _mm_xor_si128(v_y4, v_x6);
+    v_x4 = _mm_xor_si128(v_x4, v_y4);
+    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u));
+    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
+    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
+    v_y0 = _mm_xor_si128(v_y0, v_x4);
+    v_x0 = _mm_xor_si128(v_x0, v_y0);
+    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
+    v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)(((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(0u)))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u))));
+    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
+    v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((((uint64_t)(_mm_extract_epi64(v_x0, (int32_t)(1u)))) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u))));
   }
-  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
-  v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
-  v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
-  v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
-  v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K1K2));
-  {
-    wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, 64u);
-    v_p.ptr = i_slice_p.ptr;
-    v_p.len = 64;
-    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 64) * 64));
-    while (v_p.ptr < i_end0_p) {
-      v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-      v_y1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
-      v_y2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(0u));
-      v_y3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(0u));
-      v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-      v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(17u));
-      v_x2 = _mm_clmulepi64_si128(v_x2, v_k, (int32_t)(17u));
-      v_x3 = _mm_clmulepi64_si128(v_x3, v_k, (int32_t)(17u));
-      v_x0 = _mm_xor_si128(_mm_xor_si128(v_x0, v_y0), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 0u)));
-      v_x1 = _mm_xor_si128(_mm_xor_si128(v_x1, v_y1), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u)));
-      v_x2 = _mm_xor_si128(_mm_xor_si128(v_x2, v_y2), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 32u)));
-      v_x3 = _mm_xor_si128(_mm_xor_si128(v_x3, v_y3), _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 48u)));
-      v_p.ptr += 64;
-    }
-    v_p.len = 0;
+  while (((uint64_t)(a_x.len)) >= 8u) {
+    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
+    v_s = ((uint32_t)(_mm_extract_epi32(_mm_clmulepi64_si128(_mm_clmulepi64_si128(_mm_cvtsi64_si128((int64_t)((wuffs_base__peek_u64le__no_bounds_check(a_x.ptr) ^ ((uint64_t)(v_s))))), v_kk, (int32_t)(0u)), v_kk, (int32_t)(16u)), (int32_t)(2u))));
+    a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u);
   }
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K3K4));
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x2);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_y0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(17u));
-  v_x0 = _mm_xor_si128(v_x0, v_x3);
-  v_x0 = _mm_xor_si128(v_x0, v_y0);
-  v_x1 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(16u));
-  v_x2 = _mm_set_epi32((int32_t)(0u), (int32_t)(4294967295u), (int32_t)(0u), (int32_t)(4294967295u));
-  v_x0 = _mm_srli_si128(v_x0, (int32_t)(8u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_K5ZZ));
-  v_x1 = _mm_srli_si128(v_x0, (int32_t)(4u));
-  v_x0 = _mm_and_si128(v_x0, v_x2);
-  v_x0 = _mm_clmulepi64_si128(v_x0, v_k, (int32_t)(0u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_k = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC32__IEEE_X86_SSE42_PXMU));
-  v_x1 = _mm_and_si128(v_x0, v_x2);
-  v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(16u));
-  v_x1 = _mm_and_si128(v_x1, v_x2);
-  v_x1 = _mm_clmulepi64_si128(v_x1, v_k, (int32_t)(0u));
-  v_x0 = _mm_xor_si128(v_x0, v_x1);
-  v_s = ((uint32_t)(_mm_extract_epi32(v_x0, (int32_t)(1u))));
-  v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551552u);
-  if (v_tail_index < ((uint64_t)(a_x.len))) {
-    {
-      wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
-      }
-      v_p.len = 0;
-    }
+  while (((uint64_t)(a_x.len)) > 0u) {
+    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
+    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
   }
   self->private_impl.f_state = (4294967295u ^ v_s);
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
@@ -36592,27 +37162,33 @@
 };
 
 static const uint8_t
-WUFFS_CRC64__SHUFFLE_707F[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
-  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
-};
-
-static const uint8_t
-WUFFS_CRC64__SHUFFLE_8F80[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  143u, 142u, 141u, 140u, 139u, 138u, 137u, 136u,
-  135u, 134u, 133u, 132u, 131u, 130u, 129u, 128u,
-};
-
-static const uint8_t
-WUFFS_CRC64__ECMA_X86_SSE42_K1K2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
   228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u,
   64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u,
 };
 
 static const uint8_t
-WUFFS_CRC64__ECMA_X86_SSE42_PXMU[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
-  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
+WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u,
+  81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u,
+};
+
+static const uint8_t
+WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u,
+  244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u,
+};
+
+static const uint8_t
+WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u,
+  64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u,
+};
+
+static const uint8_t
+WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
   213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u,
+  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
 };
 
 // ---------------- Private Initializer Prototypes
@@ -36631,13 +37207,13 @@
     wuffs_crc64__ecma_hasher* self,
     wuffs_base__slice_u8 a_x);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_crc64__ecma_hasher__up_x86_sse42(
     wuffs_crc64__ecma_hasher* self,
     wuffs_base__slice_u8 a_x);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
 // ---------------- VTables
 
@@ -36783,7 +37359,7 @@
 
   if (self->private_impl.f_state == 0u) {
     self->private_impl.choosy_up = (
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 :
 #endif
         self->private_impl.choosy_up);
@@ -36885,7 +37461,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func crc64.ecma_hasher.up_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -36894,93 +37470,126 @@
     wuffs_base__slice_u8 a_x) {
   uint64_t v_s = 0;
   wuffs_base__slice_u8 v_p = {0};
-  __m128i v_s0 = {0};
-  __m128i v_s0_707F = {0};
-  __m128i v_s0_8F80 = {0};
-  __m128i v_x0 = {0};
-  __m128i v_aa = {0};
-  __m128i v_k1k2 = {0};
-  __m128i v_t0 = {0};
-  __m128i v_t1 = {0};
-  __m128i v_t2 = {0};
-  __m128i v_u0 = {0};
-  __m128i v_u1 = {0};
-  __m128i v_u2 = {0};
-  __m128i v_v0 = {0};
-  __m128i v_v1 = {0};
-  __m128i v_pxmu = {0};
-  __m128i v_w1 = {0};
-  __m128i v_w2 = {0};
-  uint64_t v_tail_index = 0;
+  uint8_t v_buf[48] = {0};
+  __m128i v_xa = {0};
+  __m128i v_xb = {0};
+  __m128i v_xc = {0};
+  __m128i v_xd = {0};
+  __m128i v_xe = {0};
+  __m128i v_xf = {0};
+  __m128i v_xg = {0};
+  __m128i v_xh = {0};
+  __m128i v_mu1 = {0};
+  __m128i v_mu2 = {0};
+  __m128i v_mu4 = {0};
+  __m128i v_mu8 = {0};
+  __m128i v_mupx = {0};
 
   v_s = (18446744073709551615u ^ self->private_impl.f_state);
   while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
     v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
     a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
   }
-  if (((uint64_t)(a_x.len)) < 32u) {
-    {
-      wuffs_base__slice_u8 i_slice_p = a_x;
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
+  do {
+    do {
+      if (((uint64_t)(a_x.len)) >= 128u) {
+      } else if (((uint64_t)(a_x.len)) >= 64u) {
+        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
+        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
+        v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
+        v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
+        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
+        break;
+      } else if (((uint64_t)(a_x.len)) >= 32u) {
+        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
+        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
+        a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
+        goto label__chain2__break;
+      } else {
+        {
+          wuffs_base__slice_u8 i_slice_p = a_x;
+          v_p.ptr = i_slice_p.ptr;
+          v_p.len = 1;
+          const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
+          while (v_p.ptr < i_end0_p) {
+            v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
+            v_p.ptr += 1;
+          }
+          v_p.len = 0;
+        }
+        self->private_impl.f_state = (18446744073709551615u ^ v_s);
+        return wuffs_base__make_empty_struct();
       }
-      v_p.len = 0;
+      v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
+      v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
+      v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
+      v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
+      v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
+      v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
+      v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
+      v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
+      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
+      v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8));
+      while (((uint64_t)(a_x.len)) >= 128u) {
+        v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
+        v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
+        v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
+        v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
+        v_xe = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xe, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)));
+        v_xf = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xf, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)));
+        v_xg = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xg, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)));
+        v_xh = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(0u)), _mm_clmulepi64_si128(v_xh, v_mu8, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)));
+        a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
+      }
+      v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4));
+      v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), v_xe);
+      v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), v_xf);
+      v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), v_xg);
+      v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), v_xh);
+      if (((uint64_t)(a_x.len)) > 64u) {
+        v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
+        v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
+        v_xc = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xc, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
+        v_xd = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(0u)), _mm_clmulepi64_si128(v_xd, v_mu4, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
+        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
+      }
+    } while (0);
+    v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
+    v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), v_xc);
+    v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), v_xd);
+    if (((uint64_t)(a_x.len)) > 32u) {
+      v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
+      v_xb = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu2, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
+      a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
     }
-    self->private_impl.f_state = (18446744073709551615u ^ v_s);
-    return wuffs_base__make_empty_struct();
-  }
-  v_s0 = _mm_cvtsi64_si128((int64_t)(v_s));
-  v_s0_707F = _mm_shuffle_epi8(v_s0, _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__SHUFFLE_707F)));
-  v_s0_8F80 = _mm_shuffle_epi8(v_s0, _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__SHUFFLE_8F80)));
-  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
-  a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
-  v_k1k2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_K1K2));
-  v_t0 = _mm_xor_si128(v_s0_707F, v_x0);
-  v_t1 = _mm_clmulepi64_si128(v_t0, v_k1k2, (int32_t)(0u));
-  v_t2 = _mm_clmulepi64_si128(v_t0, v_k1k2, (int32_t)(17u));
-  v_aa = _mm_xor_si128(_mm_xor_si128(v_t1, v_t2), v_s0_8F80);
-  while (((uint64_t)(a_x.len)) >= 32u) {
-    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
+  } while (0);
+  label__chain2__break:;
+  v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1));
+  v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), v_xb);
+  if (((uint64_t)(a_x.len)) > 24u) {
+    v_xa = _mm_xor_si128(_mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu1, (int32_t)(17u))), _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
     a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
-    v_u0 = _mm_xor_si128(v_aa, v_x0);
-    v_u1 = _mm_clmulepi64_si128(v_u0, v_k1k2, (int32_t)(0u));
-    v_u2 = _mm_clmulepi64_si128(v_u0, v_k1k2, (int32_t)(17u));
-    v_aa = _mm_xor_si128(v_u1, v_u2);
-  }
-  if (((uint64_t)(a_x.len)) < 16u) {
-    return wuffs_base__make_empty_struct();
-  }
-  v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
-  a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
-  v_v0 = _mm_xor_si128(v_aa, v_x0);
-  v_v1 = _mm_clmulepi64_si128(v_v0, v_k1k2, (int32_t)(16u));
-  v_aa = _mm_xor_si128(v_v1, _mm_srli_si128(v_v0, (int32_t)(8u)));
-  v_pxmu = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_PXMU));
-  v_w1 = _mm_clmulepi64_si128(v_aa, v_pxmu, (int32_t)(16u));
-  v_w2 = _mm_clmulepi64_si128(v_w1, v_pxmu, (int32_t)(0u));
-  v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(v_aa, _mm_xor_si128(v_w2, _mm_slli_si128(v_w1, (int32_t)(8u)))), (int32_t)(1u))));
-  v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551600u);
-  if (v_tail_index < ((uint64_t)(a_x.len))) {
-    {
-      wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
-      v_p.ptr = i_slice_p.ptr;
-      v_p.len = 1;
-      const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
-      while (v_p.ptr < i_end0_p) {
-        v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
-        v_p.ptr += 1;
-      }
-      v_p.len = 0;
+    if (((uint64_t)(a_x.len)) > 24u) {
+      return wuffs_base__make_empty_struct();
     }
   }
+  _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa);
+  wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(v_buf, ((24u - ((uint64_t)(a_x.len))) + 16u), 48), a_x);
+  v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
+  v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u));
+  v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u));
+  v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u));
+  v_xd = _mm_xor_si128(_mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(0u)), _mm_clmulepi64_si128(v_xa, v_mu2, (int32_t)(17u)));
+  v_xe = _mm_xor_si128(_mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(0u)), _mm_clmulepi64_si128(v_xb, v_mu1, (int32_t)(17u)));
+  v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc));
+  v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX));
+  v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u));
+  v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u));
+  v_s = ((uint64_t)(_mm_extract_epi64(_mm_xor_si128(_mm_xor_si128(v_xc, _mm_slli_si128(v_xb, (int32_t)(8u))), v_xa), (int32_t)(1u))));
   self->private_impl.f_state = (18446744073709551615u ^ v_s);
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
@@ -37119,14 +37728,14 @@
     uint32_t a_n_codes1,
     uint32_t a_base_symbol);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
 wuffs_deflate__decoder__decode_huffman_bmi2(
     wuffs_deflate__decoder* self,
     wuffs_base__io_buffer* a_dst,
     wuffs_base__io_buffer* a_src);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -37460,7 +38069,7 @@
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
 
     self->private_impl.choosy_decode_huffman_fast64 = (
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
         wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
 #endif
         self->private_impl.choosy_decode_huffman_fast64);
@@ -38349,7 +38958,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_bmi2
 // -------- func deflate.decoder.decode_huffman_bmi2
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -38557,7 +39166,7 @@
 
   return status;
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 // ‼ WUFFS MULTI-FILE SECTION -x86_bmi2
 
 // -------- func deflate.decoder.decode_huffman_fast32
@@ -43307,7 +43916,7 @@
     uint64_t a_dst_stride,
     uint32_t a_q);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_jpeg__decoder__decode_idct_x86_avx2(
@@ -43315,7 +43924,7 @@
     wuffs_base__slice_u8 a_dst_buffer,
     uint64_t a_dst_stride,
     uint32_t a_q);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -44782,7 +45391,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_avx2
 // -------- func jpeg.decoder.decode_idct_x86_avx2
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -45166,7 +45775,7 @@
   wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7);
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
 // ‼ WUFFS MULTI-FILE SECTION -x86_avx2
 
 // -------- func jpeg.decoder.get_quirk
@@ -45515,7 +46124,7 @@
       self->private_impl.f_payload_length = 0u;
     }
     self->private_impl.choosy_decode_idct = (
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
         wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 :
 #endif
         self->private_impl.choosy_decode_idct);
@@ -59313,40 +59922,40 @@
 
 // ---------------- Private Function Prototypes
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_1_distance_4_arm_neon(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_3_distance_4_arm_neon(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_3_arm_neon(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_4_arm_neon(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -59435,40 +60044,40 @@
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_1_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_3_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_3_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_4_x86_sse42(
     wuffs_png__decoder* self,
     wuffs_base__slice_u8 a_curr,
     wuffs_base__slice_u8 a_prev);
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__status
@@ -59750,7 +60359,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +arm_neon
 // -------- func png.decoder.filter_1_distance_4_arm_neon
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_1_distance_4_arm_neon(
@@ -59790,13 +60399,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 // ‼ WUFFS MULTI-FILE SECTION -arm_neon
 
 // ‼ WUFFS MULTI-FILE SECTION +arm_neon
 // -------- func png.decoder.filter_3_distance_4_arm_neon
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_3_distance_4_arm_neon(
@@ -59882,13 +60491,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 // ‼ WUFFS MULTI-FILE SECTION -arm_neon
 
 // ‼ WUFFS MULTI-FILE SECTION +arm_neon
 // -------- func png.decoder.filter_4_distance_3_arm_neon
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_3_arm_neon(
@@ -60003,13 +60612,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 // ‼ WUFFS MULTI-FILE SECTION -arm_neon
 
 // ‼ WUFFS MULTI-FILE SECTION +arm_neon
 // -------- func png.decoder.filter_4_distance_4_arm_neon
 
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
 wuffs_png__decoder__filter_4_distance_4_arm_neon(
@@ -60104,7 +60713,7 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
 // ‼ WUFFS MULTI-FILE SECTION -arm_neon
 
 // -------- func png.decoder.filter_1
@@ -60787,7 +61396,7 @@
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_1_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60828,13 +61437,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_3_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -60934,13 +61543,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_4_distance_3_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -61061,13 +61670,13 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // ‼ WUFFS MULTI-FILE SECTION +x86_sse42
 // -------- func png.decoder.filter_4_distance_4_x86_sse42
 
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
 WUFFS_BASE__GENERATED_C_CODE
 static wuffs_base__empty_struct
@@ -61166,7 +61775,7 @@
   }
   return wuffs_base__make_empty_struct();
 }
-#endif  // defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
 // ‼ WUFFS MULTI-FILE SECTION -x86_sse42
 
 // -------- func png.decoder.get_quirk
@@ -61910,35 +62519,35 @@
     self->private_impl.choosy_filter_3 = (
         &wuffs_png__decoder__filter_3_distance_3_fallback);
     self->private_impl.choosy_filter_4 = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_4_distance_3_fallback);
   } else if (self->private_impl.f_filter_distance == 4u) {
     self->private_impl.choosy_filter_1 = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_1_distance_4_fallback);
     self->private_impl.choosy_filter_3 = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_3_distance_4_fallback);
     self->private_impl.choosy_filter_4 = (
-#if defined(WUFFS_BASE__CPU_ARCH__ARM_NEON)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
         wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon :
 #endif
-#if defined(WUFFS_BASE__CPU_ARCH__X86_64)
+#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
         wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 :
 #endif
         &wuffs_png__decoder__filter_4_distance_4_fallback);
@@ -62138,20 +62747,22 @@
           self->private_impl.f_seen_srgb = true;
         }
       } else if (self->private_impl.f_chunk_type == 1397641844u) {
-        if (self->private_impl.f_seen_trns || (self->private_impl.f_color_type > 3u) || ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte)) {
+        if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte)) {
           status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
           goto exit;
-        }
-        if (a_src) {
-          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
-        }
-        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
-        status = wuffs_png__decoder__decode_trns(self, a_src);
-        if (a_src) {
-          iop_a_src = a_src->data.ptr + a_src->meta.ri;
-        }
-        if (status.repr) {
-          goto suspend;
+        } else if (self->private_impl.f_color_type > 3u) {
+        } else {
+          if (a_src) {
+            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+          }
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
+          status = wuffs_png__decoder__decode_trns(self, a_src);
+          if (a_src) {
+            iop_a_src = a_src->data.ptr + a_src->meta.ri;
+          }
+          if (status.repr) {
+            goto suspend;
+          }
         }
         self->private_impl.f_seen_trns = true;
       }
@@ -67779,6 +68390,87 @@
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TGA)
 
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
+
+// ---------------- Status Codes Implementations
+
+// ---------------- Private Consts
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+// ---------------- VTables
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_vp8__placeholder__initialize(
+    wuffs_vp8__placeholder* self,
+    size_t sizeof_star_self,
+    uint64_t wuffs_version,
+    uint32_t options){
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (sizeof(*self) != sizeof_star_self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+  }
+  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+  }
+
+  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+    // The whole point of this if-check is to detect an uninitialized *self.
+    // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+    if (self->private_impl.magic != 0) {
+      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+    }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+  } else {
+    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+      memset(self, 0, sizeof(*self));
+      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+    } else {
+      memset(&(self->private_impl), 0, sizeof(self->private_impl));
+    }
+  }
+
+  self->private_impl.magic = WUFFS_BASE__MAGIC;
+  return wuffs_base__make_status(NULL);
+}
+
+wuffs_vp8__placeholder*
+wuffs_vp8__placeholder__alloc(void) {
+  wuffs_vp8__placeholder* x =
+      (wuffs_vp8__placeholder*)(calloc(sizeof(wuffs_vp8__placeholder), 1));
+  if (!x) {
+    return NULL;
+  }
+  if (wuffs_vp8__placeholder__initialize(
+      x, sizeof(wuffs_vp8__placeholder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+    free(x);
+    return NULL;
+  }
+  return x;
+}
+
+size_t
+sizeof__wuffs_vp8__placeholder(void) {
+  return sizeof(wuffs_vp8__placeholder);
+}
+
+// ---------------- Function Implementations
+
+#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
+
 #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
 
 // ---------------- Status Codes Implementations
@@ -68701,6 +69393,4360 @@
 
 #endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
 
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
+
+// ---------------- Status Codes Implementations
+
+const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)";
+const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)";
+const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code";
+const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference";
+const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache";
+const char wuffs_webp__error__bad_header[] = "#webp: bad header";
+const char wuffs_webp__error__bad_transform[] = "#webp: bad transform";
+const char wuffs_webp__error__short_chunk[] = "#webp: short chunk";
+const char wuffs_webp__error__truncated_input[] = "#webp: truncated input";
+const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups";
+const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform";
+const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file";
+const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code";
+const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer";
+const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits";
+
+// ---------------- Private Consts
+
+static const uint8_t
+WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u,
+  16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u,
+  13u, 14u, 15u,
+};
+
+static const uint8_t
+WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  2u, 3u, 7u, 0u,
+};
+
+static const uint8_t
+WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  3u, 3u, 11u, 0u,
+};
+
+static const uint16_t
+WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  1612u, 0u, 511u, 1022u, 1533u,
+};
+
+static const uint32_t
+WUFFS_WEBP__SIGN_EXTEND_I8_I32[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
+  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
+  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
+  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
+  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
+  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
+  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
+  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
+  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
+  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
+  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
+  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
+  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
+  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
+  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
+  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
+  4294967168u, 4294967169u, 4294967170u, 4294967171u, 4294967172u, 4294967173u, 4294967174u, 4294967175u,
+  4294967176u, 4294967177u, 4294967178u, 4294967179u, 4294967180u, 4294967181u, 4294967182u, 4294967183u,
+  4294967184u, 4294967185u, 4294967186u, 4294967187u, 4294967188u, 4294967189u, 4294967190u, 4294967191u,
+  4294967192u, 4294967193u, 4294967194u, 4294967195u, 4294967196u, 4294967197u, 4294967198u, 4294967199u,
+  4294967200u, 4294967201u, 4294967202u, 4294967203u, 4294967204u, 4294967205u, 4294967206u, 4294967207u,
+  4294967208u, 4294967209u, 4294967210u, 4294967211u, 4294967212u, 4294967213u, 4294967214u, 4294967215u,
+  4294967216u, 4294967217u, 4294967218u, 4294967219u, 4294967220u, 4294967221u, 4294967222u, 4294967223u,
+  4294967224u, 4294967225u, 4294967226u, 4294967227u, 4294967228u, 4294967229u, 4294967230u, 4294967231u,
+  4294967232u, 4294967233u, 4294967234u, 4294967235u, 4294967236u, 4294967237u, 4294967238u, 4294967239u,
+  4294967240u, 4294967241u, 4294967242u, 4294967243u, 4294967244u, 4294967245u, 4294967246u, 4294967247u,
+  4294967248u, 4294967249u, 4294967250u, 4294967251u, 4294967252u, 4294967253u, 4294967254u, 4294967255u,
+  4294967256u, 4294967257u, 4294967258u, 4294967259u, 4294967260u, 4294967261u, 4294967262u, 4294967263u,
+  4294967264u, 4294967265u, 4294967266u, 4294967267u, 4294967268u, 4294967269u, 4294967270u, 4294967271u,
+  4294967272u, 4294967273u, 4294967274u, 4294967275u, 4294967276u, 4294967277u, 4294967278u, 4294967279u,
+  4294967280u, 4294967281u, 4294967282u, 4294967283u, 4294967284u, 4294967285u, 4294967286u, 4294967287u,
+  4294967288u, 4294967289u, 4294967290u, 4294967291u, 4294967292u, 4294967293u, 4294967294u, 4294967295u,
+};
+
+static const uint8_t
+WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u,
+  22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u,
+  21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u,
+  71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u,
+  36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u,
+  87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u,
+  68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u,
+  103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u,
+  84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u,
+  120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u,
+  100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u,
+  117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u,
+  0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u,
+  110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u,
+  126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u,
+};
+
+// ---------------- Private Initializer Prototypes
+
+// ---------------- Private Function Prototypes
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_groups(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_n_huffman_groups);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_tree(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_hg,
+    uint32_t a_ht);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_tree_simple(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_hg,
+    uint32_t a_ht);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_code_length_code_lengths(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_code_lengths_huffman_nodes(
+    wuffs_webp__decoder* self);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_huffman_nodes(
+    wuffs_webp__decoder* self,
+    uint32_t a_hg,
+    uint32_t a_ht);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_code_lengths(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_pixels_slow(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_dst,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    uint32_t a_height,
+    wuffs_base__slice_u8 a_tile_data,
+    uint32_t a_tile_size_log2);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_predictor(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix,
+    wuffs_base__slice_u8 a_tile_data);
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint32_t
+wuffs_webp__decoder__absolute_difference(
+    const wuffs_webp__decoder* self,
+    uint32_t a_a,
+    uint32_t a_b);
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint8_t
+wuffs_webp__decoder__mode12(
+    const wuffs_webp__decoder* self,
+    uint8_t a_l,
+    uint8_t a_t,
+    uint8_t a_tl);
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint8_t
+wuffs_webp__decoder__mode13(
+    const wuffs_webp__decoder* self,
+    uint8_t a_l,
+    uint8_t a_t,
+    uint8_t a_tl);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_cross_color(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix,
+    wuffs_base__slice_u8 a_tile_data);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_subtract_green(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_color_indexing(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__image_config* a_dst,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config_limited(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_frame_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__frame_config* a_dst,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_frame(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__pixel_blend a_blend,
+    wuffs_base__slice_u8 a_workbuf,
+    wuffs_base__decode_frame_options* a_opts);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_transform(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__slice_u8 a_workbuf);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_color_cache_parameters(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_hg_table(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    wuffs_base__slice_u8 a_workbuf);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_pixels(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_dst,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    uint32_t a_height,
+    wuffs_base__slice_u8 a_tile_data,
+    uint32_t a_tile_size_log2);
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__swizzle(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__slice_u8 a_src,
+    wuffs_base__pixel_blend a_blend);
+
+// ---------------- VTables
+
+const wuffs_base__image_decoder__func_ptrs
+wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
+  (wuffs_base__status(*)(void*,
+      wuffs_base__pixel_buffer*,
+      wuffs_base__io_buffer*,
+      wuffs_base__pixel_blend,
+      wuffs_base__slice_u8,
+      wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame),
+  (wuffs_base__status(*)(void*,
+      wuffs_base__frame_config*,
+      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config),
+  (wuffs_base__status(*)(void*,
+      wuffs_base__image_config*,
+      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config),
+  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect),
+  (uint64_t(*)(const void*,
+      uint32_t))(&wuffs_webp__decoder__get_quirk),
+  (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops),
+  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs),
+  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames),
+  (wuffs_base__status(*)(void*,
+      uint64_t,
+      uint64_t))(&wuffs_webp__decoder__restart_frame),
+  (wuffs_base__status(*)(void*,
+      uint32_t,
+      uint64_t))(&wuffs_webp__decoder__set_quirk),
+  (wuffs_base__empty_struct(*)(void*,
+      uint32_t,
+      bool))(&wuffs_webp__decoder__set_report_metadata),
+  (wuffs_base__status(*)(void*,
+      wuffs_base__io_buffer*,
+      wuffs_base__more_information*,
+      wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more),
+  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len),
+};
+
+// ---------------- Initializer Implementations
+
+wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
+wuffs_webp__decoder__initialize(
+    wuffs_webp__decoder* self,
+    size_t sizeof_star_self,
+    uint64_t wuffs_version,
+    uint32_t options){
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (sizeof(*self) != sizeof_star_self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
+  }
+  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
+      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
+    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
+  }
+
+  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
+    // The whole point of this if-check is to detect an uninitialized *self.
+    // We disable the warning on GCC. Clang-5.0 does not have this warning.
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
+#endif
+    if (self->private_impl.magic != 0) {
+      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
+    }
+#if !defined(__clang__) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+  } else {
+    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
+      memset(self, 0, sizeof(*self));
+      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
+    } else {
+      memset(&(self->private_impl), 0, sizeof(self->private_impl));
+    }
+  }
+
+  self->private_impl.magic = WUFFS_BASE__MAGIC;
+  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
+      wuffs_base__image_decoder__vtable_name;
+  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
+      (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder);
+  return wuffs_base__make_status(NULL);
+}
+
+wuffs_webp__decoder*
+wuffs_webp__decoder__alloc(void) {
+  wuffs_webp__decoder* x =
+      (wuffs_webp__decoder*)(calloc(sizeof(wuffs_webp__decoder), 1));
+  if (!x) {
+    return NULL;
+  }
+  if (wuffs_webp__decoder__initialize(
+      x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
+    free(x);
+    return NULL;
+  }
+  return x;
+}
+
+size_t
+sizeof__wuffs_webp__decoder(void) {
+  return sizeof(wuffs_webp__decoder);
+}
+
+// ---------------- Function Implementations
+
+// -------- func webp.decoder.decode_huffman_groups
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_groups(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_n_huffman_groups) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint32_t v_hg = 0;
+  uint32_t v_ht = 0;
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups;
+  if (coro_susp_point) {
+    v_hg = self->private_data.s_decode_huffman_groups.v_hg;
+    v_ht = self->private_data.s_decode_huffman_groups.v_ht;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    v_hg = 0u;
+    while (v_hg < a_n_huffman_groups) {
+      v_ht = 0u;
+      while (v_ht < 5u) {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht);
+        if (status.repr) {
+          goto suspend;
+        }
+        v_ht += 1u;
+      }
+      v_hg += 1u;
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_huffman_groups = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_huffman_groups.v_hg = v_hg;
+  self->private_data.s_decode_huffman_groups.v_ht = v_ht;
+
+  goto exit;
+  exit:
+  return status;
+}
+
+// -------- func webp.decoder.decode_huffman_tree
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_tree(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_hg,
+    uint32_t a_ht) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_use_simple = 0;
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (a_ht >= 4u) {
+      self->private_impl.f_ht_n_symbols = 40u;
+    } else if (a_ht > 0u) {
+      self->private_impl.f_ht_n_symbols = 256u;
+    } else if (self->private_impl.f_color_cache_bits == 0u) {
+      self->private_impl.f_ht_n_symbols = 280u;
+    } else {
+      self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits));
+    }
+    if (self->private_impl.f_n_bits < 1u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      self->private_impl.f_bits = ((uint32_t)(v_c8));
+      self->private_impl.f_n_bits = 8u;
+    }
+    v_use_simple = (self->private_impl.f_bits & 1u);
+    self->private_impl.f_bits >>= 1u;
+    self->private_impl.f_n_bits -= 1u;
+    if (v_use_simple != 0u) {
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+      status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+    } else {
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+      status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self);
+      if ( ! wuffs_base__status__is_ok(&v_status)) {
+        status = v_status;
+        if (wuffs_base__status__is_error(&status)) {
+          goto exit;
+        } else if (wuffs_base__status__is_suspension(&status)) {
+          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+          goto exit;
+        }
+        goto ok;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+      status = wuffs_webp__decoder__build_code_lengths(self, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht);
+      if ( ! wuffs_base__status__is_ok(&v_status)) {
+        status = v_status;
+        if (wuffs_base__status__is_error(&status)) {
+          goto exit;
+        } else if (wuffs_base__status__is_suspension(&status)) {
+          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+          goto exit;
+        }
+        goto ok;
+      }
+    }
+
+    ok:
+    self->private_impl.p_decode_huffman_tree = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_huffman_tree_simple
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_huffman_tree_simple(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_hg,
+    uint32_t a_ht) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_use_second_symbol = 0;
+  uint32_t v_first_symbol_n_bits = 0;
+  uint32_t v_symbol0 = 0;
+  uint32_t v_symbol1 = 0;
+  uint32_t v_base_offset = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple;
+  if (coro_susp_point) {
+    v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol;
+    v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits;
+    v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0;
+    v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 2u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      if (self->private_impl.f_n_bits >= 2u) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+        goto exit;
+      }
+      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+      self->private_impl.f_n_bits += 8u;
+    }
+    v_use_second_symbol = (self->private_impl.f_bits & 1u);
+    v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u);
+    self->private_impl.f_bits >>= 2u;
+    self->private_impl.f_n_bits -= 2u;
+    if (self->private_impl.f_n_bits < v_first_symbol_n_bits) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_1 = *iop_a_src++;
+        v_c8 = t_1;
+      }
+      if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+        goto exit;
+      }
+      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+      self->private_impl.f_n_bits += 8u;
+    }
+    v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u));
+    self->private_impl.f_bits >>= v_first_symbol_n_bits;
+    self->private_impl.f_n_bits -= v_first_symbol_n_bits;
+    v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
+    if (v_use_second_symbol != 0u) {
+      if (self->private_impl.f_n_bits < 8u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_2 = *iop_a_src++;
+          v_c8 = t_2;
+        }
+        if (self->private_impl.f_n_bits >= 8u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_symbol1 = (self->private_impl.f_bits & 255u);
+      self->private_impl.f_bits >>= 8u;
+      self->private_impl.f_n_bits -= 8u;
+      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u)));
+      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u)));
+      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u)));
+    } else {
+      self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u)));
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_huffman_tree_simple = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol;
+  self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits;
+  self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0;
+  self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_code_length_code_lengths
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_code_length_code_lengths(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_n_codes = 0;
+  uint32_t v_i = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths;
+  if (coro_susp_point) {
+    v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes;
+    v_i = self->private_data.s_decode_code_length_code_lengths.v_i;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 4u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      if (self->private_impl.f_n_bits >= 4u) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+        goto exit;
+      }
+      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+      self->private_impl.f_n_bits += 8u;
+    }
+    v_n_codes = ((self->private_impl.f_bits & 15u) + 4u);
+    self->private_impl.f_bits >>= 4u;
+    self->private_impl.f_n_bits -= 4u;
+    v_i = 0u;
+    while (v_i < v_n_codes) {
+      if (self->private_impl.f_n_bits < 3u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_1 = *iop_a_src++;
+          v_c8 = t_1;
+        }
+        if (self->private_impl.f_n_bits >= 3u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u)));
+      self->private_impl.f_bits >>= 3u;
+      self->private_impl.f_n_bits -= 3u;
+      v_i += 1u;
+    }
+    while (v_i < 19u) {
+      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u;
+      v_i += 1u;
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_code_length_code_lengths = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes;
+  self->private_data.s_decode_code_length_code_lengths.v_i = v_i;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.build_code_lengths_huffman_nodes
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_code_lengths_huffman_nodes(
+    wuffs_webp__decoder* self) {
+  uint32_t v_code_bits = 0;
+  uint32_t v_code_len = 0;
+  uint32_t v_symbol = 0;
+  uint32_t v_histogram[8] = {0};
+  uint32_t v_n_used_symbols = 0;
+  uint32_t v_last_used_symbol = 0;
+  uint32_t v_subscription_weight = 0;
+  uint32_t v_subscription_total = 0;
+  uint32_t v_curr_code = 0;
+  uint32_t v_next_codes[9] = {0};
+  uint32_t v_n_branches = 0;
+  uint32_t v_h = 0;
+  uint32_t v_children = 0;
+  uint16_t v_node = 0;
+
+  v_symbol = 0u;
+  while (v_symbol < 19u) {
+    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
+    if (v_code_len != 0u) {
+      v_histogram[v_code_len] += 1u;
+      v_n_used_symbols += 1u;
+      v_last_used_symbol = v_symbol;
+    }
+    v_symbol += 1u;
+  }
+  if (v_n_used_symbols < 1u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
+  } else if (v_n_used_symbols == 1u) {
+    self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u)));
+    return wuffs_base__make_status(NULL);
+  }
+  v_subscription_weight = 16384u;
+  v_code_len = 1u;
+  while (true) {
+    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
+    v_next_codes[(v_code_len + 1u)] = v_curr_code;
+    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
+    v_subscription_weight >>= 1u;
+    if (v_code_len >= 7u) {
+      break;
+    }
+    v_code_len += 1u;
+  }
+  if (v_subscription_total > 32768u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
+  } else if (v_subscription_total < 32768u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
+  }
+  self->private_data.f_code_lengths_huffman_nodes[0u] = 0u;
+  v_symbol = 0u;
+  while (v_symbol < 19u) {
+    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
+    if (v_code_len > 0u) {
+      v_code_bits = v_next_codes[v_code_len];
+      v_next_codes[v_code_len] += 1u;
+      v_code_bits <<= (32u - v_code_len);
+      v_h = 0u;
+      while (v_code_len > 0u) {
+        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
+        if (v_node == 0u) {
+          v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))));
+          v_children = wuffs_base__u32__min(v_children, 35u);
+          self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children));
+          self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u;
+          self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u;
+          v_h = (v_children + (v_code_bits >> 31u));
+          v_n_branches += 1u;
+        } else {
+          v_children = ((uint32_t)(v_node));
+          v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u));
+        }
+        v_code_bits <<= 1u;
+        v_code_len -= 1u;
+      }
+      self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u)));
+    }
+    v_symbol += 1u;
+  }
+  return wuffs_base__make_status(NULL);
+}
+
+// -------- func webp.decoder.build_huffman_nodes
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_huffman_nodes(
+    wuffs_webp__decoder* self,
+    uint32_t a_hg,
+    uint32_t a_ht) {
+  uint32_t v_base_offset = 0;
+  uint32_t v_code_bits = 0;
+  uint32_t v_code_len = 0;
+  uint32_t v_symbol = 0;
+  uint32_t v_histogram[16] = {0};
+  uint32_t v_n_used_symbols = 0;
+  uint32_t v_last_used_symbol = 0;
+  uint32_t v_subscription_weight = 0;
+  uint32_t v_subscription_total = 0;
+  uint32_t v_curr_code = 0;
+  uint32_t v_next_codes[17] = {0};
+  uint32_t v_n_branches = 0;
+  uint32_t v_h = 0;
+  uint32_t v_children = 0;
+  uint16_t v_node = 0;
+
+  v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
+  v_symbol = 0u;
+  while (v_symbol < self->private_impl.f_ht_n_symbols) {
+    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
+    if (v_code_len != 0u) {
+      v_histogram[v_code_len] += 1u;
+      v_n_used_symbols += 1u;
+      v_last_used_symbol = v_symbol;
+    }
+    v_symbol += 1u;
+  }
+  if (v_n_used_symbols < 1u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
+  } else if (v_n_used_symbols == 1u) {
+    self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u)));
+    return wuffs_base__make_status(NULL);
+  }
+  v_subscription_weight = 16384u;
+  v_code_len = 1u;
+  while (true) {
+    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
+    v_next_codes[(v_code_len + 1u)] = v_curr_code;
+    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
+    v_subscription_weight >>= 1u;
+    if (v_code_len >= 15u) {
+      break;
+    }
+    v_code_len += 1u;
+  }
+  if (v_subscription_total > 32768u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
+  } else if (v_subscription_total < 32768u) {
+    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
+  }
+  self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u;
+  v_symbol = 0u;
+  while (v_symbol < self->private_impl.f_ht_n_symbols) {
+    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
+    if (v_code_len != 0u) {
+      v_code_bits = v_next_codes[v_code_len];
+      v_next_codes[v_code_len] += 1u;
+      v_code_bits <<= (32u - v_code_len);
+      v_h = v_base_offset;
+      while (v_code_len > 0u) {
+        v_node = self->private_data.f_huffman_nodes[a_hg][v_h];
+        if (v_node == 0u) {
+          v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))))));
+          v_children = wuffs_base__u32__min(v_children, 6265u);
+          self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children));
+          self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u;
+          self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u;
+          v_h = (v_children + (v_code_bits >> 31u));
+          v_n_branches += 1u;
+        } else {
+          v_children = ((uint32_t)(v_node));
+          v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u));
+        }
+        v_code_bits <<= 1u;
+        v_code_len -= 1u;
+      }
+      self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u)));
+    }
+    v_symbol += 1u;
+  }
+  return wuffs_base__make_status(NULL);
+}
+
+// -------- func webp.decoder.build_code_lengths
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__build_code_lengths(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_use_length = 0;
+  uint32_t v_length_n_bits = 0;
+  uint32_t v_length = 0;
+  uint16_t v_prev_code_length = 0;
+  uint32_t v_h = 0;
+  uint32_t v_s = 0;
+  uint32_t v_s_max = 0;
+  uint16_t v_node = 0;
+  uint32_t v_symbol = 0;
+  uint16_t v_repeat_value = 0;
+  uint32_t v_repeat_n_bits = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_build_code_lengths;
+  if (coro_susp_point) {
+    v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits;
+    v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length;
+    v_s = self->private_data.s_build_code_lengths.v_s;
+    v_s_max = self->private_data.s_build_code_lengths.v_s_max;
+    v_node = self->private_data.s_build_code_lengths.v_node;
+    v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value;
+    v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 1u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      self->private_impl.f_bits = ((uint32_t)(v_c8));
+      self->private_impl.f_n_bits = 8u;
+    }
+    v_use_length = (self->private_impl.f_bits & 1u);
+    self->private_impl.f_bits >>= 1u;
+    self->private_impl.f_n_bits -= 1u;
+    self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols;
+    if (v_use_length != 0u) {
+      if (self->private_impl.f_n_bits < 3u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_1 = *iop_a_src++;
+          v_c8 = t_1;
+        }
+        if (self->private_impl.f_n_bits >= 3u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u);
+      self->private_impl.f_bits >>= 3u;
+      self->private_impl.f_n_bits -= 3u;
+      while (self->private_impl.f_n_bits < v_length_n_bits) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_2 = *iop_a_src++;
+          v_c8 = t_2;
+        }
+        if (self->private_impl.f_n_bits >= v_length_n_bits) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u);
+      self->private_impl.f_bits >>= v_length_n_bits;
+      self->private_impl.f_n_bits -= v_length_n_bits;
+      if (v_length > self->private_impl.f_ht_n_symbols) {
+        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
+        goto exit;
+      }
+      self->private_impl.f_ht_code_lengths_remaining = v_length;
+    }
+    v_prev_code_length = 8u;
+    while (v_s < self->private_impl.f_ht_n_symbols) {
+      if (self->private_impl.f_ht_code_lengths_remaining <= 0u) {
+        while (v_s < self->private_impl.f_ht_n_symbols) {
+          self->private_data.f_code_lengths[v_s] = 0u;
+          v_s += 1u;
+        }
+        break;
+      }
+      self->private_impl.f_ht_code_lengths_remaining -= 1u;
+      v_h = 0u;
+      while (true) {
+        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
+        if (v_node >= 32768u) {
+          break;
+        } else if (v_node > 35u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
+          goto exit;
+        }
+        if (self->private_impl.f_n_bits < 1u) {
+          {
+            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+              goto suspend;
+            }
+            uint8_t t_3 = *iop_a_src++;
+            v_c8 = t_3;
+          }
+          self->private_impl.f_bits = ((uint32_t)(v_c8));
+          self->private_impl.f_n_bits = 8u;
+        }
+        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
+        self->private_impl.f_bits >>= 1u;
+        self->private_impl.f_n_bits -= 1u;
+      }
+      v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u))));
+      if (v_symbol == 0u) {
+        self->private_data.f_code_lengths[v_s] = 0u;
+        v_s += 1u;
+        continue;
+      } else if (v_symbol < 16u) {
+        v_prev_code_length = ((uint16_t)(v_symbol));
+        self->private_data.f_code_lengths[v_s] = v_prev_code_length;
+        v_s += 1u;
+        continue;
+      } else if (v_symbol == 16u) {
+        v_repeat_value = v_prev_code_length;
+      } else {
+        v_repeat_value = 0u;
+      }
+      v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)]));
+      v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s));
+      if (self->private_impl.f_n_bits < v_repeat_n_bits) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_4 = *iop_a_src++;
+          v_c8 = t_4;
+        }
+        if (self->private_impl.f_n_bits >= v_repeat_n_bits) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u));
+      self->private_impl.f_bits >>= v_repeat_n_bits;
+      self->private_impl.f_n_bits -= v_repeat_n_bits;
+      if (v_s_max > self->private_impl.f_ht_n_symbols) {
+        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
+        goto exit;
+      }
+      while (v_s < v_s_max) {
+        self->private_data.f_code_lengths[v_s] = v_repeat_value;
+        v_s += 1u;
+      }
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_build_code_lengths = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits;
+  self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length;
+  self->private_data.s_build_code_lengths.v_s = v_s;
+  self->private_data.s_build_code_lengths.v_s_max = v_s_max;
+  self->private_data.s_build_code_lengths.v_node = v_node;
+  self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value;
+  self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_pixels_slow
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_pixels_slow(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_dst,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    uint32_t a_height,
+    wuffs_base__slice_u8 a_tile_data,
+    uint32_t a_tile_size_log2) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint64_t v_p = 0;
+  uint64_t v_p_max = 0;
+  uint32_t v_tile_size_log2 = 0;
+  uint32_t v_width_in_tiles = 0;
+  uint32_t v_x = 0;
+  uint32_t v_y = 0;
+  uint32_t v_i = 0;
+  uint32_t v_hg = 0;
+  uint32_t v_h = 0;
+  uint16_t v_node = 0;
+  uint32_t v_pixel_g = 0;
+  uint32_t v_color = 0;
+  wuffs_base__slice_u8 v_dst_pixel = {0};
+  uint32_t v_back_ref_len_n_bits = 0;
+  uint32_t v_back_ref_len_minus_1 = 0;
+  uint32_t v_back_ref_dist_n_bits = 0;
+  uint32_t v_back_ref_dist_sym = 0;
+  uint32_t v_back_ref_dist_premap_minus_1 = 0;
+  uint32_t v_back_ref_dist_minus_1 = 0;
+  uint32_t v_dm = 0;
+  uint32_t v_dx = 0;
+  uint32_t v_dy = 0;
+  uint64_t v_p_end = 0;
+  uint64_t v_dist4 = 0;
+  uint64_t v_q = 0;
+  wuffs_base__slice_u8 v_color_cache_pixels = {0};
+  uint64_t v_color_cache_p = 0;
+  uint32_t v_color_cache_shift = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow;
+  if (coro_susp_point) {
+    v_p = self->private_data.s_decode_pixels_slow.v_p;
+    v_p_max = self->private_data.s_decode_pixels_slow.v_p_max;
+    v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2;
+    v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles;
+    v_x = self->private_data.s_decode_pixels_slow.v_x;
+    v_y = self->private_data.s_decode_pixels_slow.v_y;
+    v_hg = self->private_data.s_decode_pixels_slow.v_hg;
+    v_node = self->private_data.s_decode_pixels_slow.v_node;
+    v_color = self->private_data.s_decode_pixels_slow.v_color;
+    v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits;
+    v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1;
+    v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits;
+    v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1;
+    v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    v_p_max = ((uint64_t)((4u * a_width * a_height)));
+    if (((uint64_t)(a_dst.len)) < v_p_max) {
+      status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
+      goto exit;
+    }
+    if (a_tile_size_log2 != 0u) {
+      v_tile_size_log2 = a_tile_size_log2;
+      v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
+    } else {
+      v_tile_size_log2 = 31u;
+      v_width_in_tiles = 1u;
+    }
+    while (v_p < v_p_max) {
+      v_i = ((uint32_t)(((uint32_t)(((uint32_t)(((uint32_t)((v_y >> v_tile_size_log2) * v_width_in_tiles)) + (v_x >> v_tile_size_log2))) * 4u)) + 1u));
+      if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) {
+        v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))]));
+      }
+      v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u]));
+      while (true) {
+        v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
+        if (v_node >= 32768u) {
+          break;
+        } else if (v_node > 6265u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
+          goto exit;
+        }
+        if (self->private_impl.f_n_bits < 1u) {
+          {
+            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+              goto suspend;
+            }
+            uint8_t t_0 = *iop_a_src++;
+            v_c8 = t_0;
+          }
+          self->private_impl.f_bits = ((uint32_t)(v_c8));
+          self->private_impl.f_n_bits = 8u;
+        }
+        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
+        self->private_impl.f_bits >>= 1u;
+        self->private_impl.f_n_bits -= 1u;
+      }
+      v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u))));
+      if (v_pixel_g < 256u) {
+        v_color = (v_pixel_g << 8u);
+        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u]));
+        while (true) {
+          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
+          if (v_node >= 32768u) {
+            break;
+          }
+          if (self->private_impl.f_n_bits < 1u) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_1 = *iop_a_src++;
+              v_c8 = t_1;
+            }
+            self->private_impl.f_bits = ((uint32_t)(v_c8));
+            self->private_impl.f_n_bits = 8u;
+          }
+          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
+          self->private_impl.f_bits >>= 1u;
+          self->private_impl.f_n_bits -= 1u;
+        }
+        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u);
+        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u]));
+        while (true) {
+          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
+          if (v_node >= 32768u) {
+            break;
+          }
+          if (self->private_impl.f_n_bits < 1u) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_2 = *iop_a_src++;
+              v_c8 = t_2;
+            }
+            self->private_impl.f_bits = ((uint32_t)(v_c8));
+            self->private_impl.f_n_bits = 8u;
+          }
+          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
+          self->private_impl.f_bits >>= 1u;
+          self->private_impl.f_n_bits -= 1u;
+        }
+        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u);
+        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u]));
+        while (true) {
+          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
+          if (v_node >= 32768u) {
+            break;
+          }
+          if (self->private_impl.f_n_bits < 1u) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_3 = *iop_a_src++;
+              v_c8 = t_3;
+            }
+            self->private_impl.f_bits = ((uint32_t)(v_c8));
+            self->private_impl.f_n_bits = 8u;
+          }
+          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
+          self->private_impl.f_bits >>= 1u;
+          self->private_impl.f_n_bits -= 1u;
+        }
+        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u);
+      } else if (v_pixel_g < 280u) {
+        if (v_pixel_g < 260u) {
+          v_back_ref_len_minus_1 = (v_pixel_g - 256u);
+        } else {
+          v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u);
+          v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits);
+          while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_4 = *iop_a_src++;
+              v_c8 = t_4;
+            }
+            if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) {
+              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+              goto exit;
+            }
+            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+            self->private_impl.f_n_bits += 8u;
+          }
+          v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u));
+          self->private_impl.f_bits >>= v_back_ref_len_n_bits;
+          self->private_impl.f_n_bits -= v_back_ref_len_n_bits;
+        }
+        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u]));
+        while (true) {
+          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
+          if (v_node >= 32768u) {
+            break;
+          }
+          if (self->private_impl.f_n_bits < 1u) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_5 = *iop_a_src++;
+              v_c8 = t_5;
+            }
+            self->private_impl.f_bits = ((uint32_t)(v_c8));
+            self->private_impl.f_n_bits = 8u;
+          }
+          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
+          self->private_impl.f_bits >>= 1u;
+          self->private_impl.f_n_bits -= 1u;
+        }
+        v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u))));
+        if (v_back_ref_dist_sym < 4u) {
+          v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym;
+        } else if (v_back_ref_dist_sym < 40u) {
+          v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u);
+          v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits);
+          while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) {
+            {
+              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
+              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+                goto suspend;
+              }
+              uint8_t t_6 = *iop_a_src++;
+              v_c8 = t_6;
+            }
+            if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) {
+              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+              goto exit;
+            }
+            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+            self->private_impl.f_n_bits += 8u;
+          }
+          v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u));
+          self->private_impl.f_bits >>= v_back_ref_dist_n_bits;
+          self->private_impl.f_n_bits -= v_back_ref_dist_n_bits;
+        }
+        if (v_back_ref_dist_premap_minus_1 >= 120u) {
+          v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u);
+        } else {
+          v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1]));
+          v_dy = (v_dm >> 4u);
+          v_dx = ((uint32_t)(7u - (v_dm & 15u)));
+          v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx));
+        }
+        v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u))));
+        v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u);
+        if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) {
+          status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference);
+          goto exit;
+        }
+        v_q = (v_p - v_dist4);
+        while ((v_q < v_p) && (v_p < v_p_end)) {
+          a_dst.ptr[v_p] = a_dst.ptr[v_q];
+          v_p += 1u;
+          v_q += 1u;
+        }
+        v_x += (v_back_ref_len_minus_1 + 1u);
+        while (v_x >= a_width) {
+          v_x -= a_width;
+          v_y += 1u;
+        }
+        continue;
+      } else {
+        if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
+          goto exit;
+        }
+        v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p);
+        v_color_cache_p = v_p;
+        v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u);
+        while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) {
+          v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr);
+          self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color;
+          v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u);
+        }
+        v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)];
+      }
+      if (v_p > ((uint64_t)(a_dst.len))) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
+        goto exit;
+      }
+      v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p);
+      if (((uint64_t)(v_dst_pixel.len)) < 4u) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
+        goto exit;
+      }
+      wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color);
+      v_p += 4u;
+      v_x += 1u;
+      if (v_x == a_width) {
+        v_x = 0u;
+        v_y += 1u;
+      }
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_pixels_slow = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_pixels_slow.v_p = v_p;
+  self->private_data.s_decode_pixels_slow.v_p_max = v_p_max;
+  self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2;
+  self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles;
+  self->private_data.s_decode_pixels_slow.v_x = v_x;
+  self->private_data.s_decode_pixels_slow.v_y = v_y;
+  self->private_data.s_decode_pixels_slow.v_hg = v_hg;
+  self->private_data.s_decode_pixels_slow.v_node = v_node;
+  self->private_data.s_decode_pixels_slow.v_color = v_color;
+  self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits;
+  self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1;
+  self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits;
+  self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1;
+  self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.apply_transform_predictor
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_predictor(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix,
+    wuffs_base__slice_u8 a_tile_data) {
+  uint64_t v_w4 = 0;
+  wuffs_base__slice_u8 v_prev_row = {0};
+  wuffs_base__slice_u8 v_curr_row = {0};
+  uint32_t v_tile_size_log2 = 0;
+  uint32_t v_tiles_per_row = 0;
+  uint32_t v_mask = 0;
+  uint32_t v_y = 0;
+  uint32_t v_x = 0;
+  uint64_t v_t = 0;
+  wuffs_base__slice_u8 v_tile_data = {0};
+  uint8_t v_mode = 0;
+  uint32_t v_l0 = 0;
+  uint32_t v_l1 = 0;
+  uint32_t v_l2 = 0;
+  uint32_t v_l3 = 0;
+  uint32_t v_c0 = 0;
+  uint32_t v_c1 = 0;
+  uint32_t v_c2 = 0;
+  uint32_t v_c3 = 0;
+  uint32_t v_t0 = 0;
+  uint32_t v_t1 = 0;
+  uint32_t v_t2 = 0;
+  uint32_t v_t3 = 0;
+  uint32_t v_sum_l = 0;
+  uint32_t v_sum_t = 0;
+
+  if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) {
+    return wuffs_base__make_empty_struct();
+  }
+  v_w4 = ((uint64_t)((self->private_impl.f_width * 4u)));
+  v_curr_row = wuffs_base__utility__empty_slice_u8();
+  if (v_w4 <= ((uint64_t)(a_pix.len))) {
+    v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4);
+  }
+  if (((uint64_t)(v_curr_row.len)) >= 4u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    v_curr_row.ptr[3u] += 255u;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+  }
+  while (((uint64_t)(v_curr_row.len)) >= 8u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+    v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+    v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
+  }
+  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u]));
+  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
+  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
+  v_y = 1u;
+  while (v_y < self->private_impl.f_height) {
+    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
+    v_tile_data = wuffs_base__utility__empty_slice_u8();
+    if (v_t <= ((uint64_t)(a_tile_data.len))) {
+      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
+      if (((uint64_t)(v_tile_data.len)) >= 4u) {
+        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
+        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
+      }
+    }
+    if (v_w4 <= ((uint64_t)(a_pix.len))) {
+      v_prev_row = a_pix;
+      a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4);
+      v_curr_row = a_pix;
+    }
+    if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_curr_row.ptr[0u] += v_prev_row.ptr[0u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_curr_row.ptr[1u] += v_prev_row.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_curr_row.ptr[2u] += v_prev_row.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_curr_row.ptr[3u] += v_prev_row.ptr[3u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+    }
+    v_x = 1u;
+    while (v_x < self->private_impl.f_width) {
+      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
+        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
+        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
+      }
+      if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) {
+        break;
+      }
+      if (v_mode == 0u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += 255u;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 1u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 2u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += v_prev_row.ptr[4u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += v_prev_row.ptr[5u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += v_prev_row.ptr[6u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += v_prev_row.ptr[7u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 3u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += v_prev_row.ptr[8u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += v_prev_row.ptr[9u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += v_prev_row.ptr[10u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += v_prev_row.ptr[11u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 4u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += v_prev_row.ptr[0u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += v_prev_row.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += v_prev_row.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += v_prev_row.ptr[3u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 5u) {
+        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
+        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
+        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
+        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 6u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 7u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 8u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 9u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 10u) {
+        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u);
+        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u);
+        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u);
+        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u);
+        v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
+        v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
+        v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
+        v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 11u) {
+        v_l0 = ((uint32_t)(v_curr_row.ptr[0u]));
+        v_l1 = ((uint32_t)(v_curr_row.ptr[1u]));
+        v_l2 = ((uint32_t)(v_curr_row.ptr[2u]));
+        v_l3 = ((uint32_t)(v_curr_row.ptr[3u]));
+        v_c0 = ((uint32_t)(v_prev_row.ptr[0u]));
+        v_c1 = ((uint32_t)(v_prev_row.ptr[1u]));
+        v_c2 = ((uint32_t)(v_prev_row.ptr[2u]));
+        v_c3 = ((uint32_t)(v_prev_row.ptr[3u]));
+        v_t0 = ((uint32_t)(v_prev_row.ptr[4u]));
+        v_t1 = ((uint32_t)(v_prev_row.ptr[5u]));
+        v_t2 = ((uint32_t)(v_prev_row.ptr[6u]));
+        v_t3 = ((uint32_t)(v_prev_row.ptr[7u]));
+        v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) +
+            wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) +
+            wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) +
+            wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3));
+        v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) +
+            wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) +
+            wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) +
+            wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3));
+        if (v_sum_l < v_sum_t) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[4u] += ((uint8_t)(v_l0));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[5u] += ((uint8_t)(v_l1));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[6u] += ((uint8_t)(v_l2));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[7u] += ((uint8_t)(v_l3));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+        } else {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[4u] += ((uint8_t)(v_t0));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[5u] += ((uint8_t)(v_t1));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[6u] += ((uint8_t)(v_t2));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+          v_curr_row.ptr[7u] += ((uint8_t)(v_t3));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+        }
+      } else if (v_mode == 12u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += wuffs_webp__decoder__mode12(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      } else if (v_mode == 13u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[4u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[0u], v_prev_row.ptr[4u], v_prev_row.ptr[0u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[5u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[1u], v_prev_row.ptr[5u], v_prev_row.ptr[1u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[6u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[2u], v_prev_row.ptr[6u], v_prev_row.ptr[2u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_curr_row.ptr[7u] += wuffs_webp__decoder__mode13(self, v_curr_row.ptr[3u], v_prev_row.ptr[7u], v_prev_row.ptr[3u]);
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      }
+      v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
+      v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u);
+      v_x += 1u;
+    }
+    v_y += 1u;
+  }
+  return wuffs_base__make_empty_struct();
+}
+
+// -------- func webp.decoder.absolute_difference
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint32_t
+wuffs_webp__decoder__absolute_difference(
+    const wuffs_webp__decoder* self,
+    uint32_t a_a,
+    uint32_t a_b) {
+  if (a_a < a_b) {
+    return (a_b - a_a);
+  }
+  return (a_a - a_b);
+}
+
+// -------- func webp.decoder.mode12
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint8_t
+wuffs_webp__decoder__mode12(
+    const wuffs_webp__decoder* self,
+    uint8_t a_l,
+    uint8_t a_t,
+    uint8_t a_tl) {
+  uint32_t v_v = 0;
+
+  v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl))));
+  if (v_v < 256u) {
+    return ((uint8_t)(v_v));
+  } else if (v_v < 512u) {
+    return 255u;
+  }
+  return 0u;
+}
+
+// -------- func webp.decoder.mode13
+
+WUFFS_BASE__GENERATED_C_CODE
+static uint8_t
+wuffs_webp__decoder__mode13(
+    const wuffs_webp__decoder* self,
+    uint8_t a_l,
+    uint8_t a_t,
+    uint8_t a_tl) {
+  uint32_t v_x = 0;
+  uint32_t v_y = 0;
+  uint32_t v_z = 0;
+  uint32_t v_v = 0;
+
+  v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u);
+  v_y = ((uint32_t)(a_tl));
+  v_z = ((uint32_t)(v_x - v_y));
+  v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u)));
+  if (v_v < 256u) {
+    return ((uint8_t)(v_v));
+  } else if (v_v < 512u) {
+    return 255u;
+  }
+  return 0u;
+}
+
+// -------- func webp.decoder.apply_transform_cross_color
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_cross_color(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix,
+    wuffs_base__slice_u8 a_tile_data) {
+  uint32_t v_tile_size_log2 = 0;
+  uint32_t v_tiles_per_row = 0;
+  uint32_t v_mask = 0;
+  uint32_t v_y = 0;
+  uint32_t v_x = 0;
+  uint64_t v_t = 0;
+  wuffs_base__slice_u8 v_tile_data = {0};
+  uint32_t v_g2r = 0;
+  uint32_t v_g2b = 0;
+  uint32_t v_r2b = 0;
+  uint8_t v_b = 0;
+  uint8_t v_g = 0;
+  uint8_t v_r = 0;
+
+  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u]));
+  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
+  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
+  v_y = 0u;
+  while (v_y < self->private_impl.f_height) {
+    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
+    v_tile_data = wuffs_base__utility__empty_slice_u8();
+    if (v_t <= ((uint64_t)(a_tile_data.len))) {
+      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
+    }
+    v_x = 0u;
+    while (v_x < self->private_impl.f_width) {
+      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
+        v_g2r = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[0u]];
+        v_g2b = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[1u]];
+        v_r2b = WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_tile_data.ptr[2u]];
+        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
+      }
+      if (((uint64_t)(a_pix.len)) >= 4u) {
+        v_b = a_pix.ptr[0u];
+        v_g = a_pix.ptr[1u];
+        v_r = a_pix.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_r += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_g] * v_g2r)) >> 5u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_b += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_g] * v_g2b)) >> 5u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_b += ((uint8_t)((((uint32_t)(WUFFS_WEBP__SIGN_EXTEND_I8_I32[v_r] * v_r2b)) >> 5u)));
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+        a_pix.ptr[0u] = v_b;
+        a_pix.ptr[2u] = v_r;
+        a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u);
+      }
+      v_x += 1u;
+    }
+    v_y += 1u;
+  }
+  return wuffs_base__make_empty_struct();
+}
+
+// -------- func webp.decoder.apply_transform_subtract_green
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_subtract_green(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix) {
+  wuffs_base__slice_u8 v_p = {0};
+  uint8_t v_g = 0;
+
+  {
+    wuffs_base__slice_u8 i_slice_p = a_pix;
+    v_p.ptr = i_slice_p.ptr;
+    v_p.len = 4;
+    const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 4) * 4));
+    while (v_p.ptr < i_end0_p) {
+      v_g = v_p.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_p.ptr[0u] += v_g;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+      v_p.ptr[2u] += v_g;
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+      v_p.ptr += 4;
+    }
+    v_p.len = 0;
+  }
+  return wuffs_base__make_empty_struct();
+}
+
+// -------- func webp.decoder.apply_transform_color_indexing
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__empty_struct
+wuffs_webp__decoder__apply_transform_color_indexing(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_pix) {
+  uint32_t v_tile_size_log2 = 0;
+  uint32_t v_bits_per_pixel = 0;
+  uint32_t v_x_mask = 0;
+  uint32_t v_s_mask = 0;
+  uint64_t v_src_index = 0;
+  uint32_t v_y = 0;
+  uint64_t v_di = 0;
+  uint64_t v_dj = 0;
+  wuffs_base__slice_u8 v_dst = {0};
+  uint32_t v_x = 0;
+  uint32_t v_s = 0;
+  uint32_t v_p = 0;
+  uint8_t v_p0 = 0;
+  uint8_t v_p1 = 0;
+  uint8_t v_p2 = 0;
+  uint8_t v_p3 = 0;
+
+  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u]));
+  if (v_tile_size_log2 == 0u) {
+  }
+  v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2);
+  v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
+  v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u);
+  v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u)));
+  v_y = 0u;
+  while (v_y < self->private_impl.f_height) {
+    v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width)));
+    v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width)));
+    if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) {
+      break;
+    }
+    v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj);
+    v_x = 0u;
+    while (((uint64_t)(v_dst.len)) >= 4u) {
+      if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) {
+        v_s = ((uint32_t)(a_pix.ptr[v_src_index]));
+        v_src_index += 4u;
+      }
+      v_p = ((v_s & v_s_mask) * 4u);
+      v_s >>= v_bits_per_pixel;
+      v_p0 = self->private_data.f_palette[(v_p + 0u)];
+      v_p1 = self->private_data.f_palette[(v_p + 1u)];
+      v_p2 = self->private_data.f_palette[(v_p + 2u)];
+      v_p3 = self->private_data.f_palette[(v_p + 3u)];
+      v_dst.ptr[0u] = v_p0;
+      v_dst.ptr[1u] = v_p1;
+      v_dst.ptr[2u] = v_p2;
+      v_dst.ptr[3u] = v_p3;
+      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u);
+      v_x += 1u;
+    }
+    v_y += 1u;
+  }
+  return wuffs_base__make_empty_struct();
+}
+
+// -------- func webp.decoder.get_quirk
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__get_quirk(
+    const wuffs_webp__decoder* self,
+    uint32_t a_key) {
+  if (!self) {
+    return 0;
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return 0;
+  }
+
+  return 0u;
+}
+
+// -------- func webp.decoder.set_quirk
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__set_quirk(
+    wuffs_webp__decoder* self,
+    uint32_t a_key,
+    uint64_t a_value) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+
+  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+}
+
+// -------- func webp.decoder.decode_image_config
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_image_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__image_config* a_dst,
+    wuffs_base__io_buffer* a_src) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+  if (!a_src) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  if ((self->private_impl.active_coroutine != 0) &&
+      (self->private_impl.active_coroutine != 1)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+  }
+  self->private_impl.active_coroutine = 0;
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    while (true) {
+      {
+        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src);
+        v_status = t_0;
+      }
+      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
+        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
+        goto exit;
+      }
+      status = v_status;
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+    }
+
+    ok:
+    self->private_impl.p_decode_image_config = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
+
+  goto exit;
+  exit:
+  if (wuffs_base__status__is_error(&status)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+  }
+  return status;
+}
+
+// -------- func webp.decoder.do_decode_image_config
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__image_config* a_dst,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint32_t v_c32 = 0;
+  uint64_t v_r_mark = 0;
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_call_sequence != 0u) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      uint32_t t_0;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_do_decode_image_config.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
+          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
+          if (num_bits_0 == 24) {
+            t_0 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_0 += 8u;
+          *scratch |= ((uint64_t)(num_bits_0)) << 56;
+        }
+      }
+      v_c32 = t_0;
+    }
+    if (v_c32 != 1179011410u) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+      uint32_t t_1;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_do_decode_image_config.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
+          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
+          if (num_bits_1 == 24) {
+            t_1 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_1 += 8u;
+          *scratch |= ((uint64_t)(num_bits_1)) << 56;
+        }
+      }
+      self->private_impl.f_riff_chunk_length = t_1;
+    }
+    if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+    while (true) {
+      {
+        const bool o_0_closed_a_src = a_src->meta.closed;
+        const uint8_t* o_0_io2_a_src = io2_a_src;
+        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
+            ((uint64_t)(self->private_impl.f_riff_chunk_length)));
+        if (a_src) {
+          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
+          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
+          a_src->meta.wi = n;
+        }
+        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
+        {
+          if (a_src) {
+            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+          }
+          wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_src);
+          v_status = t_2;
+          if (a_src) {
+            iop_a_src = a_src->data.ptr + a_src->meta.ri;
+          }
+        }
+        wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_riff_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
+        io2_a_src = o_0_io2_a_src;
+        if (a_src) {
+          a_src->meta.closed = o_0_closed_a_src;
+          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
+        }
+      }
+      if (wuffs_base__status__is_ok(&v_status)) {
+        break;
+      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
+        status = v_status;
+        if (wuffs_base__status__is_error(&status)) {
+          goto exit;
+        } else if (wuffs_base__status__is_suspension(&status)) {
+          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+          goto exit;
+        }
+        goto ok;
+      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) {
+        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
+        goto exit;
+      }
+      status = v_status;
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
+    }
+    self->private_impl.f_frame_config_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)));
+    if (a_dst != NULL) {
+      wuffs_base__image_config__set(
+          a_dst,
+          self->private_impl.f_pixfmt,
+          0u,
+          self->private_impl.f_width,
+          self->private_impl.f_height,
+          self->private_impl.f_frame_config_io_position,
+          false);
+    }
+    self->private_impl.f_call_sequence = 32u;
+
+    ok:
+    self->private_impl.p_do_decode_image_config = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.do_decode_image_config_limited
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config_limited(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint32_t v_c32 = 0;
+  uint64_t v_r_mark = 0;
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      uint32_t t_0;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_do_decode_image_config_limited.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
+          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
+          if (num_bits_0 == 24) {
+            t_0 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_0 += 8u;
+          *scratch |= ((uint64_t)(num_bits_0)) << 56;
+        }
+      }
+      v_c32 = t_0;
+    }
+    if (v_c32 != 1346520407u) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+      uint32_t t_1;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_do_decode_image_config_limited.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
+          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
+          if (num_bits_1 == 24) {
+            t_1 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_1 += 8u;
+          *scratch |= ((uint64_t)(num_bits_1)) << 56;
+        }
+      }
+      v_c32 = t_1;
+    }
+    if (v_c32 == 540561494u) {
+      status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file);
+      goto exit;
+    } else if (v_c32 == 1278758998u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+        uint32_t t_2;
+        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+          t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+          iop_a_src += 4;
+        } else {
+          self->private_data.s_do_decode_image_config_limited.scratch = 0;
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+          while (true) {
+            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+              goto suspend;
+            }
+            uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
+            uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
+            *scratch <<= 8;
+            *scratch >>= 8;
+            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
+            if (num_bits_2 == 24) {
+              t_2 = ((uint32_t)(*scratch));
+              break;
+            }
+            num_bits_2 += 8u;
+            *scratch |= ((uint64_t)(num_bits_2)) << 56;
+          }
+        }
+        self->private_impl.f_sub_chunk_length = t_2;
+      }
+      if (self->private_impl.f_sub_chunk_length < 4u) {
+        status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+        goto exit;
+      }
+      self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u);
+      while (true) {
+        {
+          const bool o_0_closed_a_src = a_src->meta.closed;
+          const uint8_t* o_0_io2_a_src = io2_a_src;
+          wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
+              ((uint64_t)(self->private_impl.f_sub_chunk_length)));
+          if (a_src) {
+            size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
+            a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
+            a_src->meta.wi = n;
+          }
+          v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
+          {
+            if (a_src) {
+              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+            }
+            wuffs_base__status t_3 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src);
+            v_status = t_3;
+            if (a_src) {
+              iop_a_src = a_src->data.ptr + a_src->meta.ri;
+            }
+          }
+          wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_sub_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
+          io2_a_src = o_0_io2_a_src;
+          if (a_src) {
+            a_src->meta.closed = o_0_closed_a_src;
+            a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
+          }
+        }
+        if (wuffs_base__status__is_ok(&v_status)) {
+          break;
+        } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
+          status = v_status;
+          if (wuffs_base__status__is_error(&status)) {
+            goto exit;
+          } else if (wuffs_base__status__is_suspension(&status)) {
+            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+            goto exit;
+          }
+          goto ok;
+        } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) {
+          status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
+          goto exit;
+        }
+        status = v_status;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
+      }
+    } else if (v_c32 == 1480085590u) {
+      status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file);
+      goto exit;
+    } else {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+
+    ok:
+    self->private_impl.p_do_decode_image_config_limited = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.do_decode_image_config_limited_vp8l
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint32_t v_c32 = 0;
+  uint32_t v_transform_size = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+        goto suspend;
+      }
+      uint32_t t_0 = *iop_a_src++;
+      v_c32 = t_0;
+    }
+    if (v_c32 != 47u) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+    {
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+      uint32_t t_1;
+      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
+        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
+        iop_a_src += 4;
+      } else {
+        self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0;
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+        while (true) {
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch;
+          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
+          *scratch <<= 8;
+          *scratch >>= 8;
+          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
+          if (num_bits_1 == 24) {
+            t_1 = ((uint32_t)(*scratch));
+            break;
+          }
+          num_bits_1 += 8u;
+          *scratch |= ((uint64_t)(num_bits_1)) << 56;
+        }
+      }
+      v_c32 = t_1;
+    }
+    self->private_impl.f_width = ((v_c32 & 16383u) + 1u);
+    v_c32 >>= 14u;
+    self->private_impl.f_height = ((v_c32 & 16383u) + 1u);
+    v_c32 >>= 14u;
+    self->private_impl.f_pixfmt = 2415954056u;
+    if ((v_c32 & 1u) != 0u) {
+      self->private_impl.f_pixfmt = 2164295816u;
+    }
+    v_c32 >>= 1u;
+    if (v_c32 != 0u) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
+      goto exit;
+    }
+    v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u));
+    self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size));
+    self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size));
+    self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size));
+    self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size));
+
+    goto ok;
+    ok:
+    self->private_impl.p_do_decode_image_config_limited_vp8l = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_frame_config
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_frame_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__frame_config* a_dst,
+    wuffs_base__io_buffer* a_src) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+  if (!a_src) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  if ((self->private_impl.active_coroutine != 0) &&
+      (self->private_impl.active_coroutine != 2)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+  }
+  self->private_impl.active_coroutine = 0;
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    while (true) {
+      {
+        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src);
+        v_status = t_0;
+      }
+      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
+        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
+        goto exit;
+      }
+      status = v_status;
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+    }
+
+    ok:
+    self->private_impl.p_decode_frame_config = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
+
+  goto exit;
+  exit:
+  if (wuffs_base__status__is_error(&status)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+  }
+  return status;
+}
+
+// -------- func webp.decoder.do_decode_frame_config
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_frame_config(
+    wuffs_webp__decoder* self,
+    wuffs_base__frame_config* a_dst,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_call_sequence == 32u) {
+    } else if (self->private_impl.f_call_sequence < 32u) {
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+    } else if (self->private_impl.f_call_sequence == 40u) {
+      if (self->private_impl.f_frame_config_io_position != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
+        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
+        goto exit;
+      }
+    } else if (self->private_impl.f_call_sequence == 64u) {
+      self->private_impl.f_call_sequence = 96u;
+      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
+      goto ok;
+    } else {
+      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
+      goto ok;
+    }
+    if (a_dst != NULL) {
+      wuffs_base__frame_config__set(
+          a_dst,
+          wuffs_base__utility__make_rect_ie_u32(
+          0u,
+          0u,
+          self->private_impl.f_width,
+          self->private_impl.f_height),
+          ((wuffs_base__flicks)(0u)),
+          0u,
+          self->private_impl.f_frame_config_io_position,
+          0u,
+          false,
+          false,
+          0u);
+    }
+    self->private_impl.f_call_sequence = 64u;
+
+    ok:
+    self->private_impl.p_do_decode_frame_config = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_frame
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__decode_frame(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__pixel_blend a_blend,
+    wuffs_base__slice_u8 a_workbuf,
+    wuffs_base__decode_frame_options* a_opts) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+  if (!a_dst || !a_src) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  if ((self->private_impl.active_coroutine != 0) &&
+      (self->private_impl.active_coroutine != 3)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+  }
+  self->private_impl.active_coroutine = 0;
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    while (true) {
+      {
+        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_frame(self,
+            a_dst,
+            a_src,
+            a_blend,
+            a_workbuf,
+            a_opts);
+        v_status = t_0;
+      }
+      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
+        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
+        goto exit;
+      }
+      status = v_status;
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
+    }
+
+    ok:
+    self->private_impl.p_decode_frame = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
+
+  goto exit;
+  exit:
+  if (wuffs_base__status__is_error(&status)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+  }
+  return status;
+}
+
+// -------- func webp.decoder.do_decode_frame
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__do_decode_frame(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__pixel_blend a_blend,
+    wuffs_base__slice_u8 a_workbuf,
+    wuffs_base__decode_frame_options* a_opts) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_has_more = 0;
+  uint32_t v_width = 0;
+  wuffs_base__slice_u8 v_dst = {0};
+  wuffs_base__slice_u8 v_tile_data = {0};
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+  wuffs_base__slice_u8 v_pix = {0};
+  uint32_t v_which = 0;
+  uint32_t v_transform_type = 0;
+  uint64_t v_ti = 0;
+  uint64_t v_tj = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
+  if (coro_susp_point) {
+    v_width = self->private_data.s_do_decode_frame.v_width;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_call_sequence == 64u) {
+    } else if (self->private_impl.f_call_sequence < 64u) {
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+      status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+    } else {
+      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
+      goto ok;
+    }
+    self->private_impl.f_seen_transform[0u] = false;
+    self->private_impl.f_seen_transform[1u] = false;
+    self->private_impl.f_seen_transform[2u] = false;
+    self->private_impl.f_seen_transform[3u] = false;
+    self->private_impl.f_n_transforms = 0u;
+    while (true) {
+      if (self->private_impl.f_n_bits < 1u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_0 = *iop_a_src++;
+          v_c8 = t_0;
+        }
+        self->private_impl.f_bits = ((uint32_t)(v_c8));
+        self->private_impl.f_n_bits = 8u;
+      }
+      v_has_more = (self->private_impl.f_bits & 1u);
+      self->private_impl.f_bits >>= 1u;
+      self->private_impl.f_n_bits -= 1u;
+      if (v_has_more == 0u) {
+        break;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+      status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+    }
+    v_width = self->private_impl.f_width;
+    if (self->private_impl.f_seen_transform[3u]) {
+      v_width = self->private_impl.f_color_indexing_width;
+    }
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits;
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+    status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits;
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    while (true) {
+      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) ||
+          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) ||
+          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) ||
+          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) {
+        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+        goto exit;
+      }
+      v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)),
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
+      v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
+      {
+        if (a_src) {
+          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+        }
+        wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self,
+            v_dst,
+            a_src,
+            v_width,
+            self->private_impl.f_height,
+            v_tile_data,
+            self->private_impl.f_overall_tile_size_log2);
+        v_status = t_1;
+        if (a_src) {
+          iop_a_src = a_src->data.ptr + a_src->meta.ri;
+        }
+      }
+      if (wuffs_base__status__is_ok(&v_status)) {
+        break;
+      }
+      status = v_status;
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
+    }
+    if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+      goto exit;
+    }
+    v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
+    v_which = self->private_impl.f_n_transforms;
+    while (v_which > 0u) {
+      v_which -= 1u;
+      v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which]));
+      v_tile_data = wuffs_base__utility__empty_slice_u8();
+      if (v_transform_type < 2u) {
+        v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)]));
+        v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]));
+        if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) {
+          v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj);
+        }
+      }
+      if (v_transform_type == 0u) {
+        wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data);
+      } else if (v_transform_type == 1u) {
+        wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data);
+      } else if (v_transform_type == 2u) {
+        wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix);
+      } else {
+        wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix);
+        v_width = self->private_impl.f_width;
+      }
+    }
+    v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend);
+    if ( ! wuffs_base__status__is_ok(&v_status)) {
+      status = v_status;
+      if (wuffs_base__status__is_error(&status)) {
+        goto exit;
+      } else if (wuffs_base__status__is_suspension(&status)) {
+        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
+        goto exit;
+      }
+      goto ok;
+    }
+    self->private_impl.f_call_sequence = 96u;
+
+    ok:
+    self->private_impl.p_do_decode_frame = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_do_decode_frame.v_width = v_width;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_transform
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_transform(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    wuffs_base__slice_u8 a_workbuf) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_transform_type = 0;
+  uint32_t v_tile_size_log2 = 0;
+  wuffs_base__slice_u8 v_p = {0};
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_transform;
+  if (coro_susp_point) {
+    v_transform_type = self->private_data.s_decode_transform.v_transform_type;
+    v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 2u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      if (self->private_impl.f_n_bits >= 2u) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+        goto exit;
+      }
+      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+      self->private_impl.f_n_bits += 8u;
+    }
+    v_transform_type = (self->private_impl.f_bits & 3u);
+    self->private_impl.f_bits >>= 2u;
+    self->private_impl.f_n_bits -= 2u;
+    if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) {
+      status = wuffs_base__make_status(wuffs_webp__error__bad_transform);
+      goto exit;
+    } else if (self->private_impl.f_seen_transform[3u]) {
+      status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform);
+      goto exit;
+    }
+    self->private_impl.f_seen_transform[v_transform_type] = true;
+    self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type));
+    self->private_impl.f_n_transforms += 1u;
+    if (v_transform_type < 2u) {
+      if (self->private_impl.f_n_bits < 3u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_1 = *iop_a_src++;
+          v_c8 = t_1;
+        }
+        if (self->private_impl.f_n_bits >= 3u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
+      self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2));
+      self->private_impl.f_bits >>= 3u;
+      self->private_impl.f_n_bits -= 3u;
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)])) > ((uint64_t)(a_workbuf.len)))) {
+        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+        goto exit;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+      status = wuffs_webp__decoder__decode_pixels(self,
+          wuffs_base__slice_u8__subslice_ij(a_workbuf,
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
+          a_src,
+          ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+          ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+          wuffs_base__utility__empty_slice_u8(),
+          0u);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+    } else if (v_transform_type == 2u) {
+    } else {
+      if (self->private_impl.f_n_bits < 8u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_2 = *iop_a_src++;
+          v_c8 = t_2;
+        }
+        if (self->private_impl.f_n_bits >= 8u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u);
+      self->private_impl.f_bits >>= 8u;
+      self->private_impl.f_n_bits -= 8u;
+      if (self->private_impl.f_color_indexing_palette_size <= 2u) {
+        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u);
+        self->private_impl.f_transform_tile_size_log2[3u] = 3u;
+      } else if (self->private_impl.f_color_indexing_palette_size <= 4u) {
+        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u);
+        self->private_impl.f_transform_tile_size_log2[3u] = 2u;
+      } else if (self->private_impl.f_color_indexing_palette_size <= 16u) {
+        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u);
+        self->private_impl.f_transform_tile_size_log2[3u] = 1u;
+      } else {
+        self->private_impl.f_color_indexing_width = self->private_impl.f_width;
+        self->private_impl.f_transform_tile_size_log2[3u] = 0u;
+      }
+      if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) {
+        self->private_impl.f_workbuf_offset_for_color_indexing = (4u * (self->private_impl.f_width - self->private_impl.f_color_indexing_width) * self->private_impl.f_height);
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
+      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
+      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      if (a_src) {
+        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+      }
+      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
+      status = wuffs_webp__decoder__decode_pixels(self,
+          wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)),
+          a_src,
+          self->private_impl.f_color_indexing_palette_size,
+          1u,
+          wuffs_base__utility__empty_slice_u8(),
+          0u);
+      if (a_src) {
+        iop_a_src = a_src->data.ptr + a_src->meta.ri;
+      }
+      if (status.repr) {
+        goto suspend;
+      }
+      wuffs_private_impl__bulk_memset(&self->private_data.f_palette[(4u * self->private_impl.f_color_indexing_palette_size)], (1024u - (4u * self->private_impl.f_color_indexing_palette_size)), 0u);
+      v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size));
+      while (((uint64_t)(v_p.len)) >= 8u) {
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_p.ptr[4u] += v_p.ptr[0u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_p.ptr[5u] += v_p.ptr[1u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_p.ptr[6u] += v_p.ptr[2u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wconversion"
+#endif
+        v_p.ptr[7u] += v_p.ptr[3u];
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+        v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
+      }
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_transform = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_transform.v_transform_type = v_transform_type;
+  self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_color_cache_parameters
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_color_cache_parameters(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_use_color_cache = 0;
+  uint32_t v_color_cache_bits = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 1u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      self->private_impl.f_bits = ((uint32_t)(v_c8));
+      self->private_impl.f_n_bits = 8u;
+    }
+    v_use_color_cache = (self->private_impl.f_bits & 1u);
+    self->private_impl.f_bits >>= 1u;
+    self->private_impl.f_n_bits -= 1u;
+    self->private_impl.f_color_cache_bits = 0u;
+    if (v_use_color_cache != 0u) {
+      if (self->private_impl.f_n_bits < 4u) {
+        {
+          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+            goto suspend;
+          }
+          uint8_t t_1 = *iop_a_src++;
+          v_c8 = t_1;
+        }
+        if (self->private_impl.f_n_bits >= 4u) {
+          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+          goto exit;
+        }
+        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+        self->private_impl.f_n_bits += 8u;
+      }
+      v_color_cache_bits = (self->private_impl.f_bits & 15u);
+      self->private_impl.f_bits >>= 4u;
+      self->private_impl.f_n_bits -= 4u;
+      if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) {
+        status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache);
+        goto exit;
+      }
+      self->private_impl.f_color_cache_bits = v_color_cache_bits;
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_color_cache_parameters = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_hg_table
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_hg_table(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    wuffs_base__slice_u8 a_workbuf) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint8_t v_c8 = 0;
+  uint32_t v_use_hg_table = 0;
+  uint32_t v_tile_size_log2 = 0;
+  wuffs_base__slice_u8 v_hg_pixels = {0};
+  uint64_t v_n = 0;
+  wuffs_base__slice_u8 v_p = {0};
+  uint32_t v_hg_plus_1 = 0;
+
+  const uint8_t* iop_a_src = NULL;
+  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
+  if (a_src && a_src->data.ptr) {
+    io0_a_src = a_src->data.ptr;
+    io1_a_src = io0_a_src + a_src->meta.ri;
+    iop_a_src = io1_a_src;
+    io2_a_src = io0_a_src + a_src->meta.wi;
+  }
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_hg_table;
+  if (coro_susp_point) {
+    v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2;
+  }
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    if (self->private_impl.f_n_bits < 1u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_0 = *iop_a_src++;
+        v_c8 = t_0;
+      }
+      self->private_impl.f_bits = ((uint32_t)(v_c8));
+      self->private_impl.f_n_bits = 8u;
+    }
+    v_use_hg_table = (self->private_impl.f_bits & 1u);
+    self->private_impl.f_bits >>= 1u;
+    self->private_impl.f_n_bits -= 1u;
+    if (v_use_hg_table == 0u) {
+      self->private_impl.f_overall_n_huffman_groups = 1u;
+      self->private_impl.f_overall_tile_size_log2 = 0u;
+      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
+        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+        goto exit;
+      }
+      v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
+          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
+      if (((uint64_t)(v_hg_pixels.len)) >= 4u) {
+        v_hg_pixels.ptr[0u] = 0u;
+        v_hg_pixels.ptr[1u] = 0u;
+        v_hg_pixels.ptr[2u] = 0u;
+        v_hg_pixels.ptr[3u] = 0u;
+      }
+      status = wuffs_base__make_status(NULL);
+      goto ok;
+    }
+    if (self->private_impl.f_n_bits < 3u) {
+      {
+        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
+        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
+          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
+          goto suspend;
+        }
+        uint8_t t_1 = *iop_a_src++;
+        v_c8 = t_1;
+      }
+      if (self->private_impl.f_n_bits >= 3u) {
+        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
+        goto exit;
+      }
+      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
+      self->private_impl.f_n_bits += 8u;
+    }
+    v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
+    self->private_impl.f_bits >>= 3u;
+    self->private_impl.f_n_bits -= 3u;
+    self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2;
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
+    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
+    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+      goto exit;
+    }
+    if (a_src) {
+      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
+    status = wuffs_webp__decoder__decode_pixels(self,
+        wuffs_base__slice_u8__subslice_ij(a_workbuf,
+        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
+        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
+        a_src,
+        ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+        ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
+        wuffs_base__utility__empty_slice_u8(),
+        0u);
+    if (a_src) {
+      iop_a_src = a_src->data.ptr + a_src->meta.ri;
+    }
+    if (status.repr) {
+      goto suspend;
+    }
+    self->private_impl.f_overall_n_huffman_groups = 1u;
+    if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) || (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len)))) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+      goto exit;
+    }
+    v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
+        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
+        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
+    v_n = ((uint64_t)((((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2) * 4u)));
+    if (v_n > ((uint64_t)(v_hg_pixels.len))) {
+      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
+      goto exit;
+    }
+    v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n);
+    while (((uint64_t)(v_p.len)) >= 4u) {
+      if (v_p.ptr[2u] != 0u) {
+        status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups);
+        goto exit;
+      }
+      v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u);
+      if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) {
+        self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1;
+      }
+      v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
+    }
+
+    ok:
+    self->private_impl.p_decode_hg_table = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+  self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2;
+
+  goto exit;
+  exit:
+  if (a_src && a_src->data.ptr) {
+    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
+  }
+
+  return status;
+}
+
+// -------- func webp.decoder.decode_pixels
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__decode_pixels(
+    wuffs_webp__decoder* self,
+    wuffs_base__slice_u8 a_dst,
+    wuffs_base__io_buffer* a_src,
+    uint32_t a_width,
+    uint32_t a_height,
+    wuffs_base__slice_u8 a_tile_data,
+    uint32_t a_tile_size_log2) {
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  uint32_t v_i = 0;
+  uint32_t v_n = 0;
+
+  uint32_t coro_susp_point = self->private_impl.p_decode_pixels;
+  switch (coro_susp_point) {
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
+
+    v_i = 0u;
+    v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits);
+    while (v_i < v_n) {
+      self->private_data.f_color_cache[v_i] = 0u;
+      v_i += 1u;
+    }
+    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
+    status = wuffs_webp__decoder__decode_pixels_slow(self,
+        a_dst,
+        a_src,
+        a_width,
+        a_height,
+        a_tile_data,
+        a_tile_size_log2);
+    if (status.repr) {
+      goto suspend;
+    }
+
+    goto ok;
+    ok:
+    self->private_impl.p_decode_pixels = 0;
+    goto exit;
+  }
+
+  goto suspend;
+  suspend:
+  self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
+
+  goto exit;
+  exit:
+  return status;
+}
+
+// -------- func webp.decoder.swizzle
+
+WUFFS_BASE__GENERATED_C_CODE
+static wuffs_base__status
+wuffs_webp__decoder__swizzle(
+    wuffs_webp__decoder* self,
+    wuffs_base__pixel_buffer* a_dst,
+    wuffs_base__slice_u8 a_src,
+    wuffs_base__pixel_blend a_blend) {
+  wuffs_base__status v_status = wuffs_base__make_status(NULL);
+  wuffs_base__pixel_format v_dst_pixfmt = {0};
+  uint32_t v_dst_bits_per_pixel = 0;
+  uint32_t v_dst_bytes_per_pixel = 0;
+  uint64_t v_dst_bytes_per_row = 0;
+  wuffs_base__slice_u8 v_dst_palette = {0};
+  wuffs_base__table_u8 v_tab = {0};
+  uint64_t v_src_bytes_per_row = 0;
+  wuffs_base__slice_u8 v_dst = {0};
+  uint32_t v_y = 0;
+
+  v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
+      wuffs_base__pixel_buffer__pixel_format(a_dst),
+      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)),
+      wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
+      wuffs_base__utility__empty_slice_u8(),
+      a_blend);
+  if ( ! wuffs_base__status__is_ok(&v_status)) {
+    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
+  }
+  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
+  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
+  if ((v_dst_bits_per_pixel & 7u) != 0u) {
+    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
+  }
+  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
+  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
+  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024));
+  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
+  v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u)));
+  while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) {
+    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
+    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
+      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
+    }
+    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_base__slice_u8__subslice_j(a_src, v_src_bytes_per_row));
+    a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row);
+    v_y += 1u;
+  }
+  return wuffs_base__make_status(NULL);
+}
+
+// -------- func webp.decoder.frame_dirty_rect
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
+wuffs_webp__decoder__frame_dirty_rect(
+    const wuffs_webp__decoder* self) {
+  if (!self) {
+    return wuffs_base__utility__empty_rect_ie_u32();
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return wuffs_base__utility__empty_rect_ie_u32();
+  }
+
+  return wuffs_base__utility__make_rect_ie_u32(
+      0u,
+      0u,
+      self->private_impl.f_width,
+      self->private_impl.f_height);
+}
+
+// -------- func webp.decoder.num_animation_loops
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint32_t
+wuffs_webp__decoder__num_animation_loops(
+    const wuffs_webp__decoder* self) {
+  if (!self) {
+    return 0;
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return 0;
+  }
+
+  return 0u;
+}
+
+// -------- func webp.decoder.num_decoded_frame_configs
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__num_decoded_frame_configs(
+    const wuffs_webp__decoder* self) {
+  if (!self) {
+    return 0;
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return 0;
+  }
+
+  if (self->private_impl.f_call_sequence > 32u) {
+    return 1u;
+  }
+  return 0u;
+}
+
+// -------- func webp.decoder.num_decoded_frames
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC uint64_t
+wuffs_webp__decoder__num_decoded_frames(
+    const wuffs_webp__decoder* self) {
+  if (!self) {
+    return 0;
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return 0;
+  }
+
+  if (self->private_impl.f_call_sequence > 64u) {
+    return 1u;
+  }
+  return 0u;
+}
+
+// -------- func webp.decoder.restart_frame
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__restart_frame(
+    wuffs_webp__decoder* self,
+    uint64_t a_index,
+    uint64_t a_io_position) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+
+  if (self->private_impl.f_call_sequence < 32u) {
+    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
+  }
+  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  self->private_impl.f_call_sequence = 40u;
+  return wuffs_base__make_status(NULL);
+}
+
+// -------- func webp.decoder.set_report_metadata
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
+wuffs_webp__decoder__set_report_metadata(
+    wuffs_webp__decoder* self,
+    uint32_t a_fourcc,
+    bool a_report) {
+  return wuffs_base__make_empty_struct();
+}
+
+// -------- func webp.decoder.tell_me_more
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status
+wuffs_webp__decoder__tell_me_more(
+    wuffs_webp__decoder* self,
+    wuffs_base__io_buffer* a_dst,
+    wuffs_base__more_information* a_minfo,
+    wuffs_base__io_buffer* a_src) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+        ? wuffs_base__error__disabled_by_previous_error
+        : wuffs_base__error__initialize_not_called);
+  }
+  if (!a_dst || !a_src) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  if ((self->private_impl.active_coroutine != 0) &&
+      (self->private_impl.active_coroutine != 4)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
+  }
+  self->private_impl.active_coroutine = 0;
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
+  goto exit;
+
+  goto ok;
+  ok:
+  goto exit;
+  exit:
+  if (wuffs_base__status__is_error(&status)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+  }
+  return status;
+}
+
+// -------- func webp.decoder.workbuf_len
+
+WUFFS_BASE__GENERATED_C_CODE
+WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
+wuffs_webp__decoder__workbuf_len(
+    const wuffs_webp__decoder* self) {
+  if (!self) {
+    return wuffs_base__utility__empty_range_ii_u64();
+  }
+  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
+      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
+    return wuffs_base__utility__empty_range_ii_u64();
+  }
+
+  return wuffs_base__utility__make_range_ii_u64(((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u])), ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[3u])));
+}
+
+#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
+
 #if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
 
 // ---------------- Status Codes Implementations
@@ -69604,6 +74650,7 @@
 
 // ---------------- Status Codes Implementations
 
+const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset";
 const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header";
 const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum";
 const char wuffs_xz__error__bad_filter[] = "#xz: bad filter";
@@ -69655,6 +74702,12 @@
   0u, 0u, 0u,
 };
 
+static const uint8_t
+WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
+  0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u,
+  2u, 4u, 4u, 2u,
+};
+
 // ---------------- Private Initializer Prototypes
 
 // ---------------- Private Function Prototypes
@@ -71455,6 +76508,8 @@
   wuffs_base__status status = wuffs_base__make_status(NULL);
 
   uint8_t v_c8 = 0;
+  uint32_t v_c32 = 0;
+  uint32_t v_alignment = 0;
   uint8_t v_flags = 0;
   uint8_t v_filter_id = 0;
   wuffs_base__status v_status = wuffs_base__make_status(NULL);
@@ -71476,6 +76531,7 @@
   uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding;
   if (coro_susp_point) {
     v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags;
+    v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id;
     v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift;
     v_f = self->private_data.s_decode_block_header_sans_padding.v_f;
   }
@@ -71678,8 +76734,16 @@
                 *scratch |= ((uint64_t)(num_bits_7)) << 56;
               }
             }
-            self->private_impl.f_bcj_pos = t_7;
+            v_c32 = t_7;
           }
+          v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id]));
+          if (v_alignment > 0u) {
+            if ((v_c32 % v_alignment) != 0u) {
+              status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset);
+              goto exit;
+            }
+          }
+          self->private_impl.f_bcj_pos = v_c32;
         } else {
           status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
           goto exit;
@@ -71746,6 +76810,7 @@
   suspend:
   self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags;
+  self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id;
   self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift;
   self->private_data.s_decode_block_header_sans_padding.v_f = v_f;
 
@@ -72827,6 +77892,11 @@
     case WUFFS_BASE__FOURCC__WBMP:
       return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();
 #endif
+
+#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
+    case WUFFS_BASE__FOURCC__WEBP:
+      return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder();
+#endif
   }
 
   return wuffs_base__image_decoder::unique_ptr(nullptr);
diff --git a/sync.txt b/sync.txt
index dd9188f..bb70427 100644
--- a/sync.txt
+++ b/sync.txt
@@ -1,10 +1,10 @@
-script/sync.sh ran on 2024-04-19
-Sibling directory (../wuffs) git revision is a3bfb57003d4ff0534fd9de447ebc60800b7b616
+script/sync.sh ran on 2024-07-09
+Sibling directory (../wuffs) git revision is fab0dd534a9ee22f9f4aa0f9896355ba19bff82c
 Manifest (sha256sum values, filenames, versions):
 994126492f24a3edae9b95efa92820647cedc42ee933ce3ff2a364fa9c62aba3  release/c/README.md
 3b6a0c78f663bb495d1972fbb2a87c717d70fbac5ea8cc1a50cb9afaa4b03f92  release/c/wuffs-v0.2.c
     #define WUFFS_VERSION_STRING "0.2.0+2078.20191219"
 a3db4bd979663423de00309d1ba07d7fa8576845223d3e02764181bd6da23f90  release/c/wuffs-v0.3.c
     #define WUFFS_VERSION_STRING "0.3.4+3401.20240419"
-035155b1a3c3ca855f9f5b87d2f356dab662e4403566425b7feafd3011d2c86a  release/c/wuffs-v0.4.c
-    #define WUFFS_VERSION_STRING "0.4.0-alpha.4+3742.20240406"
+1c90b9bbe662d6f7ca18b94bd56ee9156e00ca33ee350dba9ec1900f7e746d80  release/c/wuffs-v0.4.c
+    #define WUFFS_VERSION_STRING "0.4.0-alpha.5+3771.20240709"