Coverage Report

Created: 2025-07-11 06:13

/src/wuffs/release/c/wuffs-unsupported-snapshot.c
Line
Count
Source (jump to first uncovered line)
1
#ifndef WUFFS_INCLUDE_GUARD
2
#define WUFFS_INCLUDE_GUARD
3
4
// Wuffs ships as a "single file C library" or "header file library" as per
5
// https://github.com/nothings/stb/blob/master/docs/stb_howto.txt
6
//
7
// To use that single file as a "foo.c"-like implementation, instead of a
8
// "foo.h"-like header, #define WUFFS_IMPLEMENTATION before #include'ing or
9
// compiling it.
10
11
// Wuffs' C code is generated automatically, not hand-written. These warnings'
12
// costs outweigh the benefits.
13
//
14
// The "elif defined(__clang__)" isn't redundant. While vanilla clang defines
15
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
16
#if defined(__GNUC__)
17
#pragma GCC diagnostic push
18
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
19
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
20
#pragma GCC diagnostic ignored "-Wunreachable-code"
21
#pragma GCC diagnostic ignored "-Wunused-function"
22
#pragma GCC diagnostic ignored "-Wunused-parameter"
23
#if defined(__cplusplus)
24
#pragma GCC diagnostic ignored "-Wold-style-cast"
25
#endif
26
#elif defined(__clang__)
27
#pragma clang diagnostic push
28
#pragma clang diagnostic ignored "-Wimplicit-fallthrough"
29
#pragma clang diagnostic ignored "-Wmissing-field-initializers"
30
#pragma clang diagnostic ignored "-Wunreachable-code"
31
#pragma clang diagnostic ignored "-Wunused-function"
32
#pragma clang diagnostic ignored "-Wunused-parameter"
33
#if defined(__cplusplus)
34
#pragma clang diagnostic ignored "-Wold-style-cast"
35
#endif
36
#endif
37
38
// Copyright 2017 The Wuffs Authors.
39
//
40
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
41
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
42
// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
43
// option. This file may not be copied, modified, or distributed
44
// except according to those terms.
45
//
46
// SPDX-License-Identifier: Apache-2.0 OR MIT
47
48
#include <stdbool.h>
49
#include <stdint.h>
50
#include <stdlib.h>
51
#include <string.h>
52
53
#ifdef __cplusplus
54
#if (__cplusplus >= 201103L) || defined(_MSC_VER)
55
#include <memory>
56
#define WUFFS_BASE__HAVE_EQ_DELETE
57
#define WUFFS_BASE__HAVE_UNIQUE_PTR
58
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
59
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
60
#elif defined(__GNUC__) || defined(__clang__)
61
#warning "Wuffs' C++ code expects -std=c++11 or later"
62
#endif
63
64
extern "C" {
65
#endif
66
67
// ---------------- Version
68
69
// WUFFS_VERSION is the major.minor.patch version, as per https://semver.org/,
70
// as a uint64_t. The major number is the high 32 bits. The minor number is the
71
// middle 16 bits. The patch number is the low 16 bits. The pre-release label
72
// and build metadata are part of the string representation (such as
73
// "1.2.3-beta+456.20181231") but not the uint64_t representation.
74
//
75
// WUFFS_VERSION_PRE_RELEASE_LABEL (such as "", "beta" or "rc.1") being
76
// non-empty denotes a developer preview, not a release version, and has no
77
// backwards or forwards compatibility guarantees.
78
//
79
// WUFFS_VERSION_BUILD_METADATA_XXX, if non-zero, are the number of commits and
80
// the last commit date in the repository used to build this library. Within
81
// each major.minor branch, the commit count should increase monotonically.
82
//
83
// ยก Some code generation programs can override WUFFS_VERSION.
84
60.5k
#define WUFFS_VERSION 0
85
60.5k
#define WUFFS_VERSION_MAJOR 0
86
60.5k
#define WUFFS_VERSION_MINOR 0
87
#define WUFFS_VERSION_PATCH 0
88
#define WUFFS_VERSION_PRE_RELEASE_LABEL "unsupported.snapshot"
89
#define WUFFS_VERSION_BUILD_METADATA_COMMIT_COUNT 0
90
#define WUFFS_VERSION_BUILD_METADATA_COMMIT_DATE 0
91
#define WUFFS_VERSION_STRING "0.0.0+0.00000000"
92
93
// ---------------- Private Implementation Macros Re-definition Check
94
95
// Users (those who #include the "wuffs-vM.N.c" file) should not define any
96
// WUFFS_PRIVATE_IMPL__ETC macros, only WUFFS_CONFIG__ETC macros (and
97
// WUFFS_IMPLEMENTATION). Mucking about with the private implementation macros
98
// is not supported and may break when upgrading to newer Wuffs versions.
99
100
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32) ||       \
101
    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON) ||        \
102
    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64) ||          \
103
    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2) ||       \
104
    defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3) ||       \
105
    defined(WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) || \
106
    defined(WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) ||     \
107
    defined(WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) ||      \
108
    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16) ||        \
109
    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32) ||        \
110
    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64) ||        \
111
    defined(WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8)
112
113
#if defined(__GNUC__) || defined(__clang__)
114
#warning "Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported"
115
#elif defined(_MSC_VER)
116
#pragma message("Defining WUFFS_PRIVATE_IMPL__ETC yourself is not supported")
117
#endif
118
119
#endif
120
121
// ---------------- Obsolete Macros Check
122
123
// std/tga was renamed to std/targa in September 2024 (Wuffs v0.4 alpha).
124
#if defined(WUFFS_CONFIG__MODULE__TGA)
125
126
#if defined(__GNUC__) || defined(__clang__)
127
#warning "WUFFS_CONFIG__MODULE__TGA was renamed to WUFFS_CONFIG__MODULE__TARGA"
128
#elif defined(_MSC_VER)
129
#pragma message( \
130
    "WUFFS_CONFIG__MODULE__TGA was renamed to WUFFS_CONFIG__MODULE__TARGA")
131
#endif
132
133
#endif
134
135
// ---------------- Configuration
136
137
// Define WUFFS_CONFIG__AVOID_CPU_ARCH to avoid any code tied to a specific CPU
138
// architecture, such as SSE SIMD for the x86 CPU family.
139
#if defined(WUFFS_CONFIG__AVOID_CPU_ARCH)  // (#if-chain ref AVOID_CPU_ARCH_0)
140
// No-op.
141
#else  // (#if-chain ref AVOID_CPU_ARCH_0)
142
143
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
144
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
145
#if defined(__GNUC__) || defined(__clang__)
146
#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg) __attribute__((target(arg)))
147
#else
148
#define WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET(arg)
149
#endif  // defined(__GNUC__) || defined(__clang__)
150
151
#if defined(__GNUC__)  // (#if-chain ref AVOID_CPU_ARCH_1)
152
153
// To simplify Wuffs code, "cpu_arch >= arm_xxx" requires xxx but also
154
// unaligned little-endian load/stores.
155
#if defined(__ARM_FEATURE_UNALIGNED) && !defined(__native_client__) && \
156
    defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
157
// Not all gcc versions define __ARM_ACLE, even if they support crc32
158
// intrinsics. Look for __ARM_FEATURE_CRC32 instead.
159
#if defined(__ARM_FEATURE_CRC32)
160
#include <arm_acle.h>
161
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32
162
#endif  // defined(__ARM_FEATURE_CRC32)
163
#if defined(__ARM_NEON)
164
#include <arm_neon.h>
165
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON
166
#endif  // defined(__ARM_NEON)
167
#endif  // defined(__ARM_FEATURE_UNALIGNED) etc
168
169
// Similarly, "cpu_arch >= x86_sse42" requires SSE4.2 but also PCLMUL and
170
// POPCNT. This is checked at runtime via cpuid, not at compile time.
171
//
172
// Likewise, "cpu_arch >= x86_avx2" also requires PCLMUL, POPCNT and SSE4.2.
173
//
174
// ----
175
//
176
// Technically, we could use the SSE family on 32-bit x86, not just 64-bit x86.
177
// But some intrinsics don't compile in 32-bit mode. It's not worth the hassle.
178
// https://github.com/google/wuffs/issues/145
179
#if defined(__x86_64__)
180
#if !defined(__native_client__)
181
#include <cpuid.h>
182
#include <x86intrin.h>
183
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
184
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
185
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
186
#endif  // !defined(__native_client__)
187
#endif  // defined(__x86_64__)
188
189
#elif defined(_MSC_VER)  // (#if-chain ref AVOID_CPU_ARCH_1)
190
191
#if defined(_M_X64)
192
193
// On X86_64, Microsoft Visual C/C++ (MSVC) only supports SSE2 by default.
194
// There are /arch:SSE2, /arch:AVX and /arch:AVX2 compiler flags (the AVX2 one
195
// is roughly equivalent to X86_64_V3), but there is no /arch:SSE42 compiler
196
// flag that's equivalent to X86_64_V2.
197
//
198
// For getting maximum performance with X86_64 MSVC and Wuffs, pass /arch:AVX2
199
// (and then test on the oldest hardware you intend to support).
200
//
201
// Absent that compiler flag, either define one of the three macros listed
202
// below or else the X86_64 SIMD code will be disabled and you'll get a #pragma
203
// message stating this library "performs best with /arch:AVX2". This message
204
// is harmless and ignorable, in that the non-SIMD code is still correct and
205
// reasonably performant, but is a reminder that when combining Wuffs and MSVC,
206
// some compiler configuration is required for maximum performance.
207
//
208
//  - WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY
209
//  - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2 (enables SSE4.2 and below)
210
//  - WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3 (enables AVX2 and below)
211
//
212
// Defining the first one (WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
213
// or defining none of those three (the default state) are equivalent (in that
214
// both disable the SIMD code paths), other than that pragma message.
215
//
216
// When defining these WUFFS_CONFIG__ENABLE_ETC macros with MSVC, be aware that
217
// some users report it leading to ICEs (Internal Compiler Errors), but other
218
// users report no problems at all (and improved performance). It's unclear
219
// exactly what combination of SIMD code and MSVC configuration lead to ICEs.
220
// Do your own testing with your own MSVC version and configuration.
221
//
222
// https://github.com/google/wuffs/issues/148
223
// https://github.com/google/wuffs/issues/151
224
// https://developercommunity.visualstudio.com/t/fatal--error-C1001:-Internal-compiler-er/10703305
225
//
226
// Clang (including clang-cl) and GCC don't need this WUFFS_CONFIG__ETC macro
227
// machinery, or having the Wuffs-the-library user to fiddle with compiler
228
// flags, because they support "__attribute__((target(arg)))".
229
#if defined(__AVX2__) || defined(__clang__) || \
230
    defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V3)
231
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
232
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
233
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3
234
#elif defined(WUFFS_CONFIG__ENABLE_MSVC_CPU_ARCH__X86_64_V2)
235
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64
236
#define WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2
237
#elif !defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
238
#pragma message("Wuffs with MSVC+X64 performs best with /arch:AVX2")
239
#endif  // defined(__AVX2__) || defined(__clang__) || etc
240
241
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
242
243
#if defined(WUFFS_CONFIG__DISABLE_MSVC_CPU_ARCH__X86_64_FAMILY)
244
#error "MSVC_CPU_ARCH simultaneously enabled and disabled"
245
#endif
246
247
#include <intrin.h>
248
// intrin.h isn't enough for X64 SIMD, with clang-cl, if we want to use
249
// "__attribute__((target(arg)))" without e.g. "/arch:AVX".
250
//
251
// Some web pages suggest that <immintrin.h> is all you need, as it pulls in
252
// the earlier SIMD families like SSE4.2, but that doesn't seem to work in
253
// practice, possibly for the same reason that just <intrin.h> doesn't work.
254
#include <immintrin.h>  // AVX, AVX2, FMA, POPCNT
255
#include <nmmintrin.h>  // SSE4.2
256
#include <wmmintrin.h>  // AES, PCLMUL
257
258
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
259
#endif  // defined(_M_X64)
260
#endif  // (#if-chain ref AVOID_CPU_ARCH_1)
261
#endif  // (#if-chain ref AVOID_CPU_ARCH_0)
262
263
// --------
264
265
// Define WUFFS_CONFIG__STATIC_FUNCTIONS (combined with WUFFS_IMPLEMENTATION)
266
// to make all of Wuffs' functions have static storage.
267
//
268
// This can help the compiler ignore or discard unused code, which can produce
269
// faster compiles and smaller binaries. Other motivations are discussed in the
270
// "ALLOW STATIC IMPLEMENTATION" section of
271
// https://raw.githubusercontent.com/nothings/stb/master/docs/stb_howto.txt
272
#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS)
273
#define WUFFS_BASE__MAYBE_STATIC static
274
#else
275
#define WUFFS_BASE__MAYBE_STATIC
276
#endif  // defined(WUFFS_CONFIG__STATIC_FUNCTIONS)
277
278
// ---------------- CPU Architecture
279
280
static inline bool  //
281
0
wuffs_base__cpu_arch__have_arm_crc32(void) {
282
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
283
0
  return true;
284
0
#else
285
0
  return false;
286
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
287
0
}
288
289
static inline bool  //
290
0
wuffs_base__cpu_arch__have_arm_neon(void) {
291
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
292
0
  return true;
293
0
#else
294
0
  return false;
295
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
296
0
}
297
298
static inline bool  //
299
0
wuffs_base__cpu_arch__have_x86_avx2(void) {
300
#if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) && \
301
    defined(__AVX2__)
302
  return true;
303
#else
304
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
305
  // GCC defines these macros but MSVC does not.
306
  //  - bit_AVX2 = (1 <<  5)
307
0
  const unsigned int avx2_ebx7 = 0x00000020;
308
  // GCC defines these macros but MSVC does not.
309
  //  - bit_PCLMUL = (1 <<  1)
310
  //  - bit_POPCNT = (1 << 23)
311
  //  - bit_SSE4_2 = (1 << 20)
312
0
  const unsigned int avx2_ecx1 = 0x00900002;
313
314
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
315
0
#if defined(__GNUC__)
316
0
  unsigned int eax7 = 0;
317
0
  unsigned int ebx7 = 0;
318
0
  unsigned int ecx7 = 0;
319
0
  unsigned int edx7 = 0;
320
0
  if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
321
0
      ((ebx7 & avx2_ebx7) == avx2_ebx7)) {
322
0
    unsigned int eax1 = 0;
323
0
    unsigned int ebx1 = 0;
324
0
    unsigned int ecx1 = 0;
325
0
    unsigned int edx1 = 0;
326
0
    if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
327
0
        ((ecx1 & avx2_ecx1) == avx2_ecx1)) {
328
0
      return true;
329
0
    }
330
0
  }
331
#elif defined(_MSC_VER)  // defined(__GNUC__)
332
  int x7[4];
333
  __cpuidex(x7, 7, 0);
334
  if ((((unsigned int)(x7[1])) & avx2_ebx7) == avx2_ebx7) {
335
    int x1[4];
336
    __cpuid(x1, 1);
337
    if ((((unsigned int)(x1[2])) & avx2_ecx1) == avx2_ecx1) {
338
      return true;
339
    }
340
  }
341
#else
342
#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
343
#endif  // defined(__GNUC__); defined(_MSC_VER)
344
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
345
0
  return false;
346
0
#endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__) &&
347
        // defined(__AVX2__)
348
0
}
349
350
static inline bool  //
351
4.99k
wuffs_base__cpu_arch__have_x86_bmi2(void) {
352
#if defined(__BMI2__)
353
  return true;
354
#else
355
4.99k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
356
  // GCC defines these macros but MSVC does not.
357
  //  - bit_BMI2 = (1 <<  8)
358
4.99k
  const unsigned int bmi2_ebx7 = 0x00000100;
359
360
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
361
4.99k
#if defined(__GNUC__)
362
4.99k
  unsigned int eax7 = 0;
363
4.99k
  unsigned int ebx7 = 0;
364
4.99k
  unsigned int ecx7 = 0;
365
4.99k
  unsigned int edx7 = 0;
366
4.99k
  if (__get_cpuid_count(7, 0, &eax7, &ebx7, &ecx7, &edx7) &&
367
4.99k
      ((ebx7 & bmi2_ebx7) == bmi2_ebx7)) {
368
4.99k
    return true;
369
4.99k
  }
370
#elif defined(_MSC_VER)  // defined(__GNUC__)
371
  int x7[4];
372
  __cpuidex(x7, 7, 0);
373
  if ((((unsigned int)(x7[1])) & bmi2_ebx7) == bmi2_ebx7) {
374
    return true;
375
  }
376
#else
377
#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
378
#endif  // defined(__GNUC__); defined(_MSC_VER)
379
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
380
0
  return false;
381
4.99k
#endif  // defined(__BMI2__)
382
4.99k
}
383
384
static inline bool  //
385
31.9k
wuffs_base__cpu_arch__have_x86_sse42(void) {
386
#if defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
387
  return true;
388
#else
389
31.9k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
390
  // GCC defines these macros but MSVC does not.
391
  //  - bit_PCLMUL = (1 <<  1)
392
  //  - bit_POPCNT = (1 << 23)
393
  //  - bit_SSE4_2 = (1 << 20)
394
31.9k
  const unsigned int sse42_ecx1 = 0x00900002;
395
396
  // clang defines __GNUC__ and clang-cl defines _MSC_VER (but not __GNUC__).
397
31.9k
#if defined(__GNUC__)
398
31.9k
  unsigned int eax1 = 0;
399
31.9k
  unsigned int ebx1 = 0;
400
31.9k
  unsigned int ecx1 = 0;
401
31.9k
  unsigned int edx1 = 0;
402
31.9k
  if (__get_cpuid(1, &eax1, &ebx1, &ecx1, &edx1) &&
403
31.9k
      ((ecx1 & sse42_ecx1) == sse42_ecx1)) {
404
31.9k
    return true;
405
31.9k
  }
406
#elif defined(_MSC_VER)  // defined(__GNUC__)
407
  int x1[4];
408
  __cpuid(x1, 1);
409
  if ((((unsigned int)(x1[2])) & sse42_ecx1) == sse42_ecx1) {
410
    return true;
411
  }
412
#else
413
#error "WUFFS_PRIVATE_IMPL__CPU_ARCH__ETC combined with an unsupported compiler"
414
#endif  // defined(__GNUC__); defined(_MSC_VER)
415
0
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64)
416
0
  return false;
417
31.9k
#endif  // defined(__PCLMUL__) && defined(__POPCNT__) && defined(__SSE4_2__)
418
31.9k
}
419
420
// ---------------- Fundamentals
421
422
// Wuffs assumes that:
423
//  - converting a uint32_t to a size_t will never overflow.
424
//  - converting a size_t to a uint64_t will never overflow.
425
#if defined(__WORDSIZE)
426
#if (__WORDSIZE != 32) && (__WORDSIZE != 64)
427
#error "Wuffs requires a word size of either 32 or 64 bits"
428
#endif
429
#endif
430
431
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
432
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
433
#if defined(__GNUC__) || defined(__clang__)
434
#define WUFFS_BASE__FORCE_INLINE __attribute__((__always_inline__))
435
#define WUFFS_BASE__POTENTIALLY_UNUSED __attribute__((unused))
436
#define WUFFS_BASE__WARN_UNUSED_RESULT __attribute__((warn_unused_result))
437
#elif defined(_MSC_VER)
438
#define WUFFS_BASE__FORCE_INLINE __forceinline
439
#define WUFFS_BASE__POTENTIALLY_UNUSED
440
#define WUFFS_BASE__WARN_UNUSED_RESULT
441
#else
442
#define WUFFS_BASE__FORCE_INLINE
443
#define WUFFS_BASE__POTENTIALLY_UNUSED
444
#define WUFFS_BASE__WARN_UNUSED_RESULT
445
#endif
446
447
// Clang's "-fsanitize=integer" checks for "unsigned-integer-overflow" even
448
// though, for *unsigned* integers, it is *not* undefined behavior. The check
449
// is still made because unsigned integer overflow "is often unintentional".
450
// https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
451
//
452
// However, for Wuffs' generated C code, unsigned overflow is intentional. The
453
// programmer has to use "~mod+" instead of a plain "+" operator in Wuffs code.
454
// Further runtime checks for unsigned integer overflow can add performance
455
// overhead (fuzzers can then time out) and can raise false negatives, without
456
// generating much benefits. We disable the "unsigned-integer-overflow" check.
457
#if defined(__has_feature)
458
#if __has_feature(undefined_behavior_sanitizer)
459
#define WUFFS_BASE__GENERATED_C_CODE \
460
  __attribute__((no_sanitize("unsigned-integer-overflow")))
461
#endif
462
#endif
463
#if !defined(WUFFS_BASE__GENERATED_C_CODE)
464
#define WUFFS_BASE__GENERATED_C_CODE
465
#endif
466
467
// --------
468
469
// Options (bitwise or'ed together) for wuffs_foo__bar__initialize functions.
470
471
#define WUFFS_INITIALIZE__DEFAULT_OPTIONS ((uint32_t)0x00000000)
472
473
// WUFFS_INITIALIZE__ALREADY_ZEROED means that the "self" receiver struct value
474
// has already been set to all zeroes.
475
63.3k
#define WUFFS_INITIALIZE__ALREADY_ZEROED ((uint32_t)0x00000001)
476
477
// WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED means that, absent
478
// WUFFS_INITIALIZE__ALREADY_ZEROED, only some of the "self" receiver struct
479
// value will be set to all zeroes. Internal buffers, which tend to be a large
480
// proportion of the struct's size, will be left uninitialized. Internal means
481
// that the buffer is contained by the receiver struct, as opposed to being
482
// passed as a separately allocated "work buffer".
483
//
484
// For more detail, see:
485
// https://github.com/google/wuffs/blob/main/doc/note/initialization.md
486
#define WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED \
487
71.0k
  ((uint32_t)0x00000002)
488
489
// --------
490
491
#ifdef __cplusplus
492
// Wuffs structs are just data, not resources (in the RAII sense). They don't
493
// subclass anything. They don't have virtual destructors. They don't contain
494
// pointers to dynamically allocated memory. They don't contain file
495
// descriptors. And so on. Destroying such a struct (e.g. via a
496
// wuffs_foo__bar::unique_ptr) can just call free, especially as
497
// sizeof(wuffs_foo__bar) isn't supposed to be part of the public (stable) API.
498
struct wuffs_unique_ptr_deleter {
499
  void operator()(void* p) { free(p); }
500
};
501
#endif  // __cplusplus
502
503
// --------
504
505
#if defined(__GNUC__)
506
#pragma GCC diagnostic push
507
#pragma GCC diagnostic ignored "-Wcast-qual"
508
#endif
509
510
static inline uint8_t*  //
511
0
wuffs_base__strip_const_from_u8_ptr(const uint8_t* ptr) {
512
0
  return (uint8_t*)ptr;
513
0
}
514
515
static inline uint16_t*  //
516
0
wuffs_base__strip_const_from_u16_ptr(const uint16_t* ptr) {
517
0
  return (uint16_t*)ptr;
518
0
}
519
520
static inline uint32_t*  //
521
0
wuffs_base__strip_const_from_u32_ptr(const uint32_t* ptr) {
522
0
  return (uint32_t*)ptr;
523
0
}
524
525
static inline uint64_t*  //
526
0
wuffs_base__strip_const_from_u64_ptr(const uint64_t* ptr) {
527
0
  return (uint64_t*)ptr;
528
0
}
529
530
#if defined(__GNUC__)
531
#pragma GCC diagnostic pop
532
#endif
533
534
// --------
535
536
// wuffs_base__empty_struct is used when a Wuffs function returns an empty
537
// struct. In C, if a function f returns void, you can't say "x = f()", but in
538
// Wuffs, if a function g returns empty, you can say "y = g()".
539
typedef struct wuffs_base__empty_struct__struct {
540
  // private_impl is a placeholder field. It isn't explicitly used, except that
541
  // without it, the sizeof a struct with no fields can differ across C/C++
542
  // compilers, and it is undefined behavior in C99. For example, gcc says that
543
  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to
544
  // ABI incompatibility if a Wuffs .c file is processed by one compiler and
545
  // its .h file with another compiler.
546
  //
547
  // Instead, we explicitly insert an otherwise unused field, so that the
548
  // sizeof this struct is always 1.
549
  uint8_t private_impl;
550
} wuffs_base__empty_struct;
551
552
static inline wuffs_base__empty_struct  //
553
3.94M
wuffs_base__make_empty_struct(void) {
554
3.94M
  wuffs_base__empty_struct ret;
555
3.94M
  ret.private_impl = 0;
556
3.94M
  return ret;
557
3.94M
}
558
559
// wuffs_base__utility is a placeholder receiver type. It enables what Java
560
// calls static methods, as opposed to regular methods.
561
typedef struct wuffs_base__utility__struct {
562
  // private_impl is a placeholder field. It isn't explicitly used, except that
563
  // without it, the sizeof a struct with no fields can differ across C/C++
564
  // compilers, and it is undefined behavior in C99. For example, gcc says that
565
  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to
566
  // ABI incompatibility if a Wuffs .c file is processed by one compiler and
567
  // its .h file with another compiler.
568
  //
569
  // Instead, we explicitly insert an otherwise unused field, so that the
570
  // sizeof this struct is always 1.
571
  uint8_t private_impl;
572
} wuffs_base__utility;
573
574
typedef struct wuffs_base__vtable__struct {
575
  const char* vtable_name;
576
  const void* function_pointers;
577
} wuffs_base__vtable;
578
579
// --------
580
581
// See https://github.com/google/wuffs/blob/main/doc/note/statuses.md
582
typedef struct wuffs_base__status__struct {
583
  const char* repr;
584
585
#ifdef __cplusplus
586
  inline bool is_complete() const;
587
  inline bool is_error() const;
588
  inline bool is_note() const;
589
  inline bool is_ok() const;
590
  inline bool is_suspension() const;
591
  inline bool is_truncated_input_error() const;
592
  inline const char* message() const;
593
#endif  // __cplusplus
594
595
} wuffs_base__status;
596
597
extern const char wuffs_base__note__i_o_redirect[];
598
extern const char wuffs_base__note__end_of_data[];
599
extern const char wuffs_base__note__metadata_reported[];
600
extern const char wuffs_base__suspension__even_more_information[];
601
extern const char wuffs_base__suspension__mispositioned_read[];
602
extern const char wuffs_base__suspension__mispositioned_write[];
603
extern const char wuffs_base__suspension__short_read[];
604
extern const char wuffs_base__suspension__short_workbuf[];
605
extern const char wuffs_base__suspension__short_write[];
606
extern const char wuffs_base__error__bad_i_o_position[];
607
extern const char wuffs_base__error__bad_argument_length_too_short[];
608
extern const char wuffs_base__error__bad_argument[];
609
extern const char wuffs_base__error__bad_call_sequence[];
610
extern const char wuffs_base__error__bad_data[];
611
extern const char wuffs_base__error__bad_receiver[];
612
extern const char wuffs_base__error__bad_restart[];
613
extern const char wuffs_base__error__bad_sizeof_receiver[];
614
extern const char wuffs_base__error__bad_vtable[];
615
extern const char wuffs_base__error__bad_workbuf_length[];
616
extern const char wuffs_base__error__bad_wuffs_version[];
617
extern const char wuffs_base__error__cannot_return_a_suspension[];
618
extern const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[];
619
extern const char wuffs_base__error__disabled_by_previous_error[];
620
extern const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[];
621
extern const char wuffs_base__error__initialize_not_called[];
622
extern const char wuffs_base__error__insufficient_history[];
623
extern const char wuffs_base__error__interleaved_coroutine_calls[];
624
extern const char wuffs_base__error__no_more_information[];
625
extern const char wuffs_base__error__not_enough_data[];
626
extern const char wuffs_base__error__out_of_bounds[];
627
extern const char wuffs_base__error__unsupported_image_dimension[];
628
extern const char wuffs_base__error__unsupported_method[];
629
extern const char wuffs_base__error__unsupported_option[];
630
extern const char wuffs_base__error__unsupported_pixel_swizzler_option[];
631
extern const char wuffs_base__error__too_much_data[];
632
633
static inline wuffs_base__status  //
634
476k
wuffs_base__make_status(const char* repr) {
635
476k
  wuffs_base__status z;
636
476k
  z.repr = repr;
637
476k
  return z;
638
476k
}
639
640
static inline bool  //
641
0
wuffs_base__status__is_complete(const wuffs_base__status* z) {
642
0
  return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#'));
643
0
}
644
645
static inline bool  //
646
103k
wuffs_base__status__is_error(const wuffs_base__status* z) {
647
103k
  return z->repr && (*z->repr == '#');
648
103k
}
649
650
static inline bool  //
651
0
wuffs_base__status__is_note(const wuffs_base__status* z) {
652
0
  return z->repr && (*z->repr != '$') && (*z->repr != '#');
653
0
}
654
655
static inline bool  //
656
103k
wuffs_base__status__is_ok(const wuffs_base__status* z) {
657
103k
  return z->repr == NULL;
658
103k
}
659
660
static inline bool  //
661
148k
wuffs_base__status__is_suspension(const wuffs_base__status* z) {
662
148k
  return z->repr && (*z->repr == '$');
663
148k
}
664
665
static inline bool  //
666
0
wuffs_base__status__is_truncated_input_error(const wuffs_base__status* z) {
667
0
  const char* p = z->repr;
668
0
  if (!p || (*p != '#')) {
669
0
    return false;
670
0
  }
671
0
  p++;
672
0
  while (1) {
673
0
    if (*p == 0) {
674
0
      return false;
675
0
    } else if (*p++ == ':') {
676
0
      break;
677
0
    }
678
0
  }
679
0
  return strcmp(p, " truncated input") == 0;
680
0
}
681
682
// wuffs_base__status__message strips the leading '$', '#' or '@'.
683
static inline const char*  //
684
5.55k
wuffs_base__status__message(const wuffs_base__status* z) {
685
5.55k
  if (z->repr) {
686
5.55k
    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
687
5.55k
      return z->repr + 1;
688
5.55k
    }
689
5.55k
  }
690
0
  return z->repr;
691
5.55k
}
692
693
#ifdef __cplusplus
694
695
inline bool  //
696
wuffs_base__status::is_complete() const {
697
  return wuffs_base__status__is_complete(this);
698
}
699
700
inline bool  //
701
wuffs_base__status::is_error() const {
702
  return wuffs_base__status__is_error(this);
703
}
704
705
inline bool  //
706
wuffs_base__status::is_note() const {
707
  return wuffs_base__status__is_note(this);
708
}
709
710
inline bool  //
711
wuffs_base__status::is_ok() const {
712
  return wuffs_base__status__is_ok(this);
713
}
714
715
inline bool  //
716
wuffs_base__status::is_suspension() const {
717
  return wuffs_base__status__is_suspension(this);
718
}
719
720
inline bool  //
721
wuffs_base__status::is_truncated_input_error() const {
722
  return wuffs_base__status__is_truncated_input_error(this);
723
}
724
725
inline const char*  //
726
wuffs_base__status::message() const {
727
  return wuffs_base__status__message(this);
728
}
729
730
#endif  // __cplusplus
731
732
// --------
733
734
// WUFFS_BASE__RESULT is a result type: either a status (an error) or a value.
735
//
736
// A result with all fields NULL or zero is as valid as a zero-valued T.
737
#define WUFFS_BASE__RESULT(T)  \
738
  struct {                     \
739
    wuffs_base__status status; \
740
    T value;                   \
741
  }
742
743
typedef WUFFS_BASE__RESULT(double) wuffs_base__result_f64;
744
typedef WUFFS_BASE__RESULT(int64_t) wuffs_base__result_i64;
745
typedef WUFFS_BASE__RESULT(uint64_t) wuffs_base__result_u64;
746
747
// --------
748
749
// wuffs_base__transform__output is the result of transforming from a src slice
750
// to a dst slice.
751
typedef struct wuffs_base__transform__output__struct {
752
  wuffs_base__status status;
753
  size_t num_dst;
754
  size_t num_src;
755
} wuffs_base__transform__output;
756
757
// --------
758
759
// FourCC constants. Four Character Codes are literally four ASCII characters
760
// (sometimes padded with ' ' spaces) that pack neatly into a signed or
761
// unsigned 32-bit integer. ASCII letters are conventionally upper case.
762
//
763
// They are often used to identify video codecs (e.g. "H265") and pixel formats
764
// (e.g. "YV12"). Wuffs uses them for that but also generally for naming
765
// various things: compression formats (e.g. "BZ2 "), image metadata (e.g.
766
// "EXIF"), file formats (e.g. "HTML"), etc.
767
//
768
// Wuffs' u32 values are big-endian ("JPEG" is 0x4A504547 not 0x4745504A) to
769
// preserve ordering: "JPEG" < "MP3 " and 0x4A504547 < 0x4D503320.
770
771
// Android Binary XML (for resources; see AndroidBinXmlParser.java).
772
#define WUFFS_BASE__FOURCC__ABXR 0x41425852
773
774
// Android Binary XML (for system_server; see BinaryXmlSerializer.java).
775
#define WUFFS_BASE__FOURCC__ABXS 0x41425853
776
777
// Background Color.
778
#define WUFFS_BASE__FOURCC__BGCL 0x4247434C
779
780
// Bitmap.
781
#define WUFFS_BASE__FOURCC__BMP 0x424D5020
782
783
// Brotli.
784
#define WUFFS_BASE__FOURCC__BRTL 0x4252544C
785
786
// Bzip2.
787
#define WUFFS_BASE__FOURCC__BZ2 0x425A3220
788
789
// Concise Binary Object Representation.
790
#define WUFFS_BASE__FOURCC__CBOR 0x43424F52
791
792
// Primary Chromaticities and White Point.
793
#define WUFFS_BASE__FOURCC__CHRM 0x4348524D
794
795
// Cascading Style Sheets.
796
#define WUFFS_BASE__FOURCC__CSS 0x43535320
797
798
// Encapsulated PostScript.
799
#define WUFFS_BASE__FOURCC__EPS 0x45505320
800
801
// Ericsson Texture Compression 2 (iPACKMAN).
802
#define WUFFS_BASE__FOURCC__ETC2 0x45544332
803
804
// Exchangeable Image File Format.
805
#define WUFFS_BASE__FOURCC__EXIF 0x45584946
806
807
// Free Lossless Audio Codec.
808
#define WUFFS_BASE__FOURCC__FLAC 0x464C4143
809
810
// Gamma Correction.
811
#define WUFFS_BASE__FOURCC__GAMA 0x47414D41
812
813
// Graphics Interchange Format.
814
#define WUFFS_BASE__FOURCC__GIF 0x47494620
815
816
// GNU Zip.
817
#define WUFFS_BASE__FOURCC__GZ 0x475A2020
818
819
// High Efficiency Image File.
820
#define WUFFS_BASE__FOURCC__HEIF 0x48454946
821
822
// Handsum.
823
#define WUFFS_BASE__FOURCC__HNSM 0x484E534D
824
825
// Hypertext Markup Language.
826
#define WUFFS_BASE__FOURCC__HTML 0x48544D4C
827
828
// International Color Consortium Profile.
829
#define WUFFS_BASE__FOURCC__ICCP 0x49434350
830
831
// Icon.
832
#define WUFFS_BASE__FOURCC__ICO 0x49434F20
833
834
// Icon Vector Graphics.
835
#define WUFFS_BASE__FOURCC__ICVG 0x49435647
836
837
// Initialization.
838
#define WUFFS_BASE__FOURCC__INI 0x494E4920
839
840
// Joint Photographic Experts Group.
841
#define WUFFS_BASE__FOURCC__JPEG 0x4A504547
842
843
// JavaScript.
844
#define WUFFS_BASE__FOURCC__JS 0x4A532020
845
846
// JavaScript Object Notation.
847
#define WUFFS_BASE__FOURCC__JSON 0x4A534F4E
848
849
// JSON With Commas and Comments.
850
#define WUFFS_BASE__FOURCC__JWCC 0x4A574343
851
852
// Key-Value Pair.
853
#define WUFFS_BASE__FOURCC__KVP 0x4B565020
854
855
// Key-Value Pair (Key).
856
#define WUFFS_BASE__FOURCC__KVPK 0x4B56504B
857
858
// Key-Value Pair (Value).
859
#define WUFFS_BASE__FOURCC__KVPV 0x4B565056
860
861
// Lempelโ€“Ziv 4.
862
#define WUFFS_BASE__FOURCC__LZ4 0x4C5A3420
863
864
// Lzip.
865
#define WUFFS_BASE__FOURCC__LZIP 0x4C5A4950
866
867
// Lempelโ€“Ziv Markov-chain Algorithm.
868
#define WUFFS_BASE__FOURCC__LZMA 0x4C5A4D41
869
870
// Markdown.
871
#define WUFFS_BASE__FOURCC__MD 0x4D442020
872
873
// Modification Time.
874
#define WUFFS_BASE__FOURCC__MTIM 0x4D54494D
875
876
// MPEG-1 Audio Layer III.
877
#define WUFFS_BASE__FOURCC__MP3 0x4D503320
878
879
// Naive Image.
880
#define WUFFS_BASE__FOURCC__NIE 0x4E494520
881
882
// Netpbm (Portable Anymap).
883
#define WUFFS_BASE__FOURCC__NPBM 0x4E50424D
884
885
// Offset (2-Dimensional).
886
#define WUFFS_BASE__FOURCC__OFS2 0x4F465332
887
888
// Open Type Format.
889
#define WUFFS_BASE__FOURCC__OTF 0x4F544620
890
891
// Portable Document Format.
892
#define WUFFS_BASE__FOURCC__PDF 0x50444620
893
894
// Physical Dimensions.
895
#define WUFFS_BASE__FOURCC__PHYD 0x50485944
896
897
// Portable Network Graphics.
898
#define WUFFS_BASE__FOURCC__PNG 0x504E4720
899
900
// PostScript.
901
#define WUFFS_BASE__FOURCC__PS 0x50532020
902
903
// Quite OK Image.
904
#define WUFFS_BASE__FOURCC__QOI 0x514F4920
905
906
// Random Access Compression.
907
#define WUFFS_BASE__FOURCC__RAC 0x52414320
908
909
// Raw.
910
#define WUFFS_BASE__FOURCC__RAW 0x52415720
911
912
// Resource Interchange File Format.
913
#define WUFFS_BASE__FOURCC__RIFF 0x52494646
914
915
// Riegeli Records.
916
#define WUFFS_BASE__FOURCC__RIGL 0x5249474C
917
918
// Snappy.
919
#define WUFFS_BASE__FOURCC__SNPY 0x534E5059
920
921
// Standard Red Green Blue (Rendering Intent).
922
#define WUFFS_BASE__FOURCC__SRGB 0x53524742
923
924
// Scalable Vector Graphics.
925
#define WUFFS_BASE__FOURCC__SVG 0x53564720
926
927
// Tape Archive.
928
#define WUFFS_BASE__FOURCC__TAR 0x54415220
929
930
// Text.
931
#define WUFFS_BASE__FOURCC__TEXT 0x54455854
932
933
// Truevision Advanced Raster Graphics Adapter.
934
#define WUFFS_BASE__FOURCC__TGA 0x54474120
935
936
// Thumbhash.
937
#define WUFFS_BASE__FOURCC__TH 0x54482020
938
939
// Tagged Image File Format.
940
#define WUFFS_BASE__FOURCC__TIFF 0x54494646
941
942
// Tom's Obvious Minimal Language.
943
#define WUFFS_BASE__FOURCC__TOML 0x544F4D4C
944
945
// Waveform.
946
#define WUFFS_BASE__FOURCC__WAVE 0x57415645
947
948
// Wireless Bitmap.
949
#define WUFFS_BASE__FOURCC__WBMP 0x57424D50
950
951
// Web Picture.
952
#define WUFFS_BASE__FOURCC__WEBP 0x57454250
953
954
// Web Open Font Format.
955
#define WUFFS_BASE__FOURCC__WOFF 0x574F4646
956
957
// Extensible Markup Language.
958
#define WUFFS_BASE__FOURCC__XML 0x584D4C20
959
960
// Extensible Metadata Platform.
961
#define WUFFS_BASE__FOURCC__XMP 0x584D5020
962
963
// Xz.
964
#define WUFFS_BASE__FOURCC__XZ 0x585A2020
965
966
// Zip.
967
#define WUFFS_BASE__FOURCC__ZIP 0x5A495020
968
969
// Zlib.
970
#define WUFFS_BASE__FOURCC__ZLIB 0x5A4C4942
971
972
// Zstandard.
973
#define WUFFS_BASE__FOURCC__ZSTD 0x5A535444
974
975
// --------
976
977
// Quirks.
978
979
#define WUFFS_BASE__QUIRK_IGNORE_CHECKSUM 1
980
981
#define WUFFS_BASE__QUIRK_QUALITY 2
982
983
// --------
984
985
// Flicks are a unit of time. One flick (frame-tick) is 1 / 705_600_000 of a
986
// second. See https://github.com/OculusVR/Flicks
987
typedef int64_t wuffs_base__flicks;
988
989
#define WUFFS_BASE__FLICKS_PER_SECOND ((uint64_t)705600000)
990
#define WUFFS_BASE__FLICKS_PER_MILLISECOND ((uint64_t)705600)
991
992
// ---------------- Numeric Types
993
994
// The helpers below are functions, instead of macros, because their arguments
995
// can be an expression that we shouldn't evaluate more than once.
996
//
997
// They are static, so that linking multiple wuffs .o files won't complain about
998
// duplicate function definitions.
999
//
1000
// They are explicitly marked inline, even if modern compilers don't use the
1001
// inline attribute to guide optimizations such as inlining, to avoid the
1002
// -Wunused-function warning, and we like to compile with -Wall -Werror.
1003
1004
static inline int8_t  //
1005
0
wuffs_base__i8__min(int8_t x, int8_t y) {
1006
0
  return x < y ? x : y;
1007
0
}
1008
1009
static inline int8_t  //
1010
0
wuffs_base__i8__max(int8_t x, int8_t y) {
1011
0
  return x > y ? x : y;
1012
0
}
1013
1014
static inline int16_t  //
1015
0
wuffs_base__i16__min(int16_t x, int16_t y) {
1016
0
  return x < y ? x : y;
1017
0
}
1018
1019
static inline int16_t  //
1020
0
wuffs_base__i16__max(int16_t x, int16_t y) {
1021
0
  return x > y ? x : y;
1022
0
}
1023
1024
static inline int32_t  //
1025
0
wuffs_base__i32__min(int32_t x, int32_t y) {
1026
0
  return x < y ? x : y;
1027
0
}
1028
1029
static inline int32_t  //
1030
0
wuffs_base__i32__max(int32_t x, int32_t y) {
1031
0
  return x > y ? x : y;
1032
0
}
1033
1034
static inline int64_t  //
1035
0
wuffs_base__i64__min(int64_t x, int64_t y) {
1036
0
  return x < y ? x : y;
1037
0
}
1038
1039
static inline int64_t  //
1040
0
wuffs_base__i64__max(int64_t x, int64_t y) {
1041
0
  return x > y ? x : y;
1042
0
}
1043
1044
static inline uint8_t  //
1045
0
wuffs_base__u8__min(uint8_t x, uint8_t y) {
1046
0
  return x < y ? x : y;
1047
0
}
1048
1049
static inline uint8_t  //
1050
0
wuffs_base__u8__max(uint8_t x, uint8_t y) {
1051
0
  return x > y ? x : y;
1052
0
}
1053
1054
static inline uint16_t  //
1055
0
wuffs_base__u16__min(uint16_t x, uint16_t y) {
1056
0
  return x < y ? x : y;
1057
0
}
1058
1059
static inline uint16_t  //
1060
0
wuffs_base__u16__max(uint16_t x, uint16_t y) {
1061
0
  return x > y ? x : y;
1062
0
}
1063
1064
static inline uint32_t  //
1065
11.8k
wuffs_base__u32__min(uint32_t x, uint32_t y) {
1066
11.8k
  return x < y ? x : y;
1067
11.8k
}
1068
1069
static inline uint32_t  //
1070
11.8k
wuffs_base__u32__max(uint32_t x, uint32_t y) {
1071
11.8k
  return x > y ? x : y;
1072
11.8k
}
1073
1074
static inline uint64_t  //
1075
2.56M
wuffs_base__u64__min(uint64_t x, uint64_t y) {
1076
2.56M
  return x < y ? x : y;
1077
2.56M
}
1078
1079
static inline uint64_t  //
1080
0
wuffs_base__u64__max(uint64_t x, uint64_t y) {
1081
0
  return x > y ? x : y;
1082
0
}
1083
1084
// --------
1085
1086
static inline uint8_t  //
1087
0
wuffs_base__u8__rotate_left(uint8_t x, uint32_t n) {
1088
0
  n &= 7;
1089
0
  return ((uint8_t)(x << n)) | ((uint8_t)(x >> (8 - n)));
1090
0
}
1091
1092
static inline uint8_t  //
1093
0
wuffs_base__u8__rotate_right(uint8_t x, uint32_t n) {
1094
0
  n &= 7;
1095
0
  return ((uint8_t)(x >> n)) | ((uint8_t)(x << (8 - n)));
1096
0
}
1097
1098
static inline uint16_t  //
1099
0
wuffs_base__u16__rotate_left(uint16_t x, uint32_t n) {
1100
0
  n &= 15;
1101
0
  return ((uint16_t)(x << n)) | ((uint16_t)(x >> (16 - n)));
1102
0
}
1103
1104
static inline uint16_t  //
1105
0
wuffs_base__u16__rotate_right(uint16_t x, uint32_t n) {
1106
0
  n &= 15;
1107
0
  return ((uint16_t)(x >> n)) | ((uint16_t)(x << (16 - n)));
1108
0
}
1109
1110
static inline uint32_t  //
1111
0
wuffs_base__u32__rotate_left(uint32_t x, uint32_t n) {
1112
0
  n &= 31;
1113
0
  return ((uint32_t)(x << n)) | ((uint32_t)(x >> (32 - n)));
1114
0
}
1115
1116
static inline uint32_t  //
1117
0
wuffs_base__u32__rotate_right(uint32_t x, uint32_t n) {
1118
0
  n &= 31;
1119
0
  return ((uint32_t)(x >> n)) | ((uint32_t)(x << (32 - n)));
1120
0
}
1121
1122
static inline uint64_t  //
1123
0
wuffs_base__u64__rotate_left(uint64_t x, uint32_t n) {
1124
0
  n &= 63;
1125
0
  return ((uint64_t)(x << n)) | ((uint64_t)(x >> (64 - n)));
1126
0
}
1127
1128
static inline uint64_t  //
1129
5.56k
wuffs_base__u64__rotate_right(uint64_t x, uint32_t n) {
1130
5.56k
  n &= 63;
1131
5.56k
  return ((uint64_t)(x >> n)) | ((uint64_t)(x << (64 - n)));
1132
5.56k
}
1133
1134
// --------
1135
1136
// Saturating arithmetic (sat_add, sat_sub) branchless bit-twiddling algorithms
1137
// are per https://locklessinc.com/articles/sat_arithmetic/
1138
//
1139
// It is important that the underlying types are unsigned integers, as signed
1140
// integer arithmetic overflow is undefined behavior in C.
1141
1142
static inline uint8_t  //
1143
0
wuffs_base__u8__sat_add(uint8_t x, uint8_t y) {
1144
0
  uint8_t res = (uint8_t)(x + y);
1145
0
  res |= (uint8_t)(-(res < x));
1146
0
  return res;
1147
0
}
1148
1149
static inline uint8_t  //
1150
0
wuffs_base__u8__sat_sub(uint8_t x, uint8_t y) {
1151
0
  uint8_t res = (uint8_t)(x - y);
1152
0
  res &= (uint8_t)(-(res <= x));
1153
0
  return res;
1154
0
}
1155
1156
static inline uint16_t  //
1157
0
wuffs_base__u16__sat_add(uint16_t x, uint16_t y) {
1158
0
  uint16_t res = (uint16_t)(x + y);
1159
0
  res |= (uint16_t)(-(res < x));
1160
0
  return res;
1161
0
}
1162
1163
static inline uint16_t  //
1164
0
wuffs_base__u16__sat_sub(uint16_t x, uint16_t y) {
1165
0
  uint16_t res = (uint16_t)(x - y);
1166
0
  res &= (uint16_t)(-(res <= x));
1167
0
  return res;
1168
0
}
1169
1170
static inline uint32_t  //
1171
8.33k
wuffs_base__u32__sat_add(uint32_t x, uint32_t y) {
1172
8.33k
  uint32_t res = (uint32_t)(x + y);
1173
8.33k
  res |= (uint32_t)(-(res < x));
1174
8.33k
  return res;
1175
8.33k
}
1176
1177
static inline uint32_t  //
1178
19.8k
wuffs_base__u32__sat_sub(uint32_t x, uint32_t y) {
1179
19.8k
  uint32_t res = (uint32_t)(x - y);
1180
19.8k
  res &= (uint32_t)(-(res <= x));
1181
19.8k
  return res;
1182
19.8k
}
1183
1184
static inline uint64_t  //
1185
41.3k
wuffs_base__u64__sat_add(uint64_t x, uint64_t y) {
1186
41.3k
  uint64_t res = (uint64_t)(x + y);
1187
41.3k
  res |= (uint64_t)(-(res < x));
1188
41.3k
  return res;
1189
41.3k
}
1190
1191
static inline uint64_t  //
1192
0
wuffs_base__u64__sat_sub(uint64_t x, uint64_t y) {
1193
0
  uint64_t res = (uint64_t)(x - y);
1194
0
  res &= (uint64_t)(-(res <= x));
1195
0
  return res;
1196
0
}
1197
1198
// --------
1199
1200
typedef struct wuffs_base__multiply_u64__output__struct {
1201
  uint64_t lo;
1202
  uint64_t hi;
1203
} wuffs_base__multiply_u64__output;
1204
1205
// wuffs_base__multiply_u64 returns x*y as a 128-bit value.
1206
//
1207
// The maximum inclusive output hi_lo is 0xFFFFFFFFFFFFFFFE_0000000000000001.
1208
static inline wuffs_base__multiply_u64__output  //
1209
0
wuffs_base__multiply_u64(uint64_t x, uint64_t y) {
1210
0
#if defined(__SIZEOF_INT128__)
1211
0
  __uint128_t z = ((__uint128_t)x) * ((__uint128_t)y);
1212
0
  wuffs_base__multiply_u64__output o;
1213
0
  o.lo = ((uint64_t)(z));
1214
0
  o.hi = ((uint64_t)(z >> 64));
1215
0
  return o;
1216
#else
1217
  // TODO: consider using the _mul128 intrinsic if defined(_MSC_VER).
1218
  uint64_t x0 = x & 0xFFFFFFFF;
1219
  uint64_t x1 = x >> 32;
1220
  uint64_t y0 = y & 0xFFFFFFFF;
1221
  uint64_t y1 = y >> 32;
1222
  uint64_t w0 = x0 * y0;
1223
  uint64_t t = (x1 * y0) + (w0 >> 32);
1224
  uint64_t w1 = t & 0xFFFFFFFF;
1225
  uint64_t w2 = t >> 32;
1226
  w1 += x0 * y1;
1227
  wuffs_base__multiply_u64__output o;
1228
  o.lo = x * y;
1229
  o.hi = (x1 * y1) + w2 + (w1 >> 32);
1230
  return o;
1231
#endif
1232
0
}
1233
1234
// --------
1235
1236
typedef struct wuffs_base__bitvec256__struct {
1237
  // elements_u64[0] holds the LSBs (least significant bits) and
1238
  // elements_u64[3] holds the MSBs (most significant bits).
1239
  uint64_t elements_u64[4];
1240
} wuffs_base__bitvec256;
1241
1242
static inline wuffs_base__bitvec256  //
1243
wuffs_base__make_bitvec256(uint64_t e00,
1244
                           uint64_t e01,
1245
                           uint64_t e02,
1246
0
                           uint64_t e03) {
1247
0
  wuffs_base__bitvec256 res;
1248
0
  res.elements_u64[0] = e00;
1249
0
  res.elements_u64[1] = e01;
1250
0
  res.elements_u64[2] = e02;
1251
0
  res.elements_u64[3] = e03;
1252
0
  return res;
1253
0
}
1254
1255
static inline uint64_t  //
1256
0
wuffs_base__bitvec256__get_u64(const wuffs_base__bitvec256* b, uint32_t i) {
1257
0
  return b->elements_u64[i & 3];
1258
0
}
1259
1260
// --------
1261
1262
// wuffs_base__optional_u63 is like a std::optional<uint64_t>, but for C (not
1263
// just C++) and the value can only hold 63 bits (not 64).
1264
//
1265
// Do not manipulate repr directly; it is a private implementation detail.
1266
typedef struct wuffs_base__optional_u63__struct {
1267
  uint64_t repr;
1268
1269
#ifdef __cplusplus
1270
  inline bool has_value() const;
1271
  inline uint64_t value() const;
1272
  inline uint64_t value_or(uint64_t default_value) const;
1273
#endif  // __cplusplus
1274
1275
} wuffs_base__optional_u63;
1276
1277
// wuffs_base__make_optional_u63 ignores value when has_value is false.
1278
//
1279
// Preconditions:
1280
//  - value < (1 << 63).
1281
static inline wuffs_base__optional_u63  //
1282
0
wuffs_base__make_optional_u63(bool has_value, uint64_t value) {
1283
0
  wuffs_base__optional_u63 res;
1284
0
  res.repr = has_value ? ((value << 1u) | 1u) : 0u;
1285
0
  return res;
1286
0
}
1287
1288
static inline bool  //
1289
0
wuffs_base__optional_u63__has_value(const wuffs_base__optional_u63* o) {
1290
0
  return o->repr;
1291
0
}
1292
1293
// wuffs_base__optional_u63__value returns zero when o does not have a value.
1294
static inline uint64_t  //
1295
0
wuffs_base__optional_u63__value(const wuffs_base__optional_u63* o) {
1296
0
  return o->repr >> 1u;
1297
0
}
1298
1299
static inline uint64_t  //
1300
wuffs_base__optional_u63__value_or(const wuffs_base__optional_u63* o,
1301
0
                                   uint64_t default_value) {
1302
0
  return o->repr ? (o->repr >> 1u) : default_value;
1303
0
}
1304
1305
#ifdef __cplusplus
1306
1307
inline bool  //
1308
wuffs_base__optional_u63::has_value() const {
1309
  return wuffs_base__optional_u63__has_value(this);
1310
}
1311
1312
inline uint64_t  //
1313
wuffs_base__optional_u63::value() const {
1314
  return wuffs_base__optional_u63__value(this);
1315
}
1316
1317
inline uint64_t  //
1318
wuffs_base__optional_u63::value_or(uint64_t default_value) const {
1319
  return wuffs_base__optional_u63__value_or(this, default_value);
1320
}
1321
1322
#endif  // __cplusplus
1323
1324
// --------
1325
1326
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
1327
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
1328
#if (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1329
1330
static inline uint32_t  //
1331
0
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1332
0
  return u ? ((uint32_t)(__builtin_clzl(u))) : 64u;
1333
0
}
1334
1335
#else
1336
// TODO: consider using the _BitScanReverse intrinsic if defined(_MSC_VER).
1337
1338
static inline uint32_t  //
1339
wuffs_base__count_leading_zeroes_u64(uint64_t u) {
1340
  if (u == 0) {
1341
    return 64;
1342
  }
1343
1344
  uint32_t n = 0;
1345
  if ((u >> 32) == 0) {
1346
    n |= 32;
1347
    u <<= 32;
1348
  }
1349
  if ((u >> 48) == 0) {
1350
    n |= 16;
1351
    u <<= 16;
1352
  }
1353
  if ((u >> 56) == 0) {
1354
    n |= 8;
1355
    u <<= 8;
1356
  }
1357
  if ((u >> 60) == 0) {
1358
    n |= 4;
1359
    u <<= 4;
1360
  }
1361
  if ((u >> 62) == 0) {
1362
    n |= 2;
1363
    u <<= 2;
1364
  }
1365
  if ((u >> 63) == 0) {
1366
    n |= 1;
1367
    u <<= 1;
1368
  }
1369
  return n;
1370
}
1371
1372
#endif  // (defined(__GNUC__) || defined(__clang__)) && (__SIZEOF_LONG__ == 8)
1373
1374
// --------
1375
1376
// Normally, the wuffs_base__peek_etc and wuffs_base__poke_etc implementations
1377
// are both (1) correct regardless of CPU endianness and (2) very fast (e.g. an
1378
// inlined wuffs_base__peek_u32le__no_bounds_check call, in an optimized clang
1379
// or gcc build, is a single MOV instruction on x86_64).
1380
//
1381
// However, the endian-agnostic implementations are slow on Microsoft's C
1382
// compiler (MSC). Alternative memcpy-based implementations restore speed, but
1383
// they are only correct on little-endian CPU architectures. Defining
1384
// WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE opts in to these implementations.
1385
//
1386
// https://godbolt.org/z/q4MfjzTPh
1387
#if defined(_MSC_VER) && !defined(__clang__) && \
1388
    (defined(_M_ARM64) || defined(_M_X64))
1389
#define WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE
1390
#endif
1391
1392
#define wuffs_base__peek_u8be__no_bounds_check \
1393
0
  wuffs_base__peek_u8__no_bounds_check
1394
#define wuffs_base__peek_u8le__no_bounds_check \
1395
  wuffs_base__peek_u8__no_bounds_check
1396
1397
static inline uint8_t  //
1398
0
wuffs_base__peek_u8__no_bounds_check(const uint8_t* p) {
1399
0
  return p[0];
1400
0
}
1401
1402
static inline uint16_t  //
1403
10.0k
wuffs_base__peek_u16be__no_bounds_check(const uint8_t* p) {
1404
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1405
  uint16_t x;
1406
  memcpy(&x, p, 2);
1407
  return _byteswap_ushort(x);
1408
#else
1409
10.0k
  return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0));
1410
10.0k
#endif
1411
10.0k
}
1412
1413
static inline uint16_t  //
1414
0
wuffs_base__peek_u16le__no_bounds_check(const uint8_t* p) {
1415
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1416
  uint16_t x;
1417
  memcpy(&x, p, 2);
1418
  return x;
1419
#else
1420
0
  return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8));
1421
0
#endif
1422
0
}
1423
1424
static inline uint32_t  //
1425
6.91k
wuffs_base__peek_u24be__no_bounds_check(const uint8_t* p) {
1426
6.91k
  return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) |
1427
6.91k
         ((uint32_t)(p[2]) << 0);
1428
6.91k
}
1429
1430
static inline uint32_t  //
1431
1.24M
wuffs_base__peek_u24le__no_bounds_check(const uint8_t* p) {
1432
1.24M
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1433
1.24M
         ((uint32_t)(p[2]) << 16);
1434
1.24M
}
1435
1436
static inline uint32_t  //
1437
77.0k
wuffs_base__peek_u32be__no_bounds_check(const uint8_t* p) {
1438
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1439
  uint32_t x;
1440
  memcpy(&x, p, 4);
1441
  return _byteswap_ulong(x);
1442
#else
1443
77.0k
  return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |
1444
77.0k
         ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);
1445
77.0k
#endif
1446
77.0k
}
1447
1448
static inline uint32_t  //
1449
180M
wuffs_base__peek_u32le__no_bounds_check(const uint8_t* p) {
1450
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1451
  uint32_t x;
1452
  memcpy(&x, p, 4);
1453
  return x;
1454
#else
1455
180M
  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |
1456
180M
         ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);
1457
180M
#endif
1458
180M
}
1459
1460
static inline uint64_t  //
1461
0
wuffs_base__peek_u40be__no_bounds_check(const uint8_t* p) {
1462
0
  return ((uint64_t)(p[0]) << 32) | ((uint64_t)(p[1]) << 24) |
1463
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 8) |
1464
0
         ((uint64_t)(p[4]) << 0);
1465
0
}
1466
1467
static inline uint64_t  //
1468
0
wuffs_base__peek_u40le__no_bounds_check(const uint8_t* p) {
1469
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1470
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1471
0
         ((uint64_t)(p[4]) << 32);
1472
0
}
1473
1474
static inline uint64_t  //
1475
94
wuffs_base__peek_u48be__no_bounds_check(const uint8_t* p) {
1476
94
  return ((uint64_t)(p[0]) << 40) | ((uint64_t)(p[1]) << 32) |
1477
94
         ((uint64_t)(p[2]) << 24) | ((uint64_t)(p[3]) << 16) |
1478
94
         ((uint64_t)(p[4]) << 8) | ((uint64_t)(p[5]) << 0);
1479
94
}
1480
1481
static inline uint64_t  //
1482
0
wuffs_base__peek_u48le__no_bounds_check(const uint8_t* p) {
1483
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1484
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1485
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40);
1486
0
}
1487
1488
static inline uint64_t  //
1489
0
wuffs_base__peek_u56be__no_bounds_check(const uint8_t* p) {
1490
0
  return ((uint64_t)(p[0]) << 48) | ((uint64_t)(p[1]) << 40) |
1491
0
         ((uint64_t)(p[2]) << 32) | ((uint64_t)(p[3]) << 24) |
1492
0
         ((uint64_t)(p[4]) << 16) | ((uint64_t)(p[5]) << 8) |
1493
0
         ((uint64_t)(p[6]) << 0);
1494
0
}
1495
1496
static inline uint64_t  //
1497
0
wuffs_base__peek_u56le__no_bounds_check(const uint8_t* p) {
1498
0
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1499
0
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1500
0
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1501
0
         ((uint64_t)(p[6]) << 48);
1502
0
}
1503
1504
static inline uint64_t  //
1505
0
wuffs_base__peek_u64be__no_bounds_check(const uint8_t* p) {
1506
0
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1507
0
  uint64_t x;
1508
0
  memcpy(&x, p, 8);
1509
0
  return _byteswap_uint64(x);
1510
0
#else
1511
0
  return ((uint64_t)(p[0]) << 56) | ((uint64_t)(p[1]) << 48) |
1512
0
         ((uint64_t)(p[2]) << 40) | ((uint64_t)(p[3]) << 32) |
1513
0
         ((uint64_t)(p[4]) << 24) | ((uint64_t)(p[5]) << 16) |
1514
0
         ((uint64_t)(p[6]) << 8) | ((uint64_t)(p[7]) << 0);
1515
0
#endif
1516
0
}
1517
1518
static inline uint64_t  //
1519
40.0M
wuffs_base__peek_u64le__no_bounds_check(const uint8_t* p) {
1520
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE)
1521
  uint64_t x;
1522
  memcpy(&x, p, 8);
1523
  return x;
1524
#else
1525
40.0M
  return ((uint64_t)(p[0]) << 0) | ((uint64_t)(p[1]) << 8) |
1526
40.0M
         ((uint64_t)(p[2]) << 16) | ((uint64_t)(p[3]) << 24) |
1527
40.0M
         ((uint64_t)(p[4]) << 32) | ((uint64_t)(p[5]) << 40) |
1528
40.0M
         ((uint64_t)(p[6]) << 48) | ((uint64_t)(p[7]) << 56);
1529
40.0M
#endif
1530
40.0M
}
1531
1532
// --------
1533
1534
#define wuffs_base__poke_u8be__no_bounds_check \
1535
15.9M
  wuffs_base__poke_u8__no_bounds_check
1536
#define wuffs_base__poke_u8le__no_bounds_check \
1537
  wuffs_base__poke_u8__no_bounds_check
1538
1539
static inline void  //
1540
15.9M
wuffs_base__poke_u8__no_bounds_check(uint8_t* p, uint8_t x) {
1541
15.9M
  p[0] = x;
1542
15.9M
}
1543
1544
static inline void  //
1545
0
wuffs_base__poke_u16be__no_bounds_check(uint8_t* p, uint16_t x) {
1546
0
  p[0] = (uint8_t)(x >> 8);
1547
0
  p[1] = (uint8_t)(x >> 0);
1548
0
}
1549
1550
static inline void  //
1551
0
wuffs_base__poke_u16le__no_bounds_check(uint8_t* p, uint16_t x) {
1552
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1553
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1554
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1555
  // defines "__GNUC__".
1556
  memcpy(p, &x, 2);
1557
#else
1558
0
  p[0] = (uint8_t)(x >> 0);
1559
0
  p[1] = (uint8_t)(x >> 8);
1560
0
#endif
1561
0
}
1562
1563
static inline void  //
1564
0
wuffs_base__poke_u24be__no_bounds_check(uint8_t* p, uint32_t x) {
1565
0
  p[0] = (uint8_t)(x >> 16);
1566
0
  p[1] = (uint8_t)(x >> 8);
1567
0
  p[2] = (uint8_t)(x >> 0);
1568
0
}
1569
1570
static inline void  //
1571
2.56M
wuffs_base__poke_u24le__no_bounds_check(uint8_t* p, uint32_t x) {
1572
2.56M
  p[0] = (uint8_t)(x >> 0);
1573
2.56M
  p[1] = (uint8_t)(x >> 8);
1574
2.56M
  p[2] = (uint8_t)(x >> 16);
1575
2.56M
}
1576
1577
static inline void  //
1578
0
wuffs_base__poke_u32be__no_bounds_check(uint8_t* p, uint32_t x) {
1579
0
  p[0] = (uint8_t)(x >> 24);
1580
0
  p[1] = (uint8_t)(x >> 16);
1581
0
  p[2] = (uint8_t)(x >> 8);
1582
0
  p[3] = (uint8_t)(x >> 0);
1583
0
}
1584
1585
static inline void  //
1586
210M
wuffs_base__poke_u32le__no_bounds_check(uint8_t* p, uint32_t x) {
1587
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1588
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1589
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1590
  // defines "__GNUC__".
1591
  memcpy(p, &x, 4);
1592
#else
1593
210M
  p[0] = (uint8_t)(x >> 0);
1594
210M
  p[1] = (uint8_t)(x >> 8);
1595
210M
  p[2] = (uint8_t)(x >> 16);
1596
210M
  p[3] = (uint8_t)(x >> 24);
1597
210M
#endif
1598
210M
}
1599
1600
static inline void  //
1601
0
wuffs_base__poke_u40be__no_bounds_check(uint8_t* p, uint64_t x) {
1602
0
  p[0] = (uint8_t)(x >> 32);
1603
0
  p[1] = (uint8_t)(x >> 24);
1604
0
  p[2] = (uint8_t)(x >> 16);
1605
0
  p[3] = (uint8_t)(x >> 8);
1606
0
  p[4] = (uint8_t)(x >> 0);
1607
0
}
1608
1609
static inline void  //
1610
0
wuffs_base__poke_u40le__no_bounds_check(uint8_t* p, uint64_t x) {
1611
0
  p[0] = (uint8_t)(x >> 0);
1612
0
  p[1] = (uint8_t)(x >> 8);
1613
0
  p[2] = (uint8_t)(x >> 16);
1614
0
  p[3] = (uint8_t)(x >> 24);
1615
0
  p[4] = (uint8_t)(x >> 32);
1616
0
}
1617
1618
static inline void  //
1619
0
wuffs_base__poke_u48be__no_bounds_check(uint8_t* p, uint64_t x) {
1620
0
  p[0] = (uint8_t)(x >> 40);
1621
0
  p[1] = (uint8_t)(x >> 32);
1622
0
  p[2] = (uint8_t)(x >> 24);
1623
0
  p[3] = (uint8_t)(x >> 16);
1624
0
  p[4] = (uint8_t)(x >> 8);
1625
0
  p[5] = (uint8_t)(x >> 0);
1626
0
}
1627
1628
static inline void  //
1629
0
wuffs_base__poke_u48le__no_bounds_check(uint8_t* p, uint64_t x) {
1630
0
  p[0] = (uint8_t)(x >> 0);
1631
0
  p[1] = (uint8_t)(x >> 8);
1632
0
  p[2] = (uint8_t)(x >> 16);
1633
0
  p[3] = (uint8_t)(x >> 24);
1634
0
  p[4] = (uint8_t)(x >> 32);
1635
0
  p[5] = (uint8_t)(x >> 40);
1636
0
}
1637
1638
static inline void  //
1639
0
wuffs_base__poke_u56be__no_bounds_check(uint8_t* p, uint64_t x) {
1640
0
  p[0] = (uint8_t)(x >> 48);
1641
0
  p[1] = (uint8_t)(x >> 40);
1642
0
  p[2] = (uint8_t)(x >> 32);
1643
0
  p[3] = (uint8_t)(x >> 24);
1644
0
  p[4] = (uint8_t)(x >> 16);
1645
0
  p[5] = (uint8_t)(x >> 8);
1646
0
  p[6] = (uint8_t)(x >> 0);
1647
0
}
1648
1649
static inline void  //
1650
0
wuffs_base__poke_u56le__no_bounds_check(uint8_t* p, uint64_t x) {
1651
0
  p[0] = (uint8_t)(x >> 0);
1652
0
  p[1] = (uint8_t)(x >> 8);
1653
0
  p[2] = (uint8_t)(x >> 16);
1654
0
  p[3] = (uint8_t)(x >> 24);
1655
0
  p[4] = (uint8_t)(x >> 32);
1656
0
  p[5] = (uint8_t)(x >> 40);
1657
0
  p[6] = (uint8_t)(x >> 48);
1658
0
}
1659
1660
static inline void  //
1661
0
wuffs_base__poke_u64be__no_bounds_check(uint8_t* p, uint64_t x) {
1662
0
  p[0] = (uint8_t)(x >> 56);
1663
0
  p[1] = (uint8_t)(x >> 48);
1664
0
  p[2] = (uint8_t)(x >> 40);
1665
0
  p[3] = (uint8_t)(x >> 32);
1666
0
  p[4] = (uint8_t)(x >> 24);
1667
0
  p[5] = (uint8_t)(x >> 16);
1668
0
  p[6] = (uint8_t)(x >> 8);
1669
0
  p[7] = (uint8_t)(x >> 0);
1670
0
}
1671
1672
static inline void  //
1673
70.7M
wuffs_base__poke_u64le__no_bounds_check(uint8_t* p, uint64_t x) {
1674
#if defined(WUFFS_BASE__USE_MEMCPY_LE_PEEK_POKE) || \
1675
    (defined(__GNUC__) && !defined(__clang__) && defined(__x86_64__))
1676
  // This seems to perform better on gcc 10 (but not clang 9). Clang also
1677
  // defines "__GNUC__".
1678
  memcpy(p, &x, 8);
1679
#else
1680
70.7M
  p[0] = (uint8_t)(x >> 0);
1681
70.7M
  p[1] = (uint8_t)(x >> 8);
1682
70.7M
  p[2] = (uint8_t)(x >> 16);
1683
70.7M
  p[3] = (uint8_t)(x >> 24);
1684
70.7M
  p[4] = (uint8_t)(x >> 32);
1685
70.7M
  p[5] = (uint8_t)(x >> 40);
1686
70.7M
  p[6] = (uint8_t)(x >> 48);
1687
70.7M
  p[7] = (uint8_t)(x >> 56);
1688
70.7M
#endif
1689
70.7M
}
1690
1691
// ---------------- Slices and Tables
1692
1693
// WUFFS_BASE__SLICE is a 1-dimensional buffer.
1694
//
1695
// len measures a number of elements, not necessarily a size in bytes.
1696
//
1697
// A value with all fields NULL or zero is a valid, empty slice.
1698
#define WUFFS_BASE__SLICE(T) \
1699
  struct {                   \
1700
    T* ptr;                  \
1701
    size_t len;              \
1702
  }
1703
1704
// WUFFS_BASE__TABLE is a 2-dimensional buffer.
1705
//
1706
// width, height and stride measure a number of elements, not necessarily a
1707
// size in bytes.
1708
//
1709
// A value with all fields NULL or zero is a valid, empty table.
1710
#define WUFFS_BASE__TABLE(T) \
1711
  struct {                   \
1712
    T* ptr;                  \
1713
    size_t width;            \
1714
    size_t height;           \
1715
    size_t stride;           \
1716
  }
1717
1718
typedef WUFFS_BASE__SLICE(uint8_t) wuffs_base__slice_u8;
1719
typedef WUFFS_BASE__SLICE(uint16_t) wuffs_base__slice_u16;
1720
typedef WUFFS_BASE__SLICE(uint32_t) wuffs_base__slice_u32;
1721
typedef WUFFS_BASE__SLICE(uint64_t) wuffs_base__slice_u64;
1722
1723
typedef WUFFS_BASE__TABLE(uint8_t) wuffs_base__table_u8;
1724
typedef WUFFS_BASE__TABLE(uint16_t) wuffs_base__table_u16;
1725
typedef WUFFS_BASE__TABLE(uint32_t) wuffs_base__table_u32;
1726
typedef WUFFS_BASE__TABLE(uint64_t) wuffs_base__table_u64;
1727
1728
static inline wuffs_base__slice_u8  //
1729
637M
wuffs_base__make_slice_u8(uint8_t* ptr, size_t len) {
1730
637M
  wuffs_base__slice_u8 ret;
1731
637M
  ret.ptr = ptr;
1732
637M
  ret.len = len;
1733
637M
  return ret;
1734
637M
}
1735
1736
static inline wuffs_base__slice_u16  //
1737
0
wuffs_base__make_slice_u16(uint16_t* ptr, size_t len) {
1738
0
  wuffs_base__slice_u16 ret;
1739
0
  ret.ptr = ptr;
1740
0
  ret.len = len;
1741
0
  return ret;
1742
0
}
1743
1744
static inline wuffs_base__slice_u32  //
1745
0
wuffs_base__make_slice_u32(uint32_t* ptr, size_t len) {
1746
0
  wuffs_base__slice_u32 ret;
1747
0
  ret.ptr = ptr;
1748
0
  ret.len = len;
1749
0
  return ret;
1750
0
}
1751
1752
static inline wuffs_base__slice_u64  //
1753
0
wuffs_base__make_slice_u64(uint64_t* ptr, size_t len) {
1754
0
  wuffs_base__slice_u64 ret;
1755
0
  ret.ptr = ptr;
1756
0
  ret.len = len;
1757
0
  return ret;
1758
0
}
1759
1760
static inline wuffs_base__slice_u8  //
1761
236k
wuffs_base__make_slice_u8_ij(uint8_t* ptr, size_t i, size_t j) {
1762
236k
  wuffs_base__slice_u8 ret;
1763
236k
  ret.ptr = ptr ? (ptr + i) : NULL;
1764
236k
  ret.len = (j >= i) ? (j - i) : 0;
1765
236k
  return ret;
1766
236k
}
1767
1768
static inline wuffs_base__slice_u16  //
1769
0
wuffs_base__make_slice_u16_ij(uint16_t* ptr, size_t i, size_t j) {
1770
0
  wuffs_base__slice_u16 ret;
1771
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1772
0
  ret.len = (j >= i) ? (j - i) : 0;
1773
0
  return ret;
1774
0
}
1775
1776
static inline wuffs_base__slice_u32  //
1777
0
wuffs_base__make_slice_u32_ij(uint32_t* ptr, size_t i, size_t j) {
1778
0
  wuffs_base__slice_u32 ret;
1779
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1780
0
  ret.len = (j >= i) ? (j - i) : 0;
1781
0
  return ret;
1782
0
}
1783
1784
static inline wuffs_base__slice_u64  //
1785
0
wuffs_base__make_slice_u64_ij(uint64_t* ptr, size_t i, size_t j) {
1786
0
  wuffs_base__slice_u64 ret;
1787
0
  ret.ptr = ptr ? (ptr + i) : NULL;
1788
0
  ret.len = (j >= i) ? (j - i) : 0;
1789
0
  return ret;
1790
0
}
1791
1792
static inline wuffs_base__slice_u8  //
1793
30.4k
wuffs_base__empty_slice_u8(void) {
1794
30.4k
  wuffs_base__slice_u8 ret;
1795
30.4k
  ret.ptr = NULL;
1796
30.4k
  ret.len = 0;
1797
30.4k
  return ret;
1798
30.4k
}
1799
1800
static inline wuffs_base__slice_u16  //
1801
0
wuffs_base__empty_slice_u16(void) {
1802
0
  wuffs_base__slice_u16 ret;
1803
0
  ret.ptr = NULL;
1804
0
  ret.len = 0;
1805
0
  return ret;
1806
0
}
1807
1808
static inline wuffs_base__slice_u32  //
1809
0
wuffs_base__empty_slice_u32(void) {
1810
0
  wuffs_base__slice_u32 ret;
1811
0
  ret.ptr = NULL;
1812
0
  ret.len = 0;
1813
0
  return ret;
1814
0
}
1815
1816
static inline wuffs_base__slice_u64  //
1817
0
wuffs_base__empty_slice_u64(void) {
1818
0
  wuffs_base__slice_u64 ret;
1819
0
  ret.ptr = NULL;
1820
0
  ret.len = 0;
1821
0
  return ret;
1822
0
}
1823
1824
static inline wuffs_base__table_u8  //
1825
wuffs_base__make_table_u8(uint8_t* ptr,
1826
                          size_t width,
1827
                          size_t height,
1828
4.03k
                          size_t stride) {
1829
4.03k
  wuffs_base__table_u8 ret;
1830
4.03k
  ret.ptr = ptr;
1831
4.03k
  ret.width = width;
1832
4.03k
  ret.height = height;
1833
4.03k
  ret.stride = stride;
1834
4.03k
  return ret;
1835
4.03k
}
1836
1837
static inline wuffs_base__table_u16  //
1838
wuffs_base__make_table_u16(uint16_t* ptr,
1839
                           size_t width,
1840
                           size_t height,
1841
0
                           size_t stride) {
1842
0
  wuffs_base__table_u16 ret;
1843
0
  ret.ptr = ptr;
1844
0
  ret.width = width;
1845
0
  ret.height = height;
1846
0
  ret.stride = stride;
1847
0
  return ret;
1848
0
}
1849
1850
static inline wuffs_base__table_u32  //
1851
wuffs_base__make_table_u32(uint32_t* ptr,
1852
                           size_t width,
1853
                           size_t height,
1854
0
                           size_t stride) {
1855
0
  wuffs_base__table_u32 ret;
1856
0
  ret.ptr = ptr;
1857
0
  ret.width = width;
1858
0
  ret.height = height;
1859
0
  ret.stride = stride;
1860
0
  return ret;
1861
0
}
1862
1863
static inline wuffs_base__table_u64  //
1864
wuffs_base__make_table_u64(uint64_t* ptr,
1865
                           size_t width,
1866
                           size_t height,
1867
0
                           size_t stride) {
1868
0
  wuffs_base__table_u64 ret;
1869
0
  ret.ptr = ptr;
1870
0
  ret.width = width;
1871
0
  ret.height = height;
1872
0
  ret.stride = stride;
1873
0
  return ret;
1874
0
}
1875
1876
static inline wuffs_base__table_u8  //
1877
0
wuffs_base__empty_table_u8(void) {
1878
0
  wuffs_base__table_u8 ret;
1879
0
  ret.ptr = NULL;
1880
0
  ret.width = 0;
1881
0
  ret.height = 0;
1882
0
  ret.stride = 0;
1883
0
  return ret;
1884
0
}
1885
1886
static inline wuffs_base__table_u16  //
1887
0
wuffs_base__empty_table_u16(void) {
1888
0
  wuffs_base__table_u16 ret;
1889
0
  ret.ptr = NULL;
1890
0
  ret.width = 0;
1891
0
  ret.height = 0;
1892
0
  ret.stride = 0;
1893
0
  return ret;
1894
0
}
1895
1896
static inline wuffs_base__table_u32  //
1897
0
wuffs_base__empty_table_u32(void) {
1898
0
  wuffs_base__table_u32 ret;
1899
0
  ret.ptr = NULL;
1900
0
  ret.width = 0;
1901
0
  ret.height = 0;
1902
0
  ret.stride = 0;
1903
0
  return ret;
1904
0
}
1905
1906
static inline wuffs_base__table_u64  //
1907
0
wuffs_base__empty_table_u64(void) {
1908
0
  wuffs_base__table_u64 ret;
1909
0
  ret.ptr = NULL;
1910
0
  ret.width = 0;
1911
0
  ret.height = 0;
1912
0
  ret.stride = 0;
1913
0
  return ret;
1914
0
}
1915
1916
static inline bool  //
1917
0
wuffs_base__slice_u8__overlaps(wuffs_base__slice_u8 s, wuffs_base__slice_u8 t) {
1918
0
  return ((s.ptr <= t.ptr) && (t.ptr < (s.ptr + s.len))) ||
1919
0
         ((t.ptr <= s.ptr) && (s.ptr < (t.ptr + t.len)));
1920
0
}
1921
1922
// wuffs_base__slice_u8__subslice_i returns s[i:].
1923
//
1924
// It returns an empty slice if i is out of bounds.
1925
static inline wuffs_base__slice_u8  //
1926
404M
wuffs_base__slice_u8__subslice_i(wuffs_base__slice_u8 s, uint64_t i) {
1927
404M
  if ((i <= SIZE_MAX) && (i <= s.len)) {
1928
404M
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(s.len - i)));
1929
404M
  }
1930
0
  return wuffs_base__empty_slice_u8();
1931
404M
}
1932
1933
// wuffs_base__slice_u8__subslice_j returns s[:j].
1934
//
1935
// It returns an empty slice if j is out of bounds.
1936
static inline wuffs_base__slice_u8  //
1937
105M
wuffs_base__slice_u8__subslice_j(wuffs_base__slice_u8 s, uint64_t j) {
1938
105M
  if ((j <= SIZE_MAX) && (j <= s.len)) {
1939
105M
    return wuffs_base__make_slice_u8(s.ptr, ((size_t)j));
1940
105M
  }
1941
0
  return wuffs_base__empty_slice_u8();
1942
105M
}
1943
1944
// wuffs_base__slice_u8__subslice_ij returns s[i:j].
1945
//
1946
// It returns an empty slice if i or j is out of bounds.
1947
static inline wuffs_base__slice_u8  //
1948
wuffs_base__slice_u8__subslice_ij(wuffs_base__slice_u8 s,
1949
                                  uint64_t i,
1950
19.8k
                                  uint64_t j) {
1951
19.8k
  if ((i <= j) && (j <= SIZE_MAX) && (j <= s.len)) {
1952
19.8k
    return wuffs_base__make_slice_u8(s.ptr + i, ((size_t)(j - i)));
1953
19.8k
  }
1954
0
  return wuffs_base__empty_slice_u8();
1955
19.8k
}
1956
1957
// wuffs_base__table_u8__subtable_ij returns t[ix:jx, iy:jy].
1958
//
1959
// It returns an empty table if i or j is out of bounds.
1960
static inline wuffs_base__table_u8  //
1961
wuffs_base__table_u8__subtable_ij(wuffs_base__table_u8 t,
1962
                                  uint64_t ix,
1963
                                  uint64_t iy,
1964
                                  uint64_t jx,
1965
4.03k
                                  uint64_t jy) {
1966
4.03k
  if ((ix <= jx) && (jx <= SIZE_MAX) && (jx <= t.width) &&  //
1967
4.03k
      (iy <= jy) && (jy <= SIZE_MAX) && (jy <= t.height)) {
1968
4.03k
    return wuffs_base__make_table_u8(t.ptr + ix + (iy * t.stride),  //
1969
4.03k
                                     ((size_t)(jx - ix)),           //
1970
4.03k
                                     ((size_t)(jy - iy)),           //
1971
4.03k
                                     t.stride);                     //
1972
4.03k
  }
1973
0
  return wuffs_base__make_table_u8(NULL, 0, 0, 0);
1974
4.03k
}
1975
1976
// wuffs_base__table__flattened_length returns the number of elements covered
1977
// by the 1-dimensional span that backs a 2-dimensional table. This counts the
1978
// elements inside the table and, when width != stride, the elements outside
1979
// the table but between its rows.
1980
//
1981
// For example, consider a width 10, height 4, stride 10 table. Mark its first
1982
// and last (inclusive) elements with 'a' and 'z'. This function returns 40.
1983
//
1984
//    a123456789
1985
//    0123456789
1986
//    0123456789
1987
//    012345678z
1988
//
1989
// Now consider the sub-table of that from (2, 1) inclusive to (8, 4) exclusive.
1990
//
1991
//    a123456789
1992
//    01iiiiiioo
1993
//    ooiiiiiioo
1994
//    ooiiiiii8z
1995
//
1996
// This function (called with width 6, height 3, stride 10) returns 26: 18 'i'
1997
// inside elements plus 8 'o' outside elements. Note that 26 is less than a
1998
// naive (height * stride = 30) computation. Indeed, advancing 29 elements from
1999
// the first 'i' would venture past 'z', out of bounds of the original table.
2000
//
2001
// It does not check for overflow, but if the arguments come from a table that
2002
// exists in memory and each element occupies a positive number of bytes then
2003
// the result should be bounded by the amount of allocatable memory (which
2004
// shouldn't overflow SIZE_MAX).
2005
static inline size_t  //
2006
wuffs_base__table__flattened_length(size_t width,
2007
                                    size_t height,
2008
0
                                    size_t stride) {
2009
0
  if (height == 0) {
2010
0
    return 0;
2011
0
  }
2012
0
  return ((height - 1) * stride) + width;
2013
0
}
2014
2015
// ---------------- Magic Numbers
2016
2017
// wuffs_base__magic_number_guess_fourcc guesses the file format of some data,
2018
// given its starting bytes (the prefix_data argument) and whether or not there
2019
// may be further bytes (the prefix_closed argument; true means that
2020
// prefix_data is the entire data).
2021
//
2022
// It returns a positive FourCC value on success.
2023
//
2024
// It returns zero if nothing matches its hard-coded list of 'magic numbers'.
2025
//
2026
// It returns a negative value if prefix_closed is false and a longer prefix is
2027
// required for a conclusive result. For example, a single 'B' byte (without
2028
// further data) is not enough to discriminate the BMP and BPG image file
2029
// formats. Similarly, a single '\xFF' byte might be the start of JPEG data or
2030
// it might be the start of some other binary data.
2031
//
2032
// It does not do a full validity check. Like any guess made from a short
2033
// prefix of the data, it may return false positives. Data that starts with 99
2034
// bytes of valid JPEG followed by corruption or truncation is an invalid JPEG
2035
// image overall, but this function will still return WUFFS_BASE__FOURCC__JPEG.
2036
//
2037
// Another source of false positives is that some 'magic numbers' are valid
2038
// ASCII data. A file starting with "GIF87a and GIF89a are the two versions of
2039
// GIF" will match GIF's 'magic number' even if it's plain text, not an image.
2040
//
2041
// For modular builds that divide the base module into sub-modules, using this
2042
// function requires the WUFFS_CONFIG__MODULE__BASE__MAGIC sub-module, not just
2043
// WUFFS_CONFIG__MODULE__BASE__CORE.
2044
WUFFS_BASE__MAYBE_STATIC int32_t  //
2045
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
2046
                                      bool prefix_closed);
2047
2048
// ---------------- Quirk Values
2049
2050
// These constants are the value half of a key-value pair, where the key is
2051
// WUFFS_BASE__QUIRK_QUALITY.
2052
//
2053
// In the Wuffs API, set_quirk takes a u64 value. These macro definitions are
2054
// likewise unsigned values (uint64_t) but for this particular key, they are
2055
// best interpreted as signed values (int64_t). "Lower-than-default quality"
2056
// and "higher-than-default quality", as signed values, are -1 and +1.
2057
//
2058
// See doc/note/quirks.md for some more discussion about trade-offs.
2059
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY UINT64_MAX
2060
#define WUFFS_BASE__QUIRK_QUALITY__VALUE__HIGHER_QUALITY ((uint64_t)1)
2061
2062
// ---------------- Ranges and Rects
2063
2064
// See https://github.com/google/wuffs/blob/main/doc/note/ranges-and-rects.md
2065
2066
// --------
2067
2068
typedef struct wuffs_base__range_ie_i32__struct {
2069
  int32_t min_incl;
2070
  int32_t max_excl;
2071
2072
#ifdef __cplusplus
2073
  inline bool is_empty() const;
2074
  inline bool equals(wuffs_base__range_ie_i32__struct s) const;
2075
  inline wuffs_base__range_ie_i32__struct intersect(
2076
      wuffs_base__range_ie_i32__struct s) const;
2077
  inline wuffs_base__range_ie_i32__struct unite(
2078
      wuffs_base__range_ie_i32__struct s) const;
2079
  inline bool contains(int32_t x) const;
2080
  inline bool contains_range(wuffs_base__range_ie_i32__struct s) const;
2081
  inline uint32_t length() const;
2082
#endif  // __cplusplus
2083
2084
} wuffs_base__range_ie_i32;
2085
2086
static inline wuffs_base__range_ie_i32  //
2087
0
wuffs_base__empty_range_ie_i32(void) {
2088
0
  wuffs_base__range_ie_i32 ret;
2089
0
  ret.min_incl = 0;
2090
0
  ret.max_excl = 0;
2091
0
  return ret;
2092
0
}
2093
2094
static inline wuffs_base__range_ie_i32  //
2095
0
wuffs_base__make_range_ie_i32(int32_t min_incl, int32_t max_excl) {
2096
0
  wuffs_base__range_ie_i32 ret;
2097
0
  ret.min_incl = min_incl;
2098
0
  ret.max_excl = max_excl;
2099
0
  return ret;
2100
0
}
2101
2102
static inline bool  //
2103
0
wuffs_base__range_ie_i32__is_empty(const wuffs_base__range_ie_i32* r) {
2104
0
  return r->min_incl >= r->max_excl;
2105
0
}
2106
2107
static inline bool  //
2108
wuffs_base__range_ie_i32__equals(const wuffs_base__range_ie_i32* r,
2109
0
                                 wuffs_base__range_ie_i32 s) {
2110
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2111
0
         (wuffs_base__range_ie_i32__is_empty(r) &&
2112
0
          wuffs_base__range_ie_i32__is_empty(&s));
2113
0
}
2114
2115
static inline wuffs_base__range_ie_i32  //
2116
wuffs_base__range_ie_i32__intersect(const wuffs_base__range_ie_i32* r,
2117
0
                                    wuffs_base__range_ie_i32 s) {
2118
0
  wuffs_base__range_ie_i32 t;
2119
0
  t.min_incl = wuffs_base__i32__max(r->min_incl, s.min_incl);
2120
0
  t.max_excl = wuffs_base__i32__min(r->max_excl, s.max_excl);
2121
0
  return t;
2122
0
}
2123
2124
static inline wuffs_base__range_ie_i32  //
2125
wuffs_base__range_ie_i32__unite(const wuffs_base__range_ie_i32* r,
2126
0
                                wuffs_base__range_ie_i32 s) {
2127
0
  if (wuffs_base__range_ie_i32__is_empty(r)) {
2128
0
    return s;
2129
0
  }
2130
0
  if (wuffs_base__range_ie_i32__is_empty(&s)) {
2131
0
    return *r;
2132
0
  }
2133
0
  wuffs_base__range_ie_i32 t;
2134
0
  t.min_incl = wuffs_base__i32__min(r->min_incl, s.min_incl);
2135
0
  t.max_excl = wuffs_base__i32__max(r->max_excl, s.max_excl);
2136
0
  return t;
2137
0
}
2138
2139
static inline bool  //
2140
wuffs_base__range_ie_i32__contains(const wuffs_base__range_ie_i32* r,
2141
0
                                   int32_t x) {
2142
0
  return (r->min_incl <= x) && (x < r->max_excl);
2143
0
}
2144
2145
static inline bool  //
2146
wuffs_base__range_ie_i32__contains_range(const wuffs_base__range_ie_i32* r,
2147
0
                                         wuffs_base__range_ie_i32 s) {
2148
0
  return wuffs_base__range_ie_i32__equals(
2149
0
      &s, wuffs_base__range_ie_i32__intersect(r, s));
2150
0
}
2151
2152
static inline uint32_t  //
2153
0
wuffs_base__range_ie_i32__length(const wuffs_base__range_ie_i32* r) {
2154
0
  return (r->max_excl > r->min_incl)
2155
0
             ? (((uint32_t)(r->max_excl)) - ((uint32_t)(r->min_incl)))
2156
0
             : 0;
2157
0
}
2158
2159
#ifdef __cplusplus
2160
2161
inline bool  //
2162
wuffs_base__range_ie_i32::is_empty() const {
2163
  return wuffs_base__range_ie_i32__is_empty(this);
2164
}
2165
2166
inline bool  //
2167
wuffs_base__range_ie_i32::equals(wuffs_base__range_ie_i32 s) const {
2168
  return wuffs_base__range_ie_i32__equals(this, s);
2169
}
2170
2171
inline wuffs_base__range_ie_i32  //
2172
wuffs_base__range_ie_i32::intersect(wuffs_base__range_ie_i32 s) const {
2173
  return wuffs_base__range_ie_i32__intersect(this, s);
2174
}
2175
2176
inline wuffs_base__range_ie_i32  //
2177
wuffs_base__range_ie_i32::unite(wuffs_base__range_ie_i32 s) const {
2178
  return wuffs_base__range_ie_i32__unite(this, s);
2179
}
2180
2181
inline bool  //
2182
wuffs_base__range_ie_i32::contains(int32_t x) const {
2183
  return wuffs_base__range_ie_i32__contains(this, x);
2184
}
2185
2186
inline bool  //
2187
wuffs_base__range_ie_i32::contains_range(wuffs_base__range_ie_i32 s) const {
2188
  return wuffs_base__range_ie_i32__contains_range(this, s);
2189
}
2190
2191
inline uint32_t  //
2192
wuffs_base__range_ie_i32::length() const {
2193
  return wuffs_base__range_ie_i32__length(this);
2194
}
2195
2196
#endif  // __cplusplus
2197
2198
// --------
2199
2200
typedef struct wuffs_base__range_ie_u32__struct {
2201
  uint32_t min_incl;
2202
  uint32_t max_excl;
2203
2204
#ifdef __cplusplus
2205
  inline bool is_empty() const;
2206
  inline bool equals(wuffs_base__range_ie_u32__struct s) const;
2207
  inline wuffs_base__range_ie_u32__struct intersect(
2208
      wuffs_base__range_ie_u32__struct s) const;
2209
  inline wuffs_base__range_ie_u32__struct unite(
2210
      wuffs_base__range_ie_u32__struct s) const;
2211
  inline bool contains(uint32_t x) const;
2212
  inline bool contains_range(wuffs_base__range_ie_u32__struct s) const;
2213
  inline uint32_t length() const;
2214
#endif  // __cplusplus
2215
2216
} wuffs_base__range_ie_u32;
2217
2218
static inline wuffs_base__range_ie_u32  //
2219
0
wuffs_base__empty_range_ie_u32(void) {
2220
0
  wuffs_base__range_ie_u32 ret;
2221
0
  ret.min_incl = 0;
2222
0
  ret.max_excl = 0;
2223
0
  return ret;
2224
0
}
2225
2226
static inline wuffs_base__range_ie_u32  //
2227
0
wuffs_base__make_range_ie_u32(uint32_t min_incl, uint32_t max_excl) {
2228
0
  wuffs_base__range_ie_u32 ret;
2229
0
  ret.min_incl = min_incl;
2230
0
  ret.max_excl = max_excl;
2231
0
  return ret;
2232
0
}
2233
2234
static inline bool  //
2235
0
wuffs_base__range_ie_u32__is_empty(const wuffs_base__range_ie_u32* r) {
2236
0
  return r->min_incl >= r->max_excl;
2237
0
}
2238
2239
static inline bool  //
2240
wuffs_base__range_ie_u32__equals(const wuffs_base__range_ie_u32* r,
2241
0
                                 wuffs_base__range_ie_u32 s) {
2242
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2243
0
         (wuffs_base__range_ie_u32__is_empty(r) &&
2244
0
          wuffs_base__range_ie_u32__is_empty(&s));
2245
0
}
2246
2247
static inline wuffs_base__range_ie_u32  //
2248
wuffs_base__range_ie_u32__intersect(const wuffs_base__range_ie_u32* r,
2249
0
                                    wuffs_base__range_ie_u32 s) {
2250
0
  wuffs_base__range_ie_u32 t;
2251
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2252
0
  t.max_excl = wuffs_base__u32__min(r->max_excl, s.max_excl);
2253
0
  return t;
2254
0
}
2255
2256
static inline wuffs_base__range_ie_u32  //
2257
wuffs_base__range_ie_u32__unite(const wuffs_base__range_ie_u32* r,
2258
0
                                wuffs_base__range_ie_u32 s) {
2259
0
  if (wuffs_base__range_ie_u32__is_empty(r)) {
2260
0
    return s;
2261
0
  }
2262
0
  if (wuffs_base__range_ie_u32__is_empty(&s)) {
2263
0
    return *r;
2264
0
  }
2265
0
  wuffs_base__range_ie_u32 t;
2266
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2267
0
  t.max_excl = wuffs_base__u32__max(r->max_excl, s.max_excl);
2268
0
  return t;
2269
0
}
2270
2271
static inline bool  //
2272
wuffs_base__range_ie_u32__contains(const wuffs_base__range_ie_u32* r,
2273
0
                                   uint32_t x) {
2274
0
  return (r->min_incl <= x) && (x < r->max_excl);
2275
0
}
2276
2277
static inline bool  //
2278
wuffs_base__range_ie_u32__contains_range(const wuffs_base__range_ie_u32* r,
2279
0
                                         wuffs_base__range_ie_u32 s) {
2280
0
  return wuffs_base__range_ie_u32__equals(
2281
0
      &s, wuffs_base__range_ie_u32__intersect(r, s));
2282
0
}
2283
2284
static inline uint32_t  //
2285
0
wuffs_base__range_ie_u32__length(const wuffs_base__range_ie_u32* r) {
2286
0
  return wuffs_base__u32__sat_sub(r->max_excl, r->min_incl);
2287
0
}
2288
2289
#ifdef __cplusplus
2290
2291
inline bool  //
2292
wuffs_base__range_ie_u32::is_empty() const {
2293
  return wuffs_base__range_ie_u32__is_empty(this);
2294
}
2295
2296
inline bool  //
2297
wuffs_base__range_ie_u32::equals(wuffs_base__range_ie_u32 s) const {
2298
  return wuffs_base__range_ie_u32__equals(this, s);
2299
}
2300
2301
inline wuffs_base__range_ie_u32  //
2302
wuffs_base__range_ie_u32::intersect(wuffs_base__range_ie_u32 s) const {
2303
  return wuffs_base__range_ie_u32__intersect(this, s);
2304
}
2305
2306
inline wuffs_base__range_ie_u32  //
2307
wuffs_base__range_ie_u32::unite(wuffs_base__range_ie_u32 s) const {
2308
  return wuffs_base__range_ie_u32__unite(this, s);
2309
}
2310
2311
inline bool  //
2312
wuffs_base__range_ie_u32::contains(uint32_t x) const {
2313
  return wuffs_base__range_ie_u32__contains(this, x);
2314
}
2315
2316
inline bool  //
2317
wuffs_base__range_ie_u32::contains_range(wuffs_base__range_ie_u32 s) const {
2318
  return wuffs_base__range_ie_u32__contains_range(this, s);
2319
}
2320
2321
inline uint32_t  //
2322
wuffs_base__range_ie_u32::length() const {
2323
  return wuffs_base__range_ie_u32__length(this);
2324
}
2325
2326
#endif  // __cplusplus
2327
2328
// --------
2329
2330
typedef struct wuffs_base__range_ie_u64__struct {
2331
  uint64_t min_incl;
2332
  uint64_t max_excl;
2333
2334
#ifdef __cplusplus
2335
  inline bool is_empty() const;
2336
  inline bool equals(wuffs_base__range_ie_u64__struct s) const;
2337
  inline wuffs_base__range_ie_u64__struct intersect(
2338
      wuffs_base__range_ie_u64__struct s) const;
2339
  inline wuffs_base__range_ie_u64__struct unite(
2340
      wuffs_base__range_ie_u64__struct s) const;
2341
  inline bool contains(uint64_t x) const;
2342
  inline bool contains_range(wuffs_base__range_ie_u64__struct s) const;
2343
  inline uint64_t length() const;
2344
#endif  // __cplusplus
2345
2346
} wuffs_base__range_ie_u64;
2347
2348
static inline wuffs_base__range_ie_u64  //
2349
0
wuffs_base__empty_range_ie_u64(void) {
2350
0
  wuffs_base__range_ie_u64 ret;
2351
0
  ret.min_incl = 0;
2352
0
  ret.max_excl = 0;
2353
0
  return ret;
2354
0
}
2355
2356
static inline wuffs_base__range_ie_u64  //
2357
0
wuffs_base__make_range_ie_u64(uint64_t min_incl, uint64_t max_excl) {
2358
0
  wuffs_base__range_ie_u64 ret;
2359
0
  ret.min_incl = min_incl;
2360
0
  ret.max_excl = max_excl;
2361
0
  return ret;
2362
0
}
2363
2364
static inline bool  //
2365
0
wuffs_base__range_ie_u64__is_empty(const wuffs_base__range_ie_u64* r) {
2366
0
  return r->min_incl >= r->max_excl;
2367
0
}
2368
2369
static inline bool  //
2370
wuffs_base__range_ie_u64__equals(const wuffs_base__range_ie_u64* r,
2371
0
                                 wuffs_base__range_ie_u64 s) {
2372
0
  return (r->min_incl == s.min_incl && r->max_excl == s.max_excl) ||
2373
0
         (wuffs_base__range_ie_u64__is_empty(r) &&
2374
0
          wuffs_base__range_ie_u64__is_empty(&s));
2375
0
}
2376
2377
static inline wuffs_base__range_ie_u64  //
2378
wuffs_base__range_ie_u64__intersect(const wuffs_base__range_ie_u64* r,
2379
0
                                    wuffs_base__range_ie_u64 s) {
2380
0
  wuffs_base__range_ie_u64 t;
2381
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2382
0
  t.max_excl = wuffs_base__u64__min(r->max_excl, s.max_excl);
2383
0
  return t;
2384
0
}
2385
2386
static inline wuffs_base__range_ie_u64  //
2387
wuffs_base__range_ie_u64__unite(const wuffs_base__range_ie_u64* r,
2388
0
                                wuffs_base__range_ie_u64 s) {
2389
0
  if (wuffs_base__range_ie_u64__is_empty(r)) {
2390
0
    return s;
2391
0
  }
2392
0
  if (wuffs_base__range_ie_u64__is_empty(&s)) {
2393
0
    return *r;
2394
0
  }
2395
0
  wuffs_base__range_ie_u64 t;
2396
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2397
0
  t.max_excl = wuffs_base__u64__max(r->max_excl, s.max_excl);
2398
0
  return t;
2399
0
}
2400
2401
static inline bool  //
2402
wuffs_base__range_ie_u64__contains(const wuffs_base__range_ie_u64* r,
2403
0
                                   uint64_t x) {
2404
0
  return (r->min_incl <= x) && (x < r->max_excl);
2405
0
}
2406
2407
static inline bool  //
2408
wuffs_base__range_ie_u64__contains_range(const wuffs_base__range_ie_u64* r,
2409
0
                                         wuffs_base__range_ie_u64 s) {
2410
0
  return wuffs_base__range_ie_u64__equals(
2411
0
      &s, wuffs_base__range_ie_u64__intersect(r, s));
2412
0
}
2413
2414
static inline uint64_t  //
2415
0
wuffs_base__range_ie_u64__length(const wuffs_base__range_ie_u64* r) {
2416
0
  return wuffs_base__u64__sat_sub(r->max_excl, r->min_incl);
2417
0
}
2418
2419
#ifdef __cplusplus
2420
2421
inline bool  //
2422
wuffs_base__range_ie_u64::is_empty() const {
2423
  return wuffs_base__range_ie_u64__is_empty(this);
2424
}
2425
2426
inline bool  //
2427
wuffs_base__range_ie_u64::equals(wuffs_base__range_ie_u64 s) const {
2428
  return wuffs_base__range_ie_u64__equals(this, s);
2429
}
2430
2431
inline wuffs_base__range_ie_u64  //
2432
wuffs_base__range_ie_u64::intersect(wuffs_base__range_ie_u64 s) const {
2433
  return wuffs_base__range_ie_u64__intersect(this, s);
2434
}
2435
2436
inline wuffs_base__range_ie_u64  //
2437
wuffs_base__range_ie_u64::unite(wuffs_base__range_ie_u64 s) const {
2438
  return wuffs_base__range_ie_u64__unite(this, s);
2439
}
2440
2441
inline bool  //
2442
wuffs_base__range_ie_u64::contains(uint64_t x) const {
2443
  return wuffs_base__range_ie_u64__contains(this, x);
2444
}
2445
2446
inline bool  //
2447
wuffs_base__range_ie_u64::contains_range(wuffs_base__range_ie_u64 s) const {
2448
  return wuffs_base__range_ie_u64__contains_range(this, s);
2449
}
2450
2451
inline uint64_t  //
2452
wuffs_base__range_ie_u64::length() const {
2453
  return wuffs_base__range_ie_u64__length(this);
2454
}
2455
2456
#endif  // __cplusplus
2457
2458
// --------
2459
2460
typedef struct wuffs_base__range_ii_u32__struct {
2461
  uint32_t min_incl;
2462
  uint32_t max_incl;
2463
2464
#ifdef __cplusplus
2465
  inline bool is_empty() const;
2466
  inline bool equals(wuffs_base__range_ii_u32__struct s) const;
2467
  inline wuffs_base__range_ii_u32__struct intersect(
2468
      wuffs_base__range_ii_u32__struct s) const;
2469
  inline wuffs_base__range_ii_u32__struct unite(
2470
      wuffs_base__range_ii_u32__struct s) const;
2471
  inline bool contains(uint32_t x) const;
2472
  inline bool contains_range(wuffs_base__range_ii_u32__struct s) const;
2473
#endif  // __cplusplus
2474
2475
} wuffs_base__range_ii_u32;
2476
2477
static inline wuffs_base__range_ii_u32  //
2478
0
wuffs_base__empty_range_ii_u32(void) {
2479
0
  wuffs_base__range_ii_u32 ret;
2480
0
  ret.min_incl = 0;
2481
0
  ret.max_incl = 0;
2482
0
  return ret;
2483
0
}
2484
2485
static inline wuffs_base__range_ii_u32  //
2486
0
wuffs_base__make_range_ii_u32(uint32_t min_incl, uint32_t max_incl) {
2487
0
  wuffs_base__range_ii_u32 ret;
2488
0
  ret.min_incl = min_incl;
2489
0
  ret.max_incl = max_incl;
2490
0
  return ret;
2491
0
}
2492
2493
static inline bool  //
2494
0
wuffs_base__range_ii_u32__is_empty(const wuffs_base__range_ii_u32* r) {
2495
0
  return r->min_incl > r->max_incl;
2496
0
}
2497
2498
static inline bool  //
2499
wuffs_base__range_ii_u32__equals(const wuffs_base__range_ii_u32* r,
2500
0
                                 wuffs_base__range_ii_u32 s) {
2501
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2502
0
         (wuffs_base__range_ii_u32__is_empty(r) &&
2503
0
          wuffs_base__range_ii_u32__is_empty(&s));
2504
0
}
2505
2506
static inline wuffs_base__range_ii_u32  //
2507
wuffs_base__range_ii_u32__intersect(const wuffs_base__range_ii_u32* r,
2508
0
                                    wuffs_base__range_ii_u32 s) {
2509
0
  wuffs_base__range_ii_u32 t;
2510
0
  t.min_incl = wuffs_base__u32__max(r->min_incl, s.min_incl);
2511
0
  t.max_incl = wuffs_base__u32__min(r->max_incl, s.max_incl);
2512
0
  return t;
2513
0
}
2514
2515
static inline wuffs_base__range_ii_u32  //
2516
wuffs_base__range_ii_u32__unite(const wuffs_base__range_ii_u32* r,
2517
0
                                wuffs_base__range_ii_u32 s) {
2518
0
  if (wuffs_base__range_ii_u32__is_empty(r)) {
2519
0
    return s;
2520
0
  }
2521
0
  if (wuffs_base__range_ii_u32__is_empty(&s)) {
2522
0
    return *r;
2523
0
  }
2524
0
  wuffs_base__range_ii_u32 t;
2525
0
  t.min_incl = wuffs_base__u32__min(r->min_incl, s.min_incl);
2526
0
  t.max_incl = wuffs_base__u32__max(r->max_incl, s.max_incl);
2527
0
  return t;
2528
0
}
2529
2530
static inline bool  //
2531
wuffs_base__range_ii_u32__contains(const wuffs_base__range_ii_u32* r,
2532
0
                                   uint32_t x) {
2533
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2534
0
}
2535
2536
static inline bool  //
2537
wuffs_base__range_ii_u32__contains_range(const wuffs_base__range_ii_u32* r,
2538
0
                                         wuffs_base__range_ii_u32 s) {
2539
0
  return wuffs_base__range_ii_u32__equals(
2540
0
      &s, wuffs_base__range_ii_u32__intersect(r, s));
2541
0
}
2542
2543
#ifdef __cplusplus
2544
2545
inline bool  //
2546
wuffs_base__range_ii_u32::is_empty() const {
2547
  return wuffs_base__range_ii_u32__is_empty(this);
2548
}
2549
2550
inline bool  //
2551
wuffs_base__range_ii_u32::equals(wuffs_base__range_ii_u32 s) const {
2552
  return wuffs_base__range_ii_u32__equals(this, s);
2553
}
2554
2555
inline wuffs_base__range_ii_u32  //
2556
wuffs_base__range_ii_u32::intersect(wuffs_base__range_ii_u32 s) const {
2557
  return wuffs_base__range_ii_u32__intersect(this, s);
2558
}
2559
2560
inline wuffs_base__range_ii_u32  //
2561
wuffs_base__range_ii_u32::unite(wuffs_base__range_ii_u32 s) const {
2562
  return wuffs_base__range_ii_u32__unite(this, s);
2563
}
2564
2565
inline bool  //
2566
wuffs_base__range_ii_u32::contains(uint32_t x) const {
2567
  return wuffs_base__range_ii_u32__contains(this, x);
2568
}
2569
2570
inline bool  //
2571
wuffs_base__range_ii_u32::contains_range(wuffs_base__range_ii_u32 s) const {
2572
  return wuffs_base__range_ii_u32__contains_range(this, s);
2573
}
2574
2575
#endif  // __cplusplus
2576
2577
// --------
2578
2579
typedef struct wuffs_base__range_ii_u64__struct {
2580
  uint64_t min_incl;
2581
  uint64_t max_incl;
2582
2583
#ifdef __cplusplus
2584
  inline bool is_empty() const;
2585
  inline bool equals(wuffs_base__range_ii_u64__struct s) const;
2586
  inline wuffs_base__range_ii_u64__struct intersect(
2587
      wuffs_base__range_ii_u64__struct s) const;
2588
  inline wuffs_base__range_ii_u64__struct unite(
2589
      wuffs_base__range_ii_u64__struct s) const;
2590
  inline bool contains(uint64_t x) const;
2591
  inline bool contains_range(wuffs_base__range_ii_u64__struct s) const;
2592
#endif  // __cplusplus
2593
2594
} wuffs_base__range_ii_u64;
2595
2596
static inline wuffs_base__range_ii_u64  //
2597
0
wuffs_base__empty_range_ii_u64(void) {
2598
0
  wuffs_base__range_ii_u64 ret;
2599
0
  ret.min_incl = 0;
2600
0
  ret.max_incl = 0;
2601
0
  return ret;
2602
0
}
2603
2604
static inline wuffs_base__range_ii_u64  //
2605
3.90k
wuffs_base__make_range_ii_u64(uint64_t min_incl, uint64_t max_incl) {
2606
3.90k
  wuffs_base__range_ii_u64 ret;
2607
3.90k
  ret.min_incl = min_incl;
2608
3.90k
  ret.max_incl = max_incl;
2609
3.90k
  return ret;
2610
3.90k
}
2611
2612
static inline bool  //
2613
0
wuffs_base__range_ii_u64__is_empty(const wuffs_base__range_ii_u64* r) {
2614
0
  return r->min_incl > r->max_incl;
2615
0
}
2616
2617
static inline bool  //
2618
wuffs_base__range_ii_u64__equals(const wuffs_base__range_ii_u64* r,
2619
0
                                 wuffs_base__range_ii_u64 s) {
2620
0
  return (r->min_incl == s.min_incl && r->max_incl == s.max_incl) ||
2621
0
         (wuffs_base__range_ii_u64__is_empty(r) &&
2622
0
          wuffs_base__range_ii_u64__is_empty(&s));
2623
0
}
2624
2625
static inline wuffs_base__range_ii_u64  //
2626
wuffs_base__range_ii_u64__intersect(const wuffs_base__range_ii_u64* r,
2627
0
                                    wuffs_base__range_ii_u64 s) {
2628
0
  wuffs_base__range_ii_u64 t;
2629
0
  t.min_incl = wuffs_base__u64__max(r->min_incl, s.min_incl);
2630
0
  t.max_incl = wuffs_base__u64__min(r->max_incl, s.max_incl);
2631
0
  return t;
2632
0
}
2633
2634
static inline wuffs_base__range_ii_u64  //
2635
wuffs_base__range_ii_u64__unite(const wuffs_base__range_ii_u64* r,
2636
0
                                wuffs_base__range_ii_u64 s) {
2637
0
  if (wuffs_base__range_ii_u64__is_empty(r)) {
2638
0
    return s;
2639
0
  }
2640
0
  if (wuffs_base__range_ii_u64__is_empty(&s)) {
2641
0
    return *r;
2642
0
  }
2643
0
  wuffs_base__range_ii_u64 t;
2644
0
  t.min_incl = wuffs_base__u64__min(r->min_incl, s.min_incl);
2645
0
  t.max_incl = wuffs_base__u64__max(r->max_incl, s.max_incl);
2646
0
  return t;
2647
0
}
2648
2649
static inline bool  //
2650
wuffs_base__range_ii_u64__contains(const wuffs_base__range_ii_u64* r,
2651
0
                                   uint64_t x) {
2652
0
  return (r->min_incl <= x) && (x <= r->max_incl);
2653
0
}
2654
2655
static inline bool  //
2656
wuffs_base__range_ii_u64__contains_range(const wuffs_base__range_ii_u64* r,
2657
0
                                         wuffs_base__range_ii_u64 s) {
2658
0
  return wuffs_base__range_ii_u64__equals(
2659
0
      &s, wuffs_base__range_ii_u64__intersect(r, s));
2660
0
}
2661
2662
#ifdef __cplusplus
2663
2664
inline bool  //
2665
wuffs_base__range_ii_u64::is_empty() const {
2666
  return wuffs_base__range_ii_u64__is_empty(this);
2667
}
2668
2669
inline bool  //
2670
wuffs_base__range_ii_u64::equals(wuffs_base__range_ii_u64 s) const {
2671
  return wuffs_base__range_ii_u64__equals(this, s);
2672
}
2673
2674
inline wuffs_base__range_ii_u64  //
2675
wuffs_base__range_ii_u64::intersect(wuffs_base__range_ii_u64 s) const {
2676
  return wuffs_base__range_ii_u64__intersect(this, s);
2677
}
2678
2679
inline wuffs_base__range_ii_u64  //
2680
wuffs_base__range_ii_u64::unite(wuffs_base__range_ii_u64 s) const {
2681
  return wuffs_base__range_ii_u64__unite(this, s);
2682
}
2683
2684
inline bool  //
2685
wuffs_base__range_ii_u64::contains(uint64_t x) const {
2686
  return wuffs_base__range_ii_u64__contains(this, x);
2687
}
2688
2689
inline bool  //
2690
wuffs_base__range_ii_u64::contains_range(wuffs_base__range_ii_u64 s) const {
2691
  return wuffs_base__range_ii_u64__contains_range(this, s);
2692
}
2693
2694
#endif  // __cplusplus
2695
2696
// --------
2697
2698
typedef struct wuffs_base__rect_ie_i32__struct {
2699
  int32_t min_incl_x;
2700
  int32_t min_incl_y;
2701
  int32_t max_excl_x;
2702
  int32_t max_excl_y;
2703
2704
#ifdef __cplusplus
2705
  inline bool is_empty() const;
2706
  inline bool equals(wuffs_base__rect_ie_i32__struct s) const;
2707
  inline wuffs_base__rect_ie_i32__struct intersect(
2708
      wuffs_base__rect_ie_i32__struct s) const;
2709
  inline wuffs_base__rect_ie_i32__struct unite(
2710
      wuffs_base__rect_ie_i32__struct s) const;
2711
  inline bool contains(int32_t x, int32_t y) const;
2712
  inline bool contains_rect(wuffs_base__rect_ie_i32__struct s) const;
2713
  inline uint32_t width() const;
2714
  inline uint32_t height() const;
2715
#endif  // __cplusplus
2716
2717
} wuffs_base__rect_ie_i32;
2718
2719
static inline wuffs_base__rect_ie_i32  //
2720
0
wuffs_base__empty_rect_ie_i32(void) {
2721
0
  wuffs_base__rect_ie_i32 ret;
2722
0
  ret.min_incl_x = 0;
2723
0
  ret.min_incl_y = 0;
2724
0
  ret.max_excl_x = 0;
2725
0
  ret.max_excl_y = 0;
2726
0
  return ret;
2727
0
}
2728
2729
static inline wuffs_base__rect_ie_i32  //
2730
wuffs_base__make_rect_ie_i32(int32_t min_incl_x,
2731
                             int32_t min_incl_y,
2732
                             int32_t max_excl_x,
2733
0
                             int32_t max_excl_y) {
2734
0
  wuffs_base__rect_ie_i32 ret;
2735
0
  ret.min_incl_x = min_incl_x;
2736
0
  ret.min_incl_y = min_incl_y;
2737
0
  ret.max_excl_x = max_excl_x;
2738
0
  ret.max_excl_y = max_excl_y;
2739
0
  return ret;
2740
0
}
2741
2742
static inline bool  //
2743
0
wuffs_base__rect_ie_i32__is_empty(const wuffs_base__rect_ie_i32* r) {
2744
0
  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
2745
0
}
2746
2747
static inline bool  //
2748
wuffs_base__rect_ie_i32__equals(const wuffs_base__rect_ie_i32* r,
2749
0
                                wuffs_base__rect_ie_i32 s) {
2750
0
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2751
0
          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
2752
0
         (wuffs_base__rect_ie_i32__is_empty(r) &&
2753
0
          wuffs_base__rect_ie_i32__is_empty(&s));
2754
0
}
2755
2756
static inline wuffs_base__rect_ie_i32  //
2757
wuffs_base__rect_ie_i32__intersect(const wuffs_base__rect_ie_i32* r,
2758
0
                                   wuffs_base__rect_ie_i32 s) {
2759
0
  wuffs_base__rect_ie_i32 t;
2760
0
  t.min_incl_x = wuffs_base__i32__max(r->min_incl_x, s.min_incl_x);
2761
0
  t.min_incl_y = wuffs_base__i32__max(r->min_incl_y, s.min_incl_y);
2762
0
  t.max_excl_x = wuffs_base__i32__min(r->max_excl_x, s.max_excl_x);
2763
0
  t.max_excl_y = wuffs_base__i32__min(r->max_excl_y, s.max_excl_y);
2764
0
  return t;
2765
0
}
2766
2767
static inline wuffs_base__rect_ie_i32  //
2768
wuffs_base__rect_ie_i32__unite(const wuffs_base__rect_ie_i32* r,
2769
0
                               wuffs_base__rect_ie_i32 s) {
2770
0
  if (wuffs_base__rect_ie_i32__is_empty(r)) {
2771
0
    return s;
2772
0
  }
2773
0
  if (wuffs_base__rect_ie_i32__is_empty(&s)) {
2774
0
    return *r;
2775
0
  }
2776
0
  wuffs_base__rect_ie_i32 t;
2777
0
  t.min_incl_x = wuffs_base__i32__min(r->min_incl_x, s.min_incl_x);
2778
0
  t.min_incl_y = wuffs_base__i32__min(r->min_incl_y, s.min_incl_y);
2779
0
  t.max_excl_x = wuffs_base__i32__max(r->max_excl_x, s.max_excl_x);
2780
0
  t.max_excl_y = wuffs_base__i32__max(r->max_excl_y, s.max_excl_y);
2781
0
  return t;
2782
0
}
2783
2784
static inline bool  //
2785
wuffs_base__rect_ie_i32__contains(const wuffs_base__rect_ie_i32* r,
2786
                                  int32_t x,
2787
0
                                  int32_t y) {
2788
0
  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
2789
0
         (y < r->max_excl_y);
2790
0
}
2791
2792
static inline bool  //
2793
wuffs_base__rect_ie_i32__contains_rect(const wuffs_base__rect_ie_i32* r,
2794
0
                                       wuffs_base__rect_ie_i32 s) {
2795
0
  return wuffs_base__rect_ie_i32__equals(
2796
0
      &s, wuffs_base__rect_ie_i32__intersect(r, s));
2797
0
}
2798
2799
static inline uint32_t  //
2800
0
wuffs_base__rect_ie_i32__width(const wuffs_base__rect_ie_i32* r) {
2801
0
  return (r->max_excl_x > r->min_incl_x)
2802
0
             ? (((uint32_t)(r->max_excl_x)) - ((uint32_t)(r->min_incl_x)))
2803
0
             : 0;
2804
0
}
2805
2806
static inline uint32_t  //
2807
0
wuffs_base__rect_ie_i32__height(const wuffs_base__rect_ie_i32* r) {
2808
0
  return (r->max_excl_y > r->min_incl_y)
2809
0
             ? (((uint32_t)(r->max_excl_y)) - ((uint32_t)(r->min_incl_y)))
2810
0
             : 0;
2811
0
}
2812
2813
#ifdef __cplusplus
2814
2815
inline bool  //
2816
wuffs_base__rect_ie_i32::is_empty() const {
2817
  return wuffs_base__rect_ie_i32__is_empty(this);
2818
}
2819
2820
inline bool  //
2821
wuffs_base__rect_ie_i32::equals(wuffs_base__rect_ie_i32 s) const {
2822
  return wuffs_base__rect_ie_i32__equals(this, s);
2823
}
2824
2825
inline wuffs_base__rect_ie_i32  //
2826
wuffs_base__rect_ie_i32::intersect(wuffs_base__rect_ie_i32 s) const {
2827
  return wuffs_base__rect_ie_i32__intersect(this, s);
2828
}
2829
2830
inline wuffs_base__rect_ie_i32  //
2831
wuffs_base__rect_ie_i32::unite(wuffs_base__rect_ie_i32 s) const {
2832
  return wuffs_base__rect_ie_i32__unite(this, s);
2833
}
2834
2835
inline bool  //
2836
wuffs_base__rect_ie_i32::contains(int32_t x, int32_t y) const {
2837
  return wuffs_base__rect_ie_i32__contains(this, x, y);
2838
}
2839
2840
inline bool  //
2841
wuffs_base__rect_ie_i32::contains_rect(wuffs_base__rect_ie_i32 s) const {
2842
  return wuffs_base__rect_ie_i32__contains_rect(this, s);
2843
}
2844
2845
inline uint32_t  //
2846
wuffs_base__rect_ie_i32::width() const {
2847
  return wuffs_base__rect_ie_i32__width(this);
2848
}
2849
2850
inline uint32_t  //
2851
wuffs_base__rect_ie_i32::height() const {
2852
  return wuffs_base__rect_ie_i32__height(this);
2853
}
2854
2855
#endif  // __cplusplus
2856
2857
// --------
2858
2859
typedef struct wuffs_base__rect_ie_u32__struct {
2860
  uint32_t min_incl_x;
2861
  uint32_t min_incl_y;
2862
  uint32_t max_excl_x;
2863
  uint32_t max_excl_y;
2864
2865
#ifdef __cplusplus
2866
  inline bool is_empty() const;
2867
  inline bool equals(wuffs_base__rect_ie_u32__struct s) const;
2868
  inline wuffs_base__rect_ie_u32__struct intersect(
2869
      wuffs_base__rect_ie_u32__struct s) const;
2870
  inline wuffs_base__rect_ie_u32__struct unite(
2871
      wuffs_base__rect_ie_u32__struct s) const;
2872
  inline bool contains(uint32_t x, uint32_t y) const;
2873
  inline bool contains_rect(wuffs_base__rect_ie_u32__struct s) const;
2874
  inline uint32_t width() const;
2875
  inline uint32_t height() const;
2876
#endif  // __cplusplus
2877
2878
} wuffs_base__rect_ie_u32;
2879
2880
static inline wuffs_base__rect_ie_u32  //
2881
0
wuffs_base__empty_rect_ie_u32(void) {
2882
0
  wuffs_base__rect_ie_u32 ret;
2883
0
  ret.min_incl_x = 0;
2884
0
  ret.min_incl_y = 0;
2885
0
  ret.max_excl_x = 0;
2886
0
  ret.max_excl_y = 0;
2887
0
  return ret;
2888
0
}
2889
2890
static inline wuffs_base__rect_ie_u32  //
2891
wuffs_base__make_rect_ie_u32(uint32_t min_incl_x,
2892
                             uint32_t min_incl_y,
2893
                             uint32_t max_excl_x,
2894
11.8k
                             uint32_t max_excl_y) {
2895
11.8k
  wuffs_base__rect_ie_u32 ret;
2896
11.8k
  ret.min_incl_x = min_incl_x;
2897
11.8k
  ret.min_incl_y = min_incl_y;
2898
11.8k
  ret.max_excl_x = max_excl_x;
2899
11.8k
  ret.max_excl_y = max_excl_y;
2900
11.8k
  return ret;
2901
11.8k
}
2902
2903
static inline bool  //
2904
0
wuffs_base__rect_ie_u32__is_empty(const wuffs_base__rect_ie_u32* r) {
2905
0
  return (r->min_incl_x >= r->max_excl_x) || (r->min_incl_y >= r->max_excl_y);
2906
0
}
2907
2908
static inline bool  //
2909
wuffs_base__rect_ie_u32__equals(const wuffs_base__rect_ie_u32* r,
2910
8.33k
                                wuffs_base__rect_ie_u32 s) {
2911
8.33k
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
2912
8.33k
          r->max_excl_x == s.max_excl_x && r->max_excl_y == s.max_excl_y) ||
2913
8.33k
         (wuffs_base__rect_ie_u32__is_empty(r) &&
2914
0
          wuffs_base__rect_ie_u32__is_empty(&s));
2915
8.33k
}
2916
2917
static inline wuffs_base__rect_ie_u32  //
2918
wuffs_base__rect_ie_u32__intersect(const wuffs_base__rect_ie_u32* r,
2919
5.92k
                                   wuffs_base__rect_ie_u32 s) {
2920
5.92k
  wuffs_base__rect_ie_u32 t;
2921
5.92k
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
2922
5.92k
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
2923
5.92k
  t.max_excl_x = wuffs_base__u32__min(r->max_excl_x, s.max_excl_x);
2924
5.92k
  t.max_excl_y = wuffs_base__u32__min(r->max_excl_y, s.max_excl_y);
2925
5.92k
  return t;
2926
5.92k
}
2927
2928
static inline wuffs_base__rect_ie_u32  //
2929
wuffs_base__rect_ie_u32__unite(const wuffs_base__rect_ie_u32* r,
2930
0
                               wuffs_base__rect_ie_u32 s) {
2931
0
  if (wuffs_base__rect_ie_u32__is_empty(r)) {
2932
0
    return s;
2933
0
  }
2934
0
  if (wuffs_base__rect_ie_u32__is_empty(&s)) {
2935
0
    return *r;
2936
0
  }
2937
0
  wuffs_base__rect_ie_u32 t;
2938
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
2939
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
2940
0
  t.max_excl_x = wuffs_base__u32__max(r->max_excl_x, s.max_excl_x);
2941
0
  t.max_excl_y = wuffs_base__u32__max(r->max_excl_y, s.max_excl_y);
2942
0
  return t;
2943
0
}
2944
2945
static inline bool  //
2946
wuffs_base__rect_ie_u32__contains(const wuffs_base__rect_ie_u32* r,
2947
                                  uint32_t x,
2948
0
                                  uint32_t y) {
2949
0
  return (r->min_incl_x <= x) && (x < r->max_excl_x) && (r->min_incl_y <= y) &&
2950
0
         (y < r->max_excl_y);
2951
0
}
2952
2953
static inline bool  //
2954
wuffs_base__rect_ie_u32__contains_rect(const wuffs_base__rect_ie_u32* r,
2955
5.92k
                                       wuffs_base__rect_ie_u32 s) {
2956
5.92k
  return wuffs_base__rect_ie_u32__equals(
2957
5.92k
      &s, wuffs_base__rect_ie_u32__intersect(r, s));
2958
5.92k
}
2959
2960
static inline uint32_t  //
2961
0
wuffs_base__rect_ie_u32__width(const wuffs_base__rect_ie_u32* r) {
2962
0
  return wuffs_base__u32__sat_sub(r->max_excl_x, r->min_incl_x);
2963
0
}
2964
2965
static inline uint32_t  //
2966
0
wuffs_base__rect_ie_u32__height(const wuffs_base__rect_ie_u32* r) {
2967
0
  return wuffs_base__u32__sat_sub(r->max_excl_y, r->min_incl_y);
2968
0
}
2969
2970
#ifdef __cplusplus
2971
2972
inline bool  //
2973
wuffs_base__rect_ie_u32::is_empty() const {
2974
  return wuffs_base__rect_ie_u32__is_empty(this);
2975
}
2976
2977
inline bool  //
2978
wuffs_base__rect_ie_u32::equals(wuffs_base__rect_ie_u32 s) const {
2979
  return wuffs_base__rect_ie_u32__equals(this, s);
2980
}
2981
2982
inline wuffs_base__rect_ie_u32  //
2983
wuffs_base__rect_ie_u32::intersect(wuffs_base__rect_ie_u32 s) const {
2984
  return wuffs_base__rect_ie_u32__intersect(this, s);
2985
}
2986
2987
inline wuffs_base__rect_ie_u32  //
2988
wuffs_base__rect_ie_u32::unite(wuffs_base__rect_ie_u32 s) const {
2989
  return wuffs_base__rect_ie_u32__unite(this, s);
2990
}
2991
2992
inline bool  //
2993
wuffs_base__rect_ie_u32::contains(uint32_t x, uint32_t y) const {
2994
  return wuffs_base__rect_ie_u32__contains(this, x, y);
2995
}
2996
2997
inline bool  //
2998
wuffs_base__rect_ie_u32::contains_rect(wuffs_base__rect_ie_u32 s) const {
2999
  return wuffs_base__rect_ie_u32__contains_rect(this, s);
3000
}
3001
3002
inline uint32_t  //
3003
wuffs_base__rect_ie_u32::width() const {
3004
  return wuffs_base__rect_ie_u32__width(this);
3005
}
3006
3007
inline uint32_t  //
3008
wuffs_base__rect_ie_u32::height() const {
3009
  return wuffs_base__rect_ie_u32__height(this);
3010
}
3011
3012
#endif  // __cplusplus
3013
3014
// --------
3015
3016
typedef struct wuffs_base__rect_ii_u32__struct {
3017
  uint32_t min_incl_x;
3018
  uint32_t min_incl_y;
3019
  uint32_t max_incl_x;
3020
  uint32_t max_incl_y;
3021
3022
#ifdef __cplusplus
3023
  inline bool is_empty() const;
3024
  inline bool equals(wuffs_base__rect_ii_u32__struct s) const;
3025
  inline wuffs_base__rect_ii_u32__struct intersect(
3026
      wuffs_base__rect_ii_u32__struct s) const;
3027
  inline wuffs_base__rect_ii_u32__struct unite(
3028
      wuffs_base__rect_ii_u32__struct s) const;
3029
  inline bool contains(uint32_t x, uint32_t y) const;
3030
  inline bool contains_rect(wuffs_base__rect_ii_u32__struct s) const;
3031
#endif  // __cplusplus
3032
3033
} wuffs_base__rect_ii_u32;
3034
3035
static inline wuffs_base__rect_ii_u32  //
3036
0
wuffs_base__empty_rect_ii_u32(void) {
3037
0
  wuffs_base__rect_ii_u32 ret;
3038
0
  ret.min_incl_x = 0;
3039
0
  ret.min_incl_y = 0;
3040
0
  ret.max_incl_x = 0;
3041
0
  ret.max_incl_y = 0;
3042
0
  return ret;
3043
0
}
3044
3045
static inline wuffs_base__rect_ii_u32  //
3046
wuffs_base__make_rect_ii_u32(uint32_t min_incl_x,
3047
                             uint32_t min_incl_y,
3048
                             uint32_t max_incl_x,
3049
0
                             uint32_t max_incl_y) {
3050
0
  wuffs_base__rect_ii_u32 ret;
3051
0
  ret.min_incl_x = min_incl_x;
3052
0
  ret.min_incl_y = min_incl_y;
3053
0
  ret.max_incl_x = max_incl_x;
3054
0
  ret.max_incl_y = max_incl_y;
3055
0
  return ret;
3056
0
}
3057
3058
static inline bool  //
3059
0
wuffs_base__rect_ii_u32__is_empty(const wuffs_base__rect_ii_u32* r) {
3060
0
  return (r->min_incl_x > r->max_incl_x) || (r->min_incl_y > r->max_incl_y);
3061
0
}
3062
3063
static inline bool  //
3064
wuffs_base__rect_ii_u32__equals(const wuffs_base__rect_ii_u32* r,
3065
0
                                wuffs_base__rect_ii_u32 s) {
3066
0
  return (r->min_incl_x == s.min_incl_x && r->min_incl_y == s.min_incl_y &&
3067
0
          r->max_incl_x == s.max_incl_x && r->max_incl_y == s.max_incl_y) ||
3068
0
         (wuffs_base__rect_ii_u32__is_empty(r) &&
3069
0
          wuffs_base__rect_ii_u32__is_empty(&s));
3070
0
}
3071
3072
static inline wuffs_base__rect_ii_u32  //
3073
wuffs_base__rect_ii_u32__intersect(const wuffs_base__rect_ii_u32* r,
3074
0
                                   wuffs_base__rect_ii_u32 s) {
3075
0
  wuffs_base__rect_ii_u32 t;
3076
0
  t.min_incl_x = wuffs_base__u32__max(r->min_incl_x, s.min_incl_x);
3077
0
  t.min_incl_y = wuffs_base__u32__max(r->min_incl_y, s.min_incl_y);
3078
0
  t.max_incl_x = wuffs_base__u32__min(r->max_incl_x, s.max_incl_x);
3079
0
  t.max_incl_y = wuffs_base__u32__min(r->max_incl_y, s.max_incl_y);
3080
0
  return t;
3081
0
}
3082
3083
static inline wuffs_base__rect_ii_u32  //
3084
wuffs_base__rect_ii_u32__unite(const wuffs_base__rect_ii_u32* r,
3085
0
                               wuffs_base__rect_ii_u32 s) {
3086
0
  if (wuffs_base__rect_ii_u32__is_empty(r)) {
3087
0
    return s;
3088
0
  }
3089
0
  if (wuffs_base__rect_ii_u32__is_empty(&s)) {
3090
0
    return *r;
3091
0
  }
3092
0
  wuffs_base__rect_ii_u32 t;
3093
0
  t.min_incl_x = wuffs_base__u32__min(r->min_incl_x, s.min_incl_x);
3094
0
  t.min_incl_y = wuffs_base__u32__min(r->min_incl_y, s.min_incl_y);
3095
0
  t.max_incl_x = wuffs_base__u32__max(r->max_incl_x, s.max_incl_x);
3096
0
  t.max_incl_y = wuffs_base__u32__max(r->max_incl_y, s.max_incl_y);
3097
0
  return t;
3098
0
}
3099
3100
static inline bool  //
3101
wuffs_base__rect_ii_u32__contains(const wuffs_base__rect_ii_u32* r,
3102
                                  uint32_t x,
3103
0
                                  uint32_t y) {
3104
0
  return (r->min_incl_x <= x) && (x <= r->max_incl_x) && (r->min_incl_y <= y) &&
3105
0
         (y <= r->max_incl_y);
3106
0
}
3107
3108
static inline bool  //
3109
wuffs_base__rect_ii_u32__contains_rect(const wuffs_base__rect_ii_u32* r,
3110
0
                                       wuffs_base__rect_ii_u32 s) {
3111
0
  return wuffs_base__rect_ii_u32__equals(
3112
0
      &s, wuffs_base__rect_ii_u32__intersect(r, s));
3113
0
}
3114
3115
#ifdef __cplusplus
3116
3117
inline bool  //
3118
wuffs_base__rect_ii_u32::is_empty() const {
3119
  return wuffs_base__rect_ii_u32__is_empty(this);
3120
}
3121
3122
inline bool  //
3123
wuffs_base__rect_ii_u32::equals(wuffs_base__rect_ii_u32 s) const {
3124
  return wuffs_base__rect_ii_u32__equals(this, s);
3125
}
3126
3127
inline wuffs_base__rect_ii_u32  //
3128
wuffs_base__rect_ii_u32::intersect(wuffs_base__rect_ii_u32 s) const {
3129
  return wuffs_base__rect_ii_u32__intersect(this, s);
3130
}
3131
3132
inline wuffs_base__rect_ii_u32  //
3133
wuffs_base__rect_ii_u32::unite(wuffs_base__rect_ii_u32 s) const {
3134
  return wuffs_base__rect_ii_u32__unite(this, s);
3135
}
3136
3137
inline bool  //
3138
wuffs_base__rect_ii_u32::contains(uint32_t x, uint32_t y) const {
3139
  return wuffs_base__rect_ii_u32__contains(this, x, y);
3140
}
3141
3142
inline bool  //
3143
wuffs_base__rect_ii_u32::contains_rect(wuffs_base__rect_ii_u32 s) const {
3144
  return wuffs_base__rect_ii_u32__contains_rect(this, s);
3145
}
3146
3147
#endif  // __cplusplus
3148
3149
// ---------------- More Information
3150
3151
// wuffs_base__more_information holds additional fields, typically when a Wuffs
3152
// method returns a [note status](/doc/note/statuses.md).
3153
//
3154
// The flavor field follows the base38 namespace
3155
// convention](/doc/note/base38-and-fourcc.md). The other fields' semantics
3156
// depends on the flavor.
3157
typedef struct wuffs_base__more_information__struct {
3158
  uint32_t flavor;
3159
  uint32_t w;
3160
  uint64_t x;
3161
  uint64_t y;
3162
  uint64_t z;
3163
3164
#ifdef __cplusplus
3165
  inline void set(uint32_t flavor_arg,
3166
                  uint32_t w_arg,
3167
                  uint64_t x_arg,
3168
                  uint64_t y_arg,
3169
                  uint64_t z_arg);
3170
  inline uint32_t io_redirect__fourcc() const;
3171
  inline wuffs_base__range_ie_u64 io_redirect__range() const;
3172
  inline uint64_t io_seek__position() const;
3173
  inline uint32_t metadata__fourcc() const;
3174
  inline wuffs_base__range_ie_u64 metadata_raw_passthrough__range() const;
3175
  inline int32_t metadata_parsed__chrm(uint32_t component) const;
3176
  inline uint32_t metadata_parsed__gama() const;
3177
  inline uint32_t metadata_parsed__srgb() const;
3178
#endif  // __cplusplus
3179
3180
} wuffs_base__more_information;
3181
3182
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT 1
3183
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_SEEK 2
3184
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH 3
3185
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM 4
3186
#define WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED 5
3187
3188
static inline wuffs_base__more_information  //
3189
0
wuffs_base__empty_more_information(void) {
3190
0
  wuffs_base__more_information ret;
3191
0
  ret.flavor = 0;
3192
0
  ret.w = 0;
3193
0
  ret.x = 0;
3194
0
  ret.y = 0;
3195
0
  ret.z = 0;
3196
0
  return ret;
3197
0
}
3198
3199
static inline void  //
3200
wuffs_base__more_information__set(wuffs_base__more_information* m,
3201
                                  uint32_t flavor,
3202
                                  uint32_t w,
3203
                                  uint64_t x,
3204
                                  uint64_t y,
3205
0
                                  uint64_t z) {
3206
0
  if (!m) {
3207
0
    return;
3208
0
  }
3209
0
  m->flavor = flavor;
3210
0
  m->w = w;
3211
0
  m->x = x;
3212
0
  m->y = y;
3213
0
  m->z = z;
3214
0
}
3215
3216
static inline uint32_t  //
3217
wuffs_base__more_information__io_redirect__fourcc(
3218
0
    const wuffs_base__more_information* m) {
3219
0
  return m->w;
3220
0
}
3221
3222
static inline wuffs_base__range_ie_u64  //
3223
wuffs_base__more_information__io_redirect__range(
3224
0
    const wuffs_base__more_information* m) {
3225
0
  wuffs_base__range_ie_u64 ret;
3226
0
  ret.min_incl = m->y;
3227
0
  ret.max_excl = m->z;
3228
0
  return ret;
3229
0
}
3230
3231
static inline uint64_t  //
3232
wuffs_base__more_information__io_seek__position(
3233
0
    const wuffs_base__more_information* m) {
3234
0
  return m->x;
3235
0
}
3236
3237
static inline uint32_t  //
3238
wuffs_base__more_information__metadata__fourcc(
3239
0
    const wuffs_base__more_information* m) {
3240
0
  return m->w;
3241
0
}
3242
3243
static inline wuffs_base__range_ie_u64  //
3244
wuffs_base__more_information__metadata_raw_passthrough__range(
3245
0
    const wuffs_base__more_information* m) {
3246
0
  wuffs_base__range_ie_u64 ret;
3247
0
  ret.min_incl = m->y;
3248
0
  ret.max_excl = m->z;
3249
0
  return ret;
3250
0
}
3251
3252
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_X 0
3253
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__WHITE_Y 1
3254
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_X 2
3255
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__RED_Y 3
3256
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_X 4
3257
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__GREEN_Y 5
3258
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_X 6
3259
#define WUFFS_BASE__MORE_INFORMATION__METADATA_PARSED__CHRM__BLUE_Y 7
3260
3261
// wuffs_base__more_information__metadata_parsed__chrm returns chromaticity
3262
// values (scaled by 100000) like the PNG "cHRM" chunk. For example, the sRGB
3263
// color space corresponds to:
3264
//  - ETC__CHRM__WHITE_X 31270
3265
//  - ETC__CHRM__WHITE_Y 32900
3266
//  - ETC__CHRM__RED_X   64000
3267
//  - ETC__CHRM__RED_Y   33000
3268
//  - ETC__CHRM__GREEN_X 30000
3269
//  - ETC__CHRM__GREEN_Y 60000
3270
//  - ETC__CHRM__BLUE_X  15000
3271
//  - ETC__CHRM__BLUE_Y   6000
3272
//
3273
// See
3274
// https://ciechanow.ski/color-spaces/#chromaticity-and-white-point-coordinates
3275
static inline int32_t  //
3276
wuffs_base__more_information__metadata_parsed__chrm(
3277
    const wuffs_base__more_information* m,
3278
0
    uint32_t component) {
3279
0
  // After the flavor and the w field (holding a FourCC), a
3280
0
  // wuffs_base__more_information holds 24 bytes of data in three uint64_t
3281
0
  // typed fields (x, y and z). We pack the eight chromaticity values (wx, wy,
3282
0
  // rx, ..., by), basically int24_t values, into 24 bytes like this:
3283
0
  //  -    LSB                 MSB
3284
0
  //  - x: wx wx wx wy wy wy rx rx
3285
0
  //  - y: rx ry ry ry gx gx gx gy
3286
0
  //  - z: gy gy bx bx bx by by by
3287
0
  uint32_t u = 0;
3288
0
  switch (component & 7) {
3289
0
    case 0:
3290
0
      u = ((uint32_t)(m->x >> 0));
3291
0
      break;
3292
0
    case 1:
3293
0
      u = ((uint32_t)(m->x >> 24));
3294
0
      break;
3295
0
    case 2:
3296
0
      u = ((uint32_t)((m->x >> 48) | (m->y << 16)));
3297
0
      break;
3298
0
    case 3:
3299
0
      u = ((uint32_t)(m->y >> 8));
3300
0
      break;
3301
0
    case 4:
3302
0
      u = ((uint32_t)(m->y >> 32));
3303
0
      break;
3304
0
    case 5:
3305
0
      u = ((uint32_t)((m->y >> 56) | (m->z << 8)));
3306
0
      break;
3307
0
    case 6:
3308
0
      u = ((uint32_t)(m->z >> 16));
3309
0
      break;
3310
0
    case 7:
3311
0
      u = ((uint32_t)(m->z >> 40));
3312
0
      break;
3313
0
  }
3314
0
  // The left-right shifts sign-extend from 24-bit to 32-bit integers.
3315
0
  return ((int32_t)(u << 8)) >> 8;
3316
0
}
3317
3318
// wuffs_base__more_information__metadata_parsed__gama returns inverse gamma
3319
// correction values (scaled by 100000) like the PNG "gAMA" chunk. For example,
3320
// for gamma = 2.2, this returns 45455 (approximating 100000 / 2.2).
3321
static inline uint32_t  //
3322
wuffs_base__more_information__metadata_parsed__gama(
3323
0
    const wuffs_base__more_information* m) {
3324
0
  return ((uint32_t)(m->x));
3325
0
}
3326
3327
#define WUFFS_BASE__SRGB_RENDERING_INTENT__PERCEPTUAL 0
3328
#define WUFFS_BASE__SRGB_RENDERING_INTENT__RELATIVE_COLORIMETRIC 1
3329
#define WUFFS_BASE__SRGB_RENDERING_INTENT__SATURATION 2
3330
#define WUFFS_BASE__SRGB_RENDERING_INTENT__ABSOLUTE_COLORIMETRIC 3
3331
3332
// wuffs_base__more_information__metadata_parsed__srgb returns the sRGB
3333
// rendering intent like the PNG "sRGB" chunk.
3334
static inline uint32_t  //
3335
wuffs_base__more_information__metadata_parsed__srgb(
3336
0
    const wuffs_base__more_information* m) {
3337
0
  return m->x & 3;
3338
0
}
3339
3340
#ifdef __cplusplus
3341
3342
inline void  //
3343
wuffs_base__more_information::set(uint32_t flavor_arg,
3344
                                  uint32_t w_arg,
3345
                                  uint64_t x_arg,
3346
                                  uint64_t y_arg,
3347
                                  uint64_t z_arg) {
3348
  wuffs_base__more_information__set(this, flavor_arg, w_arg, x_arg, y_arg,
3349
                                    z_arg);
3350
}
3351
3352
inline uint32_t  //
3353
wuffs_base__more_information::io_redirect__fourcc() const {
3354
  return wuffs_base__more_information__io_redirect__fourcc(this);
3355
}
3356
3357
inline wuffs_base__range_ie_u64  //
3358
wuffs_base__more_information::io_redirect__range() const {
3359
  return wuffs_base__more_information__io_redirect__range(this);
3360
}
3361
3362
inline uint64_t  //
3363
wuffs_base__more_information::io_seek__position() const {
3364
  return wuffs_base__more_information__io_seek__position(this);
3365
}
3366
3367
inline uint32_t  //
3368
wuffs_base__more_information::metadata__fourcc() const {
3369
  return wuffs_base__more_information__metadata__fourcc(this);
3370
}
3371
3372
inline wuffs_base__range_ie_u64  //
3373
wuffs_base__more_information::metadata_raw_passthrough__range() const {
3374
  return wuffs_base__more_information__metadata_raw_passthrough__range(this);
3375
}
3376
3377
inline int32_t  //
3378
wuffs_base__more_information::metadata_parsed__chrm(uint32_t component) const {
3379
  return wuffs_base__more_information__metadata_parsed__chrm(this, component);
3380
}
3381
3382
inline uint32_t  //
3383
wuffs_base__more_information::metadata_parsed__gama() const {
3384
  return wuffs_base__more_information__metadata_parsed__gama(this);
3385
}
3386
3387
inline uint32_t  //
3388
wuffs_base__more_information::metadata_parsed__srgb() const {
3389
  return wuffs_base__more_information__metadata_parsed__srgb(this);
3390
}
3391
3392
#endif  // __cplusplus
3393
3394
// ---------------- I/O
3395
//
3396
// See (/doc/note/io-input-output.md).
3397
3398
// wuffs_base__io_buffer_meta is the metadata for a wuffs_base__io_buffer's
3399
// data.
3400
typedef struct wuffs_base__io_buffer_meta__struct {
3401
  size_t wi;     // Write index. Invariant: wi <= len.
3402
  size_t ri;     // Read  index. Invariant: ri <= wi.
3403
  uint64_t pos;  // Buffer position (relative to the start of stream).
3404
  bool closed;   // No further writes are expected.
3405
} wuffs_base__io_buffer_meta;
3406
3407
// wuffs_base__io_buffer is a 1-dimensional buffer (a pointer and length) plus
3408
// additional metadata.
3409
//
3410
// A value with all fields zero is a valid, empty buffer.
3411
typedef struct wuffs_base__io_buffer__struct {
3412
  wuffs_base__slice_u8 data;
3413
  wuffs_base__io_buffer_meta meta;
3414
3415
#ifdef __cplusplus
3416
  inline bool is_valid() const;
3417
  inline size_t compact();
3418
  inline size_t compact_retaining(uint64_t history_retain_length);
3419
  inline size_t reader_length() const;
3420
  inline uint8_t* reader_pointer() const;
3421
  inline uint64_t reader_position() const;
3422
  inline wuffs_base__slice_u8 reader_slice() const;
3423
  inline size_t writer_length() const;
3424
  inline uint8_t* writer_pointer() const;
3425
  inline uint64_t writer_position() const;
3426
  inline wuffs_base__slice_u8 writer_slice() const;
3427
#endif  // __cplusplus
3428
3429
} wuffs_base__io_buffer;
3430
3431
static inline wuffs_base__io_buffer  //
3432
wuffs_base__make_io_buffer(wuffs_base__slice_u8 data,
3433
0
                           wuffs_base__io_buffer_meta meta) {
3434
0
  wuffs_base__io_buffer ret;
3435
0
  ret.data = data;
3436
0
  ret.meta = meta;
3437
0
  return ret;
3438
0
}
3439
3440
static inline wuffs_base__io_buffer_meta  //
3441
wuffs_base__make_io_buffer_meta(size_t wi,
3442
                                size_t ri,
3443
                                uint64_t pos,
3444
0
                                bool closed) {
3445
0
  wuffs_base__io_buffer_meta ret;
3446
0
  ret.wi = wi;
3447
0
  ret.ri = ri;
3448
0
  ret.pos = pos;
3449
0
  ret.closed = closed;
3450
0
  return ret;
3451
0
}
3452
3453
static inline wuffs_base__io_buffer  //
3454
5.56k
wuffs_base__ptr_u8__reader(uint8_t* ptr, size_t len, bool closed) {
3455
5.56k
  wuffs_base__io_buffer ret;
3456
5.56k
  ret.data.ptr = ptr;
3457
5.56k
  ret.data.len = len;
3458
5.56k
  ret.meta.wi = len;
3459
5.56k
  ret.meta.ri = 0;
3460
5.56k
  ret.meta.pos = 0;
3461
5.56k
  ret.meta.closed = closed;
3462
5.56k
  return ret;
3463
5.56k
}
3464
3465
static inline wuffs_base__io_buffer  //
3466
0
wuffs_base__ptr_u8__writer(uint8_t* ptr, size_t len) {
3467
0
  wuffs_base__io_buffer ret;
3468
0
  ret.data.ptr = ptr;
3469
0
  ret.data.len = len;
3470
0
  ret.meta.wi = 0;
3471
0
  ret.meta.ri = 0;
3472
0
  ret.meta.pos = 0;
3473
0
  ret.meta.closed = false;
3474
0
  return ret;
3475
0
}
3476
3477
static inline wuffs_base__io_buffer  //
3478
0
wuffs_base__slice_u8__reader(wuffs_base__slice_u8 s, bool closed) {
3479
0
  wuffs_base__io_buffer ret;
3480
0
  ret.data.ptr = s.ptr;
3481
0
  ret.data.len = s.len;
3482
0
  ret.meta.wi = s.len;
3483
0
  ret.meta.ri = 0;
3484
0
  ret.meta.pos = 0;
3485
0
  ret.meta.closed = closed;
3486
0
  return ret;
3487
0
}
3488
3489
static inline wuffs_base__io_buffer  //
3490
0
wuffs_base__slice_u8__writer(wuffs_base__slice_u8 s) {
3491
0
  wuffs_base__io_buffer ret;
3492
0
  ret.data.ptr = s.ptr;
3493
0
  ret.data.len = s.len;
3494
0
  ret.meta.wi = 0;
3495
0
  ret.meta.ri = 0;
3496
0
  ret.meta.pos = 0;
3497
0
  ret.meta.closed = false;
3498
0
  return ret;
3499
0
}
3500
3501
static inline wuffs_base__io_buffer  //
3502
9.77k
wuffs_base__empty_io_buffer(void) {
3503
9.77k
  wuffs_base__io_buffer ret;
3504
9.77k
  ret.data.ptr = NULL;
3505
9.77k
  ret.data.len = 0;
3506
9.77k
  ret.meta.wi = 0;
3507
9.77k
  ret.meta.ri = 0;
3508
9.77k
  ret.meta.pos = 0;
3509
9.77k
  ret.meta.closed = false;
3510
9.77k
  return ret;
3511
9.77k
}
3512
3513
static inline wuffs_base__io_buffer_meta  //
3514
0
wuffs_base__empty_io_buffer_meta(void) {
3515
0
  wuffs_base__io_buffer_meta ret;
3516
0
  ret.wi = 0;
3517
0
  ret.ri = 0;
3518
0
  ret.pos = 0;
3519
0
  ret.closed = false;
3520
0
  return ret;
3521
0
}
3522
3523
static inline bool  //
3524
0
wuffs_base__io_buffer__is_valid(const wuffs_base__io_buffer* buf) {
3525
0
  if (buf) {
3526
0
    if (buf->data.ptr) {
3527
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
3528
0
    } else {
3529
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
3530
0
    }
3531
0
  }
3532
0
  return false;
3533
0
}
3534
3535
// wuffs_base__io_buffer__compact moves any written but unread bytes to the
3536
// start of the buffer.
3537
//
3538
// It returns the increase in the writer length: how much meta.wi fell by.
3539
static inline size_t  //
3540
0
wuffs_base__io_buffer__compact(wuffs_base__io_buffer* buf) {
3541
0
  if (!buf || (buf->meta.ri == 0)) {
3542
0
    return 0;
3543
0
  }
3544
0
  size_t old_ri = buf->meta.ri;
3545
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
3546
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
3547
0
  if (new_wi != 0) {
3548
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri, new_wi);
3549
0
  }
3550
0
  buf->meta.wi = new_wi;
3551
0
  buf->meta.ri = 0;
3552
0
  return old_ri;
3553
0
}
3554
3555
// wuffs_base__io_buffer__compact_retaining moves any written but unread bytes
3556
// closer to the start of the buffer. It retains H bytes of history (the most
3557
// recently read bytes), where H is min(buf->meta.ri, history_retain_length).
3558
// It is therefore a no-op if history_retain_length is UINT64_MAX. A
3559
// postcondition is that buf->meta.ri == H.
3560
//
3561
// It returns the increase in the writer length: how much meta.wi fell by.
3562
//
3563
// wuffs_base__io_buffer__compact_retaining(0) is equivalent to
3564
// wuffs_base__io_buffer__compact().
3565
//
3566
// For example, if buf started like this:
3567
//
3568
//        +--- ri = 3
3569
//        v
3570
//     abcdefgh??    len = 10, pos = 900
3571
//             ^
3572
//             +--- wi = 8
3573
//
3574
// Then, depending on history_retain_length, the resultant buf would be:
3575
//
3576
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
3577
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
3578
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
3579
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3580
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
3581
static inline size_t  //
3582
wuffs_base__io_buffer__compact_retaining(wuffs_base__io_buffer* buf,
3583
0
                                         uint64_t history_retain_length) {
3584
0
  if (!buf || (buf->meta.ri == 0)) {
3585
0
    return 0;
3586
0
  }
3587
0
  size_t old_ri = buf->meta.ri;
3588
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
3589
0
  size_t memmove_start = old_ri - new_ri;
3590
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
3591
0
  size_t new_wi = buf->meta.wi - memmove_start;
3592
0
  if ((new_wi != 0) && (memmove_start != 0)) {
3593
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start, new_wi);
3594
0
  }
3595
0
  buf->meta.wi = new_wi;
3596
0
  buf->meta.ri = new_ri;
3597
0
  return memmove_start;
3598
0
}
3599
3600
static inline size_t  //
3601
0
wuffs_base__io_buffer__reader_length(const wuffs_base__io_buffer* buf) {
3602
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
3603
0
}
3604
3605
static inline uint8_t*  //
3606
0
wuffs_base__io_buffer__reader_pointer(const wuffs_base__io_buffer* buf) {
3607
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.ri) : NULL;
3608
0
}
3609
3610
static inline uint64_t  //
3611
0
wuffs_base__io_buffer__reader_position(const wuffs_base__io_buffer* buf) {
3612
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
3613
0
}
3614
3615
static inline wuffs_base__slice_u8  //
3616
0
wuffs_base__io_buffer__reader_slice(const wuffs_base__io_buffer* buf) {
3617
0
  return (buf && buf->data.ptr)
3618
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.ri,
3619
0
                                         buf->meta.wi - buf->meta.ri)
3620
0
             : wuffs_base__empty_slice_u8();
3621
0
}
3622
3623
static inline size_t  //
3624
0
wuffs_base__io_buffer__writer_length(const wuffs_base__io_buffer* buf) {
3625
0
  return buf ? buf->data.len - buf->meta.wi : 0;
3626
0
}
3627
3628
static inline uint8_t*  //
3629
0
wuffs_base__io_buffer__writer_pointer(const wuffs_base__io_buffer* buf) {
3630
0
  return (buf && buf->data.ptr) ? (buf->data.ptr + buf->meta.wi) : NULL;
3631
0
}
3632
3633
static inline uint64_t  //
3634
0
wuffs_base__io_buffer__writer_position(const wuffs_base__io_buffer* buf) {
3635
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
3636
0
}
3637
3638
static inline wuffs_base__slice_u8  //
3639
0
wuffs_base__io_buffer__writer_slice(const wuffs_base__io_buffer* buf) {
3640
0
  return (buf && buf->data.ptr)
3641
0
             ? wuffs_base__make_slice_u8(buf->data.ptr + buf->meta.wi,
3642
0
                                         buf->data.len - buf->meta.wi)
3643
0
             : wuffs_base__empty_slice_u8();
3644
0
}
3645
3646
#ifdef __cplusplus
3647
3648
inline bool  //
3649
wuffs_base__io_buffer::is_valid() const {
3650
  return wuffs_base__io_buffer__is_valid(this);
3651
}
3652
3653
inline size_t  //
3654
wuffs_base__io_buffer::compact() {
3655
  return wuffs_base__io_buffer__compact(this);
3656
}
3657
3658
inline size_t  //
3659
wuffs_base__io_buffer::compact_retaining(uint64_t history_retain_length) {
3660
  return wuffs_base__io_buffer__compact_retaining(this, history_retain_length);
3661
}
3662
3663
inline size_t  //
3664
wuffs_base__io_buffer::reader_length() const {
3665
  return wuffs_base__io_buffer__reader_length(this);
3666
}
3667
3668
inline uint8_t*  //
3669
wuffs_base__io_buffer::reader_pointer() const {
3670
  return wuffs_base__io_buffer__reader_pointer(this);
3671
}
3672
3673
inline uint64_t  //
3674
wuffs_base__io_buffer::reader_position() const {
3675
  return wuffs_base__io_buffer__reader_position(this);
3676
}
3677
3678
inline wuffs_base__slice_u8  //
3679
wuffs_base__io_buffer::reader_slice() const {
3680
  return wuffs_base__io_buffer__reader_slice(this);
3681
}
3682
3683
inline size_t  //
3684
wuffs_base__io_buffer::writer_length() const {
3685
  return wuffs_base__io_buffer__writer_length(this);
3686
}
3687
3688
inline uint8_t*  //
3689
wuffs_base__io_buffer::writer_pointer() const {
3690
  return wuffs_base__io_buffer__writer_pointer(this);
3691
}
3692
3693
inline uint64_t  //
3694
wuffs_base__io_buffer::writer_position() const {
3695
  return wuffs_base__io_buffer__writer_position(this);
3696
}
3697
3698
inline wuffs_base__slice_u8  //
3699
wuffs_base__io_buffer::writer_slice() const {
3700
  return wuffs_base__io_buffer__writer_slice(this);
3701
}
3702
3703
#endif  // __cplusplus
3704
3705
// ---------------- Tokens
3706
3707
// wuffs_base__token is an element of a byte stream's tokenization.
3708
//
3709
// See https://github.com/google/wuffs/blob/main/doc/note/tokens.md
3710
typedef struct wuffs_base__token__struct {
3711
  uint64_t repr;
3712
3713
#ifdef __cplusplus
3714
  inline int64_t value() const;
3715
  inline int64_t value_extension() const;
3716
  inline int64_t value_major() const;
3717
  inline int64_t value_base_category() const;
3718
  inline uint64_t value_minor() const;
3719
  inline uint64_t value_base_detail() const;
3720
  inline int64_t value_base_detail__sign_extended() const;
3721
  inline bool continued() const;
3722
  inline uint64_t length() const;
3723
#endif  // __cplusplus
3724
3725
} wuffs_base__token;
3726
3727
static inline wuffs_base__token  //
3728
0
wuffs_base__make_token(uint64_t repr) {
3729
0
  wuffs_base__token ret;
3730
0
  ret.repr = repr;
3731
0
  return ret;
3732
0
}
3733
3734
// --------
3735
3736
// clang-format off
3737
3738
// --------
3739
3740
#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF
3741
3742
#define WUFFS_BASE__TOKEN__VALUE__SHIFT               17
3743
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT     17
3744
#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT         42
3745
#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT         17
3746
#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 38
3747
#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT   17
3748
#define WUFFS_BASE__TOKEN__CONTINUED__SHIFT           16
3749
#define WUFFS_BASE__TOKEN__LENGTH__SHIFT               0
3750
3751
#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS  46
3752
3753
// --------
3754
3755
#define WUFFS_BASE__TOKEN__VBC__FILLER                  0
3756
#define WUFFS_BASE__TOKEN__VBC__STRUCTURE               1
3757
#define WUFFS_BASE__TOKEN__VBC__STRING                  2
3758
#define WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT      3
3759
#define WUFFS_BASE__TOKEN__VBC__LITERAL                 4
3760
#define WUFFS_BASE__TOKEN__VBC__NUMBER                  5
3761
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED   6
3762
#define WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED 7
3763
3764
// --------
3765
3766
#define WUFFS_BASE__TOKEN__VBD__FILLER__PUNCTUATION   0x00001
3767
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_BLOCK 0x00002
3768
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_LINE  0x00004
3769
3770
// COMMENT_ANY is a bit-wise or of COMMENT_BLOCK AND COMMENT_LINE.
3771
#define WUFFS_BASE__TOKEN__VBD__FILLER__COMMENT_ANY   0x00006
3772
3773
// --------
3774
3775
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH      0x00001
3776
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP       0x00002
3777
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010
3778
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020
3779
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040
3780
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE   0x01000
3781
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST   0x02000
3782
#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT   0x04000
3783
3784
// --------
3785
3786
// DEFINITELY_FOO means that the destination bytes (and also the source bytes,
3787
// for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that the lack
3788
// of the bit means "maybe FOO". It does not necessarily mean "not FOO".
3789
//
3790
// CHAIN_ETC means that decoding the entire token chain forms a UTF-8 or ASCII
3791
// string, not just this current token. CHAIN_ETC_UTF_8 therefore distinguishes
3792
// Unicode (UTF-8) strings from byte strings. MUST means that the the token
3793
// producer (e.g. parser) must verify this. SHOULD means that the token
3794
// consumer (e.g. renderer) should verify this.
3795
//
3796
// When a CHAIN_ETC_UTF_8 bit is set, the parser must ensure that non-ASCII
3797
// code points (with multi-byte UTF-8 encodings) do not straddle token
3798
// boundaries. Checking UTF-8 validity can inspect each token separately.
3799
//
3800
// The lack of any particular bit is conservative: it is valid for all-ASCII
3801
// strings, in a single- or multi-token chain, to have none of these bits set.
3802
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8      0x00001
3803
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8   0x00002
3804
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_UTF_8 0x00004
3805
#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII      0x00010
3806
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_ASCII   0x00020
3807
#define WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_SHOULD_BE_ASCII 0x00040
3808
3809
// CONVERT_D_DST_S_SRC means that multiples of S source bytes (possibly padded)
3810
// produces multiples of D destination bytes. For example,
3811
// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
3812
// 12 src bytes encode 3 dst bytes.
3813
//
3814
// Post-processing may further transform those D destination bytes (e.g. treat
3815
// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
3816
// is out of scope of this VBD's semantics.
3817
//
3818
// When src is the empty string, multiple conversion algorithms are applicable
3819
// (so these bits are not necessarily mutually exclusive), all producing the
3820
// same empty dst string.
3821
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP        0x00100
3822
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY        0x00200
3823
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00400
3824
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00800
3825
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x01000
3826
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x02000
3827
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85    0x04000
3828
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_HEX 0x08000
3829
#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_5_DST_8_SRC_BASE_32_STD 0x10000
3830
3831
// --------
3832
3833
#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001
3834
#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL      0x00002
3835
#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE     0x00004
3836
#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE      0x00008
3837
3838
// --------
3839
3840
// For a source string of "123" or "0x9A", it is valid for a tokenizer to
3841
// return any combination of:
3842
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT.
3843
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED.
3844
//  - WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED.
3845
//
3846
// For a source string of "+123" or "-0x9A", only the first two are valid.
3847
//
3848
// For a source string of "123.", only the first one is valid.
3849
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT   0x00001
3850
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED   0x00002
3851
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_UNSIGNED 0x00004
3852
3853
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF 0x00010
3854
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF 0x00020
3855
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN 0x00040
3856
#define WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN 0x00080
3857
3858
// The number 300 might be represented as "\x01\x2C", "\x2C\x01\x00\x00" or
3859
// "300", which are big-endian, little-endian or text. For binary formats, the
3860
// token length (after adjusting for FORMAT_IGNORE_ETC) discriminates
3861
// e.g. u16 little-endian vs u32 little-endian.
3862
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN    0x00100
3863
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_LITTLE_ENDIAN 0x00200
3864
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT                 0x00400
3865
3866
#define WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE    0x01000
3867
3868
// --------
3869
3870
// clang-format on
3871
3872
// --------
3873
3874
// wuffs_base__token__value returns the token's high 46 bits, sign-extended. A
3875
// negative value means an extended token, non-negative means a simple token.
3876
static inline int64_t  //
3877
0
wuffs_base__token__value(const wuffs_base__token* t) {
3878
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE__SHIFT;
3879
0
}
3880
3881
// wuffs_base__token__value_extension returns a negative value if the token was
3882
// not an extended token.
3883
static inline int64_t  //
3884
0
wuffs_base__token__value_extension(const wuffs_base__token* t) {
3885
0
  return (~(int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT;
3886
0
}
3887
3888
// wuffs_base__token__value_major returns a negative value if the token was not
3889
// a simple token.
3890
static inline int64_t  //
3891
0
wuffs_base__token__value_major(const wuffs_base__token* t) {
3892
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT;
3893
0
}
3894
3895
// wuffs_base__token__value_base_category returns a negative value if the token
3896
// was not a simple token.
3897
static inline int64_t  //
3898
0
wuffs_base__token__value_base_category(const wuffs_base__token* t) {
3899
0
  return ((int64_t)(t->repr)) >> WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT;
3900
0
}
3901
3902
static inline uint64_t  //
3903
0
wuffs_base__token__value_minor(const wuffs_base__token* t) {
3904
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) & 0x1FFFFFF;
3905
0
}
3906
3907
static inline uint64_t  //
3908
0
wuffs_base__token__value_base_detail(const wuffs_base__token* t) {
3909
0
  return (t->repr >> WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT) & 0x1FFFFF;
3910
0
}
3911
3912
static inline int64_t  //
3913
wuffs_base__token__value_base_detail__sign_extended(
3914
0
    const wuffs_base__token* t) {
3915
0
  // The VBD is 21 bits in the middle of t->repr. Left shift the high (64 - 21
3916
0
  // - ETC__SHIFT) bits off, then right shift (sign-extending) back down.
3917
0
  uint64_t u = t->repr << (43 - WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT);
3918
0
  return ((int64_t)u) >> 43;
3919
0
}
3920
3921
static inline bool  //
3922
0
wuffs_base__token__continued(const wuffs_base__token* t) {
3923
0
  return t->repr & 0x10000;
3924
0
}
3925
3926
static inline uint64_t  //
3927
0
wuffs_base__token__length(const wuffs_base__token* t) {
3928
0
  return (t->repr >> WUFFS_BASE__TOKEN__LENGTH__SHIFT) & 0xFFFF;
3929
0
}
3930
3931
#ifdef __cplusplus
3932
3933
inline int64_t  //
3934
wuffs_base__token::value() const {
3935
  return wuffs_base__token__value(this);
3936
}
3937
3938
inline int64_t  //
3939
wuffs_base__token::value_extension() const {
3940
  return wuffs_base__token__value_extension(this);
3941
}
3942
3943
inline int64_t  //
3944
wuffs_base__token::value_major() const {
3945
  return wuffs_base__token__value_major(this);
3946
}
3947
3948
inline int64_t  //
3949
wuffs_base__token::value_base_category() const {
3950
  return wuffs_base__token__value_base_category(this);
3951
}
3952
3953
inline uint64_t  //
3954
wuffs_base__token::value_minor() const {
3955
  return wuffs_base__token__value_minor(this);
3956
}
3957
3958
inline uint64_t  //
3959
wuffs_base__token::value_base_detail() const {
3960
  return wuffs_base__token__value_base_detail(this);
3961
}
3962
3963
inline int64_t  //
3964
wuffs_base__token::value_base_detail__sign_extended() const {
3965
  return wuffs_base__token__value_base_detail__sign_extended(this);
3966
}
3967
3968
inline bool  //
3969
wuffs_base__token::continued() const {
3970
  return wuffs_base__token__continued(this);
3971
}
3972
3973
inline uint64_t  //
3974
wuffs_base__token::length() const {
3975
  return wuffs_base__token__length(this);
3976
}
3977
3978
#endif  // __cplusplus
3979
3980
// --------
3981
3982
#if defined(__GNUC__)
3983
#pragma GCC diagnostic push
3984
#pragma GCC diagnostic ignored "-Wcast-qual"
3985
#endif
3986
3987
static inline wuffs_base__token*  //
3988
0
wuffs_base__strip_const_from_token_ptr(const wuffs_base__token* ptr) {
3989
0
  return (wuffs_base__token*)ptr;
3990
0
}
3991
3992
#if defined(__GNUC__)
3993
#pragma GCC diagnostic pop
3994
#endif
3995
3996
// --------
3997
3998
typedef WUFFS_BASE__SLICE(wuffs_base__token) wuffs_base__slice_token;
3999
4000
static inline wuffs_base__slice_token  //
4001
0
wuffs_base__make_slice_token(wuffs_base__token* ptr, size_t len) {
4002
0
  wuffs_base__slice_token ret;
4003
0
  ret.ptr = ptr;
4004
0
  ret.len = len;
4005
0
  return ret;
4006
0
}
4007
4008
static inline wuffs_base__slice_token  //
4009
0
wuffs_base__empty_slice_token(void) {
4010
0
  wuffs_base__slice_token ret;
4011
0
  ret.ptr = NULL;
4012
0
  ret.len = 0;
4013
0
  return ret;
4014
0
}
4015
4016
// --------
4017
4018
// wuffs_base__token_buffer_meta is the metadata for a
4019
// wuffs_base__token_buffer's data.
4020
typedef struct wuffs_base__token_buffer_meta__struct {
4021
  size_t wi;     // Write index. Invariant: wi <= len.
4022
  size_t ri;     // Read  index. Invariant: ri <= wi.
4023
  uint64_t pos;  // Position of the buffer start relative to the stream start.
4024
  bool closed;   // No further writes are expected.
4025
} wuffs_base__token_buffer_meta;
4026
4027
// wuffs_base__token_buffer is a 1-dimensional buffer (a pointer and length)
4028
// plus additional metadata.
4029
//
4030
// A value with all fields zero is a valid, empty buffer.
4031
typedef struct wuffs_base__token_buffer__struct {
4032
  wuffs_base__slice_token data;
4033
  wuffs_base__token_buffer_meta meta;
4034
4035
#ifdef __cplusplus
4036
  inline bool is_valid() const;
4037
  inline size_t compact();
4038
  inline size_t compact_retaining(uint64_t history_retain_length);
4039
  inline uint64_t reader_length() const;
4040
  inline wuffs_base__token* reader_pointer() const;
4041
  inline wuffs_base__slice_token reader_slice() const;
4042
  inline uint64_t reader_token_position() const;
4043
  inline uint64_t writer_length() const;
4044
  inline uint64_t writer_token_position() const;
4045
  inline wuffs_base__token* writer_pointer() const;
4046
  inline wuffs_base__slice_token writer_slice() const;
4047
#endif  // __cplusplus
4048
4049
} wuffs_base__token_buffer;
4050
4051
static inline wuffs_base__token_buffer  //
4052
wuffs_base__make_token_buffer(wuffs_base__slice_token data,
4053
0
                              wuffs_base__token_buffer_meta meta) {
4054
0
  wuffs_base__token_buffer ret;
4055
0
  ret.data = data;
4056
0
  ret.meta = meta;
4057
0
  return ret;
4058
0
}
4059
4060
static inline wuffs_base__token_buffer_meta  //
4061
wuffs_base__make_token_buffer_meta(size_t wi,
4062
                                   size_t ri,
4063
                                   uint64_t pos,
4064
0
                                   bool closed) {
4065
0
  wuffs_base__token_buffer_meta ret;
4066
0
  ret.wi = wi;
4067
0
  ret.ri = ri;
4068
0
  ret.pos = pos;
4069
0
  ret.closed = closed;
4070
0
  return ret;
4071
0
}
4072
4073
static inline wuffs_base__token_buffer  //
4074
0
wuffs_base__slice_token__reader(wuffs_base__slice_token s, bool closed) {
4075
0
  wuffs_base__token_buffer ret;
4076
0
  ret.data.ptr = s.ptr;
4077
0
  ret.data.len = s.len;
4078
0
  ret.meta.wi = s.len;
4079
0
  ret.meta.ri = 0;
4080
0
  ret.meta.pos = 0;
4081
0
  ret.meta.closed = closed;
4082
0
  return ret;
4083
0
}
4084
4085
static inline wuffs_base__token_buffer  //
4086
0
wuffs_base__slice_token__writer(wuffs_base__slice_token s) {
4087
0
  wuffs_base__token_buffer ret;
4088
0
  ret.data.ptr = s.ptr;
4089
0
  ret.data.len = s.len;
4090
0
  ret.meta.wi = 0;
4091
0
  ret.meta.ri = 0;
4092
0
  ret.meta.pos = 0;
4093
0
  ret.meta.closed = false;
4094
0
  return ret;
4095
0
}
4096
4097
static inline wuffs_base__token_buffer  //
4098
0
wuffs_base__empty_token_buffer(void) {
4099
0
  wuffs_base__token_buffer ret;
4100
0
  ret.data.ptr = NULL;
4101
0
  ret.data.len = 0;
4102
0
  ret.meta.wi = 0;
4103
0
  ret.meta.ri = 0;
4104
0
  ret.meta.pos = 0;
4105
0
  ret.meta.closed = false;
4106
0
  return ret;
4107
0
}
4108
4109
static inline wuffs_base__token_buffer_meta  //
4110
0
wuffs_base__empty_token_buffer_meta(void) {
4111
0
  wuffs_base__token_buffer_meta ret;
4112
0
  ret.wi = 0;
4113
0
  ret.ri = 0;
4114
0
  ret.pos = 0;
4115
0
  ret.closed = false;
4116
0
  return ret;
4117
0
}
4118
4119
static inline bool  //
4120
0
wuffs_base__token_buffer__is_valid(const wuffs_base__token_buffer* buf) {
4121
0
  if (buf) {
4122
0
    if (buf->data.ptr) {
4123
0
      return (buf->meta.ri <= buf->meta.wi) && (buf->meta.wi <= buf->data.len);
4124
0
    } else {
4125
0
      return (buf->meta.ri == 0) && (buf->meta.wi == 0) && (buf->data.len == 0);
4126
0
    }
4127
0
  }
4128
0
  return false;
4129
0
}
4130
4131
// wuffs_base__token_buffer__compact moves any written but unread tokens to the
4132
// start of the buffer.
4133
//
4134
// It returns the increase in the writer length: how much meta.wi fell by.
4135
static inline size_t  //
4136
0
wuffs_base__token_buffer__compact(wuffs_base__token_buffer* buf) {
4137
0
  if (!buf || (buf->meta.ri == 0)) {
4138
0
    return 0;
4139
0
  }
4140
0
  size_t old_ri = buf->meta.ri;
4141
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri);
4142
0
  size_t new_wi = buf->meta.wi - buf->meta.ri;
4143
0
  if (new_wi != 0) {
4144
0
    memmove(buf->data.ptr, buf->data.ptr + buf->meta.ri,
4145
0
            new_wi * sizeof(wuffs_base__token));
4146
0
  }
4147
0
  buf->meta.wi = new_wi;
4148
0
  buf->meta.ri = 0;
4149
0
  return old_ri;
4150
0
}
4151
4152
// wuffs_base__token_buffer__compact_retaining moves any written but unread
4153
// tokens closer to the start of the buffer. It retains H tokens of history
4154
// (the most recently read tokens), where H is min(buf->meta.ri,
4155
// history_retain_length). It is therefore a no-op if history_retain_length is
4156
// UINT64_MAX. A postcondition is that buf->meta.ri == H.
4157
//
4158
// It returns the increase in the writer length: how much meta.wi fell by.
4159
//
4160
// wuffs_base__token_buffer__compact_retaining(0) is equivalent to
4161
// wuffs_base__token_buffer__compact().
4162
//
4163
// For example, if buf started like this:
4164
//
4165
//        +--- ri = 3
4166
//        v
4167
//     abcdefgh??    len = 10, pos = 900
4168
//             ^
4169
//             +--- wi = 8
4170
//
4171
// Then, depending on history_retain_length, the resultant buf would be:
4172
//
4173
// HRL = 0     defgh?????    ri = 0    wi = 5    pos = 903    return = 3
4174
// HRL = 1     cdefgh????    ri = 1    wi = 6    pos = 902    return = 2
4175
// HRL = 2     bcdefgh???    ri = 2    wi = 7    pos = 901    return = 1
4176
// HRL = 3     abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
4177
// HRL = 4+    abcdefgh??    ri = 3    wi = 8    pos = 900    return = 0
4178
static inline size_t  //
4179
wuffs_base__token_buffer__compact_retaining(wuffs_base__token_buffer* buf,
4180
0
                                            uint64_t history_retain_length) {
4181
0
  if (!buf || (buf->meta.ri == 0)) {
4182
0
    return 0;
4183
0
  }
4184
0
  size_t old_ri = buf->meta.ri;
4185
0
  size_t new_ri = (size_t)(wuffs_base__u64__min(old_ri, history_retain_length));
4186
0
  size_t memmove_start = old_ri - new_ri;
4187
0
  buf->meta.pos = wuffs_base__u64__sat_add(buf->meta.pos, memmove_start);
4188
0
  size_t new_wi = buf->meta.wi - memmove_start;
4189
0
  if ((new_wi != 0) && (memmove_start != 0)) {
4190
0
    memmove(buf->data.ptr, buf->data.ptr + memmove_start,
4191
0
            new_wi * sizeof(wuffs_base__token));
4192
0
  }
4193
0
  buf->meta.wi = new_wi;
4194
0
  buf->meta.ri = new_ri;
4195
0
  return memmove_start;
4196
0
}
4197
4198
static inline uint64_t  //
4199
0
wuffs_base__token_buffer__reader_length(const wuffs_base__token_buffer* buf) {
4200
0
  return buf ? buf->meta.wi - buf->meta.ri : 0;
4201
0
}
4202
4203
static inline wuffs_base__token*  //
4204
0
wuffs_base__token_buffer__reader_pointer(const wuffs_base__token_buffer* buf) {
4205
0
  return buf ? (buf->data.ptr + buf->meta.ri) : NULL;
4206
0
}
4207
4208
static inline wuffs_base__slice_token  //
4209
0
wuffs_base__token_buffer__reader_slice(const wuffs_base__token_buffer* buf) {
4210
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.ri,
4211
0
                                            buf->meta.wi - buf->meta.ri)
4212
0
             : wuffs_base__empty_slice_token();
4213
0
}
4214
4215
static inline uint64_t  //
4216
wuffs_base__token_buffer__reader_token_position(
4217
0
    const wuffs_base__token_buffer* buf) {
4218
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.ri) : 0;
4219
0
}
4220
4221
static inline uint64_t  //
4222
0
wuffs_base__token_buffer__writer_length(const wuffs_base__token_buffer* buf) {
4223
0
  return buf ? buf->data.len - buf->meta.wi : 0;
4224
0
}
4225
4226
static inline wuffs_base__token*  //
4227
0
wuffs_base__token_buffer__writer_pointer(const wuffs_base__token_buffer* buf) {
4228
0
  return buf ? (buf->data.ptr + buf->meta.wi) : NULL;
4229
0
}
4230
4231
static inline wuffs_base__slice_token  //
4232
0
wuffs_base__token_buffer__writer_slice(const wuffs_base__token_buffer* buf) {
4233
0
  return buf ? wuffs_base__make_slice_token(buf->data.ptr + buf->meta.wi,
4234
0
                                            buf->data.len - buf->meta.wi)
4235
0
             : wuffs_base__empty_slice_token();
4236
0
}
4237
4238
static inline uint64_t  //
4239
wuffs_base__token_buffer__writer_token_position(
4240
0
    const wuffs_base__token_buffer* buf) {
4241
0
  return buf ? wuffs_base__u64__sat_add(buf->meta.pos, buf->meta.wi) : 0;
4242
0
}
4243
4244
#ifdef __cplusplus
4245
4246
inline bool  //
4247
wuffs_base__token_buffer::is_valid() const {
4248
  return wuffs_base__token_buffer__is_valid(this);
4249
}
4250
4251
inline size_t  //
4252
wuffs_base__token_buffer::compact() {
4253
  return wuffs_base__token_buffer__compact(this);
4254
}
4255
4256
inline size_t  //
4257
wuffs_base__token_buffer::compact_retaining(uint64_t history_retain_length) {
4258
  return wuffs_base__token_buffer__compact_retaining(this,
4259
                                                     history_retain_length);
4260
}
4261
4262
inline uint64_t  //
4263
wuffs_base__token_buffer::reader_length() const {
4264
  return wuffs_base__token_buffer__reader_length(this);
4265
}
4266
4267
inline wuffs_base__token*  //
4268
wuffs_base__token_buffer::reader_pointer() const {
4269
  return wuffs_base__token_buffer__reader_pointer(this);
4270
}
4271
4272
inline wuffs_base__slice_token  //
4273
wuffs_base__token_buffer::reader_slice() const {
4274
  return wuffs_base__token_buffer__reader_slice(this);
4275
}
4276
4277
inline uint64_t  //
4278
wuffs_base__token_buffer::reader_token_position() const {
4279
  return wuffs_base__token_buffer__reader_token_position(this);
4280
}
4281
4282
inline uint64_t  //
4283
wuffs_base__token_buffer::writer_length() const {
4284
  return wuffs_base__token_buffer__writer_length(this);
4285
}
4286
4287
inline wuffs_base__token*  //
4288
wuffs_base__token_buffer::writer_pointer() const {
4289
  return wuffs_base__token_buffer__writer_pointer(this);
4290
}
4291
4292
inline wuffs_base__slice_token  //
4293
wuffs_base__token_buffer::writer_slice() const {
4294
  return wuffs_base__token_buffer__writer_slice(this);
4295
}
4296
4297
inline uint64_t  //
4298
wuffs_base__token_buffer::writer_token_position() const {
4299
  return wuffs_base__token_buffer__writer_token_position(this);
4300
}
4301
4302
#endif  // __cplusplus
4303
4304
// ---------------- Memory Allocation
4305
4306
// The memory allocation related functions in this section aren't used by Wuffs
4307
// per se, but they may be helpful to the code that uses Wuffs.
4308
4309
// wuffs_base__malloc_slice_uxx wraps calling a malloc-like function, except
4310
// that it takes a uint64_t number of elements instead of a size_t size in
4311
// bytes, and it returns a slice (a pointer and a length) instead of just a
4312
// pointer.
4313
//
4314
// You can pass the C stdlib's malloc as the malloc_func.
4315
//
4316
// It returns an empty slice (containing a NULL ptr field) if num_uxx is zero
4317
// or if (num_uxx * sizeof(uintxx_t)) would overflow SIZE_MAX.
4318
4319
static inline wuffs_base__slice_u8  //
4320
7.79k
wuffs_base__malloc_slice_u8(void* (*malloc_func)(size_t), uint64_t num_u8) {
4321
7.79k
  if (malloc_func && num_u8 && (num_u8 <= (SIZE_MAX / sizeof(uint8_t)))) {
4322
7.79k
    void* p = (*malloc_func)((size_t)(num_u8 * sizeof(uint8_t)));
4323
7.79k
    if (p) {
4324
7.79k
      return wuffs_base__make_slice_u8((uint8_t*)(p), (size_t)num_u8);
4325
7.79k
    }
4326
7.79k
  }
4327
0
  return wuffs_base__empty_slice_u8();
4328
7.79k
}
4329
4330
static inline wuffs_base__slice_u16  //
4331
0
wuffs_base__malloc_slice_u16(void* (*malloc_func)(size_t), uint64_t num_u16) {
4332
0
  if (malloc_func && num_u16 && (num_u16 <= (SIZE_MAX / sizeof(uint16_t)))) {
4333
0
    void* p = (*malloc_func)((size_t)(num_u16 * sizeof(uint16_t)));
4334
0
    if (p) {
4335
0
      return wuffs_base__make_slice_u16((uint16_t*)(p), (size_t)num_u16);
4336
0
    }
4337
0
  }
4338
0
  return wuffs_base__empty_slice_u16();
4339
0
}
4340
4341
static inline wuffs_base__slice_u32  //
4342
0
wuffs_base__malloc_slice_u32(void* (*malloc_func)(size_t), uint64_t num_u32) {
4343
0
  if (malloc_func && num_u32 && (num_u32 <= (SIZE_MAX / sizeof(uint32_t)))) {
4344
0
    void* p = (*malloc_func)((size_t)(num_u32 * sizeof(uint32_t)));
4345
0
    if (p) {
4346
0
      return wuffs_base__make_slice_u32((uint32_t*)(p), (size_t)num_u32);
4347
0
    }
4348
0
  }
4349
0
  return wuffs_base__empty_slice_u32();
4350
0
}
4351
4352
static inline wuffs_base__slice_u64  //
4353
0
wuffs_base__malloc_slice_u64(void* (*malloc_func)(size_t), uint64_t num_u64) {
4354
0
  if (malloc_func && num_u64 && (num_u64 <= (SIZE_MAX / sizeof(uint64_t)))) {
4355
0
    void* p = (*malloc_func)((size_t)(num_u64 * sizeof(uint64_t)));
4356
0
    if (p) {
4357
0
      return wuffs_base__make_slice_u64((uint64_t*)(p), (size_t)num_u64);
4358
0
    }
4359
0
  }
4360
0
  return wuffs_base__empty_slice_u64();
4361
0
}
4362
4363
// ---------------- Images
4364
4365
// WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL is the largest width or height
4366
// (measured in pixels) supported by Wuffs' standard library's image codecs.
4367
//
4368
// Any non-negative integer N less than or equal to ((1 << 24) - 1) can be
4369
// losslessly converted to and from single-precision floating point (what C
4370
// calls the "float" type and what Go calls "float32").
4371
//
4372
// A Wuffs image can have up to 4 channels and up to 8 bytes per channel (8 is
4373
// also known as sizeof(double)), combining for up to 32 bytes per pixel. When
4374
// calculating memory requirements, the 0xFFFFFF upper bound also means that:
4375
//   - (32 * N)     will not overflow an int32_t or uint32_t.
4376
//   - (32 * N * N) will not overflow an int64_t or uint64_t, provided that N
4377
//     already has a 64-bit type.
4378
//
4379
// 0xFFFFFF in decimal is 16777215.
4380
#define WUFFS_BASE__IMAGE__DIMENSION_MAX_INCL 0xFFFFFF
4381
4382
// wuffs_base__color_u32_argb_premul is an 8 bit per channel premultiplied
4383
// Alpha, Red, Green, Blue color, as a uint32_t value. Its value is always
4384
// 0xAARRGGBB (Alpha most significant, Blue least), regardless of endianness.
4385
typedef uint32_t wuffs_base__color_u32_argb_premul;
4386
4387
// wuffs_base__color_u32_argb_premul__is_valid returns whether c's Red, Green
4388
// and Blue channels are all less than or equal to its Alpha channel. c uses
4389
// premultiplied alpha, so 50% opaque 100% saturated red is 0x7F7F_0000 and a
4390
// value like 0x7F80_0000 is invalid.
4391
static inline bool  //
4392
wuffs_base__color_u32_argb_premul__is_valid(
4393
0
    wuffs_base__color_u32_argb_premul c) {
4394
0
  uint32_t a = 0xFF & (c >> 24);
4395
0
  uint32_t r = 0xFF & (c >> 16);
4396
0
  uint32_t g = 0xFF & (c >> 8);
4397
0
  uint32_t b = 0xFF & (c >> 0);
4398
0
  return (a >= r) && (a >= g) && (a >= b);
4399
0
}
4400
4401
static inline uint16_t  //
4402
wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
4403
0
    wuffs_base__color_u32_argb_premul c) {
4404
0
  uint32_t r5 = 0xF800 & (c >> 8);
4405
0
  uint32_t g6 = 0x07E0 & (c >> 5);
4406
0
  uint32_t b5 = 0x001F & (c >> 3);
4407
0
  return (uint16_t)(r5 | g6 | b5);
4408
0
}
4409
4410
static inline wuffs_base__color_u32_argb_premul  //
4411
0
wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(uint16_t rgb_565) {
4412
0
  uint32_t b5 = 0x1F & (rgb_565 >> 0);
4413
0
  uint32_t b = (b5 << 3) | (b5 >> 2);
4414
0
  uint32_t g6 = 0x3F & (rgb_565 >> 5);
4415
0
  uint32_t g = (g6 << 2) | (g6 >> 4);
4416
0
  uint32_t r5 = 0x1F & (rgb_565 >> 11);
4417
0
  uint32_t r = (r5 << 3) | (r5 >> 2);
4418
0
  return 0xFF000000 | (r << 16) | (g << 8) | (b << 0);
4419
0
}
4420
4421
static inline uint8_t  //
4422
wuffs_base__color_u32_argb_premul__as__color_u8_gray(
4423
0
    wuffs_base__color_u32_argb_premul c) {
4424
  // Work in 16-bit color.
4425
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4426
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4427
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4428
4429
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4430
  // as those given by the JFIF specification.
4431
  //
4432
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4433
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4434
  // 16-bit color.
4435
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4436
0
  return (uint8_t)(weighted_average >> 24);
4437
0
}
4438
4439
static inline uint16_t  //
4440
wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
4441
0
    wuffs_base__color_u32_argb_premul c) {
4442
0
  uint32_t a = 0xFF & (c >> 24);
4443
0
  if (a == 0) {
4444
0
    return 0;
4445
0
  }
4446
0
  uint32_t a16 = a * 0x101;
4447
4448
0
  uint32_t cr = 0xFF & (c >> 16);
4449
0
  cr = (cr * (0x101 * 0xFFFF)) / a16;
4450
0
  uint32_t cg = 0xFF & (c >> 8);
4451
0
  cg = (cg * (0x101 * 0xFFFF)) / a16;
4452
0
  uint32_t cb = 0xFF & (c >> 0);
4453
0
  cb = (cb * (0x101 * 0xFFFF)) / a16;
4454
4455
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4456
0
  return (uint16_t)((a16 & 0xFF00) | (weighted_average >> 24));
4457
0
}
4458
4459
static inline uint16_t  //
4460
wuffs_base__color_u32_argb_premul__as__color_u16_gray(
4461
0
    wuffs_base__color_u32_argb_premul c) {
4462
  // Work in 16-bit color.
4463
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
4464
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
4465
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
4466
4467
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4468
  // as those given by the JFIF specification.
4469
  //
4470
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16).
4471
0
  uint32_t weighted_average = (19595 * cr) + (38470 * cg) + (7471 * cb) + 32768;
4472
0
  return (uint16_t)(weighted_average >> 16);
4473
0
}
4474
4475
// wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul converts
4476
// from non-premultiplied alpha to premultiplied alpha.
4477
static inline wuffs_base__color_u32_argb_premul  //
4478
wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
4479
117M
    uint32_t argb_nonpremul) {
4480
  // Multiplying by 0x101 (twice, once for alpha and once for color) converts
4481
  // from 8-bit to 16-bit color. Shifting right by 8 undoes that.
4482
  //
4483
  // Working in the higher bit depth can produce slightly different (and
4484
  // arguably slightly more accurate) results. For example, given 8-bit blue
4485
  // and alpha of 0x80 and 0x81:
4486
  //
4487
  //  - ((0x80   * 0x81  ) / 0xFF  )      = 0x40        = 0x40
4488
  //  - ((0x8080 * 0x8181) / 0xFFFF) >> 8 = 0x4101 >> 8 = 0x41
4489
117M
  uint32_t a = 0xFF & (argb_nonpremul >> 24);
4490
117M
  uint32_t a16 = a * (0x101 * 0x101);
4491
4492
117M
  uint32_t r = 0xFF & (argb_nonpremul >> 16);
4493
117M
  r = ((r * a16) / 0xFFFF) >> 8;
4494
117M
  uint32_t g = 0xFF & (argb_nonpremul >> 8);
4495
117M
  g = ((g * a16) / 0xFFFF) >> 8;
4496
117M
  uint32_t b = 0xFF & (argb_nonpremul >> 0);
4497
117M
  b = ((b * a16) / 0xFFFF) >> 8;
4498
4499
117M
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4500
117M
}
4501
4502
// wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul converts
4503
// from premultiplied alpha to non-premultiplied alpha.
4504
static inline uint32_t  //
4505
wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
4506
0
    wuffs_base__color_u32_argb_premul c) {
4507
0
  uint32_t a = 0xFF & (c >> 24);
4508
0
  if (a == 0xFF) {
4509
0
    return c;
4510
0
  } else if (a == 0) {
4511
0
    return 0;
4512
0
  }
4513
0
  uint32_t a16 = a * 0x101;
4514
4515
0
  uint32_t r = 0xFF & (c >> 16);
4516
0
  r = ((r * (0x101 * 0xFFFF)) / a16) >> 8;
4517
0
  uint32_t g = 0xFF & (c >> 8);
4518
0
  g = ((g * (0x101 * 0xFFFF)) / a16) >> 8;
4519
0
  uint32_t b = 0xFF & (c >> 0);
4520
0
  b = ((b * (0x101 * 0xFFFF)) / a16) >> 8;
4521
4522
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4523
0
}
4524
4525
// wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul converts
4526
// from 4x16LE non-premultiplied alpha to 4x8 premultiplied alpha.
4527
static inline wuffs_base__color_u32_argb_premul  //
4528
wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
4529
15.4M
    uint64_t argb_nonpremul) {
4530
15.4M
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4531
4532
15.4M
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4533
15.4M
  r16 = (r16 * a16) / 0xFFFF;
4534
15.4M
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4535
15.4M
  g16 = (g16 * a16) / 0xFFFF;
4536
15.4M
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4537
15.4M
  b16 = (b16 * a16) / 0xFFFF;
4538
4539
15.4M
  return ((a16 >> 8) << 24) | ((r16 >> 8) << 16) | ((g16 >> 8) << 8) |
4540
15.4M
         ((b16 >> 8) << 0);
4541
15.4M
}
4542
4543
// wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul converts
4544
// from 4x8 premultiplied alpha to 4x16LE non-premultiplied alpha.
4545
static inline uint64_t  //
4546
wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
4547
0
    wuffs_base__color_u32_argb_premul c) {
4548
0
  uint32_t a = 0xFF & (c >> 24);
4549
0
  if (a == 0xFF) {
4550
0
    uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4551
0
    uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4552
0
    uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4553
0
    return 0xFFFF000000000000u | (r16 << 32) | (g16 << 16) | (b16 << 0);
4554
0
  } else if (a == 0) {
4555
0
    return 0;
4556
0
  }
4557
0
  uint64_t a16 = a * 0x101;
4558
4559
0
  uint64_t r = 0xFF & (c >> 16);
4560
0
  uint64_t r16 = (r * (0x101 * 0xFFFF)) / a16;
4561
0
  uint64_t g = 0xFF & (c >> 8);
4562
0
  uint64_t g16 = (g * (0x101 * 0xFFFF)) / a16;
4563
0
  uint64_t b = 0xFF & (c >> 0);
4564
0
  uint64_t b16 = (b * (0x101 * 0xFFFF)) / a16;
4565
4566
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4567
0
}
4568
4569
static inline uint8_t  //
4570
0
wuffs_base__color_u64_argb_premul__as__color_u8_gray(uint64_t argb_premul) {
4571
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_premul >> 32)));
4572
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_premul >> 16)));
4573
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_premul >> 0)));
4574
0
4575
0
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4576
0
  // as those given by the JFIF specification.
4577
0
  //
4578
0
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4579
0
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4580
0
  // 16-bit color.
4581
0
  uint32_t weighted_average =
4582
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4583
0
  return (uint8_t)(weighted_average >> 24);
4584
0
}
4585
4586
static inline uint8_t  //
4587
wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
4588
0
    uint64_t argb_nonpremul) {
4589
0
  uint32_t a16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 48)));
4590
4591
0
  uint32_t r16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 32)));
4592
0
  r16 = (r16 * a16) / 0xFFFF;
4593
0
  uint32_t g16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 16)));
4594
0
  g16 = (g16 * a16) / 0xFFFF;
4595
0
  uint32_t b16 = ((uint32_t)(0xFFFF & (argb_nonpremul >> 0)));
4596
0
  b16 = (b16 * a16) / 0xFFFF;
4597
4598
  // These coefficients (the fractions 0.299, 0.587 and 0.114) are the same
4599
  // as those given by the JFIF specification.
4600
  //
4601
  // Note that 19595 + 38470 + 7471 equals 65536, also known as (1 << 16). We
4602
  // shift by 24, not just by 16, because the return value is 8-bit color, not
4603
  // 16-bit color.
4604
0
  uint32_t weighted_average =
4605
0
      (19595 * r16) + (38470 * g16) + (7471 * b16) + 32768;
4606
0
  return (uint8_t)(weighted_average >> 24);
4607
0
}
4608
4609
static inline uint64_t  //
4610
0
wuffs_base__color_u32__as__color_u64(uint32_t c) {
4611
0
  uint64_t a16 = 0x101 * (0xFF & (c >> 24));
4612
0
  uint64_t r16 = 0x101 * (0xFF & (c >> 16));
4613
0
  uint64_t g16 = 0x101 * (0xFF & (c >> 8));
4614
0
  uint64_t b16 = 0x101 * (0xFF & (c >> 0));
4615
0
  return (a16 << 48) | (r16 << 32) | (g16 << 16) | (b16 << 0);
4616
0
}
4617
4618
static inline uint32_t  //
4619
0
wuffs_base__color_u64__as__color_u32(uint64_t c) {
4620
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
4621
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
4622
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
4623
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
4624
0
  return (a << 24) | (r << 16) | (g << 8) | (b << 0);
4625
0
}
4626
4627
// wuffs_base__color_ycc__as__color_u32 converts from YCbCr to 0xAARRGGBB. The
4628
// alpha bits are always 0xFF.
4629
static inline wuffs_base__color_u32_argb_premul  //
4630
0
wuffs_base__color_ycc__as__color_u32(uint8_t yy, uint8_t cb, uint8_t cr) {
4631
  // Work in 16.16 fixed point arithmetic (so that 'one half' is (1 << 15)) and
4632
  // bias the chroma values by 0x80.
4633
0
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4634
0
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4635
0
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4636
4637
  // The formulae:
4638
  //
4639
  //  R = Y                + 1.40200 * Cr
4640
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
4641
  //  B = Y + 1.77200 * Cb
4642
  //
4643
  // When scaled by 1<<16:
4644
  //
4645
  //  0.34414 becomes 0x0581A =  22554.
4646
  //  0.71414 becomes 0x0B6D2 =  46802.
4647
  //  1.40200 becomes 0x166E9 =  91881.
4648
  //  1.77200 becomes 0x1C5A2 = 116130.
4649
  //
4650
  // Since we're working in 16.16 fixed point arithmetic, masking by 0x00FF0000
4651
  // (possibly followed by a shift) gives the relevant 8 bits per channel.
4652
  //
4653
  // However, we need to saturate for overflow (above 0x00FFFFFF, but not so
4654
  // high that the MSB Most Significant Bit is set) or for underflow (below
4655
  // 0x00000000 as int32_t, which means that the MSB is set as uint32_t). In
4656
  // both cases, some of the high 8 bits (bits 24 ..= 31) will be set.
4657
  //
4658
  // "((uint32_t)(((int32_t)x) >> 31))" just replicates x's MSB across all 32
4659
  // bits. Prepending that with "~" inverts those bits. Thus, "~(etc)" is
4660
  // either 0xFFFFFFFF (for overflow) or 0x00000000 (for underflow).
4661
0
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4662
0
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4663
0
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4664
0
  if (rr32 >> 24) {
4665
0
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4666
0
  }
4667
0
  if (gg32 >> 24) {
4668
0
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4669
0
  }
4670
0
  if (bb32 >> 24) {
4671
0
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4672
0
  }
4673
0
  return 0xFF000000 |                  //
4674
0
         ((0x00FF0000 & rr32) >> 0) |  //
4675
0
         ((0x00FF0000 & gg32) >> 8) |  //
4676
0
         ((0x00FF0000 & bb32) >> 16);
4677
0
}
4678
4679
// wuffs_base__color_ycc__as__color_u32_abgr is like
4680
// wuffs_base__color_ycc__as__color_u32 but the uint32_t returned is in
4681
// 0xAABBGGRR order, not 0xAARRGGBB.
4682
static inline uint32_t  //
4683
0
wuffs_base__color_ycc__as__color_u32_abgr(uint8_t yy, uint8_t cb, uint8_t cr) {
4684
0
  uint32_t yy32 = (((uint32_t)yy) << 16) | (1 << 15);
4685
0
  uint32_t cb32 = (((uint32_t)cb) - 0x80);
4686
0
  uint32_t cr32 = (((uint32_t)cr) - 0x80);
4687
0
  uint32_t rr32 = yy32 + (0x166E9 * cr32);
4688
0
  uint32_t gg32 = yy32 - (0x0581A * cb32) - (0x0B6D2 * cr32);
4689
0
  uint32_t bb32 = yy32 + (0x1C5A2 * cb32);
4690
0
  if (rr32 >> 24) {
4691
0
    rr32 = ~((uint32_t)(((int32_t)rr32) >> 31));
4692
0
  }
4693
0
  if (gg32 >> 24) {
4694
0
    gg32 = ~((uint32_t)(((int32_t)gg32) >> 31));
4695
0
  }
4696
0
  if (bb32 >> 24) {
4697
0
    bb32 = ~((uint32_t)(((int32_t)bb32) >> 31));
4698
0
  }
4699
0
  return 0xFF000000 |                  //
4700
0
         ((0x00FF0000 & bb32) >> 0) |  //
4701
0
         ((0x00FF0000 & gg32) >> 8) |  //
4702
0
         ((0x00FF0000 & rr32) >> 16);
4703
0
}
4704
4705
// --------
4706
4707
typedef uint8_t wuffs_base__pixel_blend;
4708
4709
// wuffs_base__pixel_blend encodes how to blend source and destination pixels,
4710
// accounting for transparency. It encompasses the Porter-Duff compositing
4711
// operators as well as the other blending modes defined by PDF.
4712
//
4713
// TODO: implement the other modes.
4714
14.6k
#define WUFFS_BASE__PIXEL_BLEND__SRC ((wuffs_base__pixel_blend)0)
4715
0
#define WUFFS_BASE__PIXEL_BLEND__SRC_OVER ((wuffs_base__pixel_blend)1)
4716
4717
// --------
4718
4719
// wuffs_base__pixel_alpha_transparency is a pixel format's alpha channel
4720
// model. It is a property of the pixel format in general, not of a specific
4721
// pixel. An RGBA pixel format (with alpha) can still have fully opaque pixels.
4722
typedef uint32_t wuffs_base__pixel_alpha_transparency;
4723
4724
0
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE 0
4725
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__NONPREMULTIPLIED_ALPHA 1
4726
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__PREMULTIPLIED_ALPHA 2
4727
#define WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__BINARY_ALPHA 3
4728
4729
// --------
4730
4731
// wuffs_base__pixel_coloration is whether a pixel format's color model has no
4732
// color (alpha only), gray color or rich (non-gray) color. Rich color includes
4733
// RGB, BGR, YCC, YCCK, CMY and CMYK.
4734
//
4735
// Coloration does not capture the alpha aspect of the color model. It does not
4736
// distinguish RGB from RGBA.
4737
typedef uint32_t wuffs_base__pixel_coloration;
4738
4739
#define WUFFS_BASE__PIXEL_COLORATION__NONE 0
4740
#define WUFFS_BASE__PIXEL_COLORATION__GRAY 1
4741
#define WUFFS_BASE__PIXEL_COLORATION__RICH 3
4742
4743
// --------
4744
4745
// Deprecated: use WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL.
4746
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX 4
4747
4748
9.03k
#define WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL 4
4749
4750
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__INDEX_PLANE 0
4751
1.21k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE 3
4752
4753
// A palette is 256 entries ร— 4 bytes per entry (e.g. BGRA).
4754
709k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH 1024
4755
4756
// wuffs_base__pixel_format encodes the format of the bytes that constitute an
4757
// image frame's pixel data.
4758
//
4759
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-formats.md
4760
//
4761
// Do not manipulate its bits directly; they are private implementation
4762
// details. Use methods such as wuffs_base__pixel_format__num_planes instead.
4763
typedef struct wuffs_base__pixel_format__struct {
4764
  uint32_t repr;
4765
4766
#ifdef __cplusplus
4767
  inline bool is_valid() const;
4768
  inline uint32_t bits_per_pixel() const;
4769
  inline uint32_t default_background_color() const;
4770
  inline bool is_direct() const;
4771
  inline bool is_indexed() const;
4772
  inline bool is_interleaved() const;
4773
  inline bool is_planar() const;
4774
  inline uint32_t coloration() const;
4775
  inline uint32_t num_planes() const;
4776
  inline wuffs_base__pixel_alpha_transparency transparency() const;
4777
#endif  // __cplusplus
4778
4779
} wuffs_base__pixel_format;
4780
4781
static inline wuffs_base__pixel_format  //
4782
11.5k
wuffs_base__make_pixel_format(uint32_t repr) {
4783
11.5k
  wuffs_base__pixel_format f;
4784
11.5k
  f.repr = repr;
4785
11.5k
  return f;
4786
11.5k
}
4787
4788
// Common 8-bit-depth pixel formats. This list is not exhaustive; not all valid
4789
// wuffs_base__pixel_format values are present.
4790
4791
// clang-format off
4792
4793
0
#define WUFFS_BASE__PIXEL_FORMAT__INVALID                   0x00000000
4794
4795
#define WUFFS_BASE__PIXEL_FORMAT__A                         0x02000008
4796
4797
1.97k
#define WUFFS_BASE__PIXEL_FORMAT__Y                         0x20000008
4798
75
#define WUFFS_BASE__PIXEL_FORMAT__Y_16LE                    0x2000000B
4799
153
#define WUFFS_BASE__PIXEL_FORMAT__Y_16BE                    0x2010000B
4800
140
#define WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL              0x21000088
4801
#define WUFFS_BASE__PIXEL_FORMAT__YA_PREMUL                 0x22000088
4802
#define WUFFS_BASE__PIXEL_FORMAT__YXXX                      0x30008888
4803
4804
#define WUFFS_BASE__PIXEL_FORMAT__YCBCR                     0x40020888
4805
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRA_NONPREMUL          0x41038888
4806
#define WUFFS_BASE__PIXEL_FORMAT__YCBCRK                    0x50038888
4807
4808
#define WUFFS_BASE__PIXEL_FORMAT__YCOCG                     0x60020888
4809
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGA_NONPREMUL          0x61038888
4810
#define WUFFS_BASE__PIXEL_FORMAT__YCOCGK                    0x70038888
4811
4812
372
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL   0x81040008
4813
0
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL      0x82040008
4814
1.32k
#define WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY      0x83040008
4815
4816
0
#define WUFFS_BASE__PIXEL_FORMAT__BGR_565                   0x80000565
4817
519
#define WUFFS_BASE__PIXEL_FORMAT__BGR                       0x80000888
4818
868
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL            0x81008888
4819
736
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE     0x8100BBBB
4820
4.83k
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL               0x82008888
4821
0
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE        0x8200BBBB
4822
1.74k
#define WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY               0x83008888
4823
1.27k
#define WUFFS_BASE__PIXEL_FORMAT__BGRX                      0x90008888
4824
4825
1.04k
#define WUFFS_BASE__PIXEL_FORMAT__RGB                       0xA0000888
4826
1.97k
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL            0xA1008888
4827
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE     0xA100BBBB
4828
802
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL               0xA2008888
4829
0
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE        0xA200BBBB
4830
750
#define WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY               0xA3008888
4831
750
#define WUFFS_BASE__PIXEL_FORMAT__RGBX                      0xB0008888
4832
4833
#define WUFFS_BASE__PIXEL_FORMAT__CMY                       0xC0020888
4834
#define WUFFS_BASE__PIXEL_FORMAT__CMYK                      0xD0038888
4835
4836
// clang-format on
4837
4838
extern const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16];
4839
4840
static inline bool  //
4841
0
wuffs_base__pixel_format__is_valid(const wuffs_base__pixel_format* f) {
4842
0
  return f->repr != 0;
4843
0
}
4844
4845
// wuffs_base__pixel_format__bits_per_pixel returns the number of bits per
4846
// pixel for interleaved pixel formats, and returns 0 for planar pixel formats.
4847
static inline uint32_t  //
4848
28.1k
wuffs_base__pixel_format__bits_per_pixel(const wuffs_base__pixel_format* f) {
4849
28.1k
  if (((f->repr >> 16) & 0x03) != 0) {
4850
0
    return 0;
4851
0
  }
4852
28.1k
  return wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4853
28.1k
                                                            (f->repr >> 0)] +
4854
28.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4855
28.1k
                                                            (f->repr >> 4)] +
4856
28.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4857
28.1k
                                                            (f->repr >> 8)] +
4858
28.1k
         wuffs_private_impl__pixel_format__bits_per_channel[0x0F &
4859
28.1k
                                                            (f->repr >> 12)];
4860
28.1k
}
4861
4862
static inline uint32_t  //
4863
wuffs_base__pixel_format__default_background_color(
4864
5.92k
    const wuffs_base__pixel_format* f) {
4865
5.92k
  return ((f->repr & 0x03000000) == 0) ? 0xFF000000   // Opaque black.
4866
5.92k
                                       : 0x00000000;  // Transparent black.
4867
5.92k
}
4868
4869
static inline bool  //
4870
0
wuffs_base__pixel_format__is_direct(const wuffs_base__pixel_format* f) {
4871
0
  return ((f->repr >> 18) & 0x01) == 0;
4872
0
}
4873
4874
static inline bool  //
4875
22.4k
wuffs_base__pixel_format__is_indexed(const wuffs_base__pixel_format* f) {
4876
22.4k
  return ((f->repr >> 18) & 0x01) != 0;
4877
22.4k
}
4878
4879
static inline bool  //
4880
0
wuffs_base__pixel_format__is_interleaved(const wuffs_base__pixel_format* f) {
4881
0
  return ((f->repr >> 16) & 0x03) == 0;
4882
0
}
4883
4884
static inline bool  //
4885
7.79k
wuffs_base__pixel_format__is_planar(const wuffs_base__pixel_format* f) {
4886
7.79k
  return ((f->repr >> 16) & 0x03) != 0;
4887
7.79k
}
4888
4889
static inline uint32_t  //
4890
0
wuffs_base__pixel_format__coloration(const wuffs_base__pixel_format* f) {
4891
0
  uint32_t n = (f->repr) >> 29;
4892
0
  return (n <= 1) ? n : 3;
4893
0
}
4894
4895
static inline uint32_t  //
4896
0
wuffs_base__pixel_format__num_planes(const wuffs_base__pixel_format* f) {
4897
0
  return ((f->repr >> 16) & 0x03) + 1;
4898
0
}
4899
4900
static inline wuffs_base__pixel_alpha_transparency  //
4901
0
wuffs_base__pixel_format__transparency(const wuffs_base__pixel_format* f) {
4902
0
  return (wuffs_base__pixel_alpha_transparency)((f->repr >> 24) & 0x03);
4903
0
}
4904
4905
#ifdef __cplusplus
4906
4907
inline bool  //
4908
wuffs_base__pixel_format::is_valid() const {
4909
  return wuffs_base__pixel_format__is_valid(this);
4910
}
4911
4912
inline uint32_t  //
4913
wuffs_base__pixel_format::bits_per_pixel() const {
4914
  return wuffs_base__pixel_format__bits_per_pixel(this);
4915
}
4916
4917
inline uint32_t  //
4918
wuffs_base__pixel_format::default_background_color() const {
4919
  return wuffs_base__pixel_format__default_background_color(this);
4920
}
4921
4922
inline bool  //
4923
wuffs_base__pixel_format::is_direct() const {
4924
  return wuffs_base__pixel_format__is_direct(this);
4925
}
4926
4927
inline bool  //
4928
wuffs_base__pixel_format::is_indexed() const {
4929
  return wuffs_base__pixel_format__is_indexed(this);
4930
}
4931
4932
inline bool  //
4933
wuffs_base__pixel_format::is_interleaved() const {
4934
  return wuffs_base__pixel_format__is_interleaved(this);
4935
}
4936
4937
inline bool  //
4938
wuffs_base__pixel_format::is_planar() const {
4939
  return wuffs_base__pixel_format__is_planar(this);
4940
}
4941
4942
inline uint32_t  //
4943
wuffs_base__pixel_format::coloration() const {
4944
  return wuffs_base__pixel_format__coloration(this);
4945
}
4946
4947
inline uint32_t  //
4948
wuffs_base__pixel_format::num_planes() const {
4949
  return wuffs_base__pixel_format__num_planes(this);
4950
}
4951
4952
inline wuffs_base__pixel_alpha_transparency  //
4953
wuffs_base__pixel_format::transparency() const {
4954
  return wuffs_base__pixel_format__transparency(this);
4955
}
4956
4957
#endif  // __cplusplus
4958
4959
// --------
4960
4961
// wuffs_base__pixel_subsampling encodes whether sample values cover one pixel
4962
// or cover multiple pixels.
4963
//
4964
// See https://github.com/google/wuffs/blob/main/doc/note/pixel-subsampling.md
4965
//
4966
// Do not manipulate its bits directly; they are private implementation
4967
// details. Use methods such as wuffs_base__pixel_subsampling__bias_x instead.
4968
typedef struct wuffs_base__pixel_subsampling__struct {
4969
  uint32_t repr;
4970
4971
#ifdef __cplusplus
4972
  inline uint32_t bias_x(uint32_t plane) const;
4973
  inline uint32_t denominator_x(uint32_t plane) const;
4974
  inline uint32_t bias_y(uint32_t plane) const;
4975
  inline uint32_t denominator_y(uint32_t plane) const;
4976
#endif  // __cplusplus
4977
4978
} wuffs_base__pixel_subsampling;
4979
4980
static inline wuffs_base__pixel_subsampling  //
4981
0
wuffs_base__make_pixel_subsampling(uint32_t repr) {
4982
0
  wuffs_base__pixel_subsampling s;
4983
0
  s.repr = repr;
4984
0
  return s;
4985
0
}
4986
4987
1.98k
#define WUFFS_BASE__PIXEL_SUBSAMPLING__NONE 0x00000000
4988
4989
#define WUFFS_BASE__PIXEL_SUBSAMPLING__444 0x000000
4990
#define WUFFS_BASE__PIXEL_SUBSAMPLING__440 0x010100
4991
#define WUFFS_BASE__PIXEL_SUBSAMPLING__422 0x101000
4992
#define WUFFS_BASE__PIXEL_SUBSAMPLING__420 0x111100
4993
#define WUFFS_BASE__PIXEL_SUBSAMPLING__411 0x303000
4994
#define WUFFS_BASE__PIXEL_SUBSAMPLING__410 0x313100
4995
4996
static inline uint32_t  //
4997
wuffs_base__pixel_subsampling__bias_x(const wuffs_base__pixel_subsampling* s,
4998
0
                                      uint32_t plane) {
4999
0
  uint32_t shift = ((plane & 0x03) * 8) + 6;
5000
0
  return (s->repr >> shift) & 0x03;
5001
0
}
5002
5003
static inline uint32_t  //
5004
wuffs_base__pixel_subsampling__denominator_x(
5005
    const wuffs_base__pixel_subsampling* s,
5006
0
    uint32_t plane) {
5007
0
  uint32_t shift = ((plane & 0x03) * 8) + 4;
5008
0
  return ((s->repr >> shift) & 0x03) + 1;
5009
0
}
5010
5011
static inline uint32_t  //
5012
wuffs_base__pixel_subsampling__bias_y(const wuffs_base__pixel_subsampling* s,
5013
0
                                      uint32_t plane) {
5014
0
  uint32_t shift = ((plane & 0x03) * 8) + 2;
5015
0
  return (s->repr >> shift) & 0x03;
5016
0
}
5017
5018
static inline uint32_t  //
5019
wuffs_base__pixel_subsampling__denominator_y(
5020
    const wuffs_base__pixel_subsampling* s,
5021
0
    uint32_t plane) {
5022
0
  uint32_t shift = ((plane & 0x03) * 8) + 0;
5023
0
  return ((s->repr >> shift) & 0x03) + 1;
5024
0
}
5025
5026
#ifdef __cplusplus
5027
5028
inline uint32_t  //
5029
wuffs_base__pixel_subsampling::bias_x(uint32_t plane) const {
5030
  return wuffs_base__pixel_subsampling__bias_x(this, plane);
5031
}
5032
5033
inline uint32_t  //
5034
wuffs_base__pixel_subsampling::denominator_x(uint32_t plane) const {
5035
  return wuffs_base__pixel_subsampling__denominator_x(this, plane);
5036
}
5037
5038
inline uint32_t  //
5039
wuffs_base__pixel_subsampling::bias_y(uint32_t plane) const {
5040
  return wuffs_base__pixel_subsampling__bias_y(this, plane);
5041
}
5042
5043
inline uint32_t  //
5044
wuffs_base__pixel_subsampling::denominator_y(uint32_t plane) const {
5045
  return wuffs_base__pixel_subsampling__denominator_y(this, plane);
5046
}
5047
5048
#endif  // __cplusplus
5049
5050
// --------
5051
5052
typedef struct wuffs_base__pixel_config__struct {
5053
  // Do not access the private_impl's fields directly. There is no API/ABI
5054
  // compatibility or safety guarantee if you do so.
5055
  struct {
5056
    wuffs_base__pixel_format pixfmt;
5057
    wuffs_base__pixel_subsampling pixsub;
5058
    uint32_t width;
5059
    uint32_t height;
5060
  } private_impl;
5061
5062
#ifdef __cplusplus
5063
  inline void set(uint32_t pixfmt_repr,
5064
                  uint32_t pixsub_repr,
5065
                  uint32_t width,
5066
                  uint32_t height);
5067
  inline void invalidate();
5068
  inline bool is_valid() const;
5069
  inline wuffs_base__pixel_format pixel_format() const;
5070
  inline wuffs_base__pixel_subsampling pixel_subsampling() const;
5071
  inline wuffs_base__rect_ie_u32 bounds() const;
5072
  inline uint32_t width() const;
5073
  inline uint32_t height() const;
5074
  inline uint64_t pixbuf_len() const;
5075
#endif  // __cplusplus
5076
5077
} wuffs_base__pixel_config;
5078
5079
static inline wuffs_base__pixel_config  //
5080
0
wuffs_base__null_pixel_config(void) {
5081
0
  wuffs_base__pixel_config ret;
5082
0
  ret.private_impl.pixfmt.repr = 0;
5083
0
  ret.private_impl.pixsub.repr = 0;
5084
0
  ret.private_impl.width = 0;
5085
0
  ret.private_impl.height = 0;
5086
0
  return ret;
5087
0
}
5088
5089
// TODO: Should this function return bool? An error type?
5090
static inline void  //
5091
wuffs_base__pixel_config__set(wuffs_base__pixel_config* c,
5092
                              uint32_t pixfmt_repr,
5093
                              uint32_t pixsub_repr,
5094
                              uint32_t width,
5095
1.98k
                              uint32_t height) {
5096
1.98k
  if (!c) {
5097
0
    return;
5098
0
  }
5099
1.98k
  if (pixfmt_repr) {
5100
1.98k
    do {
5101
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
5102
      uint64_t wh = ((uint64_t)width) * ((uint64_t)height);
5103
      // TODO: handle things other than 1 byte per pixel.
5104
      if (wh > ((uint64_t)SIZE_MAX)) {
5105
        break;
5106
      }
5107
#endif
5108
1.98k
      c->private_impl.pixfmt.repr = pixfmt_repr;
5109
1.98k
      c->private_impl.pixsub.repr = pixsub_repr;
5110
1.98k
      c->private_impl.width = width;
5111
1.98k
      c->private_impl.height = height;
5112
1.98k
      return;
5113
1.98k
    } while (0);
5114
1.98k
  }
5115
5116
0
  c->private_impl.pixfmt.repr = 0;
5117
0
  c->private_impl.pixsub.repr = 0;
5118
0
  c->private_impl.width = 0;
5119
0
  c->private_impl.height = 0;
5120
0
}
5121
5122
static inline void  //
5123
0
wuffs_base__pixel_config__invalidate(wuffs_base__pixel_config* c) {
5124
0
  if (c) {
5125
0
    c->private_impl.pixfmt.repr = 0;
5126
0
    c->private_impl.pixsub.repr = 0;
5127
0
    c->private_impl.width = 0;
5128
0
    c->private_impl.height = 0;
5129
0
  }
5130
0
}
5131
5132
static inline bool  //
5133
3.90k
wuffs_base__pixel_config__is_valid(const wuffs_base__pixel_config* c) {
5134
3.90k
  return c && c->private_impl.pixfmt.repr;
5135
3.90k
}
5136
5137
static inline wuffs_base__pixel_format  //
5138
0
wuffs_base__pixel_config__pixel_format(const wuffs_base__pixel_config* c) {
5139
0
  return c ? c->private_impl.pixfmt : wuffs_base__make_pixel_format(0);
5140
0
}
5141
5142
static inline wuffs_base__pixel_subsampling  //
5143
0
wuffs_base__pixel_config__pixel_subsampling(const wuffs_base__pixel_config* c) {
5144
0
  return c ? c->private_impl.pixsub : wuffs_base__make_pixel_subsampling(0);
5145
0
}
5146
5147
static inline wuffs_base__rect_ie_u32  //
5148
0
wuffs_base__pixel_config__bounds(const wuffs_base__pixel_config* c) {
5149
0
  if (c) {
5150
0
    wuffs_base__rect_ie_u32 ret;
5151
0
    ret.min_incl_x = 0;
5152
0
    ret.min_incl_y = 0;
5153
0
    ret.max_excl_x = c->private_impl.width;
5154
0
    ret.max_excl_y = c->private_impl.height;
5155
0
    return ret;
5156
0
  }
5157
5158
0
  wuffs_base__rect_ie_u32 ret;
5159
0
  ret.min_incl_x = 0;
5160
0
  ret.min_incl_y = 0;
5161
0
  ret.max_excl_x = 0;
5162
0
  ret.max_excl_y = 0;
5163
0
  return ret;
5164
0
}
5165
5166
static inline uint32_t  //
5167
1.98k
wuffs_base__pixel_config__width(const wuffs_base__pixel_config* c) {
5168
1.98k
  return c ? c->private_impl.width : 0;
5169
1.98k
}
5170
5171
static inline uint32_t  //
5172
1.98k
wuffs_base__pixel_config__height(const wuffs_base__pixel_config* c) {
5173
1.98k
  return c ? c->private_impl.height : 0;
5174
1.98k
}
5175
5176
// TODO: this is the right API for planar (not interleaved) pixbufs? Should it
5177
// allow decoding into a color model different from the format's intrinsic one?
5178
// For example, decoding a JPEG image straight to RGBA instead of to YCbCr?
5179
static inline uint64_t  //
5180
3.89k
wuffs_base__pixel_config__pixbuf_len(const wuffs_base__pixel_config* c) {
5181
3.89k
  if (!c) {
5182
0
    return 0;
5183
0
  }
5184
3.89k
  if (wuffs_base__pixel_format__is_planar(&c->private_impl.pixfmt)) {
5185
    // TODO: support planar pixel formats, concious of pixel subsampling.
5186
0
    return 0;
5187
0
  }
5188
3.89k
  uint32_t bits_per_pixel =
5189
3.89k
      wuffs_base__pixel_format__bits_per_pixel(&c->private_impl.pixfmt);
5190
3.89k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5191
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5192
0
    return 0;
5193
0
  }
5194
3.89k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5195
5196
3.89k
  uint64_t n =
5197
3.89k
      ((uint64_t)c->private_impl.width) * ((uint64_t)c->private_impl.height);
5198
3.89k
  if (n > (UINT64_MAX / bytes_per_pixel)) {
5199
0
    return 0;
5200
0
  }
5201
3.89k
  n *= bytes_per_pixel;
5202
5203
3.89k
  if (wuffs_base__pixel_format__is_indexed(&c->private_impl.pixfmt)) {
5204
72
    if (n >
5205
72
        (UINT64_MAX - WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
5206
0
      return 0;
5207
0
    }
5208
72
    n += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5209
72
  }
5210
5211
3.89k
  return n;
5212
3.89k
}
5213
5214
#ifdef __cplusplus
5215
5216
inline void  //
5217
wuffs_base__pixel_config::set(uint32_t pixfmt_repr,
5218
                              uint32_t pixsub_repr,
5219
                              uint32_t width,
5220
                              uint32_t height) {
5221
  wuffs_base__pixel_config__set(this, pixfmt_repr, pixsub_repr, width, height);
5222
}
5223
5224
inline void  //
5225
wuffs_base__pixel_config::invalidate() {
5226
  wuffs_base__pixel_config__invalidate(this);
5227
}
5228
5229
inline bool  //
5230
wuffs_base__pixel_config::is_valid() const {
5231
  return wuffs_base__pixel_config__is_valid(this);
5232
}
5233
5234
inline wuffs_base__pixel_format  //
5235
wuffs_base__pixel_config::pixel_format() const {
5236
  return wuffs_base__pixel_config__pixel_format(this);
5237
}
5238
5239
inline wuffs_base__pixel_subsampling  //
5240
wuffs_base__pixel_config::pixel_subsampling() const {
5241
  return wuffs_base__pixel_config__pixel_subsampling(this);
5242
}
5243
5244
inline wuffs_base__rect_ie_u32  //
5245
wuffs_base__pixel_config::bounds() const {
5246
  return wuffs_base__pixel_config__bounds(this);
5247
}
5248
5249
inline uint32_t  //
5250
wuffs_base__pixel_config::width() const {
5251
  return wuffs_base__pixel_config__width(this);
5252
}
5253
5254
inline uint32_t  //
5255
wuffs_base__pixel_config::height() const {
5256
  return wuffs_base__pixel_config__height(this);
5257
}
5258
5259
inline uint64_t  //
5260
wuffs_base__pixel_config::pixbuf_len() const {
5261
  return wuffs_base__pixel_config__pixbuf_len(this);
5262
}
5263
5264
#endif  // __cplusplus
5265
5266
// --------
5267
5268
typedef struct wuffs_base__image_config__struct {
5269
  wuffs_base__pixel_config pixcfg;
5270
5271
  // Do not access the private_impl's fields directly. There is no API/ABI
5272
  // compatibility or safety guarantee if you do so.
5273
  struct {
5274
    uint64_t first_frame_io_position;
5275
    bool first_frame_is_opaque;
5276
  } private_impl;
5277
5278
#ifdef __cplusplus
5279
  inline void set(uint32_t pixfmt_repr,
5280
                  uint32_t pixsub_repr,
5281
                  uint32_t width,
5282
                  uint32_t height,
5283
                  uint64_t first_frame_io_position,
5284
                  bool first_frame_is_opaque);
5285
  inline void invalidate();
5286
  inline bool is_valid() const;
5287
  inline uint64_t first_frame_io_position() const;
5288
  inline bool first_frame_is_opaque() const;
5289
#endif  // __cplusplus
5290
5291
} wuffs_base__image_config;
5292
5293
static inline wuffs_base__image_config  //
5294
0
wuffs_base__null_image_config(void) {
5295
0
  wuffs_base__image_config ret;
5296
0
  ret.pixcfg = wuffs_base__null_pixel_config();
5297
0
  ret.private_impl.first_frame_io_position = 0;
5298
0
  ret.private_impl.first_frame_is_opaque = false;
5299
0
  return ret;
5300
0
}
5301
5302
// TODO: Should this function return bool? An error type?
5303
static inline void  //
5304
wuffs_base__image_config__set(wuffs_base__image_config* c,
5305
                              uint32_t pixfmt_repr,
5306
                              uint32_t pixsub_repr,
5307
                              uint32_t width,
5308
                              uint32_t height,
5309
                              uint64_t first_frame_io_position,
5310
3.90k
                              bool first_frame_is_opaque) {
5311
3.90k
  if (!c) {
5312
0
    return;
5313
0
  }
5314
3.90k
  if (pixfmt_repr) {
5315
3.90k
    c->pixcfg.private_impl.pixfmt.repr = pixfmt_repr;
5316
3.90k
    c->pixcfg.private_impl.pixsub.repr = pixsub_repr;
5317
3.90k
    c->pixcfg.private_impl.width = width;
5318
3.90k
    c->pixcfg.private_impl.height = height;
5319
3.90k
    c->private_impl.first_frame_io_position = first_frame_io_position;
5320
3.90k
    c->private_impl.first_frame_is_opaque = first_frame_is_opaque;
5321
3.90k
    return;
5322
3.90k
  }
5323
5324
0
  c->pixcfg.private_impl.pixfmt.repr = 0;
5325
0
  c->pixcfg.private_impl.pixsub.repr = 0;
5326
0
  c->pixcfg.private_impl.width = 0;
5327
0
  c->pixcfg.private_impl.height = 0;
5328
0
  c->private_impl.first_frame_io_position = 0;
5329
0
  c->private_impl.first_frame_is_opaque = 0;
5330
0
}
5331
5332
static inline void  //
5333
0
wuffs_base__image_config__invalidate(wuffs_base__image_config* c) {
5334
0
  if (c) {
5335
0
    c->pixcfg.private_impl.pixfmt.repr = 0;
5336
0
    c->pixcfg.private_impl.pixsub.repr = 0;
5337
0
    c->pixcfg.private_impl.width = 0;
5338
0
    c->pixcfg.private_impl.height = 0;
5339
0
    c->private_impl.first_frame_io_position = 0;
5340
0
    c->private_impl.first_frame_is_opaque = 0;
5341
0
  }
5342
0
}
5343
5344
static inline bool  //
5345
3.90k
wuffs_base__image_config__is_valid(const wuffs_base__image_config* c) {
5346
3.90k
  return c && wuffs_base__pixel_config__is_valid(&(c->pixcfg));
5347
3.90k
}
5348
5349
static inline uint64_t  //
5350
wuffs_base__image_config__first_frame_io_position(
5351
0
    const wuffs_base__image_config* c) {
5352
0
  return c ? c->private_impl.first_frame_io_position : 0;
5353
0
}
5354
5355
static inline bool  //
5356
wuffs_base__image_config__first_frame_is_opaque(
5357
0
    const wuffs_base__image_config* c) {
5358
0
  return c ? c->private_impl.first_frame_is_opaque : false;
5359
0
}
5360
5361
#ifdef __cplusplus
5362
5363
inline void  //
5364
wuffs_base__image_config::set(uint32_t pixfmt_repr,
5365
                              uint32_t pixsub_repr,
5366
                              uint32_t width,
5367
                              uint32_t height,
5368
                              uint64_t first_frame_io_position,
5369
                              bool first_frame_is_opaque) {
5370
  wuffs_base__image_config__set(this, pixfmt_repr, pixsub_repr, width, height,
5371
                                first_frame_io_position, first_frame_is_opaque);
5372
}
5373
5374
inline void  //
5375
wuffs_base__image_config::invalidate() {
5376
  wuffs_base__image_config__invalidate(this);
5377
}
5378
5379
inline bool  //
5380
wuffs_base__image_config::is_valid() const {
5381
  return wuffs_base__image_config__is_valid(this);
5382
}
5383
5384
inline uint64_t  //
5385
wuffs_base__image_config::first_frame_io_position() const {
5386
  return wuffs_base__image_config__first_frame_io_position(this);
5387
}
5388
5389
inline bool  //
5390
wuffs_base__image_config::first_frame_is_opaque() const {
5391
  return wuffs_base__image_config__first_frame_is_opaque(this);
5392
}
5393
5394
#endif  // __cplusplus
5395
5396
// --------
5397
5398
// wuffs_base__animation_disposal encodes, for an animated image, how to
5399
// dispose of a frame after displaying it:
5400
//  - None means to draw the next frame on top of this one.
5401
//  - Restore Background means to clear the frame's dirty rectangle to "the
5402
//    background color" (in practice, this means transparent black) before
5403
//    drawing the next frame.
5404
//  - Restore Previous means to undo the current frame, so that the next frame
5405
//    is drawn on top of the previous one.
5406
typedef uint8_t wuffs_base__animation_disposal;
5407
5408
#define WUFFS_BASE__ANIMATION_DISPOSAL__NONE ((wuffs_base__animation_disposal)0)
5409
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_BACKGROUND \
5410
  ((wuffs_base__animation_disposal)1)
5411
#define WUFFS_BASE__ANIMATION_DISPOSAL__RESTORE_PREVIOUS \
5412
  ((wuffs_base__animation_disposal)2)
5413
5414
// --------
5415
5416
typedef struct wuffs_base__frame_config__struct {
5417
  // Do not access the private_impl's fields directly. There is no API/ABI
5418
  // compatibility or safety guarantee if you do so.
5419
  struct {
5420
    wuffs_base__rect_ie_u32 bounds;
5421
    wuffs_base__flicks duration;
5422
    uint64_t index;
5423
    uint64_t io_position;
5424
    wuffs_base__animation_disposal disposal;
5425
    bool opaque_within_bounds;
5426
    bool overwrite_instead_of_blend;
5427
    wuffs_base__color_u32_argb_premul background_color;
5428
  } private_impl;
5429
5430
#ifdef __cplusplus
5431
  inline void set(wuffs_base__rect_ie_u32 bounds,
5432
                  wuffs_base__flicks duration,
5433
                  uint64_t index,
5434
                  uint64_t io_position,
5435
                  wuffs_base__animation_disposal disposal,
5436
                  bool opaque_within_bounds,
5437
                  bool overwrite_instead_of_blend,
5438
                  wuffs_base__color_u32_argb_premul background_color);
5439
  inline wuffs_base__rect_ie_u32 bounds() const;
5440
  inline uint32_t width() const;
5441
  inline uint32_t height() const;
5442
  inline wuffs_base__flicks duration() const;
5443
  inline uint64_t index() const;
5444
  inline uint64_t io_position() const;
5445
  inline wuffs_base__animation_disposal disposal() const;
5446
  inline bool opaque_within_bounds() const;
5447
  inline bool overwrite_instead_of_blend() const;
5448
  inline wuffs_base__color_u32_argb_premul background_color() const;
5449
#endif  // __cplusplus
5450
5451
} wuffs_base__frame_config;
5452
5453
static inline wuffs_base__frame_config  //
5454
0
wuffs_base__null_frame_config(void) {
5455
0
  wuffs_base__frame_config ret;
5456
0
  ret.private_impl.bounds = wuffs_base__make_rect_ie_u32(0, 0, 0, 0);
5457
0
  ret.private_impl.duration = 0;
5458
0
  ret.private_impl.index = 0;
5459
0
  ret.private_impl.io_position = 0;
5460
0
  ret.private_impl.disposal = 0;
5461
0
  ret.private_impl.opaque_within_bounds = false;
5462
0
  ret.private_impl.overwrite_instead_of_blend = false;
5463
0
  return ret;
5464
0
}
5465
5466
static inline void  //
5467
wuffs_base__frame_config__set(
5468
    wuffs_base__frame_config* c,
5469
    wuffs_base__rect_ie_u32 bounds,
5470
    wuffs_base__flicks duration,
5471
    uint64_t index,
5472
    uint64_t io_position,
5473
    wuffs_base__animation_disposal disposal,
5474
    bool opaque_within_bounds,
5475
    bool overwrite_instead_of_blend,
5476
5.92k
    wuffs_base__color_u32_argb_premul background_color) {
5477
5.92k
  if (!c) {
5478
0
    return;
5479
0
  }
5480
5481
5.92k
  c->private_impl.bounds = bounds;
5482
5.92k
  c->private_impl.duration = duration;
5483
5.92k
  c->private_impl.index = index;
5484
5.92k
  c->private_impl.io_position = io_position;
5485
5.92k
  c->private_impl.disposal = disposal;
5486
5.92k
  c->private_impl.opaque_within_bounds = opaque_within_bounds;
5487
5.92k
  c->private_impl.overwrite_instead_of_blend = overwrite_instead_of_blend;
5488
5.92k
  c->private_impl.background_color = background_color;
5489
5.92k
}
5490
5491
static inline wuffs_base__rect_ie_u32  //
5492
5.92k
wuffs_base__frame_config__bounds(const wuffs_base__frame_config* c) {
5493
5.92k
  if (c) {
5494
5.92k
    return c->private_impl.bounds;
5495
5.92k
  }
5496
5497
0
  wuffs_base__rect_ie_u32 ret;
5498
0
  ret.min_incl_x = 0;
5499
0
  ret.min_incl_y = 0;
5500
0
  ret.max_excl_x = 0;
5501
0
  ret.max_excl_y = 0;
5502
0
  return ret;
5503
5.92k
}
5504
5505
static inline uint32_t  //
5506
0
wuffs_base__frame_config__width(const wuffs_base__frame_config* c) {
5507
0
  return c ? wuffs_base__rect_ie_u32__width(&c->private_impl.bounds) : 0;
5508
0
}
5509
5510
static inline uint32_t  //
5511
0
wuffs_base__frame_config__height(const wuffs_base__frame_config* c) {
5512
0
  return c ? wuffs_base__rect_ie_u32__height(&c->private_impl.bounds) : 0;
5513
0
}
5514
5515
// wuffs_base__frame_config__duration returns the amount of time to display
5516
// this frame. Zero means to display forever - a still (non-animated) image.
5517
static inline wuffs_base__flicks  //
5518
0
wuffs_base__frame_config__duration(const wuffs_base__frame_config* c) {
5519
0
  return c ? c->private_impl.duration : 0;
5520
0
}
5521
5522
// wuffs_base__frame_config__index returns the index of this frame. The first
5523
// frame in an image has index 0, the second frame has index 1, and so on.
5524
static inline uint64_t  //
5525
0
wuffs_base__frame_config__index(const wuffs_base__frame_config* c) {
5526
0
  return c ? c->private_impl.index : 0;
5527
0
}
5528
5529
// wuffs_base__frame_config__io_position returns the I/O stream position before
5530
// the frame config.
5531
static inline uint64_t  //
5532
0
wuffs_base__frame_config__io_position(const wuffs_base__frame_config* c) {
5533
0
  return c ? c->private_impl.io_position : 0;
5534
0
}
5535
5536
// wuffs_base__frame_config__disposal returns, for an animated image, how to
5537
// dispose of this frame after displaying it.
5538
static inline wuffs_base__animation_disposal  //
5539
0
wuffs_base__frame_config__disposal(const wuffs_base__frame_config* c) {
5540
0
  return c ? c->private_impl.disposal : 0;
5541
0
}
5542
5543
// wuffs_base__frame_config__opaque_within_bounds returns whether all pixels
5544
// within the frame's bounds are fully opaque. It makes no claim about pixels
5545
// outside the frame bounds but still inside the overall image. The two
5546
// bounding rectangles can differ for animated images.
5547
//
5548
// Its semantics are conservative. It is valid for a fully opaque frame to have
5549
// this value be false: a false negative.
5550
//
5551
// If true, drawing the frame with WUFFS_BASE__PIXEL_BLEND__SRC and
5552
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER should be equivalent, in terms of
5553
// resultant pixels, but the former may be faster.
5554
static inline bool  //
5555
wuffs_base__frame_config__opaque_within_bounds(
5556
0
    const wuffs_base__frame_config* c) {
5557
0
  return c && c->private_impl.opaque_within_bounds;
5558
0
}
5559
5560
// wuffs_base__frame_config__overwrite_instead_of_blend returns, for an
5561
// animated image, whether to ignore the previous image state (within the frame
5562
// bounds) when drawing this incremental frame. Equivalently, whether to use
5563
// WUFFS_BASE__PIXEL_BLEND__SRC instead of WUFFS_BASE__PIXEL_BLEND__SRC_OVER.
5564
//
5565
// The WebP spec (https://developers.google.com/speed/webp/docs/riff_container)
5566
// calls this the "Blending method" bit. WebP's "Do not blend" corresponds to
5567
// Wuffs' "overwrite_instead_of_blend".
5568
static inline bool  //
5569
wuffs_base__frame_config__overwrite_instead_of_blend(
5570
0
    const wuffs_base__frame_config* c) {
5571
0
  return c && c->private_impl.overwrite_instead_of_blend;
5572
0
}
5573
5574
static inline wuffs_base__color_u32_argb_premul  //
5575
0
wuffs_base__frame_config__background_color(const wuffs_base__frame_config* c) {
5576
0
  return c ? c->private_impl.background_color : 0;
5577
0
}
5578
5579
#ifdef __cplusplus
5580
5581
inline void  //
5582
wuffs_base__frame_config::set(
5583
    wuffs_base__rect_ie_u32 bounds,
5584
    wuffs_base__flicks duration,
5585
    uint64_t index,
5586
    uint64_t io_position,
5587
    wuffs_base__animation_disposal disposal,
5588
    bool opaque_within_bounds,
5589
    bool overwrite_instead_of_blend,
5590
    wuffs_base__color_u32_argb_premul background_color) {
5591
  wuffs_base__frame_config__set(this, bounds, duration, index, io_position,
5592
                                disposal, opaque_within_bounds,
5593
                                overwrite_instead_of_blend, background_color);
5594
}
5595
5596
inline wuffs_base__rect_ie_u32  //
5597
wuffs_base__frame_config::bounds() const {
5598
  return wuffs_base__frame_config__bounds(this);
5599
}
5600
5601
inline uint32_t  //
5602
wuffs_base__frame_config::width() const {
5603
  return wuffs_base__frame_config__width(this);
5604
}
5605
5606
inline uint32_t  //
5607
wuffs_base__frame_config::height() const {
5608
  return wuffs_base__frame_config__height(this);
5609
}
5610
5611
inline wuffs_base__flicks  //
5612
wuffs_base__frame_config::duration() const {
5613
  return wuffs_base__frame_config__duration(this);
5614
}
5615
5616
inline uint64_t  //
5617
wuffs_base__frame_config::index() const {
5618
  return wuffs_base__frame_config__index(this);
5619
}
5620
5621
inline uint64_t  //
5622
wuffs_base__frame_config::io_position() const {
5623
  return wuffs_base__frame_config__io_position(this);
5624
}
5625
5626
inline wuffs_base__animation_disposal  //
5627
wuffs_base__frame_config::disposal() const {
5628
  return wuffs_base__frame_config__disposal(this);
5629
}
5630
5631
inline bool  //
5632
wuffs_base__frame_config::opaque_within_bounds() const {
5633
  return wuffs_base__frame_config__opaque_within_bounds(this);
5634
}
5635
5636
inline bool  //
5637
wuffs_base__frame_config::overwrite_instead_of_blend() const {
5638
  return wuffs_base__frame_config__overwrite_instead_of_blend(this);
5639
}
5640
5641
inline wuffs_base__color_u32_argb_premul  //
5642
wuffs_base__frame_config::background_color() const {
5643
  return wuffs_base__frame_config__background_color(this);
5644
}
5645
5646
#endif  // __cplusplus
5647
5648
// --------
5649
5650
typedef struct wuffs_base__pixel_buffer__struct {
5651
  wuffs_base__pixel_config pixcfg;
5652
5653
  // Do not access the private_impl's fields directly. There is no API/ABI
5654
  // compatibility or safety guarantee if you do so.
5655
  struct {
5656
    wuffs_base__table_u8 planes[WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL];
5657
    // TODO: color spaces.
5658
  } private_impl;
5659
5660
#ifdef __cplusplus
5661
  inline wuffs_base__status set_interleaved(
5662
      const wuffs_base__pixel_config* pixcfg,
5663
      wuffs_base__table_u8 primary_memory,
5664
      wuffs_base__slice_u8 palette_memory);
5665
  inline wuffs_base__status set_from_slice(
5666
      const wuffs_base__pixel_config* pixcfg,
5667
      wuffs_base__slice_u8 pixbuf_memory);
5668
  inline wuffs_base__slice_u8 palette();
5669
  inline wuffs_base__slice_u8 palette_or_else(wuffs_base__slice_u8 fallback);
5670
  inline wuffs_base__pixel_format pixel_format() const;
5671
  inline wuffs_base__table_u8 plane(uint32_t p);
5672
  inline wuffs_base__color_u32_argb_premul color_u32_at(uint32_t x,
5673
                                                        uint32_t y) const;
5674
  inline wuffs_base__status set_color_u32_at(
5675
      uint32_t x,
5676
      uint32_t y,
5677
      wuffs_base__color_u32_argb_premul color);
5678
  inline wuffs_base__status set_color_u32_fill_rect(
5679
      wuffs_base__rect_ie_u32 rect,
5680
      wuffs_base__color_u32_argb_premul color);
5681
  inline bool is_opaque();
5682
#endif  // __cplusplus
5683
5684
} wuffs_base__pixel_buffer;
5685
5686
static inline wuffs_base__pixel_buffer  //
5687
0
wuffs_base__null_pixel_buffer(void) {
5688
0
  wuffs_base__pixel_buffer ret;
5689
0
  ret.pixcfg = wuffs_base__null_pixel_config();
5690
0
  ret.private_impl.planes[0] = wuffs_base__empty_table_u8();
5691
0
  ret.private_impl.planes[1] = wuffs_base__empty_table_u8();
5692
0
  ret.private_impl.planes[2] = wuffs_base__empty_table_u8();
5693
0
  ret.private_impl.planes[3] = wuffs_base__empty_table_u8();
5694
0
  return ret;
5695
0
}
5696
5697
static inline wuffs_base__status  //
5698
wuffs_base__pixel_buffer__set_interleaved(
5699
    wuffs_base__pixel_buffer* pb,
5700
    const wuffs_base__pixel_config* pixcfg,
5701
    wuffs_base__table_u8 primary_memory,
5702
0
    wuffs_base__slice_u8 palette_memory) {
5703
0
  if (!pb) {
5704
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5705
0
  }
5706
0
  memset(pb, 0, sizeof(*pb));
5707
0
  if (!pixcfg ||
5708
0
      wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5709
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5710
0
  }
5711
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt) &&
5712
0
      (palette_memory.len <
5713
0
       WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH)) {
5714
0
    return wuffs_base__make_status(
5715
0
        wuffs_base__error__bad_argument_length_too_short);
5716
0
  }
5717
0
  uint32_t bits_per_pixel =
5718
0
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5719
0
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5720
0
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5721
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5722
0
  }
5723
0
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5724
0
5725
0
  uint64_t width_in_bytes =
5726
0
      ((uint64_t)pixcfg->private_impl.width) * bytes_per_pixel;
5727
0
  if ((width_in_bytes > primary_memory.width) ||
5728
0
      (pixcfg->private_impl.height > primary_memory.height)) {
5729
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5730
0
  }
5731
0
5732
0
  pb->pixcfg = *pixcfg;
5733
0
  pb->private_impl.planes[0] = primary_memory;
5734
0
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5735
0
    wuffs_base__table_u8* tab =
5736
0
        &pb->private_impl
5737
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5738
0
    tab->ptr = palette_memory.ptr;
5739
0
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5740
0
    tab->height = 1;
5741
0
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5742
0
  }
5743
0
  return wuffs_base__make_status(NULL);
5744
0
}
5745
5746
static inline wuffs_base__status  //
5747
wuffs_base__pixel_buffer__set_from_slice(wuffs_base__pixel_buffer* pb,
5748
                                         const wuffs_base__pixel_config* pixcfg,
5749
3.89k
                                         wuffs_base__slice_u8 pixbuf_memory) {
5750
3.89k
  if (!pb) {
5751
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
5752
0
  }
5753
3.89k
  memset(pb, 0, sizeof(*pb));
5754
3.89k
  if (!pixcfg) {
5755
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5756
0
  }
5757
3.89k
  if (wuffs_base__pixel_format__is_planar(&pixcfg->private_impl.pixfmt)) {
5758
    // TODO: support planar pixel formats, concious of pixel subsampling.
5759
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5760
0
  }
5761
3.89k
  uint32_t bits_per_pixel =
5762
3.89k
      wuffs_base__pixel_format__bits_per_pixel(&pixcfg->private_impl.pixfmt);
5763
3.89k
  if ((bits_per_pixel == 0) || ((bits_per_pixel % 8) != 0)) {
5764
    // TODO: support fraction-of-byte pixels, e.g. 1 bit per pixel?
5765
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
5766
0
  }
5767
3.89k
  uint64_t bytes_per_pixel = bits_per_pixel / 8;
5768
5769
3.89k
  uint8_t* ptr = pixbuf_memory.ptr;
5770
3.89k
  uint64_t len = pixbuf_memory.len;
5771
3.89k
  if (wuffs_base__pixel_format__is_indexed(&pixcfg->private_impl.pixfmt)) {
5772
    // Split a WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH byte
5773
    // chunk (1024 bytes = 256 palette entries ร— 4 bytes per entry) from the
5774
    // start of pixbuf_memory. We split from the start, not the end, so that
5775
    // the both chunks' pointers have the same alignment as the original
5776
    // pointer, up to an alignment of 1024.
5777
72
    if (len < WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
5778
0
      return wuffs_base__make_status(
5779
0
          wuffs_base__error__bad_argument_length_too_short);
5780
0
    }
5781
72
    wuffs_base__table_u8* tab =
5782
72
        &pb->private_impl
5783
72
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5784
72
    tab->ptr = ptr;
5785
72
    tab->width = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5786
72
    tab->height = 1;
5787
72
    tab->stride = WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5788
72
    ptr += WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5789
72
    len -= WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH;
5790
72
  }
5791
5792
3.89k
  uint64_t wh = ((uint64_t)pixcfg->private_impl.width) *
5793
3.89k
                ((uint64_t)pixcfg->private_impl.height);
5794
3.89k
  size_t width = (size_t)(pixcfg->private_impl.width);
5795
3.89k
  if ((wh > (UINT64_MAX / bytes_per_pixel)) ||
5796
3.89k
      (width > (SIZE_MAX / bytes_per_pixel))) {
5797
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
5798
0
  }
5799
3.89k
  wh *= bytes_per_pixel;
5800
3.89k
  width = ((size_t)(width * bytes_per_pixel));
5801
3.89k
  if (wh > len) {
5802
0
    return wuffs_base__make_status(
5803
0
        wuffs_base__error__bad_argument_length_too_short);
5804
0
  }
5805
5806
3.89k
  pb->pixcfg = *pixcfg;
5807
3.89k
  wuffs_base__table_u8* tab = &pb->private_impl.planes[0];
5808
3.89k
  tab->ptr = ptr;
5809
3.89k
  tab->width = width;
5810
3.89k
  tab->height = pixcfg->private_impl.height;
5811
3.89k
  tab->stride = width;
5812
3.89k
  return wuffs_base__make_status(NULL);
5813
3.89k
}
5814
5815
// wuffs_base__pixel_buffer__palette returns the palette color data. If
5816
// non-empty, it will have length
5817
// WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH.
5818
static inline wuffs_base__slice_u8  //
5819
0
wuffs_base__pixel_buffer__palette(wuffs_base__pixel_buffer* pb) {
5820
0
  if (pb &&
5821
0
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5822
0
    wuffs_base__table_u8* tab =
5823
0
        &pb->private_impl
5824
0
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5825
0
    if ((tab->width ==
5826
0
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5827
0
        (tab->height == 1)) {
5828
0
      return wuffs_base__make_slice_u8(
5829
0
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5830
0
    }
5831
0
  }
5832
0
  return wuffs_base__empty_slice_u8();
5833
0
}
5834
5835
static inline wuffs_base__slice_u8  //
5836
wuffs_base__pixel_buffer__palette_or_else(wuffs_base__pixel_buffer* pb,
5837
14.6k
                                          wuffs_base__slice_u8 fallback) {
5838
14.6k
  if (pb &&
5839
14.6k
      wuffs_base__pixel_format__is_indexed(&pb->pixcfg.private_impl.pixfmt)) {
5840
1.14k
    wuffs_base__table_u8* tab =
5841
1.14k
        &pb->private_impl
5842
1.14k
             .planes[WUFFS_BASE__PIXEL_FORMAT__INDEXED__COLOR_PLANE];
5843
1.14k
    if ((tab->width ==
5844
1.14k
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) &&
5845
1.14k
        (tab->height == 1)) {
5846
1.14k
      return wuffs_base__make_slice_u8(
5847
1.14k
          tab->ptr, WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH);
5848
1.14k
    }
5849
1.14k
  }
5850
13.5k
  return fallback;
5851
14.6k
}
5852
5853
static inline wuffs_base__pixel_format  //
5854
14.6k
wuffs_base__pixel_buffer__pixel_format(const wuffs_base__pixel_buffer* pb) {
5855
14.6k
  if (pb) {
5856
14.6k
    return pb->pixcfg.private_impl.pixfmt;
5857
14.6k
  }
5858
0
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__INVALID);
5859
14.6k
}
5860
5861
static inline wuffs_base__table_u8  //
5862
9.03k
wuffs_base__pixel_buffer__plane(wuffs_base__pixel_buffer* pb, uint32_t p) {
5863
9.03k
  if (pb && (p < WUFFS_BASE__PIXEL_FORMAT__NUM_PLANES_MAX_INCL)) {
5864
9.03k
    return pb->private_impl.planes[p];
5865
9.03k
  }
5866
5867
0
  wuffs_base__table_u8 ret;
5868
0
  ret.ptr = NULL;
5869
0
  ret.width = 0;
5870
0
  ret.height = 0;
5871
0
  ret.stride = 0;
5872
0
  return ret;
5873
9.03k
}
5874
5875
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
5876
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
5877
                                       uint32_t x,
5878
                                       uint32_t y);
5879
5880
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5881
wuffs_base__pixel_buffer__set_color_u32_at(
5882
    wuffs_base__pixel_buffer* pb,
5883
    uint32_t x,
5884
    uint32_t y,
5885
    wuffs_base__color_u32_argb_premul color);
5886
5887
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
5888
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
5889
    wuffs_base__pixel_buffer* pb,
5890
    wuffs_base__rect_ie_u32 rect,
5891
    wuffs_base__color_u32_argb_premul color);
5892
5893
WUFFS_BASE__MAYBE_STATIC bool  //
5894
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb);
5895
5896
#ifdef __cplusplus
5897
5898
inline wuffs_base__status  //
5899
wuffs_base__pixel_buffer::set_interleaved(
5900
    const wuffs_base__pixel_config* pixcfg_arg,
5901
    wuffs_base__table_u8 primary_memory,
5902
    wuffs_base__slice_u8 palette_memory) {
5903
  return wuffs_base__pixel_buffer__set_interleaved(
5904
      this, pixcfg_arg, primary_memory, palette_memory);
5905
}
5906
5907
inline wuffs_base__status  //
5908
wuffs_base__pixel_buffer::set_from_slice(
5909
    const wuffs_base__pixel_config* pixcfg_arg,
5910
    wuffs_base__slice_u8 pixbuf_memory) {
5911
  return wuffs_base__pixel_buffer__set_from_slice(this, pixcfg_arg,
5912
                                                  pixbuf_memory);
5913
}
5914
5915
inline wuffs_base__slice_u8  //
5916
wuffs_base__pixel_buffer::palette() {
5917
  return wuffs_base__pixel_buffer__palette(this);
5918
}
5919
5920
inline wuffs_base__slice_u8  //
5921
wuffs_base__pixel_buffer::palette_or_else(wuffs_base__slice_u8 fallback) {
5922
  return wuffs_base__pixel_buffer__palette_or_else(this, fallback);
5923
}
5924
5925
inline wuffs_base__pixel_format  //
5926
wuffs_base__pixel_buffer::pixel_format() const {
5927
  return wuffs_base__pixel_buffer__pixel_format(this);
5928
}
5929
5930
inline wuffs_base__table_u8  //
5931
wuffs_base__pixel_buffer::plane(uint32_t p) {
5932
  return wuffs_base__pixel_buffer__plane(this, p);
5933
}
5934
5935
inline wuffs_base__color_u32_argb_premul  //
5936
wuffs_base__pixel_buffer::color_u32_at(uint32_t x, uint32_t y) const {
5937
  return wuffs_base__pixel_buffer__color_u32_at(this, x, y);
5938
}
5939
5940
inline wuffs_base__status  //
5941
wuffs_base__pixel_buffer::set_color_u32_at(
5942
    uint32_t x,
5943
    uint32_t y,
5944
    wuffs_base__color_u32_argb_premul color) {
5945
  return wuffs_base__pixel_buffer__set_color_u32_at(this, x, y, color);
5946
}
5947
5948
inline wuffs_base__status  //
5949
wuffs_base__pixel_buffer::set_color_u32_fill_rect(
5950
    wuffs_base__rect_ie_u32 rect,
5951
    wuffs_base__color_u32_argb_premul color) {
5952
  return wuffs_base__pixel_buffer__set_color_u32_fill_rect(this, rect, color);
5953
}
5954
5955
inline bool  //
5956
wuffs_base__pixel_buffer::is_opaque() {
5957
  return wuffs_base__pixel_buffer__is_opaque(this);
5958
}
5959
5960
#endif  // __cplusplus
5961
5962
// --------
5963
5964
typedef struct wuffs_base__decode_frame_options__struct {
5965
  // Do not access the private_impl's fields directly. There is no API/ABI
5966
  // compatibility or safety guarantee if you do so.
5967
  struct {
5968
    uint8_t TODO;
5969
  } private_impl;
5970
5971
#ifdef __cplusplus
5972
#endif  // __cplusplus
5973
5974
} wuffs_base__decode_frame_options;
5975
5976
#ifdef __cplusplus
5977
5978
#endif  // __cplusplus
5979
5980
// --------
5981
5982
// wuffs_base__pixel_palette__closest_element returns the index of the palette
5983
// element that minimizes the sum of squared differences of the four ARGB
5984
// channels, working in premultiplied alpha. Ties favor the smaller index.
5985
//
5986
// The palette_slice.len may equal (N*4), for N less than 256, which means that
5987
// only the first N palette elements are considered. It returns 0 when N is 0.
5988
//
5989
// Applying this function on a per-pixel basis will not produce whole-of-image
5990
// dithering.
5991
WUFFS_BASE__MAYBE_STATIC uint8_t  //
5992
wuffs_base__pixel_palette__closest_element(
5993
    wuffs_base__slice_u8 palette_slice,
5994
    wuffs_base__pixel_format palette_format,
5995
    wuffs_base__color_u32_argb_premul c);
5996
5997
// --------
5998
5999
// TODO: should the func type take restrict pointers?
6000
typedef uint64_t (*wuffs_base__pixel_swizzler__func)(uint8_t* dst_ptr,
6001
                                                     size_t dst_len,
6002
                                                     uint8_t* dst_palette_ptr,
6003
                                                     size_t dst_palette_len,
6004
                                                     const uint8_t* src_ptr,
6005
                                                     size_t src_len);
6006
6007
typedef uint64_t (*wuffs_base__pixel_swizzler__transparent_black_func)(
6008
    uint8_t* dst_ptr,
6009
    size_t dst_len,
6010
    uint8_t* dst_palette_ptr,
6011
    size_t dst_palette_len,
6012
    uint64_t num_pixels,
6013
    uint32_t dst_pixfmt_bytes_per_pixel);
6014
6015
typedef struct wuffs_base__pixel_swizzler__struct {
6016
  // Do not access the private_impl's fields directly. There is no API/ABI
6017
  // compatibility or safety guarantee if you do so.
6018
  struct {
6019
    wuffs_base__pixel_swizzler__func func;
6020
    wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func;
6021
    uint32_t dst_pixfmt_bytes_per_pixel;
6022
    uint32_t src_pixfmt_bytes_per_pixel;
6023
  } private_impl;
6024
6025
#ifdef __cplusplus
6026
  inline wuffs_base__status prepare(wuffs_base__pixel_format dst_pixfmt,
6027
                                    wuffs_base__slice_u8 dst_palette,
6028
                                    wuffs_base__pixel_format src_pixfmt,
6029
                                    wuffs_base__slice_u8 src_palette,
6030
                                    wuffs_base__pixel_blend blend);
6031
  inline uint64_t swizzle_interleaved_from_slice(
6032
      wuffs_base__slice_u8 dst,
6033
      wuffs_base__slice_u8 dst_palette,
6034
      wuffs_base__slice_u8 src) const;
6035
#endif  // __cplusplus
6036
6037
} wuffs_base__pixel_swizzler;
6038
6039
// wuffs_base__pixel_swizzler__prepare readies the pixel swizzler so that its
6040
// other methods may be called.
6041
//
6042
// For modular builds that divide the base module into sub-modules, using this
6043
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
6044
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6045
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
6046
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
6047
                                    wuffs_base__pixel_format dst_pixfmt,
6048
                                    wuffs_base__slice_u8 dst_palette,
6049
                                    wuffs_base__pixel_format src_pixfmt,
6050
                                    wuffs_base__slice_u8 src_palette,
6051
                                    wuffs_base__pixel_blend blend);
6052
6053
// wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice converts pixels
6054
// from a source format to a destination format.
6055
//
6056
// For modular builds that divide the base module into sub-modules, using this
6057
// function requires the WUFFS_CONFIG__MODULE__BASE__PIXCONV sub-module, not
6058
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6059
WUFFS_BASE__MAYBE_STATIC uint64_t  //
6060
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
6061
    const wuffs_base__pixel_swizzler* p,
6062
    wuffs_base__slice_u8 dst,
6063
    wuffs_base__slice_u8 dst_palette,
6064
    wuffs_base__slice_u8 src);
6065
6066
#ifdef __cplusplus
6067
6068
inline wuffs_base__status  //
6069
wuffs_base__pixel_swizzler::prepare(wuffs_base__pixel_format dst_pixfmt,
6070
                                    wuffs_base__slice_u8 dst_palette,
6071
                                    wuffs_base__pixel_format src_pixfmt,
6072
                                    wuffs_base__slice_u8 src_palette,
6073
                                    wuffs_base__pixel_blend blend) {
6074
  return wuffs_base__pixel_swizzler__prepare(this, dst_pixfmt, dst_palette,
6075
                                             src_pixfmt, src_palette, blend);
6076
}
6077
6078
uint64_t  //
6079
wuffs_base__pixel_swizzler::swizzle_interleaved_from_slice(
6080
    wuffs_base__slice_u8 dst,
6081
    wuffs_base__slice_u8 dst_palette,
6082
    wuffs_base__slice_u8 src) const {
6083
  return wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
6084
      this, dst, dst_palette, src);
6085
}
6086
6087
#endif  // __cplusplus
6088
6089
// ---------------- String Conversions
6090
6091
// Options (bitwise or'ed together) for wuffs_base__parse_number_xxx
6092
// functions. The XXX options apply to both integer and floating point. The FXX
6093
// options apply only to floating point.
6094
6095
#define WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6096
6097
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES means to accept
6098
// inputs like "00", "0644" and "00.7". By default, they are rejected.
6099
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES \
6100
0
  ((uint32_t)0x00000001)
6101
6102
// WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES means to accept inputs like
6103
// "1__2" and "_3.141_592". By default, they are rejected.
6104
0
#define WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES ((uint32_t)0x00000002)
6105
6106
// WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to accept
6107
// "1,5" and not "1.5" as one-and-a-half.
6108
//
6109
// If the caller wants to accept either, it is responsible for canonicalizing
6110
// the input before calling wuffs_base__parse_number_fxx. The caller also has
6111
// more context on e.g. exactly how to treat something like "$1,234".
6112
#define WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
6113
0
  ((uint32_t)0x00000010)
6114
6115
// WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN means to reject inputs that
6116
// would lead to infinite or Not-a-Number floating point values. By default,
6117
// they are accepted.
6118
//
6119
// This affects the literal "inf" as input, but also affects inputs like
6120
// "1e999" that would overflow double-precision floating point.
6121
0
#define WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN ((uint32_t)0x00000020)
6122
6123
// --------
6124
6125
// Options (bitwise or'ed together) for wuffs_base__render_number_xxx
6126
// functions. The XXX options apply to both integer and floating point. The FXX
6127
// options apply only to floating point.
6128
6129
#define WUFFS_BASE__RENDER_NUMBER_XXX__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6130
6131
// WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT means to render to the right side
6132
// (higher indexes) of the destination slice, leaving any untouched bytes on
6133
// the left side (lower indexes). The default is vice versa: rendering on the
6134
// left with slack on the right.
6135
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT ((uint32_t)0x00000100)
6136
6137
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN means to render the leading
6138
// "+" for non-negative numbers: "+0" and "+12.3" instead of "0" and "12.3".
6139
0
#define WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN ((uint32_t)0x00000200)
6140
6141
// WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA means to render
6142
// one-and-a-half as "1,5" instead of "1.5".
6143
#define WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA \
6144
0
  ((uint32_t)0x00001000)
6145
6146
// WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ETC means whether to never
6147
// (EXPONENT_ABSENT, equivalent to printf's "%f") or to always
6148
// (EXPONENT_PRESENT, equivalent to printf's "%e") render a floating point
6149
// number as "1.23e+05" instead of "123000".
6150
//
6151
// Having both bits set is the same has having neither bit set, where the
6152
// notation used depends on whether the exponent is sufficiently large: "0.5"
6153
// is preferred over "5e-01" but "5e-09" is preferred over "0.000000005".
6154
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT ((uint32_t)0x00002000)
6155
0
#define WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT ((uint32_t)0x00004000)
6156
6157
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION means to render the
6158
// smallest number of digits so that parsing the resultant string will recover
6159
// the same double-precision floating point number.
6160
//
6161
// For example, double-precision cannot distinguish between 0.3 and
6162
// 0.299999999999999988897769753748434595763683319091796875, so when this bit
6163
// is set, rendering the latter will produce "0.3" but rendering
6164
// 0.3000000000000000444089209850062616169452667236328125 will produce
6165
// "0.30000000000000004".
6166
#define WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION \
6167
0
  ((uint32_t)0x00008000)
6168
6169
// ---------------- IEEE 754 Floating Point
6170
6171
// wuffs_base__ieee_754_bit_representation__etc converts between a double
6172
// precision numerical value and its IEEE 754 representations:
6173
//  - 16-bit: 1 sign bit,  5 exponent bits, 10 explicit significand bits.
6174
//  - 32-bit: 1 sign bit,  8 exponent bits, 23 explicit significand bits.
6175
//  - 64-bit: 1 sign bit, 11 exponent bits, 52 explicit significand bits.
6176
//
6177
// For example, it converts between:
6178
//  - +1.0 and 0x3C00, 0x3F80_0000 or 0x3FF0_0000_0000_0000.
6179
//  - +5.5 and 0x4580, 0x40B0_0000 or 0x4016_0000_0000_0000.
6180
//  - -inf and 0xFC00, 0xFF80_0000 or 0xFFF0_0000_0000_0000.
6181
//
6182
// Converting from f64 to shorter formats (f16 or f32, represented in C as
6183
// uint16_t and uint32_t) may be lossy. Such functions have names that look
6184
// like etc_truncate, as converting finite numbers produce equal or smaller
6185
// (closer-to-zero) finite numbers. For example, 1048576.0 is a perfectly valid
6186
// f64 number, but converting it to a f16 (with truncation) produces 65504.0,
6187
// the largest finite f16 number. Truncating a f64-typed value d to f32 does
6188
// not always produce the same result as the C-style cast ((float)d), as
6189
// casting can convert from finite numbers to infinite ones.
6190
//
6191
// Converting infinities or NaNs produces infinities or NaNs and always report
6192
// no loss, even though there a multiple NaN representations so that round-
6193
// tripping a f64-typed NaN may produce a different 64 bits. Nonetheless, the
6194
// etc_truncate functions preserve a NaN's "quiet vs signaling" bit.
6195
//
6196
// See https://en.wikipedia.org/wiki/Double-precision_floating-point_format
6197
6198
typedef struct wuffs_base__lossy_value_u16__struct {
6199
  uint16_t value;
6200
  bool lossy;
6201
} wuffs_base__lossy_value_u16;
6202
6203
typedef struct wuffs_base__lossy_value_u32__struct {
6204
  uint32_t value;
6205
  bool lossy;
6206
} wuffs_base__lossy_value_u32;
6207
6208
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
6209
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f);
6210
6211
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
6212
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f);
6213
6214
static inline uint64_t  //
6215
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u64(double f) {
6216
0
  uint64_t u = 0;
6217
0
  if (sizeof(uint64_t) == sizeof(double)) {
6218
0
    memcpy(&u, &f, sizeof(uint64_t));
6219
0
  }
6220
0
  return u;
6221
0
}
6222
6223
static inline double  //
6224
0
wuffs_base__ieee_754_bit_representation__from_u16_to_f64(uint16_t u) {
6225
0
  uint64_t v = ((uint64_t)(u & 0x8000)) << 48;
6226
0
6227
0
  do {
6228
0
    uint64_t exp = (u >> 10) & 0x1F;
6229
0
    uint64_t man = u & 0x3FF;
6230
0
    if (exp == 0x1F) {  // Infinity or NaN.
6231
0
      exp = 2047;
6232
0
    } else if (exp != 0) {  // Normal.
6233
0
      exp += 1008;          // 1008 = 1023 - 15, the difference in biases.
6234
0
    } else if (man != 0) {  // Subnormal but non-zero.
6235
0
      uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
6236
0
      exp = 1062 - clz;  // 1062 = 1008 + 64 - 10.
6237
0
      man = 0x3FF & (man << (clz - 53));
6238
0
    } else {  // Zero.
6239
0
      break;
6240
0
    }
6241
0
    v |= (exp << 52) | (man << 42);
6242
0
  } while (0);
6243
0
6244
0
  double f = 0;
6245
0
  if (sizeof(uint64_t) == sizeof(double)) {
6246
0
    memcpy(&f, &v, sizeof(uint64_t));
6247
0
  }
6248
0
  return f;
6249
0
}
6250
6251
static inline double  //
6252
0
wuffs_base__ieee_754_bit_representation__from_u32_to_f64(uint32_t u) {
6253
0
  float f = 0;
6254
0
  if (sizeof(uint32_t) == sizeof(float)) {
6255
0
    memcpy(&f, &u, sizeof(uint32_t));
6256
0
  }
6257
0
  return (double)f;
6258
0
}
6259
6260
static inline double  //
6261
0
wuffs_base__ieee_754_bit_representation__from_u64_to_f64(uint64_t u) {
6262
0
  double f = 0;
6263
0
  if (sizeof(uint64_t) == sizeof(double)) {
6264
0
    memcpy(&f, &u, sizeof(uint64_t));
6265
0
  }
6266
0
  return f;
6267
0
}
6268
6269
// ---------------- Parsing and Rendering Numbers
6270
6271
// wuffs_base__parse_number_f64 parses the floating point number in s. For
6272
// example, if s contains the bytes "1.5" then it will return the double 1.5.
6273
//
6274
// It returns an error if s does not contain a floating point number.
6275
//
6276
// It does not necessarily return an error if the conversion is lossy, e.g. if
6277
// s is "0.3", which double-precision floating point cannot represent exactly.
6278
//
6279
// Similarly, the returned value may be infinite (and no error returned) even
6280
// if s was not "inf", when the input is nominally finite but sufficiently
6281
// larger than DBL_MAX, about 1.8e+308.
6282
//
6283
// It is similar to the C standard library's strtod function, but:
6284
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
6285
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
6286
//  - It does not take an optional endptr argument. It does not allow a partial
6287
//    parse: it returns an error unless all of s is consumed.
6288
//  - It does not allow whitespace, leading or otherwise.
6289
//  - It does not allow hexadecimal floating point numbers.
6290
//  - It is not affected by i18n / l10n settings such as environment variables.
6291
//
6292
// The options argument can change these, but by default, it:
6293
//  - Allows "inf", "+Infinity" and "-NAN", case insensitive. Similarly,
6294
//    without an explicit opt-out, it would successfully parse "1e999" as
6295
//    infinity, even though it overflows double-precision floating point.
6296
//  - Rejects underscores. With an explicit opt-in, "_3.141_592" would
6297
//    successfully parse as an approximation to ฯ€.
6298
//  - Rejects unnecessary leading zeroes: "00", "0644" and "00.7".
6299
//  - Uses a dot '1.5' instead of a comma '1,5' for the decimal separator.
6300
//
6301
// For modular builds that divide the base module into sub-modules, using this
6302
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6303
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6304
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
6305
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options);
6306
6307
// wuffs_base__parse_number_i64 parses the ASCII integer in s. For example, if
6308
// s contains the bytes "-123" then it will return the int64_t -123.
6309
//
6310
// It returns an error if s does not contain an integer or if the integer
6311
// within would overflow an int64_t.
6312
//
6313
// It is similar to wuffs_base__parse_number_u64 but it returns a signed
6314
// integer, not an unsigned integer. It also allows a leading '+' or '-'.
6315
//
6316
// For modular builds that divide the base module into sub-modules, using this
6317
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6318
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6319
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
6320
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options);
6321
6322
// wuffs_base__parse_number_u64 parses the ASCII integer in s. For example, if
6323
// s contains the bytes "123" then it will return the uint64_t 123.
6324
//
6325
// It returns an error if s does not contain an integer or if the integer
6326
// within would overflow a uint64_t.
6327
//
6328
// It is similar to the C standard library's strtoull function, but:
6329
//  - Errors are returned in-band (in a result type), not out-of-band (errno).
6330
//  - It takes a slice (a pointer and length), not a NUL-terminated C string.
6331
//  - It does not take an optional endptr argument. It does not allow a partial
6332
//    parse: it returns an error unless all of s is consumed.
6333
//  - It does not allow whitespace, leading or otherwise.
6334
//  - It does not allow a leading '+' or '-'.
6335
//  - It does not take a base argument (e.g. base 10 vs base 16). Instead, it
6336
//    always accepts both decimal (e.g "1234", "0d5678") and hexadecimal (e.g.
6337
//    "0x9aBC"). The caller is responsible for prior filtering of e.g. hex
6338
//    numbers if they are unwanted. For example, Wuffs' JSON decoder will only
6339
//    produce a wuffs_base__token for decimal numbers, not hexadecimal.
6340
//  - It is not affected by i18n / l10n settings such as environment variables.
6341
//
6342
// The options argument can change these, but by default, it:
6343
//  - Rejects underscores. With an explicit opt-in, "__0D_1_002" would
6344
//    successfully parse as "one thousand and two". Underscores are still
6345
//    rejected inside the optional 2-byte opening "0d" or "0X" that denotes
6346
//    base-10 or base-16.
6347
//  - Rejects unnecessary leading zeroes: "00" and "0644".
6348
//
6349
// For modular builds that divide the base module into sub-modules, using this
6350
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6351
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6352
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
6353
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options);
6354
6355
// --------
6356
6357
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL is the string length of
6358
// "-9223372036854775808" and "+9223372036854775807", INT64_MIN and INT64_MAX.
6359
#define WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL 20
6360
6361
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL is the string length of
6362
// "+18446744073709551615", UINT64_MAX.
6363
#define WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL 21
6364
6365
// wuffs_base__render_number_f64 writes the decimal encoding of x to dst and
6366
// returns the number of bytes written. If dst is shorter than the entire
6367
// encoding, it returns 0 (and no bytes are written).
6368
//
6369
// For those familiar with C's printf or Go's fmt.Printf functions:
6370
//  - "%e" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT option.
6371
//  - "%f" means the WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT  option.
6372
//  - "%g" means neither or both bits are set.
6373
//
6374
// The precision argument controls the number of digits rendered, excluding the
6375
// exponent (the "e+05" in "1.23e+05"):
6376
//  - for "%e" and "%f" it is the number of digits after the decimal separator,
6377
//  - for "%g" it is the number of significant digits (and trailing zeroes are
6378
//    removed).
6379
//
6380
// A precision of 6 gives similar output to printf's defaults.
6381
//
6382
// A precision greater than 4095 is equivalent to 4095.
6383
//
6384
// The precision argument is ignored when the
6385
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION option is set. This is
6386
// similar to Go's strconv.FormatFloat with a negative (i.e. non-sensical)
6387
// precision, but there is no corresponding feature in C's printf.
6388
//
6389
// Extreme values of x will be rendered as "NaN", "Inf" (or "+Inf" if the
6390
// WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN option is set) or "-Inf".
6391
//
6392
// For modular builds that divide the base module into sub-modules, using this
6393
// function requires the WUFFS_CONFIG__MODULE__BASE__FLOATCONV sub-module, not
6394
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6395
WUFFS_BASE__MAYBE_STATIC size_t  //
6396
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
6397
                              double x,
6398
                              uint32_t precision,
6399
                              uint32_t options);
6400
6401
// wuffs_base__render_number_i64 writes the decimal encoding of x to dst and
6402
// returns the number of bytes written. If dst is shorter than the entire
6403
// encoding, it returns 0 (and no bytes are written).
6404
//
6405
// dst will never be too short if its length is at least 20, also known as
6406
// WUFFS_BASE__I64__BYTE_LENGTH__MAX_INCL.
6407
//
6408
// For modular builds that divide the base module into sub-modules, using this
6409
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6410
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6411
WUFFS_BASE__MAYBE_STATIC size_t  //
6412
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
6413
                              int64_t x,
6414
                              uint32_t options);
6415
6416
// wuffs_base__render_number_u64 writes the decimal encoding of x to dst and
6417
// returns the number of bytes written. If dst is shorter than the entire
6418
// encoding, it returns 0 (and no bytes are written).
6419
//
6420
// dst will never be too short if its length is at least 21, also known as
6421
// WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL.
6422
//
6423
// For modular builds that divide the base module into sub-modules, using this
6424
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6425
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6426
WUFFS_BASE__MAYBE_STATIC size_t  //
6427
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
6428
                              uint64_t x,
6429
                              uint32_t options);
6430
6431
// ---------------- Base-16
6432
6433
// Options (bitwise or'ed together) for wuffs_base__base_16__xxx functions.
6434
6435
#define WUFFS_BASE__BASE_16__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6436
6437
// wuffs_base__base_16__decode2 converts "6A6b" to "jk", where e.g. 'j' is
6438
// U+006A. There are 2 src bytes for every dst byte.
6439
//
6440
// It assumes that the src bytes are two hexadecimal digits (0-9, A-F, a-f),
6441
// repeated. It may write nonsense bytes if not, although it will not read or
6442
// write out of bounds.
6443
//
6444
// For modular builds that divide the base module into sub-modules, using this
6445
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6446
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6447
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6448
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
6449
                             wuffs_base__slice_u8 src,
6450
                             bool src_closed,
6451
                             uint32_t options);
6452
6453
// wuffs_base__base_16__decode4 converts both "\\x6A\\x6b" and "??6a??6B" to
6454
// "jk", where e.g. 'j' is U+006A. There are 4 src bytes for every dst byte.
6455
//
6456
// It assumes that the src bytes are two ignored bytes and then two hexadecimal
6457
// digits (0-9, A-F, a-f), repeated. It may write nonsense bytes if not,
6458
// although it will not read or write out of bounds.
6459
//
6460
// For modular builds that divide the base module into sub-modules, using this
6461
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6462
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6463
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6464
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
6465
                             wuffs_base__slice_u8 src,
6466
                             bool src_closed,
6467
                             uint32_t options);
6468
6469
// wuffs_base__base_16__encode2 converts "jk" to "6A6B", where e.g. 'j' is
6470
// U+006A. There are 2 dst bytes for every src byte.
6471
//
6472
// For modular builds that divide the base module into sub-modules, using this
6473
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6474
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6475
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6476
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
6477
                             wuffs_base__slice_u8 src,
6478
                             bool src_closed,
6479
                             uint32_t options);
6480
6481
// wuffs_base__base_16__encode4 converts "jk" to "\\x6A\\x6B", where e.g. 'j'
6482
// is U+006A. There are 4 dst bytes for every src byte.
6483
//
6484
// For modular builds that divide the base module into sub-modules, using this
6485
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6486
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6487
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6488
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
6489
                             wuffs_base__slice_u8 src,
6490
                             bool src_closed,
6491
                             uint32_t options);
6492
6493
// ---------------- Base-64
6494
6495
// Options (bitwise or'ed together) for wuffs_base__base_64__xxx functions.
6496
6497
#define WUFFS_BASE__BASE_64__DEFAULT_OPTIONS ((uint32_t)0x00000000)
6498
6499
// WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING means that, when decoding base-64,
6500
// the input may (but does not need to) be padded with '=' bytes so that the
6501
// overall encoded length in bytes is a multiple of 4. A successful decoding
6502
// will return a num_src that includes those padding bytes.
6503
//
6504
// Excess padding (e.g. three final '='s) will be rejected as bad data.
6505
0
#define WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING ((uint32_t)0x00000001)
6506
6507
// WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING means that, when encoding base-64,
6508
// the output will be padded with '=' bytes so that the overall encoded length
6509
// in bytes is a multiple of 4.
6510
0
#define WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING ((uint32_t)0x00000002)
6511
6512
// WUFFS_BASE__BASE_64__URL_ALPHABET means that, for base-64, the URL-friendly
6513
// and file-name-friendly alphabet be used, as per RFC 4648 section 5. When
6514
// this option bit is off, the standard alphabet from section 4 is used.
6515
0
#define WUFFS_BASE__BASE_64__URL_ALPHABET ((uint32_t)0x00000100)
6516
6517
// wuffs_base__base_64__decode transforms base-64 encoded bytes from src to
6518
// arbitrary bytes in dst.
6519
//
6520
// It will not permit line breaks or other whitespace in src. Filtering those
6521
// out is the responsibility of the caller.
6522
//
6523
// For modular builds that divide the base module into sub-modules, using this
6524
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6525
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6526
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6527
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
6528
                            wuffs_base__slice_u8 src,
6529
                            bool src_closed,
6530
                            uint32_t options);
6531
6532
// wuffs_base__base_64__encode transforms arbitrary bytes from src to base-64
6533
// encoded bytes in dst.
6534
//
6535
// For modular builds that divide the base module into sub-modules, using this
6536
// function requires the WUFFS_CONFIG__MODULE__BASE__INTCONV sub-module, not
6537
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6538
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
6539
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
6540
                            wuffs_base__slice_u8 src,
6541
                            bool src_closed,
6542
                            uint32_t options);
6543
6544
// ---------------- Unicode and UTF-8
6545
6546
#define WUFFS_BASE__UNICODE_CODE_POINT__MIN_INCL 0x00000000
6547
#define WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL 0x0010FFFF
6548
6549
0
#define WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER 0x0000FFFD
6550
6551
#define WUFFS_BASE__UNICODE_SURROGATE__MIN_INCL 0x0000D800
6552
#define WUFFS_BASE__UNICODE_SURROGATE__MAX_INCL 0x0000DFFF
6553
6554
#define WUFFS_BASE__ASCII__MIN_INCL 0x00
6555
#define WUFFS_BASE__ASCII__MAX_INCL 0x7F
6556
6557
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MIN_INCL 1
6558
#define WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL 4
6559
6560
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MIN_INCL 0x00000000
6561
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_1__CODE_POINT__MAX_INCL 0x0000007F
6562
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MIN_INCL 0x00000080
6563
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_2__CODE_POINT__MAX_INCL 0x000007FF
6564
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MIN_INCL 0x00000800
6565
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_3__CODE_POINT__MAX_INCL 0x0000FFFF
6566
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MIN_INCL 0x00010000
6567
#define WUFFS_BASE__UTF_8__BYTE_LENGTH_4__CODE_POINT__MAX_INCL 0x0010FFFF
6568
6569
// --------
6570
6571
// wuffs_base__utf_8__next__output is the type returned by
6572
// wuffs_base__utf_8__next.
6573
typedef struct wuffs_base__utf_8__next__output__struct {
6574
  uint32_t code_point;
6575
  uint32_t byte_length;
6576
6577
#ifdef __cplusplus
6578
  inline bool is_valid() const;
6579
#endif  // __cplusplus
6580
6581
} wuffs_base__utf_8__next__output;
6582
6583
static inline wuffs_base__utf_8__next__output  //
6584
wuffs_base__make_utf_8__next__output(uint32_t code_point,
6585
0
                                     uint32_t byte_length) {
6586
0
  wuffs_base__utf_8__next__output ret;
6587
0
  ret.code_point = code_point;
6588
0
  ret.byte_length = byte_length;
6589
0
  return ret;
6590
0
}
6591
6592
static inline bool  //
6593
wuffs_base__utf_8__next__output__is_valid(
6594
0
    const wuffs_base__utf_8__next__output* o) {
6595
0
  if (o) {
6596
0
    uint32_t cp = o->code_point;
6597
0
    switch (o->byte_length) {
6598
0
      case 1:
6599
0
        return (cp <= 0x7F);
6600
0
      case 2:
6601
0
        return (0x080 <= cp) && (cp <= 0x7FF);
6602
0
      case 3:
6603
0
        // Avoid the 0xD800 ..= 0xDFFF surrogate range.
6604
0
        return ((0x0800 <= cp) && (cp <= 0xD7FF)) ||
6605
0
               ((0xE000 <= cp) && (cp <= 0xFFFF));
6606
0
      case 4:
6607
0
        return (0x00010000 <= cp) && (cp <= 0x0010FFFF);
6608
0
    }
6609
0
  }
6610
0
  return false;
6611
0
}
6612
6613
#ifdef __cplusplus
6614
6615
inline bool  //
6616
wuffs_base__utf_8__next__output::is_valid() const {
6617
  return wuffs_base__utf_8__next__output__is_valid(this);
6618
}
6619
6620
#endif  // __cplusplus
6621
6622
// --------
6623
6624
// wuffs_base__utf_8__encode writes the UTF-8 encoding of code_point to s and
6625
// returns the number of bytes written. If code_point is invalid, or if s is
6626
// shorter than the entire encoding, it returns 0 (and no bytes are written).
6627
//
6628
// s will never be too short if its length is at least 4, also known as
6629
// WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL.
6630
//
6631
// For modular builds that divide the base module into sub-modules, using this
6632
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6633
// WUFFS_CONFIG__MODULE__BASE__CORE.
6634
WUFFS_BASE__MAYBE_STATIC size_t  //
6635
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point);
6636
6637
// wuffs_base__utf_8__next returns the next UTF-8 code point (and that code
6638
// point's byte length) at the start of the read-only slice (s_ptr, s_len).
6639
//
6640
// There are exactly two cases in which this function returns something where
6641
// wuffs_base__utf_8__next__output__is_valid is false:
6642
//  - If s is empty then it returns {.code_point=0, .byte_length=0}.
6643
//  - If s is non-empty and starts with invalid UTF-8 then it returns
6644
//    {.code_point=WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, .byte_length=1}.
6645
//
6646
// Otherwise, it returns something where
6647
// wuffs_base__utf_8__next__output__is_valid is true.
6648
//
6649
// In any case, it always returns an output that satisfies both of:
6650
//  - (output.code_point  <= WUFFS_BASE__UNICODE_CODE_POINT__MAX_INCL).
6651
//  - (output.byte_length <= s_len).
6652
//
6653
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6654
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6655
// code point, then this function may return something invalid. It is the
6656
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6657
//
6658
// For modular builds that divide the base module into sub-modules, using this
6659
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6660
// WUFFS_CONFIG__MODULE__BASE__CORE.
6661
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6662
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len);
6663
6664
// wuffs_base__utf_8__next_from_end is like wuffs_base__utf_8__next except that
6665
// it looks at the end of (s_ptr, s_len) instead of the start.
6666
//
6667
// For modular builds that divide the base module into sub-modules, using this
6668
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6669
// WUFFS_CONFIG__MODULE__BASE__CORE.
6670
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
6671
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len);
6672
6673
// wuffs_base__utf_8__longest_valid_prefix returns the largest n such that the
6674
// sub-slice s[..n] is valid UTF-8, where s is the read-only slice (s_ptr,
6675
// s_len).
6676
//
6677
// In particular, it returns s_len if and only if all of s is valid UTF-8.
6678
//
6679
// If s is a sub-slice of a larger slice of valid UTF-8, but that sub-slice
6680
// boundary occurs in the middle of a multi-byte UTF-8 encoding of a single
6681
// code point, then this function will return less than s_len. It is the
6682
// caller's responsibility to split on or otherwise manage UTF-8 boundaries.
6683
//
6684
// For modular builds that divide the base module into sub-modules, using this
6685
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6686
// WUFFS_CONFIG__MODULE__BASE__CORE.
6687
WUFFS_BASE__MAYBE_STATIC size_t  //
6688
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6689
6690
// wuffs_base__ascii__longest_valid_prefix returns the largest n such that the
6691
// sub-slice s[..n] is valid ASCII, where s is the read-only slice (s_ptr,
6692
// s_len).
6693
//
6694
// In particular, it returns s_len if and only if all of s is valid ASCII.
6695
// Equivalently, when none of the bytes in s have the 0x80 high bit set.
6696
//
6697
// For modular builds that divide the base module into sub-modules, using this
6698
// function requires the WUFFS_CONFIG__MODULE__BASE__UTF8 sub-module, not just
6699
// WUFFS_CONFIG__MODULE__BASE__CORE.
6700
WUFFS_BASE__MAYBE_STATIC size_t  //
6701
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len);
6702
6703
// ---------------- Interface Declarations.
6704
6705
// For modular builds that divide the base module into sub-modules, using these
6706
// functions require the WUFFS_CONFIG__MODULE__BASE__INTERFACES sub-module, not
6707
// just WUFFS_CONFIG__MODULE__BASE__CORE.
6708
6709
// --------
6710
6711
extern const char wuffs_base__hasher_u32__vtable_name[];
6712
6713
typedef struct wuffs_base__hasher_u32__func_ptrs__struct {
6714
  uint32_t (*checksum_u32)(
6715
    const void* self);
6716
  uint64_t (*get_quirk)(
6717
    const void* self,
6718
    uint32_t a_key);
6719
  wuffs_base__status (*set_quirk)(
6720
    void* self,
6721
    uint32_t a_key,
6722
    uint64_t a_value);
6723
  wuffs_base__empty_struct (*update)(
6724
    void* self,
6725
    wuffs_base__slice_u8 a_x);
6726
  uint32_t (*update_u32)(
6727
    void* self,
6728
    wuffs_base__slice_u8 a_x);
6729
} wuffs_base__hasher_u32__func_ptrs;
6730
6731
typedef struct wuffs_base__hasher_u32__struct wuffs_base__hasher_u32;
6732
6733
WUFFS_BASE__GENERATED_C_CODE
6734
WUFFS_BASE__MAYBE_STATIC uint32_t
6735
wuffs_base__hasher_u32__checksum_u32(
6736
    const wuffs_base__hasher_u32* self);
6737
6738
WUFFS_BASE__GENERATED_C_CODE
6739
WUFFS_BASE__MAYBE_STATIC uint64_t
6740
wuffs_base__hasher_u32__get_quirk(
6741
    const wuffs_base__hasher_u32* self,
6742
    uint32_t a_key);
6743
6744
WUFFS_BASE__GENERATED_C_CODE
6745
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6746
wuffs_base__hasher_u32__set_quirk(
6747
    wuffs_base__hasher_u32* self,
6748
    uint32_t a_key,
6749
    uint64_t a_value);
6750
6751
WUFFS_BASE__GENERATED_C_CODE
6752
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6753
wuffs_base__hasher_u32__update(
6754
    wuffs_base__hasher_u32* self,
6755
    wuffs_base__slice_u8 a_x);
6756
6757
WUFFS_BASE__GENERATED_C_CODE
6758
WUFFS_BASE__MAYBE_STATIC uint32_t
6759
wuffs_base__hasher_u32__update_u32(
6760
    wuffs_base__hasher_u32* self,
6761
    wuffs_base__slice_u8 a_x);
6762
6763
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6764
6765
struct wuffs_base__hasher_u32__struct {
6766
  struct {
6767
    uint32_t magic;
6768
    uint32_t active_coroutine;
6769
    wuffs_base__vtable first_vtable;
6770
  } private_impl;
6771
6772
#ifdef __cplusplus
6773
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6774
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u32, wuffs_unique_ptr_deleter>;
6775
#endif
6776
6777
  inline uint32_t
6778
  checksum_u32() const {
6779
    return wuffs_base__hasher_u32__checksum_u32(this);
6780
  }
6781
6782
  inline uint64_t
6783
  get_quirk(
6784
      uint32_t a_key) const {
6785
    return wuffs_base__hasher_u32__get_quirk(
6786
        this, a_key);
6787
  }
6788
6789
  inline wuffs_base__status
6790
  set_quirk(
6791
      uint32_t a_key,
6792
      uint64_t a_value) {
6793
    return wuffs_base__hasher_u32__set_quirk(
6794
        this, a_key, a_value);
6795
  }
6796
6797
  inline wuffs_base__empty_struct
6798
  update(
6799
      wuffs_base__slice_u8 a_x) {
6800
    return wuffs_base__hasher_u32__update(
6801
        this, a_x);
6802
  }
6803
6804
  inline uint32_t
6805
  update_u32(
6806
      wuffs_base__slice_u8 a_x) {
6807
    return wuffs_base__hasher_u32__update_u32(
6808
        this, a_x);
6809
  }
6810
6811
#endif  // __cplusplus
6812
};  // struct wuffs_base__hasher_u32__struct
6813
6814
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6815
6816
// --------
6817
6818
extern const char wuffs_base__hasher_u64__vtable_name[];
6819
6820
typedef struct wuffs_base__hasher_u64__func_ptrs__struct {
6821
  uint64_t (*checksum_u64)(
6822
    const void* self);
6823
  uint64_t (*get_quirk)(
6824
    const void* self,
6825
    uint32_t a_key);
6826
  wuffs_base__status (*set_quirk)(
6827
    void* self,
6828
    uint32_t a_key,
6829
    uint64_t a_value);
6830
  wuffs_base__empty_struct (*update)(
6831
    void* self,
6832
    wuffs_base__slice_u8 a_x);
6833
  uint64_t (*update_u64)(
6834
    void* self,
6835
    wuffs_base__slice_u8 a_x);
6836
} wuffs_base__hasher_u64__func_ptrs;
6837
6838
typedef struct wuffs_base__hasher_u64__struct wuffs_base__hasher_u64;
6839
6840
WUFFS_BASE__GENERATED_C_CODE
6841
WUFFS_BASE__MAYBE_STATIC uint64_t
6842
wuffs_base__hasher_u64__checksum_u64(
6843
    const wuffs_base__hasher_u64* self);
6844
6845
WUFFS_BASE__GENERATED_C_CODE
6846
WUFFS_BASE__MAYBE_STATIC uint64_t
6847
wuffs_base__hasher_u64__get_quirk(
6848
    const wuffs_base__hasher_u64* self,
6849
    uint32_t a_key);
6850
6851
WUFFS_BASE__GENERATED_C_CODE
6852
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6853
wuffs_base__hasher_u64__set_quirk(
6854
    wuffs_base__hasher_u64* self,
6855
    uint32_t a_key,
6856
    uint64_t a_value);
6857
6858
WUFFS_BASE__GENERATED_C_CODE
6859
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6860
wuffs_base__hasher_u64__update(
6861
    wuffs_base__hasher_u64* self,
6862
    wuffs_base__slice_u8 a_x);
6863
6864
WUFFS_BASE__GENERATED_C_CODE
6865
WUFFS_BASE__MAYBE_STATIC uint64_t
6866
wuffs_base__hasher_u64__update_u64(
6867
    wuffs_base__hasher_u64* self,
6868
    wuffs_base__slice_u8 a_x);
6869
6870
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6871
6872
struct wuffs_base__hasher_u64__struct {
6873
  struct {
6874
    uint32_t magic;
6875
    uint32_t active_coroutine;
6876
    wuffs_base__vtable first_vtable;
6877
  } private_impl;
6878
6879
#ifdef __cplusplus
6880
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6881
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_u64, wuffs_unique_ptr_deleter>;
6882
#endif
6883
6884
  inline uint64_t
6885
  checksum_u64() const {
6886
    return wuffs_base__hasher_u64__checksum_u64(this);
6887
  }
6888
6889
  inline uint64_t
6890
  get_quirk(
6891
      uint32_t a_key) const {
6892
    return wuffs_base__hasher_u64__get_quirk(
6893
        this, a_key);
6894
  }
6895
6896
  inline wuffs_base__status
6897
  set_quirk(
6898
      uint32_t a_key,
6899
      uint64_t a_value) {
6900
    return wuffs_base__hasher_u64__set_quirk(
6901
        this, a_key, a_value);
6902
  }
6903
6904
  inline wuffs_base__empty_struct
6905
  update(
6906
      wuffs_base__slice_u8 a_x) {
6907
    return wuffs_base__hasher_u64__update(
6908
        this, a_x);
6909
  }
6910
6911
  inline uint64_t
6912
  update_u64(
6913
      wuffs_base__slice_u8 a_x) {
6914
    return wuffs_base__hasher_u64__update_u64(
6915
        this, a_x);
6916
  }
6917
6918
#endif  // __cplusplus
6919
};  // struct wuffs_base__hasher_u64__struct
6920
6921
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6922
6923
// --------
6924
6925
extern const char wuffs_base__hasher_bitvec256__vtable_name[];
6926
6927
typedef struct wuffs_base__hasher_bitvec256__func_ptrs__struct {
6928
  wuffs_base__bitvec256 (*checksum_bitvec256)(
6929
    const void* self);
6930
  uint64_t (*get_quirk)(
6931
    const void* self,
6932
    uint32_t a_key);
6933
  wuffs_base__status (*set_quirk)(
6934
    void* self,
6935
    uint32_t a_key,
6936
    uint64_t a_value);
6937
  wuffs_base__empty_struct (*update)(
6938
    void* self,
6939
    wuffs_base__slice_u8 a_x);
6940
  wuffs_base__bitvec256 (*update_bitvec256)(
6941
    void* self,
6942
    wuffs_base__slice_u8 a_x);
6943
} wuffs_base__hasher_bitvec256__func_ptrs;
6944
6945
typedef struct wuffs_base__hasher_bitvec256__struct wuffs_base__hasher_bitvec256;
6946
6947
WUFFS_BASE__GENERATED_C_CODE
6948
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6949
wuffs_base__hasher_bitvec256__checksum_bitvec256(
6950
    const wuffs_base__hasher_bitvec256* self);
6951
6952
WUFFS_BASE__GENERATED_C_CODE
6953
WUFFS_BASE__MAYBE_STATIC uint64_t
6954
wuffs_base__hasher_bitvec256__get_quirk(
6955
    const wuffs_base__hasher_bitvec256* self,
6956
    uint32_t a_key);
6957
6958
WUFFS_BASE__GENERATED_C_CODE
6959
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
6960
wuffs_base__hasher_bitvec256__set_quirk(
6961
    wuffs_base__hasher_bitvec256* self,
6962
    uint32_t a_key,
6963
    uint64_t a_value);
6964
6965
WUFFS_BASE__GENERATED_C_CODE
6966
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
6967
wuffs_base__hasher_bitvec256__update(
6968
    wuffs_base__hasher_bitvec256* self,
6969
    wuffs_base__slice_u8 a_x);
6970
6971
WUFFS_BASE__GENERATED_C_CODE
6972
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
6973
wuffs_base__hasher_bitvec256__update_bitvec256(
6974
    wuffs_base__hasher_bitvec256* self,
6975
    wuffs_base__slice_u8 a_x);
6976
6977
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
6978
6979
struct wuffs_base__hasher_bitvec256__struct {
6980
  struct {
6981
    uint32_t magic;
6982
    uint32_t active_coroutine;
6983
    wuffs_base__vtable first_vtable;
6984
  } private_impl;
6985
6986
#ifdef __cplusplus
6987
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
6988
  using unique_ptr = std::unique_ptr<wuffs_base__hasher_bitvec256, wuffs_unique_ptr_deleter>;
6989
#endif
6990
6991
  inline wuffs_base__bitvec256
6992
  checksum_bitvec256() const {
6993
    return wuffs_base__hasher_bitvec256__checksum_bitvec256(this);
6994
  }
6995
6996
  inline uint64_t
6997
  get_quirk(
6998
      uint32_t a_key) const {
6999
    return wuffs_base__hasher_bitvec256__get_quirk(
7000
        this, a_key);
7001
  }
7002
7003
  inline wuffs_base__status
7004
  set_quirk(
7005
      uint32_t a_key,
7006
      uint64_t a_value) {
7007
    return wuffs_base__hasher_bitvec256__set_quirk(
7008
        this, a_key, a_value);
7009
  }
7010
7011
  inline wuffs_base__empty_struct
7012
  update(
7013
      wuffs_base__slice_u8 a_x) {
7014
    return wuffs_base__hasher_bitvec256__update(
7015
        this, a_x);
7016
  }
7017
7018
  inline wuffs_base__bitvec256
7019
  update_bitvec256(
7020
      wuffs_base__slice_u8 a_x) {
7021
    return wuffs_base__hasher_bitvec256__update_bitvec256(
7022
        this, a_x);
7023
  }
7024
7025
#endif  // __cplusplus
7026
};  // struct wuffs_base__hasher_bitvec256__struct
7027
7028
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7029
7030
// --------
7031
7032
extern const char wuffs_base__image_decoder__vtable_name[];
7033
7034
typedef struct wuffs_base__image_decoder__func_ptrs__struct {
7035
  wuffs_base__status (*decode_frame)(
7036
    void* self,
7037
    wuffs_base__pixel_buffer* a_dst,
7038
    wuffs_base__io_buffer* a_src,
7039
    wuffs_base__pixel_blend a_blend,
7040
    wuffs_base__slice_u8 a_workbuf,
7041
    wuffs_base__decode_frame_options* a_opts);
7042
  wuffs_base__status (*decode_frame_config)(
7043
    void* self,
7044
    wuffs_base__frame_config* a_dst,
7045
    wuffs_base__io_buffer* a_src);
7046
  wuffs_base__status (*decode_image_config)(
7047
    void* self,
7048
    wuffs_base__image_config* a_dst,
7049
    wuffs_base__io_buffer* a_src);
7050
  wuffs_base__rect_ie_u32 (*frame_dirty_rect)(
7051
    const void* self);
7052
  uint64_t (*get_quirk)(
7053
    const void* self,
7054
    uint32_t a_key);
7055
  uint32_t (*num_animation_loops)(
7056
    const void* self);
7057
  uint64_t (*num_decoded_frame_configs)(
7058
    const void* self);
7059
  uint64_t (*num_decoded_frames)(
7060
    const void* self);
7061
  wuffs_base__status (*restart_frame)(
7062
    void* self,
7063
    uint64_t a_index,
7064
    uint64_t a_io_position);
7065
  wuffs_base__status (*set_quirk)(
7066
    void* self,
7067
    uint32_t a_key,
7068
    uint64_t a_value);
7069
  wuffs_base__empty_struct (*set_report_metadata)(
7070
    void* self,
7071
    uint32_t a_fourcc,
7072
    bool a_report);
7073
  wuffs_base__status (*tell_me_more)(
7074
    void* self,
7075
    wuffs_base__io_buffer* a_dst,
7076
    wuffs_base__more_information* a_minfo,
7077
    wuffs_base__io_buffer* a_src);
7078
  wuffs_base__range_ii_u64 (*workbuf_len)(
7079
    const void* self);
7080
} wuffs_base__image_decoder__func_ptrs;
7081
7082
typedef struct wuffs_base__image_decoder__struct wuffs_base__image_decoder;
7083
7084
WUFFS_BASE__GENERATED_C_CODE
7085
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7086
wuffs_base__image_decoder__decode_frame(
7087
    wuffs_base__image_decoder* self,
7088
    wuffs_base__pixel_buffer* a_dst,
7089
    wuffs_base__io_buffer* a_src,
7090
    wuffs_base__pixel_blend a_blend,
7091
    wuffs_base__slice_u8 a_workbuf,
7092
    wuffs_base__decode_frame_options* a_opts);
7093
7094
WUFFS_BASE__GENERATED_C_CODE
7095
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7096
wuffs_base__image_decoder__decode_frame_config(
7097
    wuffs_base__image_decoder* self,
7098
    wuffs_base__frame_config* a_dst,
7099
    wuffs_base__io_buffer* a_src);
7100
7101
WUFFS_BASE__GENERATED_C_CODE
7102
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7103
wuffs_base__image_decoder__decode_image_config(
7104
    wuffs_base__image_decoder* self,
7105
    wuffs_base__image_config* a_dst,
7106
    wuffs_base__io_buffer* a_src);
7107
7108
WUFFS_BASE__GENERATED_C_CODE
7109
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
7110
wuffs_base__image_decoder__frame_dirty_rect(
7111
    const wuffs_base__image_decoder* self);
7112
7113
WUFFS_BASE__GENERATED_C_CODE
7114
WUFFS_BASE__MAYBE_STATIC uint64_t
7115
wuffs_base__image_decoder__get_quirk(
7116
    const wuffs_base__image_decoder* self,
7117
    uint32_t a_key);
7118
7119
WUFFS_BASE__GENERATED_C_CODE
7120
WUFFS_BASE__MAYBE_STATIC uint32_t
7121
wuffs_base__image_decoder__num_animation_loops(
7122
    const wuffs_base__image_decoder* self);
7123
7124
WUFFS_BASE__GENERATED_C_CODE
7125
WUFFS_BASE__MAYBE_STATIC uint64_t
7126
wuffs_base__image_decoder__num_decoded_frame_configs(
7127
    const wuffs_base__image_decoder* self);
7128
7129
WUFFS_BASE__GENERATED_C_CODE
7130
WUFFS_BASE__MAYBE_STATIC uint64_t
7131
wuffs_base__image_decoder__num_decoded_frames(
7132
    const wuffs_base__image_decoder* self);
7133
7134
WUFFS_BASE__GENERATED_C_CODE
7135
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7136
wuffs_base__image_decoder__restart_frame(
7137
    wuffs_base__image_decoder* self,
7138
    uint64_t a_index,
7139
    uint64_t a_io_position);
7140
7141
WUFFS_BASE__GENERATED_C_CODE
7142
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7143
wuffs_base__image_decoder__set_quirk(
7144
    wuffs_base__image_decoder* self,
7145
    uint32_t a_key,
7146
    uint64_t a_value);
7147
7148
WUFFS_BASE__GENERATED_C_CODE
7149
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7150
wuffs_base__image_decoder__set_report_metadata(
7151
    wuffs_base__image_decoder* self,
7152
    uint32_t a_fourcc,
7153
    bool a_report);
7154
7155
WUFFS_BASE__GENERATED_C_CODE
7156
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7157
wuffs_base__image_decoder__tell_me_more(
7158
    wuffs_base__image_decoder* self,
7159
    wuffs_base__io_buffer* a_dst,
7160
    wuffs_base__more_information* a_minfo,
7161
    wuffs_base__io_buffer* a_src);
7162
7163
WUFFS_BASE__GENERATED_C_CODE
7164
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7165
wuffs_base__image_decoder__workbuf_len(
7166
    const wuffs_base__image_decoder* self);
7167
7168
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7169
7170
struct wuffs_base__image_decoder__struct {
7171
  struct {
7172
    uint32_t magic;
7173
    uint32_t active_coroutine;
7174
    wuffs_base__vtable first_vtable;
7175
  } private_impl;
7176
7177
#ifdef __cplusplus
7178
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7179
  using unique_ptr = std::unique_ptr<wuffs_base__image_decoder, wuffs_unique_ptr_deleter>;
7180
#endif
7181
7182
  inline wuffs_base__status
7183
  decode_frame(
7184
      wuffs_base__pixel_buffer* a_dst,
7185
      wuffs_base__io_buffer* a_src,
7186
      wuffs_base__pixel_blend a_blend,
7187
      wuffs_base__slice_u8 a_workbuf,
7188
      wuffs_base__decode_frame_options* a_opts) {
7189
    return wuffs_base__image_decoder__decode_frame(
7190
        this, a_dst, a_src, a_blend, a_workbuf, a_opts);
7191
  }
7192
7193
  inline wuffs_base__status
7194
  decode_frame_config(
7195
      wuffs_base__frame_config* a_dst,
7196
      wuffs_base__io_buffer* a_src) {
7197
    return wuffs_base__image_decoder__decode_frame_config(
7198
        this, a_dst, a_src);
7199
  }
7200
7201
  inline wuffs_base__status
7202
  decode_image_config(
7203
      wuffs_base__image_config* a_dst,
7204
      wuffs_base__io_buffer* a_src) {
7205
    return wuffs_base__image_decoder__decode_image_config(
7206
        this, a_dst, a_src);
7207
  }
7208
7209
  inline wuffs_base__rect_ie_u32
7210
  frame_dirty_rect() const {
7211
    return wuffs_base__image_decoder__frame_dirty_rect(this);
7212
  }
7213
7214
  inline uint64_t
7215
  get_quirk(
7216
      uint32_t a_key) const {
7217
    return wuffs_base__image_decoder__get_quirk(
7218
        this, a_key);
7219
  }
7220
7221
  inline uint32_t
7222
  num_animation_loops() const {
7223
    return wuffs_base__image_decoder__num_animation_loops(this);
7224
  }
7225
7226
  inline uint64_t
7227
  num_decoded_frame_configs() const {
7228
    return wuffs_base__image_decoder__num_decoded_frame_configs(this);
7229
  }
7230
7231
  inline uint64_t
7232
  num_decoded_frames() const {
7233
    return wuffs_base__image_decoder__num_decoded_frames(this);
7234
  }
7235
7236
  inline wuffs_base__status
7237
  restart_frame(
7238
      uint64_t a_index,
7239
      uint64_t a_io_position) {
7240
    return wuffs_base__image_decoder__restart_frame(
7241
        this, a_index, a_io_position);
7242
  }
7243
7244
  inline wuffs_base__status
7245
  set_quirk(
7246
      uint32_t a_key,
7247
      uint64_t a_value) {
7248
    return wuffs_base__image_decoder__set_quirk(
7249
        this, a_key, a_value);
7250
  }
7251
7252
  inline wuffs_base__empty_struct
7253
  set_report_metadata(
7254
      uint32_t a_fourcc,
7255
      bool a_report) {
7256
    return wuffs_base__image_decoder__set_report_metadata(
7257
        this, a_fourcc, a_report);
7258
  }
7259
7260
  inline wuffs_base__status
7261
  tell_me_more(
7262
      wuffs_base__io_buffer* a_dst,
7263
      wuffs_base__more_information* a_minfo,
7264
      wuffs_base__io_buffer* a_src) {
7265
    return wuffs_base__image_decoder__tell_me_more(
7266
        this, a_dst, a_minfo, a_src);
7267
  }
7268
7269
  inline wuffs_base__range_ii_u64
7270
  workbuf_len() const {
7271
    return wuffs_base__image_decoder__workbuf_len(this);
7272
  }
7273
7274
#endif  // __cplusplus
7275
};  // struct wuffs_base__image_decoder__struct
7276
7277
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7278
7279
// --------
7280
7281
extern const char wuffs_base__io_transformer__vtable_name[];
7282
7283
typedef struct wuffs_base__io_transformer__func_ptrs__struct {
7284
  wuffs_base__optional_u63 (*dst_history_retain_length)(
7285
    const void* self);
7286
  uint64_t (*get_quirk)(
7287
    const void* self,
7288
    uint32_t a_key);
7289
  wuffs_base__status (*set_quirk)(
7290
    void* self,
7291
    uint32_t a_key,
7292
    uint64_t a_value);
7293
  wuffs_base__status (*transform_io)(
7294
    void* self,
7295
    wuffs_base__io_buffer* a_dst,
7296
    wuffs_base__io_buffer* a_src,
7297
    wuffs_base__slice_u8 a_workbuf);
7298
  wuffs_base__range_ii_u64 (*workbuf_len)(
7299
    const void* self);
7300
} wuffs_base__io_transformer__func_ptrs;
7301
7302
typedef struct wuffs_base__io_transformer__struct wuffs_base__io_transformer;
7303
7304
WUFFS_BASE__GENERATED_C_CODE
7305
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
7306
wuffs_base__io_transformer__dst_history_retain_length(
7307
    const wuffs_base__io_transformer* self);
7308
7309
WUFFS_BASE__GENERATED_C_CODE
7310
WUFFS_BASE__MAYBE_STATIC uint64_t
7311
wuffs_base__io_transformer__get_quirk(
7312
    const wuffs_base__io_transformer* self,
7313
    uint32_t a_key);
7314
7315
WUFFS_BASE__GENERATED_C_CODE
7316
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7317
wuffs_base__io_transformer__set_quirk(
7318
    wuffs_base__io_transformer* self,
7319
    uint32_t a_key,
7320
    uint64_t a_value);
7321
7322
WUFFS_BASE__GENERATED_C_CODE
7323
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7324
wuffs_base__io_transformer__transform_io(
7325
    wuffs_base__io_transformer* self,
7326
    wuffs_base__io_buffer* a_dst,
7327
    wuffs_base__io_buffer* a_src,
7328
    wuffs_base__slice_u8 a_workbuf);
7329
7330
WUFFS_BASE__GENERATED_C_CODE
7331
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7332
wuffs_base__io_transformer__workbuf_len(
7333
    const wuffs_base__io_transformer* self);
7334
7335
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7336
7337
struct wuffs_base__io_transformer__struct {
7338
  struct {
7339
    uint32_t magic;
7340
    uint32_t active_coroutine;
7341
    wuffs_base__vtable first_vtable;
7342
  } private_impl;
7343
7344
#ifdef __cplusplus
7345
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7346
  using unique_ptr = std::unique_ptr<wuffs_base__io_transformer, wuffs_unique_ptr_deleter>;
7347
#endif
7348
7349
  inline wuffs_base__optional_u63
7350
  dst_history_retain_length() const {
7351
    return wuffs_base__io_transformer__dst_history_retain_length(this);
7352
  }
7353
7354
  inline uint64_t
7355
  get_quirk(
7356
      uint32_t a_key) const {
7357
    return wuffs_base__io_transformer__get_quirk(
7358
        this, a_key);
7359
  }
7360
7361
  inline wuffs_base__status
7362
  set_quirk(
7363
      uint32_t a_key,
7364
      uint64_t a_value) {
7365
    return wuffs_base__io_transformer__set_quirk(
7366
        this, a_key, a_value);
7367
  }
7368
7369
  inline wuffs_base__status
7370
  transform_io(
7371
      wuffs_base__io_buffer* a_dst,
7372
      wuffs_base__io_buffer* a_src,
7373
      wuffs_base__slice_u8 a_workbuf) {
7374
    return wuffs_base__io_transformer__transform_io(
7375
        this, a_dst, a_src, a_workbuf);
7376
  }
7377
7378
  inline wuffs_base__range_ii_u64
7379
  workbuf_len() const {
7380
    return wuffs_base__io_transformer__workbuf_len(this);
7381
  }
7382
7383
#endif  // __cplusplus
7384
};  // struct wuffs_base__io_transformer__struct
7385
7386
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7387
7388
// --------
7389
7390
extern const char wuffs_base__token_decoder__vtable_name[];
7391
7392
typedef struct wuffs_base__token_decoder__func_ptrs__struct {
7393
  wuffs_base__status (*decode_tokens)(
7394
    void* self,
7395
    wuffs_base__token_buffer* a_dst,
7396
    wuffs_base__io_buffer* a_src,
7397
    wuffs_base__slice_u8 a_workbuf);
7398
  uint64_t (*get_quirk)(
7399
    const void* self,
7400
    uint32_t a_key);
7401
  wuffs_base__status (*set_quirk)(
7402
    void* self,
7403
    uint32_t a_key,
7404
    uint64_t a_value);
7405
  wuffs_base__range_ii_u64 (*workbuf_len)(
7406
    const void* self);
7407
} wuffs_base__token_decoder__func_ptrs;
7408
7409
typedef struct wuffs_base__token_decoder__struct wuffs_base__token_decoder;
7410
7411
WUFFS_BASE__GENERATED_C_CODE
7412
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7413
wuffs_base__token_decoder__decode_tokens(
7414
    wuffs_base__token_decoder* self,
7415
    wuffs_base__token_buffer* a_dst,
7416
    wuffs_base__io_buffer* a_src,
7417
    wuffs_base__slice_u8 a_workbuf);
7418
7419
WUFFS_BASE__GENERATED_C_CODE
7420
WUFFS_BASE__MAYBE_STATIC uint64_t
7421
wuffs_base__token_decoder__get_quirk(
7422
    const wuffs_base__token_decoder* self,
7423
    uint32_t a_key);
7424
7425
WUFFS_BASE__GENERATED_C_CODE
7426
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7427
wuffs_base__token_decoder__set_quirk(
7428
    wuffs_base__token_decoder* self,
7429
    uint32_t a_key,
7430
    uint64_t a_value);
7431
7432
WUFFS_BASE__GENERATED_C_CODE
7433
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7434
wuffs_base__token_decoder__workbuf_len(
7435
    const wuffs_base__token_decoder* self);
7436
7437
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7438
7439
struct wuffs_base__token_decoder__struct {
7440
  struct {
7441
    uint32_t magic;
7442
    uint32_t active_coroutine;
7443
    wuffs_base__vtable first_vtable;
7444
  } private_impl;
7445
7446
#ifdef __cplusplus
7447
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7448
  using unique_ptr = std::unique_ptr<wuffs_base__token_decoder, wuffs_unique_ptr_deleter>;
7449
#endif
7450
7451
  inline wuffs_base__status
7452
  decode_tokens(
7453
      wuffs_base__token_buffer* a_dst,
7454
      wuffs_base__io_buffer* a_src,
7455
      wuffs_base__slice_u8 a_workbuf) {
7456
    return wuffs_base__token_decoder__decode_tokens(
7457
        this, a_dst, a_src, a_workbuf);
7458
  }
7459
7460
  inline uint64_t
7461
  get_quirk(
7462
      uint32_t a_key) const {
7463
    return wuffs_base__token_decoder__get_quirk(
7464
        this, a_key);
7465
  }
7466
7467
  inline wuffs_base__status
7468
  set_quirk(
7469
      uint32_t a_key,
7470
      uint64_t a_value) {
7471
    return wuffs_base__token_decoder__set_quirk(
7472
        this, a_key, a_value);
7473
  }
7474
7475
  inline wuffs_base__range_ii_u64
7476
  workbuf_len() const {
7477
    return wuffs_base__token_decoder__workbuf_len(this);
7478
  }
7479
7480
#endif  // __cplusplus
7481
};  // struct wuffs_base__token_decoder__struct
7482
7483
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7484
7485
// ----------------
7486
7487
#ifdef __cplusplus
7488
}  // extern "C"
7489
#endif
7490
7491
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7492
7493
// ---------------- Status Codes
7494
7495
// ---------------- Public Consts
7496
7497
// ---------------- Struct Declarations
7498
7499
typedef struct wuffs_adler32__hasher__struct wuffs_adler32__hasher;
7500
7501
#ifdef __cplusplus
7502
extern "C" {
7503
#endif
7504
7505
// ---------------- Public Initializer Prototypes
7506
7507
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7508
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7509
//
7510
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7511
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7512
7513
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7514
wuffs_adler32__hasher__initialize(
7515
    wuffs_adler32__hasher* self,
7516
    size_t sizeof_star_self,
7517
    uint64_t wuffs_version,
7518
    uint32_t options);
7519
7520
size_t
7521
sizeof__wuffs_adler32__hasher(void);
7522
7523
// ---------------- Allocs
7524
7525
// These functions allocate and initialize Wuffs structs. They return NULL if
7526
// memory allocation fails. If they return non-NULL, there is no need to call
7527
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7528
// calling free on the returned pointer. That pointer is effectively a C++
7529
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7530
7531
wuffs_adler32__hasher*
7532
wuffs_adler32__hasher__alloc(void);
7533
7534
static inline wuffs_base__hasher_u32*
7535
0
wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
7536
0
  return (wuffs_base__hasher_u32*)(wuffs_adler32__hasher__alloc());
7537
0
}
7538
7539
// ---------------- Upcasts
7540
7541
static inline wuffs_base__hasher_u32*
7542
wuffs_adler32__hasher__upcast_as__wuffs_base__hasher_u32(
7543
0
    wuffs_adler32__hasher* p) {
7544
0
  return (wuffs_base__hasher_u32*)p;
7545
0
}
7546
7547
// ---------------- Public Function Prototypes
7548
7549
WUFFS_BASE__GENERATED_C_CODE
7550
WUFFS_BASE__MAYBE_STATIC uint64_t
7551
wuffs_adler32__hasher__get_quirk(
7552
    const wuffs_adler32__hasher* self,
7553
    uint32_t a_key);
7554
7555
WUFFS_BASE__GENERATED_C_CODE
7556
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7557
wuffs_adler32__hasher__set_quirk(
7558
    wuffs_adler32__hasher* self,
7559
    uint32_t a_key,
7560
    uint64_t a_value);
7561
7562
WUFFS_BASE__GENERATED_C_CODE
7563
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7564
wuffs_adler32__hasher__update(
7565
    wuffs_adler32__hasher* self,
7566
    wuffs_base__slice_u8 a_x);
7567
7568
WUFFS_BASE__GENERATED_C_CODE
7569
WUFFS_BASE__MAYBE_STATIC uint32_t
7570
wuffs_adler32__hasher__update_u32(
7571
    wuffs_adler32__hasher* self,
7572
    wuffs_base__slice_u8 a_x);
7573
7574
WUFFS_BASE__GENERATED_C_CODE
7575
WUFFS_BASE__MAYBE_STATIC uint32_t
7576
wuffs_adler32__hasher__checksum_u32(
7577
    const wuffs_adler32__hasher* self);
7578
7579
#ifdef __cplusplus
7580
}  // extern "C"
7581
#endif
7582
7583
// ---------------- Struct Definitions
7584
7585
// These structs' fields, and the sizeof them, are private implementation
7586
// details that aren't guaranteed to be stable across Wuffs versions.
7587
//
7588
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7589
7590
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7591
7592
struct wuffs_adler32__hasher__struct {
7593
  // Do not access the private_impl's or private_data's fields directly. There
7594
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7595
  // the wuffs_foo__bar__baz functions.
7596
  //
7597
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7598
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7599
7600
  struct {
7601
    uint32_t magic;
7602
    uint32_t active_coroutine;
7603
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
7604
    wuffs_base__vtable null_vtable;
7605
7606
    uint32_t f_state;
7607
    bool f_started;
7608
7609
    wuffs_base__empty_struct (*choosy_up)(
7610
        wuffs_adler32__hasher* self,
7611
        wuffs_base__slice_u8 a_x);
7612
  } private_impl;
7613
7614
#ifdef __cplusplus
7615
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7616
  using unique_ptr = std::unique_ptr<wuffs_adler32__hasher, wuffs_unique_ptr_deleter>;
7617
7618
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7619
7620
  static inline unique_ptr
7621
  alloc() {
7622
    return unique_ptr(wuffs_adler32__hasher__alloc());
7623
  }
7624
7625
  static inline wuffs_base__hasher_u32::unique_ptr
7626
  alloc_as__wuffs_base__hasher_u32() {
7627
    return wuffs_base__hasher_u32::unique_ptr(
7628
        wuffs_adler32__hasher__alloc_as__wuffs_base__hasher_u32());
7629
  }
7630
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7631
7632
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7633
  // Disallow constructing or copying an object via standard C++ mechanisms,
7634
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7635
  // size and field layout is not part of the public, stable, memory-safe API.
7636
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7637
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7638
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7639
  //
7640
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7641
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7642
  // order to provide convenience methods. These forward on "this", so that you
7643
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7644
  wuffs_adler32__hasher__struct() = delete;
7645
  wuffs_adler32__hasher__struct(const wuffs_adler32__hasher__struct&) = delete;
7646
  wuffs_adler32__hasher__struct& operator=(
7647
      const wuffs_adler32__hasher__struct&) = delete;
7648
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7649
7650
#if !defined(WUFFS_IMPLEMENTATION)
7651
  // As above, the size of the struct is not part of the public API, and unless
7652
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
7653
  // allocated, not stack allocated. Its size is not intended to be known at
7654
  // compile time, but it is unfortunately divulged as a side effect of
7655
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
7656
  // instead of "sizeof T", invoking the operator. To make the two values
7657
  // different, so that passing the latter will be rejected by the initialize
7658
  // function, we add an arbitrary amount of dead weight.
7659
  uint8_t dead_weight[123000000];  // 123 MB.
7660
#endif  // !defined(WUFFS_IMPLEMENTATION)
7661
7662
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7663
  initialize(
7664
      size_t sizeof_star_self,
7665
      uint64_t wuffs_version,
7666
      uint32_t options) {
7667
    return wuffs_adler32__hasher__initialize(
7668
        this, sizeof_star_self, wuffs_version, options);
7669
  }
7670
7671
  inline wuffs_base__hasher_u32*
7672
  upcast_as__wuffs_base__hasher_u32() {
7673
    return (wuffs_base__hasher_u32*)this;
7674
  }
7675
7676
  inline uint64_t
7677
  get_quirk(
7678
      uint32_t a_key) const {
7679
    return wuffs_adler32__hasher__get_quirk(this, a_key);
7680
  }
7681
7682
  inline wuffs_base__status
7683
  set_quirk(
7684
      uint32_t a_key,
7685
      uint64_t a_value) {
7686
    return wuffs_adler32__hasher__set_quirk(this, a_key, a_value);
7687
  }
7688
7689
  inline wuffs_base__empty_struct
7690
  update(
7691
      wuffs_base__slice_u8 a_x) {
7692
    return wuffs_adler32__hasher__update(this, a_x);
7693
  }
7694
7695
  inline uint32_t
7696
  update_u32(
7697
      wuffs_base__slice_u8 a_x) {
7698
    return wuffs_adler32__hasher__update_u32(this, a_x);
7699
  }
7700
7701
  inline uint32_t
7702
  checksum_u32() const {
7703
    return wuffs_adler32__hasher__checksum_u32(this);
7704
  }
7705
7706
#endif  // __cplusplus
7707
};  // struct wuffs_adler32__hasher__struct
7708
7709
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7710
7711
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32) || defined(WUFFS_NONMONOLITHIC)
7712
7713
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
7714
7715
// ---------------- Status Codes
7716
7717
extern const char wuffs_bmp__error__bad_header[];
7718
extern const char wuffs_bmp__error__bad_rle_compression[];
7719
extern const char wuffs_bmp__error__truncated_input[];
7720
extern const char wuffs_bmp__error__unsupported_bmp_file[];
7721
7722
// ---------------- Public Consts
7723
7724
#define WUFFS_BMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
7725
7726
// ---------------- Struct Declarations
7727
7728
typedef struct wuffs_bmp__decoder__struct wuffs_bmp__decoder;
7729
7730
#ifdef __cplusplus
7731
extern "C" {
7732
#endif
7733
7734
// ---------------- Public Initializer Prototypes
7735
7736
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
7737
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
7738
//
7739
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
7740
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
7741
7742
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7743
wuffs_bmp__decoder__initialize(
7744
    wuffs_bmp__decoder* self,
7745
    size_t sizeof_star_self,
7746
    uint64_t wuffs_version,
7747
    uint32_t options);
7748
7749
size_t
7750
sizeof__wuffs_bmp__decoder(void);
7751
7752
// ---------------- Allocs
7753
7754
// These functions allocate and initialize Wuffs structs. They return NULL if
7755
// memory allocation fails. If they return non-NULL, there is no need to call
7756
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
7757
// calling free on the returned pointer. That pointer is effectively a C++
7758
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
7759
7760
wuffs_bmp__decoder*
7761
wuffs_bmp__decoder__alloc(void);
7762
7763
static inline wuffs_base__image_decoder*
7764
wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
7765
  return (wuffs_base__image_decoder*)(wuffs_bmp__decoder__alloc());
7766
}
7767
7768
// ---------------- Upcasts
7769
7770
static inline wuffs_base__image_decoder*
7771
wuffs_bmp__decoder__upcast_as__wuffs_base__image_decoder(
7772
    wuffs_bmp__decoder* p) {
7773
  return (wuffs_base__image_decoder*)p;
7774
}
7775
7776
// ---------------- Public Function Prototypes
7777
7778
WUFFS_BASE__GENERATED_C_CODE
7779
WUFFS_BASE__MAYBE_STATIC uint64_t
7780
wuffs_bmp__decoder__get_quirk(
7781
    const wuffs_bmp__decoder* self,
7782
    uint32_t a_key);
7783
7784
WUFFS_BASE__GENERATED_C_CODE
7785
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7786
wuffs_bmp__decoder__set_quirk(
7787
    wuffs_bmp__decoder* self,
7788
    uint32_t a_key,
7789
    uint64_t a_value);
7790
7791
WUFFS_BASE__GENERATED_C_CODE
7792
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7793
wuffs_bmp__decoder__decode_image_config(
7794
    wuffs_bmp__decoder* self,
7795
    wuffs_base__image_config* a_dst,
7796
    wuffs_base__io_buffer* a_src);
7797
7798
WUFFS_BASE__GENERATED_C_CODE
7799
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7800
wuffs_bmp__decoder__decode_frame_config(
7801
    wuffs_bmp__decoder* self,
7802
    wuffs_base__frame_config* a_dst,
7803
    wuffs_base__io_buffer* a_src);
7804
7805
WUFFS_BASE__GENERATED_C_CODE
7806
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7807
wuffs_bmp__decoder__decode_frame(
7808
    wuffs_bmp__decoder* self,
7809
    wuffs_base__pixel_buffer* a_dst,
7810
    wuffs_base__io_buffer* a_src,
7811
    wuffs_base__pixel_blend a_blend,
7812
    wuffs_base__slice_u8 a_workbuf,
7813
    wuffs_base__decode_frame_options* a_opts);
7814
7815
WUFFS_BASE__GENERATED_C_CODE
7816
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
7817
wuffs_bmp__decoder__frame_dirty_rect(
7818
    const wuffs_bmp__decoder* self);
7819
7820
WUFFS_BASE__GENERATED_C_CODE
7821
WUFFS_BASE__MAYBE_STATIC uint32_t
7822
wuffs_bmp__decoder__num_animation_loops(
7823
    const wuffs_bmp__decoder* self);
7824
7825
WUFFS_BASE__GENERATED_C_CODE
7826
WUFFS_BASE__MAYBE_STATIC uint64_t
7827
wuffs_bmp__decoder__num_decoded_frame_configs(
7828
    const wuffs_bmp__decoder* self);
7829
7830
WUFFS_BASE__GENERATED_C_CODE
7831
WUFFS_BASE__MAYBE_STATIC uint64_t
7832
wuffs_bmp__decoder__num_decoded_frames(
7833
    const wuffs_bmp__decoder* self);
7834
7835
WUFFS_BASE__GENERATED_C_CODE
7836
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7837
wuffs_bmp__decoder__restart_frame(
7838
    wuffs_bmp__decoder* self,
7839
    uint64_t a_index,
7840
    uint64_t a_io_position);
7841
7842
WUFFS_BASE__GENERATED_C_CODE
7843
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
7844
wuffs_bmp__decoder__set_report_metadata(
7845
    wuffs_bmp__decoder* self,
7846
    uint32_t a_fourcc,
7847
    bool a_report);
7848
7849
WUFFS_BASE__GENERATED_C_CODE
7850
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
7851
wuffs_bmp__decoder__tell_me_more(
7852
    wuffs_bmp__decoder* self,
7853
    wuffs_base__io_buffer* a_dst,
7854
    wuffs_base__more_information* a_minfo,
7855
    wuffs_base__io_buffer* a_src);
7856
7857
WUFFS_BASE__GENERATED_C_CODE
7858
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
7859
wuffs_bmp__decoder__workbuf_len(
7860
    const wuffs_bmp__decoder* self);
7861
7862
#ifdef __cplusplus
7863
}  // extern "C"
7864
#endif
7865
7866
// ---------------- Struct Definitions
7867
7868
// These structs' fields, and the sizeof them, are private implementation
7869
// details that aren't guaranteed to be stable across Wuffs versions.
7870
//
7871
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
7872
7873
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
7874
7875
struct wuffs_bmp__decoder__struct {
7876
  // Do not access the private_impl's or private_data's fields directly. There
7877
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
7878
  // the wuffs_foo__bar__baz functions.
7879
  //
7880
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
7881
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
7882
7883
  struct {
7884
    uint32_t magic;
7885
    uint32_t active_coroutine;
7886
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
7887
    wuffs_base__vtable null_vtable;
7888
7889
    uint32_t f_width;
7890
    uint32_t f_height;
7891
    uint8_t f_call_sequence;
7892
    bool f_top_down;
7893
    uint32_t f_pad_per_row;
7894
    uint32_t f_src_pixfmt;
7895
    uint32_t f_io_redirect_fourcc;
7896
    uint64_t f_io_redirect_pos;
7897
    uint64_t f_frame_config_io_position;
7898
    uint32_t f_bitmap_info_len;
7899
    uint32_t f_padding;
7900
    uint32_t f_bits_per_pixel;
7901
    uint32_t f_compression;
7902
    uint32_t f_channel_masks[4];
7903
    uint8_t f_channel_shifts[4];
7904
    uint8_t f_channel_num_bits[4];
7905
    uint32_t f_dst_x;
7906
    uint32_t f_dst_y;
7907
    uint32_t f_dst_y_inc;
7908
    uint32_t f_pending_pad;
7909
    uint32_t f_rle_state;
7910
    uint32_t f_rle_length;
7911
    uint8_t f_rle_delta_x;
7912
    bool f_rle_padded;
7913
    wuffs_base__pixel_swizzler f_swizzler;
7914
7915
    uint32_t p_decode_image_config;
7916
    uint32_t p_do_decode_image_config;
7917
    uint32_t p_decode_frame_config;
7918
    uint32_t p_do_decode_frame_config;
7919
    uint32_t p_decode_frame;
7920
    uint32_t p_do_decode_frame;
7921
    uint32_t p_tell_me_more;
7922
    uint32_t p_read_palette;
7923
  } private_impl;
7924
7925
  struct {
7926
    uint8_t f_scratch[2048];
7927
    uint8_t f_src_palette[1024];
7928
7929
    struct {
7930
      uint64_t scratch;
7931
    } s_do_decode_image_config;
7932
    struct {
7933
      uint64_t scratch;
7934
    } s_do_decode_frame;
7935
    struct {
7936
      uint32_t v_i;
7937
      uint64_t scratch;
7938
    } s_read_palette;
7939
  } private_data;
7940
7941
#ifdef __cplusplus
7942
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7943
  using unique_ptr = std::unique_ptr<wuffs_bmp__decoder, wuffs_unique_ptr_deleter>;
7944
7945
  // On failure, the alloc_etc functions return nullptr. They don't throw.
7946
7947
  static inline unique_ptr
7948
  alloc() {
7949
    return unique_ptr(wuffs_bmp__decoder__alloc());
7950
  }
7951
7952
  static inline wuffs_base__image_decoder::unique_ptr
7953
  alloc_as__wuffs_base__image_decoder() {
7954
    return wuffs_base__image_decoder::unique_ptr(
7955
        wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder());
7956
  }
7957
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
7958
7959
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7960
  // Disallow constructing or copying an object via standard C++ mechanisms,
7961
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
7962
  // size and field layout is not part of the public, stable, memory-safe API.
7963
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
7964
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
7965
  // their first argument) rather than tweaking bar.private_impl.qux fields.
7966
  //
7967
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
7968
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
7969
  // order to provide convenience methods. These forward on "this", so that you
7970
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
7971
  wuffs_bmp__decoder__struct() = delete;
7972
  wuffs_bmp__decoder__struct(const wuffs_bmp__decoder__struct&) = delete;
7973
  wuffs_bmp__decoder__struct& operator=(
7974
      const wuffs_bmp__decoder__struct&) = delete;
7975
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
7976
7977
#if !defined(WUFFS_IMPLEMENTATION)
7978
  // As above, the size of the struct is not part of the public API, and unless
7979
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
7980
  // allocated, not stack allocated. Its size is not intended to be known at
7981
  // compile time, but it is unfortunately divulged as a side effect of
7982
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
7983
  // instead of "sizeof T", invoking the operator. To make the two values
7984
  // different, so that passing the latter will be rejected by the initialize
7985
  // function, we add an arbitrary amount of dead weight.
7986
  uint8_t dead_weight[123000000];  // 123 MB.
7987
#endif  // !defined(WUFFS_IMPLEMENTATION)
7988
7989
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
7990
  initialize(
7991
      size_t sizeof_star_self,
7992
      uint64_t wuffs_version,
7993
      uint32_t options) {
7994
    return wuffs_bmp__decoder__initialize(
7995
        this, sizeof_star_self, wuffs_version, options);
7996
  }
7997
7998
  inline wuffs_base__image_decoder*
7999
  upcast_as__wuffs_base__image_decoder() {
8000
    return (wuffs_base__image_decoder*)this;
8001
  }
8002
8003
  inline uint64_t
8004
  get_quirk(
8005
      uint32_t a_key) const {
8006
    return wuffs_bmp__decoder__get_quirk(this, a_key);
8007
  }
8008
8009
  inline wuffs_base__status
8010
  set_quirk(
8011
      uint32_t a_key,
8012
      uint64_t a_value) {
8013
    return wuffs_bmp__decoder__set_quirk(this, a_key, a_value);
8014
  }
8015
8016
  inline wuffs_base__status
8017
  decode_image_config(
8018
      wuffs_base__image_config* a_dst,
8019
      wuffs_base__io_buffer* a_src) {
8020
    return wuffs_bmp__decoder__decode_image_config(this, a_dst, a_src);
8021
  }
8022
8023
  inline wuffs_base__status
8024
  decode_frame_config(
8025
      wuffs_base__frame_config* a_dst,
8026
      wuffs_base__io_buffer* a_src) {
8027
    return wuffs_bmp__decoder__decode_frame_config(this, a_dst, a_src);
8028
  }
8029
8030
  inline wuffs_base__status
8031
  decode_frame(
8032
      wuffs_base__pixel_buffer* a_dst,
8033
      wuffs_base__io_buffer* a_src,
8034
      wuffs_base__pixel_blend a_blend,
8035
      wuffs_base__slice_u8 a_workbuf,
8036
      wuffs_base__decode_frame_options* a_opts) {
8037
    return wuffs_bmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
8038
  }
8039
8040
  inline wuffs_base__rect_ie_u32
8041
  frame_dirty_rect() const {
8042
    return wuffs_bmp__decoder__frame_dirty_rect(this);
8043
  }
8044
8045
  inline uint32_t
8046
  num_animation_loops() const {
8047
    return wuffs_bmp__decoder__num_animation_loops(this);
8048
  }
8049
8050
  inline uint64_t
8051
  num_decoded_frame_configs() const {
8052
    return wuffs_bmp__decoder__num_decoded_frame_configs(this);
8053
  }
8054
8055
  inline uint64_t
8056
  num_decoded_frames() const {
8057
    return wuffs_bmp__decoder__num_decoded_frames(this);
8058
  }
8059
8060
  inline wuffs_base__status
8061
  restart_frame(
8062
      uint64_t a_index,
8063
      uint64_t a_io_position) {
8064
    return wuffs_bmp__decoder__restart_frame(this, a_index, a_io_position);
8065
  }
8066
8067
  inline wuffs_base__empty_struct
8068
  set_report_metadata(
8069
      uint32_t a_fourcc,
8070
      bool a_report) {
8071
    return wuffs_bmp__decoder__set_report_metadata(this, a_fourcc, a_report);
8072
  }
8073
8074
  inline wuffs_base__status
8075
  tell_me_more(
8076
      wuffs_base__io_buffer* a_dst,
8077
      wuffs_base__more_information* a_minfo,
8078
      wuffs_base__io_buffer* a_src) {
8079
    return wuffs_bmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
8080
  }
8081
8082
  inline wuffs_base__range_ii_u64
8083
  workbuf_len() const {
8084
    return wuffs_bmp__decoder__workbuf_len(this);
8085
  }
8086
8087
#endif  // __cplusplus
8088
};  // struct wuffs_bmp__decoder__struct
8089
8090
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8091
8092
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP) || defined(WUFFS_NONMONOLITHIC)
8093
8094
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
8095
8096
// ---------------- Status Codes
8097
8098
extern const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[];
8099
extern const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[];
8100
extern const char wuffs_bzip2__error__bad_block_header[];
8101
extern const char wuffs_bzip2__error__bad_block_length[];
8102
extern const char wuffs_bzip2__error__bad_checksum[];
8103
extern const char wuffs_bzip2__error__bad_header[];
8104
extern const char wuffs_bzip2__error__bad_number_of_sections[];
8105
extern const char wuffs_bzip2__error__truncated_input[];
8106
extern const char wuffs_bzip2__error__unsupported_block_randomization[];
8107
8108
// ---------------- Public Consts
8109
8110
#define WUFFS_BZIP2__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
8111
8112
#define WUFFS_BZIP2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
8113
8114
// ---------------- Struct Declarations
8115
8116
typedef struct wuffs_bzip2__decoder__struct wuffs_bzip2__decoder;
8117
8118
#ifdef __cplusplus
8119
extern "C" {
8120
#endif
8121
8122
// ---------------- Public Initializer Prototypes
8123
8124
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8125
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8126
//
8127
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8128
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8129
8130
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8131
wuffs_bzip2__decoder__initialize(
8132
    wuffs_bzip2__decoder* self,
8133
    size_t sizeof_star_self,
8134
    uint64_t wuffs_version,
8135
    uint32_t options);
8136
8137
size_t
8138
sizeof__wuffs_bzip2__decoder(void);
8139
8140
// ---------------- Allocs
8141
8142
// These functions allocate and initialize Wuffs structs. They return NULL if
8143
// memory allocation fails. If they return non-NULL, there is no need to call
8144
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8145
// calling free on the returned pointer. That pointer is effectively a C++
8146
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8147
8148
wuffs_bzip2__decoder*
8149
wuffs_bzip2__decoder__alloc(void);
8150
8151
static inline wuffs_base__io_transformer*
8152
wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer(void) {
8153
  return (wuffs_base__io_transformer*)(wuffs_bzip2__decoder__alloc());
8154
}
8155
8156
// ---------------- Upcasts
8157
8158
static inline wuffs_base__io_transformer*
8159
wuffs_bzip2__decoder__upcast_as__wuffs_base__io_transformer(
8160
    wuffs_bzip2__decoder* p) {
8161
  return (wuffs_base__io_transformer*)p;
8162
}
8163
8164
// ---------------- Public Function Prototypes
8165
8166
WUFFS_BASE__GENERATED_C_CODE
8167
WUFFS_BASE__MAYBE_STATIC uint64_t
8168
wuffs_bzip2__decoder__get_quirk(
8169
    const wuffs_bzip2__decoder* self,
8170
    uint32_t a_key);
8171
8172
WUFFS_BASE__GENERATED_C_CODE
8173
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8174
wuffs_bzip2__decoder__set_quirk(
8175
    wuffs_bzip2__decoder* self,
8176
    uint32_t a_key,
8177
    uint64_t a_value);
8178
8179
WUFFS_BASE__GENERATED_C_CODE
8180
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
8181
wuffs_bzip2__decoder__dst_history_retain_length(
8182
    const wuffs_bzip2__decoder* self);
8183
8184
WUFFS_BASE__GENERATED_C_CODE
8185
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8186
wuffs_bzip2__decoder__workbuf_len(
8187
    const wuffs_bzip2__decoder* self);
8188
8189
WUFFS_BASE__GENERATED_C_CODE
8190
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8191
wuffs_bzip2__decoder__transform_io(
8192
    wuffs_bzip2__decoder* self,
8193
    wuffs_base__io_buffer* a_dst,
8194
    wuffs_base__io_buffer* a_src,
8195
    wuffs_base__slice_u8 a_workbuf);
8196
8197
#ifdef __cplusplus
8198
}  // extern "C"
8199
#endif
8200
8201
// ---------------- Struct Definitions
8202
8203
// These structs' fields, and the sizeof them, are private implementation
8204
// details that aren't guaranteed to be stable across Wuffs versions.
8205
//
8206
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8207
8208
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8209
8210
struct wuffs_bzip2__decoder__struct {
8211
  // Do not access the private_impl's or private_data's fields directly. There
8212
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8213
  // the wuffs_foo__bar__baz functions.
8214
  //
8215
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8216
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8217
8218
  struct {
8219
    uint32_t magic;
8220
    uint32_t active_coroutine;
8221
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
8222
    wuffs_base__vtable null_vtable;
8223
8224
    uint32_t f_bits;
8225
    uint32_t f_n_bits;
8226
    uint32_t f_max_incl_block_size;
8227
    uint32_t f_block_size;
8228
    bool f_decode_huffman_finished;
8229
    uint8_t f_decode_huffman_which;
8230
    uint32_t f_decode_huffman_ticks;
8231
    uint32_t f_decode_huffman_section;
8232
    uint32_t f_decode_huffman_run_shift;
8233
    uint32_t f_flush_pointer;
8234
    uint32_t f_flush_repeat_count;
8235
    uint8_t f_flush_prev;
8236
    bool f_ignore_checksum;
8237
    uint32_t f_final_checksum_have;
8238
    uint32_t f_block_checksum_have;
8239
    uint32_t f_block_checksum_want;
8240
    uint32_t f_original_pointer;
8241
    uint32_t f_num_symbols;
8242
    uint32_t f_num_huffman_codes;
8243
    uint32_t f_num_sections;
8244
    uint32_t f_code_lengths_bitmask;
8245
8246
    uint32_t p_transform_io;
8247
    uint32_t p_do_transform_io;
8248
    uint32_t p_prepare_block;
8249
    uint32_t p_read_code_lengths;
8250
    uint32_t p_flush_slow;
8251
    uint32_t p_decode_huffman_slow;
8252
  } private_impl;
8253
8254
  struct {
8255
    uint32_t f_scratch;
8256
    uint32_t f_letter_counts[256];
8257
    uint8_t f_presence[256];
8258
    uint8_t f_mtft[256];
8259
    uint8_t f_huffman_selectors[32768];
8260
    uint16_t f_huffman_trees[6][257][2];
8261
    uint16_t f_huffman_tables[6][256];
8262
    uint32_t f_bwt[1048576];
8263
8264
    struct {
8265
      uint32_t v_i;
8266
      uint64_t v_tag;
8267
      uint32_t v_final_checksum_want;
8268
    } s_do_transform_io;
8269
    struct {
8270
      uint32_t v_i;
8271
      uint32_t v_selector;
8272
    } s_prepare_block;
8273
    struct {
8274
      uint32_t v_i;
8275
      uint32_t v_code_length;
8276
    } s_read_code_lengths;
8277
    struct {
8278
      uint32_t v_flush_pointer;
8279
      uint32_t v_flush_repeat_count;
8280
      uint8_t v_flush_prev;
8281
      uint32_t v_block_checksum_have;
8282
      uint32_t v_block_size;
8283
      uint8_t v_curr;
8284
      uint64_t scratch;
8285
    } s_flush_slow;
8286
    struct {
8287
      uint32_t v_node_index;
8288
    } s_decode_huffman_slow;
8289
  } private_data;
8290
8291
#ifdef __cplusplus
8292
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8293
  using unique_ptr = std::unique_ptr<wuffs_bzip2__decoder, wuffs_unique_ptr_deleter>;
8294
8295
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8296
8297
  static inline unique_ptr
8298
  alloc() {
8299
    return unique_ptr(wuffs_bzip2__decoder__alloc());
8300
  }
8301
8302
  static inline wuffs_base__io_transformer::unique_ptr
8303
  alloc_as__wuffs_base__io_transformer() {
8304
    return wuffs_base__io_transformer::unique_ptr(
8305
        wuffs_bzip2__decoder__alloc_as__wuffs_base__io_transformer());
8306
  }
8307
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8308
8309
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8310
  // Disallow constructing or copying an object via standard C++ mechanisms,
8311
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8312
  // size and field layout is not part of the public, stable, memory-safe API.
8313
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8314
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8315
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8316
  //
8317
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8318
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8319
  // order to provide convenience methods. These forward on "this", so that you
8320
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8321
  wuffs_bzip2__decoder__struct() = delete;
8322
  wuffs_bzip2__decoder__struct(const wuffs_bzip2__decoder__struct&) = delete;
8323
  wuffs_bzip2__decoder__struct& operator=(
8324
      const wuffs_bzip2__decoder__struct&) = delete;
8325
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8326
8327
#if !defined(WUFFS_IMPLEMENTATION)
8328
  // As above, the size of the struct is not part of the public API, and unless
8329
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8330
  // allocated, not stack allocated. Its size is not intended to be known at
8331
  // compile time, but it is unfortunately divulged as a side effect of
8332
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8333
  // instead of "sizeof T", invoking the operator. To make the two values
8334
  // different, so that passing the latter will be rejected by the initialize
8335
  // function, we add an arbitrary amount of dead weight.
8336
  uint8_t dead_weight[123000000];  // 123 MB.
8337
#endif  // !defined(WUFFS_IMPLEMENTATION)
8338
8339
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8340
  initialize(
8341
      size_t sizeof_star_self,
8342
      uint64_t wuffs_version,
8343
      uint32_t options) {
8344
    return wuffs_bzip2__decoder__initialize(
8345
        this, sizeof_star_self, wuffs_version, options);
8346
  }
8347
8348
  inline wuffs_base__io_transformer*
8349
  upcast_as__wuffs_base__io_transformer() {
8350
    return (wuffs_base__io_transformer*)this;
8351
  }
8352
8353
  inline uint64_t
8354
  get_quirk(
8355
      uint32_t a_key) const {
8356
    return wuffs_bzip2__decoder__get_quirk(this, a_key);
8357
  }
8358
8359
  inline wuffs_base__status
8360
  set_quirk(
8361
      uint32_t a_key,
8362
      uint64_t a_value) {
8363
    return wuffs_bzip2__decoder__set_quirk(this, a_key, a_value);
8364
  }
8365
8366
  inline wuffs_base__optional_u63
8367
  dst_history_retain_length() const {
8368
    return wuffs_bzip2__decoder__dst_history_retain_length(this);
8369
  }
8370
8371
  inline wuffs_base__range_ii_u64
8372
  workbuf_len() const {
8373
    return wuffs_bzip2__decoder__workbuf_len(this);
8374
  }
8375
8376
  inline wuffs_base__status
8377
  transform_io(
8378
      wuffs_base__io_buffer* a_dst,
8379
      wuffs_base__io_buffer* a_src,
8380
      wuffs_base__slice_u8 a_workbuf) {
8381
    return wuffs_bzip2__decoder__transform_io(this, a_dst, a_src, a_workbuf);
8382
  }
8383
8384
#endif  // __cplusplus
8385
};  // struct wuffs_bzip2__decoder__struct
8386
8387
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8388
8389
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2) || defined(WUFFS_NONMONOLITHIC)
8390
8391
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8392
8393
// ---------------- Status Codes
8394
8395
extern const char wuffs_cbor__error__bad_input[];
8396
extern const char wuffs_cbor__error__unsupported_recursion_depth[];
8397
8398
// ---------------- Public Consts
8399
8400
#define WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
8401
8402
#define WUFFS_CBOR__DECODER_DEPTH_MAX_INCL 1024u
8403
8404
#define WUFFS_CBOR__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 2u
8405
8406
#define WUFFS_CBOR__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 9u
8407
8408
#define WUFFS_CBOR__TOKEN_VALUE_MAJOR 731642u
8409
8410
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK 262143u
8411
8412
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X 16777216u
8413
8414
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE 8388608u
8415
8416
#define WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG 4194304u
8417
8418
// ---------------- Struct Declarations
8419
8420
typedef struct wuffs_cbor__decoder__struct wuffs_cbor__decoder;
8421
8422
#ifdef __cplusplus
8423
extern "C" {
8424
#endif
8425
8426
// ---------------- Public Initializer Prototypes
8427
8428
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8429
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8430
//
8431
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8432
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8433
8434
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8435
wuffs_cbor__decoder__initialize(
8436
    wuffs_cbor__decoder* self,
8437
    size_t sizeof_star_self,
8438
    uint64_t wuffs_version,
8439
    uint32_t options);
8440
8441
size_t
8442
sizeof__wuffs_cbor__decoder(void);
8443
8444
// ---------------- Allocs
8445
8446
// These functions allocate and initialize Wuffs structs. They return NULL if
8447
// memory allocation fails. If they return non-NULL, there is no need to call
8448
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8449
// calling free on the returned pointer. That pointer is effectively a C++
8450
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8451
8452
wuffs_cbor__decoder*
8453
wuffs_cbor__decoder__alloc(void);
8454
8455
static inline wuffs_base__token_decoder*
8456
wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder(void) {
8457
  return (wuffs_base__token_decoder*)(wuffs_cbor__decoder__alloc());
8458
}
8459
8460
// ---------------- Upcasts
8461
8462
static inline wuffs_base__token_decoder*
8463
wuffs_cbor__decoder__upcast_as__wuffs_base__token_decoder(
8464
    wuffs_cbor__decoder* p) {
8465
  return (wuffs_base__token_decoder*)p;
8466
}
8467
8468
// ---------------- Public Function Prototypes
8469
8470
WUFFS_BASE__GENERATED_C_CODE
8471
WUFFS_BASE__MAYBE_STATIC uint64_t
8472
wuffs_cbor__decoder__get_quirk(
8473
    const wuffs_cbor__decoder* self,
8474
    uint32_t a_key);
8475
8476
WUFFS_BASE__GENERATED_C_CODE
8477
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8478
wuffs_cbor__decoder__set_quirk(
8479
    wuffs_cbor__decoder* self,
8480
    uint32_t a_key,
8481
    uint64_t a_value);
8482
8483
WUFFS_BASE__GENERATED_C_CODE
8484
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
8485
wuffs_cbor__decoder__workbuf_len(
8486
    const wuffs_cbor__decoder* self);
8487
8488
WUFFS_BASE__GENERATED_C_CODE
8489
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8490
wuffs_cbor__decoder__decode_tokens(
8491
    wuffs_cbor__decoder* self,
8492
    wuffs_base__token_buffer* a_dst,
8493
    wuffs_base__io_buffer* a_src,
8494
    wuffs_base__slice_u8 a_workbuf);
8495
8496
#ifdef __cplusplus
8497
}  // extern "C"
8498
#endif
8499
8500
// ---------------- Struct Definitions
8501
8502
// These structs' fields, and the sizeof them, are private implementation
8503
// details that aren't guaranteed to be stable across Wuffs versions.
8504
//
8505
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8506
8507
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8508
8509
struct wuffs_cbor__decoder__struct {
8510
  // Do not access the private_impl's or private_data's fields directly. There
8511
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8512
  // the wuffs_foo__bar__baz functions.
8513
  //
8514
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8515
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8516
8517
  struct {
8518
    uint32_t magic;
8519
    uint32_t active_coroutine;
8520
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
8521
    wuffs_base__vtable null_vtable;
8522
8523
    bool f_end_of_data;
8524
8525
    uint32_t p_decode_tokens;
8526
  } private_impl;
8527
8528
  struct {
8529
    uint32_t f_stack[64];
8530
    uint64_t f_container_num_remaining[1024];
8531
8532
    struct {
8533
      uint64_t v_string_length;
8534
      uint32_t v_depth;
8535
      bool v_tagged;
8536
      uint8_t v_indefinite_string_major_type;
8537
    } s_decode_tokens;
8538
  } private_data;
8539
8540
#ifdef __cplusplus
8541
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8542
  using unique_ptr = std::unique_ptr<wuffs_cbor__decoder, wuffs_unique_ptr_deleter>;
8543
8544
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8545
8546
  static inline unique_ptr
8547
  alloc() {
8548
    return unique_ptr(wuffs_cbor__decoder__alloc());
8549
  }
8550
8551
  static inline wuffs_base__token_decoder::unique_ptr
8552
  alloc_as__wuffs_base__token_decoder() {
8553
    return wuffs_base__token_decoder::unique_ptr(
8554
        wuffs_cbor__decoder__alloc_as__wuffs_base__token_decoder());
8555
  }
8556
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8557
8558
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8559
  // Disallow constructing or copying an object via standard C++ mechanisms,
8560
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8561
  // size and field layout is not part of the public, stable, memory-safe API.
8562
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8563
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8564
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8565
  //
8566
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8567
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8568
  // order to provide convenience methods. These forward on "this", so that you
8569
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8570
  wuffs_cbor__decoder__struct() = delete;
8571
  wuffs_cbor__decoder__struct(const wuffs_cbor__decoder__struct&) = delete;
8572
  wuffs_cbor__decoder__struct& operator=(
8573
      const wuffs_cbor__decoder__struct&) = delete;
8574
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8575
8576
#if !defined(WUFFS_IMPLEMENTATION)
8577
  // As above, the size of the struct is not part of the public API, and unless
8578
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8579
  // allocated, not stack allocated. Its size is not intended to be known at
8580
  // compile time, but it is unfortunately divulged as a side effect of
8581
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8582
  // instead of "sizeof T", invoking the operator. To make the two values
8583
  // different, so that passing the latter will be rejected by the initialize
8584
  // function, we add an arbitrary amount of dead weight.
8585
  uint8_t dead_weight[123000000];  // 123 MB.
8586
#endif  // !defined(WUFFS_IMPLEMENTATION)
8587
8588
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8589
  initialize(
8590
      size_t sizeof_star_self,
8591
      uint64_t wuffs_version,
8592
      uint32_t options) {
8593
    return wuffs_cbor__decoder__initialize(
8594
        this, sizeof_star_self, wuffs_version, options);
8595
  }
8596
8597
  inline wuffs_base__token_decoder*
8598
  upcast_as__wuffs_base__token_decoder() {
8599
    return (wuffs_base__token_decoder*)this;
8600
  }
8601
8602
  inline uint64_t
8603
  get_quirk(
8604
      uint32_t a_key) const {
8605
    return wuffs_cbor__decoder__get_quirk(this, a_key);
8606
  }
8607
8608
  inline wuffs_base__status
8609
  set_quirk(
8610
      uint32_t a_key,
8611
      uint64_t a_value) {
8612
    return wuffs_cbor__decoder__set_quirk(this, a_key, a_value);
8613
  }
8614
8615
  inline wuffs_base__range_ii_u64
8616
  workbuf_len() const {
8617
    return wuffs_cbor__decoder__workbuf_len(this);
8618
  }
8619
8620
  inline wuffs_base__status
8621
  decode_tokens(
8622
      wuffs_base__token_buffer* a_dst,
8623
      wuffs_base__io_buffer* a_src,
8624
      wuffs_base__slice_u8 a_workbuf) {
8625
    return wuffs_cbor__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
8626
  }
8627
8628
#endif  // __cplusplus
8629
};  // struct wuffs_cbor__decoder__struct
8630
8631
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8632
8633
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR) || defined(WUFFS_NONMONOLITHIC)
8634
8635
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8636
8637
// ---------------- Status Codes
8638
8639
// ---------------- Public Consts
8640
8641
// ---------------- Struct Declarations
8642
8643
typedef struct wuffs_crc32__ieee_hasher__struct wuffs_crc32__ieee_hasher;
8644
8645
#ifdef __cplusplus
8646
extern "C" {
8647
#endif
8648
8649
// ---------------- Public Initializer Prototypes
8650
8651
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8652
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8653
//
8654
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8655
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8656
8657
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8658
wuffs_crc32__ieee_hasher__initialize(
8659
    wuffs_crc32__ieee_hasher* self,
8660
    size_t sizeof_star_self,
8661
    uint64_t wuffs_version,
8662
    uint32_t options);
8663
8664
size_t
8665
sizeof__wuffs_crc32__ieee_hasher(void);
8666
8667
// ---------------- Allocs
8668
8669
// These functions allocate and initialize Wuffs structs. They return NULL if
8670
// memory allocation fails. If they return non-NULL, there is no need to call
8671
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8672
// calling free on the returned pointer. That pointer is effectively a C++
8673
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8674
8675
wuffs_crc32__ieee_hasher*
8676
wuffs_crc32__ieee_hasher__alloc(void);
8677
8678
static inline wuffs_base__hasher_u32*
8679
0
wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32(void) {
8680
0
  return (wuffs_base__hasher_u32*)(wuffs_crc32__ieee_hasher__alloc());
8681
0
}
8682
8683
// ---------------- Upcasts
8684
8685
static inline wuffs_base__hasher_u32*
8686
wuffs_crc32__ieee_hasher__upcast_as__wuffs_base__hasher_u32(
8687
0
    wuffs_crc32__ieee_hasher* p) {
8688
0
  return (wuffs_base__hasher_u32*)p;
8689
0
}
8690
8691
// ---------------- Public Function Prototypes
8692
8693
WUFFS_BASE__GENERATED_C_CODE
8694
WUFFS_BASE__MAYBE_STATIC uint64_t
8695
wuffs_crc32__ieee_hasher__get_quirk(
8696
    const wuffs_crc32__ieee_hasher* self,
8697
    uint32_t a_key);
8698
8699
WUFFS_BASE__GENERATED_C_CODE
8700
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8701
wuffs_crc32__ieee_hasher__set_quirk(
8702
    wuffs_crc32__ieee_hasher* self,
8703
    uint32_t a_key,
8704
    uint64_t a_value);
8705
8706
WUFFS_BASE__GENERATED_C_CODE
8707
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8708
wuffs_crc32__ieee_hasher__update(
8709
    wuffs_crc32__ieee_hasher* self,
8710
    wuffs_base__slice_u8 a_x);
8711
8712
WUFFS_BASE__GENERATED_C_CODE
8713
WUFFS_BASE__MAYBE_STATIC uint32_t
8714
wuffs_crc32__ieee_hasher__update_u32(
8715
    wuffs_crc32__ieee_hasher* self,
8716
    wuffs_base__slice_u8 a_x);
8717
8718
WUFFS_BASE__GENERATED_C_CODE
8719
WUFFS_BASE__MAYBE_STATIC uint32_t
8720
wuffs_crc32__ieee_hasher__checksum_u32(
8721
    const wuffs_crc32__ieee_hasher* self);
8722
8723
#ifdef __cplusplus
8724
}  // extern "C"
8725
#endif
8726
8727
// ---------------- Struct Definitions
8728
8729
// These structs' fields, and the sizeof them, are private implementation
8730
// details that aren't guaranteed to be stable across Wuffs versions.
8731
//
8732
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8733
8734
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8735
8736
struct wuffs_crc32__ieee_hasher__struct {
8737
  // Do not access the private_impl's or private_data's fields directly. There
8738
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8739
  // the wuffs_foo__bar__baz functions.
8740
  //
8741
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8742
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8743
8744
  struct {
8745
    uint32_t magic;
8746
    uint32_t active_coroutine;
8747
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
8748
    wuffs_base__vtable null_vtable;
8749
8750
    uint32_t f_state;
8751
8752
    wuffs_base__empty_struct (*choosy_up)(
8753
        wuffs_crc32__ieee_hasher* self,
8754
        wuffs_base__slice_u8 a_x);
8755
  } private_impl;
8756
8757
#ifdef __cplusplus
8758
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8759
  using unique_ptr = std::unique_ptr<wuffs_crc32__ieee_hasher, wuffs_unique_ptr_deleter>;
8760
8761
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8762
8763
  static inline unique_ptr
8764
  alloc() {
8765
    return unique_ptr(wuffs_crc32__ieee_hasher__alloc());
8766
  }
8767
8768
  static inline wuffs_base__hasher_u32::unique_ptr
8769
  alloc_as__wuffs_base__hasher_u32() {
8770
    return wuffs_base__hasher_u32::unique_ptr(
8771
        wuffs_crc32__ieee_hasher__alloc_as__wuffs_base__hasher_u32());
8772
  }
8773
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8774
8775
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8776
  // Disallow constructing or copying an object via standard C++ mechanisms,
8777
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8778
  // size and field layout is not part of the public, stable, memory-safe API.
8779
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
8780
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
8781
  // their first argument) rather than tweaking bar.private_impl.qux fields.
8782
  //
8783
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
8784
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
8785
  // order to provide convenience methods. These forward on "this", so that you
8786
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
8787
  wuffs_crc32__ieee_hasher__struct() = delete;
8788
  wuffs_crc32__ieee_hasher__struct(const wuffs_crc32__ieee_hasher__struct&) = delete;
8789
  wuffs_crc32__ieee_hasher__struct& operator=(
8790
      const wuffs_crc32__ieee_hasher__struct&) = delete;
8791
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8792
8793
#if !defined(WUFFS_IMPLEMENTATION)
8794
  // As above, the size of the struct is not part of the public API, and unless
8795
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
8796
  // allocated, not stack allocated. Its size is not intended to be known at
8797
  // compile time, but it is unfortunately divulged as a side effect of
8798
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
8799
  // instead of "sizeof T", invoking the operator. To make the two values
8800
  // different, so that passing the latter will be rejected by the initialize
8801
  // function, we add an arbitrary amount of dead weight.
8802
  uint8_t dead_weight[123000000];  // 123 MB.
8803
#endif  // !defined(WUFFS_IMPLEMENTATION)
8804
8805
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8806
  initialize(
8807
      size_t sizeof_star_self,
8808
      uint64_t wuffs_version,
8809
      uint32_t options) {
8810
    return wuffs_crc32__ieee_hasher__initialize(
8811
        this, sizeof_star_self, wuffs_version, options);
8812
  }
8813
8814
  inline wuffs_base__hasher_u32*
8815
  upcast_as__wuffs_base__hasher_u32() {
8816
    return (wuffs_base__hasher_u32*)this;
8817
  }
8818
8819
  inline uint64_t
8820
  get_quirk(
8821
      uint32_t a_key) const {
8822
    return wuffs_crc32__ieee_hasher__get_quirk(this, a_key);
8823
  }
8824
8825
  inline wuffs_base__status
8826
  set_quirk(
8827
      uint32_t a_key,
8828
      uint64_t a_value) {
8829
    return wuffs_crc32__ieee_hasher__set_quirk(this, a_key, a_value);
8830
  }
8831
8832
  inline wuffs_base__empty_struct
8833
  update(
8834
      wuffs_base__slice_u8 a_x) {
8835
    return wuffs_crc32__ieee_hasher__update(this, a_x);
8836
  }
8837
8838
  inline uint32_t
8839
  update_u32(
8840
      wuffs_base__slice_u8 a_x) {
8841
    return wuffs_crc32__ieee_hasher__update_u32(this, a_x);
8842
  }
8843
8844
  inline uint32_t
8845
  checksum_u32() const {
8846
    return wuffs_crc32__ieee_hasher__checksum_u32(this);
8847
  }
8848
8849
#endif  // __cplusplus
8850
};  // struct wuffs_crc32__ieee_hasher__struct
8851
8852
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8853
8854
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32) || defined(WUFFS_NONMONOLITHIC)
8855
8856
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
8857
8858
// ---------------- Status Codes
8859
8860
// ---------------- Public Consts
8861
8862
// ---------------- Struct Declarations
8863
8864
typedef struct wuffs_crc64__ecma_hasher__struct wuffs_crc64__ecma_hasher;
8865
8866
#ifdef __cplusplus
8867
extern "C" {
8868
#endif
8869
8870
// ---------------- Public Initializer Prototypes
8871
8872
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
8873
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
8874
//
8875
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
8876
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
8877
8878
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
8879
wuffs_crc64__ecma_hasher__initialize(
8880
    wuffs_crc64__ecma_hasher* self,
8881
    size_t sizeof_star_self,
8882
    uint64_t wuffs_version,
8883
    uint32_t options);
8884
8885
size_t
8886
sizeof__wuffs_crc64__ecma_hasher(void);
8887
8888
// ---------------- Allocs
8889
8890
// These functions allocate and initialize Wuffs structs. They return NULL if
8891
// memory allocation fails. If they return non-NULL, there is no need to call
8892
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
8893
// calling free on the returned pointer. That pointer is effectively a C++
8894
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
8895
8896
wuffs_crc64__ecma_hasher*
8897
wuffs_crc64__ecma_hasher__alloc(void);
8898
8899
static inline wuffs_base__hasher_u64*
8900
wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64(void) {
8901
  return (wuffs_base__hasher_u64*)(wuffs_crc64__ecma_hasher__alloc());
8902
}
8903
8904
// ---------------- Upcasts
8905
8906
static inline wuffs_base__hasher_u64*
8907
wuffs_crc64__ecma_hasher__upcast_as__wuffs_base__hasher_u64(
8908
    wuffs_crc64__ecma_hasher* p) {
8909
  return (wuffs_base__hasher_u64*)p;
8910
}
8911
8912
// ---------------- Public Function Prototypes
8913
8914
WUFFS_BASE__GENERATED_C_CODE
8915
WUFFS_BASE__MAYBE_STATIC uint64_t
8916
wuffs_crc64__ecma_hasher__get_quirk(
8917
    const wuffs_crc64__ecma_hasher* self,
8918
    uint32_t a_key);
8919
8920
WUFFS_BASE__GENERATED_C_CODE
8921
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
8922
wuffs_crc64__ecma_hasher__set_quirk(
8923
    wuffs_crc64__ecma_hasher* self,
8924
    uint32_t a_key,
8925
    uint64_t a_value);
8926
8927
WUFFS_BASE__GENERATED_C_CODE
8928
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
8929
wuffs_crc64__ecma_hasher__update(
8930
    wuffs_crc64__ecma_hasher* self,
8931
    wuffs_base__slice_u8 a_x);
8932
8933
WUFFS_BASE__GENERATED_C_CODE
8934
WUFFS_BASE__MAYBE_STATIC uint64_t
8935
wuffs_crc64__ecma_hasher__update_u64(
8936
    wuffs_crc64__ecma_hasher* self,
8937
    wuffs_base__slice_u8 a_x);
8938
8939
WUFFS_BASE__GENERATED_C_CODE
8940
WUFFS_BASE__MAYBE_STATIC uint64_t
8941
wuffs_crc64__ecma_hasher__checksum_u64(
8942
    const wuffs_crc64__ecma_hasher* self);
8943
8944
#ifdef __cplusplus
8945
}  // extern "C"
8946
#endif
8947
8948
// ---------------- Struct Definitions
8949
8950
// These structs' fields, and the sizeof them, are private implementation
8951
// details that aren't guaranteed to be stable across Wuffs versions.
8952
//
8953
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
8954
8955
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
8956
8957
struct wuffs_crc64__ecma_hasher__struct {
8958
  // Do not access the private_impl's or private_data's fields directly. There
8959
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
8960
  // the wuffs_foo__bar__baz functions.
8961
  //
8962
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
8963
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
8964
8965
  struct {
8966
    uint32_t magic;
8967
    uint32_t active_coroutine;
8968
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
8969
    wuffs_base__vtable null_vtable;
8970
8971
    uint64_t f_state;
8972
8973
    wuffs_base__empty_struct (*choosy_up)(
8974
        wuffs_crc64__ecma_hasher* self,
8975
        wuffs_base__slice_u8 a_x);
8976
  } private_impl;
8977
8978
#ifdef __cplusplus
8979
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8980
  using unique_ptr = std::unique_ptr<wuffs_crc64__ecma_hasher, wuffs_unique_ptr_deleter>;
8981
8982
  // On failure, the alloc_etc functions return nullptr. They don't throw.
8983
8984
  static inline unique_ptr
8985
  alloc() {
8986
    return unique_ptr(wuffs_crc64__ecma_hasher__alloc());
8987
  }
8988
8989
  static inline wuffs_base__hasher_u64::unique_ptr
8990
  alloc_as__wuffs_base__hasher_u64() {
8991
    return wuffs_base__hasher_u64::unique_ptr(
8992
        wuffs_crc64__ecma_hasher__alloc_as__wuffs_base__hasher_u64());
8993
  }
8994
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
8995
8996
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
8997
  // Disallow constructing or copying an object via standard C++ mechanisms,
8998
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
8999
  // size and field layout is not part of the public, stable, memory-safe API.
9000
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9001
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9002
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9003
  //
9004
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9005
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9006
  // order to provide convenience methods. These forward on "this", so that you
9007
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9008
  wuffs_crc64__ecma_hasher__struct() = delete;
9009
  wuffs_crc64__ecma_hasher__struct(const wuffs_crc64__ecma_hasher__struct&) = delete;
9010
  wuffs_crc64__ecma_hasher__struct& operator=(
9011
      const wuffs_crc64__ecma_hasher__struct&) = delete;
9012
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9013
9014
#if !defined(WUFFS_IMPLEMENTATION)
9015
  // As above, the size of the struct is not part of the public API, and unless
9016
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9017
  // allocated, not stack allocated. Its size is not intended to be known at
9018
  // compile time, but it is unfortunately divulged as a side effect of
9019
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9020
  // instead of "sizeof T", invoking the operator. To make the two values
9021
  // different, so that passing the latter will be rejected by the initialize
9022
  // function, we add an arbitrary amount of dead weight.
9023
  uint8_t dead_weight[123000000];  // 123 MB.
9024
#endif  // !defined(WUFFS_IMPLEMENTATION)
9025
9026
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9027
  initialize(
9028
      size_t sizeof_star_self,
9029
      uint64_t wuffs_version,
9030
      uint32_t options) {
9031
    return wuffs_crc64__ecma_hasher__initialize(
9032
        this, sizeof_star_self, wuffs_version, options);
9033
  }
9034
9035
  inline wuffs_base__hasher_u64*
9036
  upcast_as__wuffs_base__hasher_u64() {
9037
    return (wuffs_base__hasher_u64*)this;
9038
  }
9039
9040
  inline uint64_t
9041
  get_quirk(
9042
      uint32_t a_key) const {
9043
    return wuffs_crc64__ecma_hasher__get_quirk(this, a_key);
9044
  }
9045
9046
  inline wuffs_base__status
9047
  set_quirk(
9048
      uint32_t a_key,
9049
      uint64_t a_value) {
9050
    return wuffs_crc64__ecma_hasher__set_quirk(this, a_key, a_value);
9051
  }
9052
9053
  inline wuffs_base__empty_struct
9054
  update(
9055
      wuffs_base__slice_u8 a_x) {
9056
    return wuffs_crc64__ecma_hasher__update(this, a_x);
9057
  }
9058
9059
  inline uint64_t
9060
  update_u64(
9061
      wuffs_base__slice_u8 a_x) {
9062
    return wuffs_crc64__ecma_hasher__update_u64(this, a_x);
9063
  }
9064
9065
  inline uint64_t
9066
  checksum_u64() const {
9067
    return wuffs_crc64__ecma_hasher__checksum_u64(this);
9068
  }
9069
9070
#endif  // __cplusplus
9071
};  // struct wuffs_crc64__ecma_hasher__struct
9072
9073
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9074
9075
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64) || defined(WUFFS_NONMONOLITHIC)
9076
9077
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
9078
9079
// ---------------- Status Codes
9080
9081
extern const char wuffs_deflate__error__bad_huffman_code_over_subscribed[];
9082
extern const char wuffs_deflate__error__bad_huffman_code_under_subscribed[];
9083
extern const char wuffs_deflate__error__bad_huffman_code_length_count[];
9084
extern const char wuffs_deflate__error__bad_huffman_code_length_repetition[];
9085
extern const char wuffs_deflate__error__bad_huffman_code[];
9086
extern const char wuffs_deflate__error__bad_huffman_minimum_code_length[];
9087
extern const char wuffs_deflate__error__bad_block[];
9088
extern const char wuffs_deflate__error__bad_distance[];
9089
extern const char wuffs_deflate__error__bad_distance_code_count[];
9090
extern const char wuffs_deflate__error__bad_literal_length_code_count[];
9091
extern const char wuffs_deflate__error__inconsistent_stored_block_length[];
9092
extern const char wuffs_deflate__error__missing_end_of_block_code[];
9093
extern const char wuffs_deflate__error__no_huffman_codes[];
9094
extern const char wuffs_deflate__error__truncated_input[];
9095
9096
// ---------------- Public Consts
9097
9098
#define WUFFS_DEFLATE__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
9099
9100
#define WUFFS_DEFLATE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
9101
9102
// ---------------- Struct Declarations
9103
9104
typedef struct wuffs_deflate__decoder__struct wuffs_deflate__decoder;
9105
9106
#ifdef __cplusplus
9107
extern "C" {
9108
#endif
9109
9110
// ---------------- Public Initializer Prototypes
9111
9112
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9113
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9114
//
9115
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9116
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9117
9118
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9119
wuffs_deflate__decoder__initialize(
9120
    wuffs_deflate__decoder* self,
9121
    size_t sizeof_star_self,
9122
    uint64_t wuffs_version,
9123
    uint32_t options);
9124
9125
size_t
9126
sizeof__wuffs_deflate__decoder(void);
9127
9128
// ---------------- Allocs
9129
9130
// These functions allocate and initialize Wuffs structs. They return NULL if
9131
// memory allocation fails. If they return non-NULL, there is no need to call
9132
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9133
// calling free on the returned pointer. That pointer is effectively a C++
9134
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9135
9136
wuffs_deflate__decoder*
9137
wuffs_deflate__decoder__alloc(void);
9138
9139
static inline wuffs_base__io_transformer*
9140
0
wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer(void) {
9141
0
  return (wuffs_base__io_transformer*)(wuffs_deflate__decoder__alloc());
9142
0
}
9143
9144
// ---------------- Upcasts
9145
9146
static inline wuffs_base__io_transformer*
9147
wuffs_deflate__decoder__upcast_as__wuffs_base__io_transformer(
9148
0
    wuffs_deflate__decoder* p) {
9149
0
  return (wuffs_base__io_transformer*)p;
9150
0
}
9151
9152
// ---------------- Public Function Prototypes
9153
9154
WUFFS_BASE__GENERATED_C_CODE
9155
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9156
wuffs_deflate__decoder__add_history(
9157
    wuffs_deflate__decoder* self,
9158
    wuffs_base__slice_u8 a_hist);
9159
9160
WUFFS_BASE__GENERATED_C_CODE
9161
WUFFS_BASE__MAYBE_STATIC uint64_t
9162
wuffs_deflate__decoder__get_quirk(
9163
    const wuffs_deflate__decoder* self,
9164
    uint32_t a_key);
9165
9166
WUFFS_BASE__GENERATED_C_CODE
9167
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9168
wuffs_deflate__decoder__set_quirk(
9169
    wuffs_deflate__decoder* self,
9170
    uint32_t a_key,
9171
    uint64_t a_value);
9172
9173
WUFFS_BASE__GENERATED_C_CODE
9174
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
9175
wuffs_deflate__decoder__dst_history_retain_length(
9176
    const wuffs_deflate__decoder* self);
9177
9178
WUFFS_BASE__GENERATED_C_CODE
9179
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9180
wuffs_deflate__decoder__workbuf_len(
9181
    const wuffs_deflate__decoder* self);
9182
9183
WUFFS_BASE__GENERATED_C_CODE
9184
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9185
wuffs_deflate__decoder__transform_io(
9186
    wuffs_deflate__decoder* self,
9187
    wuffs_base__io_buffer* a_dst,
9188
    wuffs_base__io_buffer* a_src,
9189
    wuffs_base__slice_u8 a_workbuf);
9190
9191
#ifdef __cplusplus
9192
}  // extern "C"
9193
#endif
9194
9195
// ---------------- Struct Definitions
9196
9197
// These structs' fields, and the sizeof them, are private implementation
9198
// details that aren't guaranteed to be stable across Wuffs versions.
9199
//
9200
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9201
9202
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9203
9204
struct wuffs_deflate__decoder__struct {
9205
  // Do not access the private_impl's or private_data's fields directly. There
9206
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9207
  // the wuffs_foo__bar__baz functions.
9208
  //
9209
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9210
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9211
9212
  struct {
9213
    uint32_t magic;
9214
    uint32_t active_coroutine;
9215
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
9216
    wuffs_base__vtable null_vtable;
9217
9218
    uint32_t f_bits;
9219
    uint32_t f_n_bits;
9220
    uint64_t f_transformed_history_count;
9221
    uint32_t f_history_index;
9222
    uint32_t f_n_huffs_bits[2];
9223
    bool f_end_of_block;
9224
9225
    uint32_t p_transform_io;
9226
    uint32_t p_do_transform_io;
9227
    uint32_t p_decode_blocks;
9228
    uint32_t p_decode_uncompressed;
9229
    uint32_t p_init_dynamic_huffman;
9230
    wuffs_base__status (*choosy_decode_huffman_fast64)(
9231
        wuffs_deflate__decoder* self,
9232
        wuffs_base__io_buffer* a_dst,
9233
        wuffs_base__io_buffer* a_src);
9234
    uint32_t p_decode_huffman_slow;
9235
  } private_impl;
9236
9237
  struct {
9238
    uint32_t f_huffs[2][1024];
9239
    uint8_t f_history[33025];
9240
    uint8_t f_code_lengths[320];
9241
9242
    struct {
9243
      uint32_t v_final;
9244
    } s_decode_blocks;
9245
    struct {
9246
      uint32_t v_length;
9247
      uint64_t scratch;
9248
    } s_decode_uncompressed;
9249
    struct {
9250
      uint32_t v_bits;
9251
      uint32_t v_n_bits;
9252
      uint32_t v_n_lit;
9253
      uint32_t v_n_dist;
9254
      uint32_t v_n_clen;
9255
      uint32_t v_i;
9256
      uint32_t v_mask;
9257
      uint32_t v_n_extra_bits;
9258
      uint8_t v_rep_symbol;
9259
      uint32_t v_rep_count;
9260
    } s_init_dynamic_huffman;
9261
    struct {
9262
      uint32_t v_bits;
9263
      uint32_t v_n_bits;
9264
      uint32_t v_table_entry_n_bits;
9265
      uint32_t v_lmask;
9266
      uint32_t v_dmask;
9267
      uint32_t v_redir_top;
9268
      uint32_t v_redir_mask;
9269
      uint32_t v_length;
9270
      uint32_t v_dist_minus_1;
9271
      uint64_t scratch;
9272
    } s_decode_huffman_slow;
9273
  } private_data;
9274
9275
#ifdef __cplusplus
9276
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9277
  using unique_ptr = std::unique_ptr<wuffs_deflate__decoder, wuffs_unique_ptr_deleter>;
9278
9279
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9280
9281
  static inline unique_ptr
9282
  alloc() {
9283
    return unique_ptr(wuffs_deflate__decoder__alloc());
9284
  }
9285
9286
  static inline wuffs_base__io_transformer::unique_ptr
9287
  alloc_as__wuffs_base__io_transformer() {
9288
    return wuffs_base__io_transformer::unique_ptr(
9289
        wuffs_deflate__decoder__alloc_as__wuffs_base__io_transformer());
9290
  }
9291
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9292
9293
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9294
  // Disallow constructing or copying an object via standard C++ mechanisms,
9295
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9296
  // size and field layout is not part of the public, stable, memory-safe API.
9297
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9298
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9299
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9300
  //
9301
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9302
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9303
  // order to provide convenience methods. These forward on "this", so that you
9304
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9305
  wuffs_deflate__decoder__struct() = delete;
9306
  wuffs_deflate__decoder__struct(const wuffs_deflate__decoder__struct&) = delete;
9307
  wuffs_deflate__decoder__struct& operator=(
9308
      const wuffs_deflate__decoder__struct&) = delete;
9309
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9310
9311
#if !defined(WUFFS_IMPLEMENTATION)
9312
  // As above, the size of the struct is not part of the public API, and unless
9313
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9314
  // allocated, not stack allocated. Its size is not intended to be known at
9315
  // compile time, but it is unfortunately divulged as a side effect of
9316
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9317
  // instead of "sizeof T", invoking the operator. To make the two values
9318
  // different, so that passing the latter will be rejected by the initialize
9319
  // function, we add an arbitrary amount of dead weight.
9320
  uint8_t dead_weight[123000000];  // 123 MB.
9321
#endif  // !defined(WUFFS_IMPLEMENTATION)
9322
9323
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9324
  initialize(
9325
      size_t sizeof_star_self,
9326
      uint64_t wuffs_version,
9327
      uint32_t options) {
9328
    return wuffs_deflate__decoder__initialize(
9329
        this, sizeof_star_self, wuffs_version, options);
9330
  }
9331
9332
  inline wuffs_base__io_transformer*
9333
  upcast_as__wuffs_base__io_transformer() {
9334
    return (wuffs_base__io_transformer*)this;
9335
  }
9336
9337
  inline wuffs_base__empty_struct
9338
  add_history(
9339
      wuffs_base__slice_u8 a_hist) {
9340
    return wuffs_deflate__decoder__add_history(this, a_hist);
9341
  }
9342
9343
  inline uint64_t
9344
  get_quirk(
9345
      uint32_t a_key) const {
9346
    return wuffs_deflate__decoder__get_quirk(this, a_key);
9347
  }
9348
9349
  inline wuffs_base__status
9350
  set_quirk(
9351
      uint32_t a_key,
9352
      uint64_t a_value) {
9353
    return wuffs_deflate__decoder__set_quirk(this, a_key, a_value);
9354
  }
9355
9356
  inline wuffs_base__optional_u63
9357
  dst_history_retain_length() const {
9358
    return wuffs_deflate__decoder__dst_history_retain_length(this);
9359
  }
9360
9361
  inline wuffs_base__range_ii_u64
9362
  workbuf_len() const {
9363
    return wuffs_deflate__decoder__workbuf_len(this);
9364
  }
9365
9366
  inline wuffs_base__status
9367
  transform_io(
9368
      wuffs_base__io_buffer* a_dst,
9369
      wuffs_base__io_buffer* a_src,
9370
      wuffs_base__slice_u8 a_workbuf) {
9371
    return wuffs_deflate__decoder__transform_io(this, a_dst, a_src, a_workbuf);
9372
  }
9373
9374
#endif  // __cplusplus
9375
};  // struct wuffs_deflate__decoder__struct
9376
9377
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9378
9379
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE) || defined(WUFFS_NONMONOLITHIC)
9380
9381
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9382
9383
// ---------------- Status Codes
9384
9385
extern const char wuffs_etc2__error__bad_header[];
9386
extern const char wuffs_etc2__error__truncated_input[];
9387
9388
// ---------------- Public Consts
9389
9390
#define WUFFS_ETC2__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9391
9392
// ---------------- Struct Declarations
9393
9394
typedef struct wuffs_etc2__decoder__struct wuffs_etc2__decoder;
9395
9396
#ifdef __cplusplus
9397
extern "C" {
9398
#endif
9399
9400
// ---------------- Public Initializer Prototypes
9401
9402
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9403
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9404
//
9405
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9406
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9407
9408
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9409
wuffs_etc2__decoder__initialize(
9410
    wuffs_etc2__decoder* self,
9411
    size_t sizeof_star_self,
9412
    uint64_t wuffs_version,
9413
    uint32_t options);
9414
9415
size_t
9416
sizeof__wuffs_etc2__decoder(void);
9417
9418
// ---------------- Allocs
9419
9420
// These functions allocate and initialize Wuffs structs. They return NULL if
9421
// memory allocation fails. If they return non-NULL, there is no need to call
9422
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9423
// calling free on the returned pointer. That pointer is effectively a C++
9424
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9425
9426
wuffs_etc2__decoder*
9427
wuffs_etc2__decoder__alloc(void);
9428
9429
static inline wuffs_base__image_decoder*
9430
wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder(void) {
9431
  return (wuffs_base__image_decoder*)(wuffs_etc2__decoder__alloc());
9432
}
9433
9434
// ---------------- Upcasts
9435
9436
static inline wuffs_base__image_decoder*
9437
wuffs_etc2__decoder__upcast_as__wuffs_base__image_decoder(
9438
    wuffs_etc2__decoder* p) {
9439
  return (wuffs_base__image_decoder*)p;
9440
}
9441
9442
// ---------------- Public Function Prototypes
9443
9444
WUFFS_BASE__GENERATED_C_CODE
9445
WUFFS_BASE__MAYBE_STATIC uint64_t
9446
wuffs_etc2__decoder__get_quirk(
9447
    const wuffs_etc2__decoder* self,
9448
    uint32_t a_key);
9449
9450
WUFFS_BASE__GENERATED_C_CODE
9451
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9452
wuffs_etc2__decoder__set_quirk(
9453
    wuffs_etc2__decoder* self,
9454
    uint32_t a_key,
9455
    uint64_t a_value);
9456
9457
WUFFS_BASE__GENERATED_C_CODE
9458
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9459
wuffs_etc2__decoder__decode_image_config(
9460
    wuffs_etc2__decoder* self,
9461
    wuffs_base__image_config* a_dst,
9462
    wuffs_base__io_buffer* a_src);
9463
9464
WUFFS_BASE__GENERATED_C_CODE
9465
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9466
wuffs_etc2__decoder__decode_frame_config(
9467
    wuffs_etc2__decoder* self,
9468
    wuffs_base__frame_config* a_dst,
9469
    wuffs_base__io_buffer* a_src);
9470
9471
WUFFS_BASE__GENERATED_C_CODE
9472
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9473
wuffs_etc2__decoder__decode_frame(
9474
    wuffs_etc2__decoder* self,
9475
    wuffs_base__pixel_buffer* a_dst,
9476
    wuffs_base__io_buffer* a_src,
9477
    wuffs_base__pixel_blend a_blend,
9478
    wuffs_base__slice_u8 a_workbuf,
9479
    wuffs_base__decode_frame_options* a_opts);
9480
9481
WUFFS_BASE__GENERATED_C_CODE
9482
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9483
wuffs_etc2__decoder__frame_dirty_rect(
9484
    const wuffs_etc2__decoder* self);
9485
9486
WUFFS_BASE__GENERATED_C_CODE
9487
WUFFS_BASE__MAYBE_STATIC uint32_t
9488
wuffs_etc2__decoder__num_animation_loops(
9489
    const wuffs_etc2__decoder* self);
9490
9491
WUFFS_BASE__GENERATED_C_CODE
9492
WUFFS_BASE__MAYBE_STATIC uint64_t
9493
wuffs_etc2__decoder__num_decoded_frame_configs(
9494
    const wuffs_etc2__decoder* self);
9495
9496
WUFFS_BASE__GENERATED_C_CODE
9497
WUFFS_BASE__MAYBE_STATIC uint64_t
9498
wuffs_etc2__decoder__num_decoded_frames(
9499
    const wuffs_etc2__decoder* self);
9500
9501
WUFFS_BASE__GENERATED_C_CODE
9502
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9503
wuffs_etc2__decoder__restart_frame(
9504
    wuffs_etc2__decoder* self,
9505
    uint64_t a_index,
9506
    uint64_t a_io_position);
9507
9508
WUFFS_BASE__GENERATED_C_CODE
9509
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9510
wuffs_etc2__decoder__set_report_metadata(
9511
    wuffs_etc2__decoder* self,
9512
    uint32_t a_fourcc,
9513
    bool a_report);
9514
9515
WUFFS_BASE__GENERATED_C_CODE
9516
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9517
wuffs_etc2__decoder__tell_me_more(
9518
    wuffs_etc2__decoder* self,
9519
    wuffs_base__io_buffer* a_dst,
9520
    wuffs_base__more_information* a_minfo,
9521
    wuffs_base__io_buffer* a_src);
9522
9523
WUFFS_BASE__GENERATED_C_CODE
9524
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9525
wuffs_etc2__decoder__workbuf_len(
9526
    const wuffs_etc2__decoder* self);
9527
9528
#ifdef __cplusplus
9529
}  // extern "C"
9530
#endif
9531
9532
// ---------------- Struct Definitions
9533
9534
// These structs' fields, and the sizeof them, are private implementation
9535
// details that aren't guaranteed to be stable across Wuffs versions.
9536
//
9537
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9538
9539
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9540
9541
struct wuffs_etc2__decoder__struct {
9542
  // Do not access the private_impl's or private_data's fields directly. There
9543
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9544
  // the wuffs_foo__bar__baz functions.
9545
  //
9546
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9547
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9548
9549
  struct {
9550
    uint32_t magic;
9551
    uint32_t active_coroutine;
9552
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9553
    wuffs_base__vtable null_vtable;
9554
9555
    uint32_t f_pixfmt;
9556
    uint32_t f_width;
9557
    uint32_t f_height;
9558
    uint8_t f_call_sequence;
9559
    bool f_srgb;
9560
    uint32_t f_num_buffered_blocks;
9561
    uint32_t f_dst_x;
9562
    uint32_t f_dst_y;
9563
    wuffs_base__pixel_swizzler f_swizzler;
9564
9565
    uint32_t p_decode_image_config;
9566
    uint32_t p_do_decode_image_config;
9567
    uint32_t p_decode_frame_config;
9568
    uint32_t p_do_decode_frame_config;
9569
    uint32_t p_decode_frame;
9570
    uint32_t p_do_decode_frame;
9571
    uint32_t p_from_src_to_colors;
9572
    wuffs_base__empty_struct (*choosy_from_colors_to_buffer)(
9573
        wuffs_etc2__decoder* self);
9574
  } private_impl;
9575
9576
  struct {
9577
    uint64_t f_colors[2][64];
9578
    uint8_t f_buffer[4096];
9579
9580
    struct {
9581
      uint16_t v_rounded_up_width;
9582
      uint16_t v_rounded_up_height;
9583
      uint64_t scratch;
9584
    } s_do_decode_image_config;
9585
    struct {
9586
      uint32_t v_remaining;
9587
    } s_do_decode_frame;
9588
    struct {
9589
      uint32_t v_bi;
9590
      uint64_t scratch;
9591
    } s_from_src_to_colors;
9592
  } private_data;
9593
9594
#ifdef __cplusplus
9595
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9596
  using unique_ptr = std::unique_ptr<wuffs_etc2__decoder, wuffs_unique_ptr_deleter>;
9597
9598
  // On failure, the alloc_etc functions return nullptr. They don't throw.
9599
9600
  static inline unique_ptr
9601
  alloc() {
9602
    return unique_ptr(wuffs_etc2__decoder__alloc());
9603
  }
9604
9605
  static inline wuffs_base__image_decoder::unique_ptr
9606
  alloc_as__wuffs_base__image_decoder() {
9607
    return wuffs_base__image_decoder::unique_ptr(
9608
        wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder());
9609
  }
9610
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
9611
9612
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9613
  // Disallow constructing or copying an object via standard C++ mechanisms,
9614
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
9615
  // size and field layout is not part of the public, stable, memory-safe API.
9616
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
9617
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
9618
  // their first argument) rather than tweaking bar.private_impl.qux fields.
9619
  //
9620
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
9621
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
9622
  // order to provide convenience methods. These forward on "this", so that you
9623
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
9624
  wuffs_etc2__decoder__struct() = delete;
9625
  wuffs_etc2__decoder__struct(const wuffs_etc2__decoder__struct&) = delete;
9626
  wuffs_etc2__decoder__struct& operator=(
9627
      const wuffs_etc2__decoder__struct&) = delete;
9628
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
9629
9630
#if !defined(WUFFS_IMPLEMENTATION)
9631
  // As above, the size of the struct is not part of the public API, and unless
9632
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
9633
  // allocated, not stack allocated. Its size is not intended to be known at
9634
  // compile time, but it is unfortunately divulged as a side effect of
9635
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
9636
  // instead of "sizeof T", invoking the operator. To make the two values
9637
  // different, so that passing the latter will be rejected by the initialize
9638
  // function, we add an arbitrary amount of dead weight.
9639
  uint8_t dead_weight[123000000];  // 123 MB.
9640
#endif  // !defined(WUFFS_IMPLEMENTATION)
9641
9642
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9643
  initialize(
9644
      size_t sizeof_star_self,
9645
      uint64_t wuffs_version,
9646
      uint32_t options) {
9647
    return wuffs_etc2__decoder__initialize(
9648
        this, sizeof_star_self, wuffs_version, options);
9649
  }
9650
9651
  inline wuffs_base__image_decoder*
9652
  upcast_as__wuffs_base__image_decoder() {
9653
    return (wuffs_base__image_decoder*)this;
9654
  }
9655
9656
  inline uint64_t
9657
  get_quirk(
9658
      uint32_t a_key) const {
9659
    return wuffs_etc2__decoder__get_quirk(this, a_key);
9660
  }
9661
9662
  inline wuffs_base__status
9663
  set_quirk(
9664
      uint32_t a_key,
9665
      uint64_t a_value) {
9666
    return wuffs_etc2__decoder__set_quirk(this, a_key, a_value);
9667
  }
9668
9669
  inline wuffs_base__status
9670
  decode_image_config(
9671
      wuffs_base__image_config* a_dst,
9672
      wuffs_base__io_buffer* a_src) {
9673
    return wuffs_etc2__decoder__decode_image_config(this, a_dst, a_src);
9674
  }
9675
9676
  inline wuffs_base__status
9677
  decode_frame_config(
9678
      wuffs_base__frame_config* a_dst,
9679
      wuffs_base__io_buffer* a_src) {
9680
    return wuffs_etc2__decoder__decode_frame_config(this, a_dst, a_src);
9681
  }
9682
9683
  inline wuffs_base__status
9684
  decode_frame(
9685
      wuffs_base__pixel_buffer* a_dst,
9686
      wuffs_base__io_buffer* a_src,
9687
      wuffs_base__pixel_blend a_blend,
9688
      wuffs_base__slice_u8 a_workbuf,
9689
      wuffs_base__decode_frame_options* a_opts) {
9690
    return wuffs_etc2__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
9691
  }
9692
9693
  inline wuffs_base__rect_ie_u32
9694
  frame_dirty_rect() const {
9695
    return wuffs_etc2__decoder__frame_dirty_rect(this);
9696
  }
9697
9698
  inline uint32_t
9699
  num_animation_loops() const {
9700
    return wuffs_etc2__decoder__num_animation_loops(this);
9701
  }
9702
9703
  inline uint64_t
9704
  num_decoded_frame_configs() const {
9705
    return wuffs_etc2__decoder__num_decoded_frame_configs(this);
9706
  }
9707
9708
  inline uint64_t
9709
  num_decoded_frames() const {
9710
    return wuffs_etc2__decoder__num_decoded_frames(this);
9711
  }
9712
9713
  inline wuffs_base__status
9714
  restart_frame(
9715
      uint64_t a_index,
9716
      uint64_t a_io_position) {
9717
    return wuffs_etc2__decoder__restart_frame(this, a_index, a_io_position);
9718
  }
9719
9720
  inline wuffs_base__empty_struct
9721
  set_report_metadata(
9722
      uint32_t a_fourcc,
9723
      bool a_report) {
9724
    return wuffs_etc2__decoder__set_report_metadata(this, a_fourcc, a_report);
9725
  }
9726
9727
  inline wuffs_base__status
9728
  tell_me_more(
9729
      wuffs_base__io_buffer* a_dst,
9730
      wuffs_base__more_information* a_minfo,
9731
      wuffs_base__io_buffer* a_src) {
9732
    return wuffs_etc2__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
9733
  }
9734
9735
  inline wuffs_base__range_ii_u64
9736
  workbuf_len() const {
9737
    return wuffs_etc2__decoder__workbuf_len(this);
9738
  }
9739
9740
#endif  // __cplusplus
9741
};  // struct wuffs_etc2__decoder__struct
9742
9743
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9744
9745
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2) || defined(WUFFS_NONMONOLITHIC)
9746
9747
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
9748
9749
// ---------------- Status Codes
9750
9751
extern const char wuffs_gif__error__bad_lzw_code[];
9752
extern const char wuffs_gif__error__bad_extension_label[];
9753
extern const char wuffs_gif__error__bad_frame_size[];
9754
extern const char wuffs_gif__error__bad_graphic_control[];
9755
extern const char wuffs_gif__error__bad_header[];
9756
extern const char wuffs_gif__error__bad_literal_width[];
9757
extern const char wuffs_gif__error__bad_palette[];
9758
extern const char wuffs_gif__error__truncated_input[];
9759
9760
// ---------------- Public Consts
9761
9762
#define WUFFS_GIF__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
9763
9764
#define WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES 983928832u
9765
9766
#define WUFFS_GIF__QUIRK_FIRST_FRAME_LOCAL_PALETTE_MEANS_BLACK_BACKGROUND 983928833u
9767
9768
#define WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR 983928834u
9769
9770
#define WUFFS_GIF__QUIRK_IGNORE_TOO_MUCH_PIXEL_DATA 983928835u
9771
9772
#define WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT 983928836u
9773
9774
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_FRAME 983928837u
9775
9776
#define WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE 983928838u
9777
9778
// ---------------- Struct Declarations
9779
9780
typedef struct wuffs_gif__decoder__struct wuffs_gif__decoder;
9781
9782
#ifdef __cplusplus
9783
extern "C" {
9784
#endif
9785
9786
// ---------------- Public Initializer Prototypes
9787
9788
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
9789
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
9790
//
9791
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
9792
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
9793
9794
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
9795
wuffs_gif__decoder__initialize(
9796
    wuffs_gif__decoder* self,
9797
    size_t sizeof_star_self,
9798
    uint64_t wuffs_version,
9799
    uint32_t options);
9800
9801
size_t
9802
sizeof__wuffs_gif__decoder(void);
9803
9804
// ---------------- Allocs
9805
9806
// These functions allocate and initialize Wuffs structs. They return NULL if
9807
// memory allocation fails. If they return non-NULL, there is no need to call
9808
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
9809
// calling free on the returned pointer. That pointer is effectively a C++
9810
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
9811
9812
wuffs_gif__decoder*
9813
wuffs_gif__decoder__alloc(void);
9814
9815
static inline wuffs_base__image_decoder*
9816
wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder(void) {
9817
  return (wuffs_base__image_decoder*)(wuffs_gif__decoder__alloc());
9818
}
9819
9820
// ---------------- Upcasts
9821
9822
static inline wuffs_base__image_decoder*
9823
wuffs_gif__decoder__upcast_as__wuffs_base__image_decoder(
9824
    wuffs_gif__decoder* p) {
9825
  return (wuffs_base__image_decoder*)p;
9826
}
9827
9828
// ---------------- Public Function Prototypes
9829
9830
WUFFS_BASE__GENERATED_C_CODE
9831
WUFFS_BASE__MAYBE_STATIC uint64_t
9832
wuffs_gif__decoder__get_quirk(
9833
    const wuffs_gif__decoder* self,
9834
    uint32_t a_key);
9835
9836
WUFFS_BASE__GENERATED_C_CODE
9837
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9838
wuffs_gif__decoder__set_quirk(
9839
    wuffs_gif__decoder* self,
9840
    uint32_t a_key,
9841
    uint64_t a_value);
9842
9843
WUFFS_BASE__GENERATED_C_CODE
9844
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9845
wuffs_gif__decoder__decode_image_config(
9846
    wuffs_gif__decoder* self,
9847
    wuffs_base__image_config* a_dst,
9848
    wuffs_base__io_buffer* a_src);
9849
9850
WUFFS_BASE__GENERATED_C_CODE
9851
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
9852
wuffs_gif__decoder__set_report_metadata(
9853
    wuffs_gif__decoder* self,
9854
    uint32_t a_fourcc,
9855
    bool a_report);
9856
9857
WUFFS_BASE__GENERATED_C_CODE
9858
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9859
wuffs_gif__decoder__tell_me_more(
9860
    wuffs_gif__decoder* self,
9861
    wuffs_base__io_buffer* a_dst,
9862
    wuffs_base__more_information* a_minfo,
9863
    wuffs_base__io_buffer* a_src);
9864
9865
WUFFS_BASE__GENERATED_C_CODE
9866
WUFFS_BASE__MAYBE_STATIC uint32_t
9867
wuffs_gif__decoder__num_animation_loops(
9868
    const wuffs_gif__decoder* self);
9869
9870
WUFFS_BASE__GENERATED_C_CODE
9871
WUFFS_BASE__MAYBE_STATIC uint64_t
9872
wuffs_gif__decoder__num_decoded_frame_configs(
9873
    const wuffs_gif__decoder* self);
9874
9875
WUFFS_BASE__GENERATED_C_CODE
9876
WUFFS_BASE__MAYBE_STATIC uint64_t
9877
wuffs_gif__decoder__num_decoded_frames(
9878
    const wuffs_gif__decoder* self);
9879
9880
WUFFS_BASE__GENERATED_C_CODE
9881
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
9882
wuffs_gif__decoder__frame_dirty_rect(
9883
    const wuffs_gif__decoder* self);
9884
9885
WUFFS_BASE__GENERATED_C_CODE
9886
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
9887
wuffs_gif__decoder__workbuf_len(
9888
    const wuffs_gif__decoder* self);
9889
9890
WUFFS_BASE__GENERATED_C_CODE
9891
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9892
wuffs_gif__decoder__restart_frame(
9893
    wuffs_gif__decoder* self,
9894
    uint64_t a_index,
9895
    uint64_t a_io_position);
9896
9897
WUFFS_BASE__GENERATED_C_CODE
9898
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9899
wuffs_gif__decoder__decode_frame_config(
9900
    wuffs_gif__decoder* self,
9901
    wuffs_base__frame_config* a_dst,
9902
    wuffs_base__io_buffer* a_src);
9903
9904
WUFFS_BASE__GENERATED_C_CODE
9905
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
9906
wuffs_gif__decoder__decode_frame(
9907
    wuffs_gif__decoder* self,
9908
    wuffs_base__pixel_buffer* a_dst,
9909
    wuffs_base__io_buffer* a_src,
9910
    wuffs_base__pixel_blend a_blend,
9911
    wuffs_base__slice_u8 a_workbuf,
9912
    wuffs_base__decode_frame_options* a_opts);
9913
9914
#ifdef __cplusplus
9915
}  // extern "C"
9916
#endif
9917
9918
// ---------------- Struct Definitions
9919
9920
// These structs' fields, and the sizeof them, are private implementation
9921
// details that aren't guaranteed to be stable across Wuffs versions.
9922
//
9923
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
9924
9925
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
9926
9927
struct wuffs_gif__decoder__struct {
9928
  // Do not access the private_impl's or private_data's fields directly. There
9929
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
9930
  // the wuffs_foo__bar__baz functions.
9931
  //
9932
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
9933
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
9934
9935
  struct {
9936
    uint32_t magic;
9937
    uint32_t active_coroutine;
9938
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
9939
    wuffs_base__vtable null_vtable;
9940
9941
    uint32_t f_width;
9942
    uint32_t f_height;
9943
    uint8_t f_call_sequence;
9944
    bool f_report_metadata_iccp;
9945
    bool f_report_metadata_xmp;
9946
    uint32_t f_metadata_fourcc;
9947
    uint64_t f_metadata_io_position;
9948
    bool f_quirks[7];
9949
    bool f_delayed_num_decoded_frames;
9950
    bool f_seen_header;
9951
    bool f_ignored_but_affects_benchmarks;
9952
    bool f_has_global_palette;
9953
    uint8_t f_interlace;
9954
    bool f_seen_num_animation_loops_value;
9955
    uint32_t f_num_animation_loops_value;
9956
    uint32_t f_background_color_u32_argb_premul;
9957
    uint32_t f_black_color_u32_argb_premul;
9958
    bool f_gc_has_transparent_index;
9959
    uint8_t f_gc_transparent_index;
9960
    uint8_t f_gc_disposal;
9961
    uint64_t f_gc_duration;
9962
    uint64_t f_frame_config_io_position;
9963
    uint64_t f_num_decoded_frame_configs_value;
9964
    uint64_t f_num_decoded_frames_value;
9965
    uint32_t f_frame_rect_x0;
9966
    uint32_t f_frame_rect_y0;
9967
    uint32_t f_frame_rect_x1;
9968
    uint32_t f_frame_rect_y1;
9969
    uint32_t f_dst_x;
9970
    uint32_t f_dst_y;
9971
    uint32_t f_dirty_max_excl_y;
9972
    uint64_t f_compressed_ri;
9973
    uint64_t f_compressed_wi;
9974
    wuffs_base__pixel_swizzler f_swizzler;
9975
    uint32_t f_lzw_pending_literal_width_plus_one;
9976
    uint32_t f_lzw_literal_width;
9977
    uint32_t f_lzw_clear_code;
9978
    uint32_t f_lzw_end_code;
9979
    uint32_t f_lzw_save_code;
9980
    uint32_t f_lzw_prev_code;
9981
    uint32_t f_lzw_width;
9982
    uint32_t f_lzw_bits;
9983
    uint32_t f_lzw_n_bits;
9984
    uint32_t f_lzw_output_ri;
9985
    uint32_t f_lzw_output_wi;
9986
    uint32_t f_lzw_read_from_return_value;
9987
    uint16_t f_lzw_prefixes[4096];
9988
9989
    uint32_t p_decode_image_config;
9990
    uint32_t p_do_decode_image_config;
9991
    uint32_t p_tell_me_more;
9992
    uint32_t p_do_tell_me_more;
9993
    uint32_t p_decode_frame_config;
9994
    uint32_t p_do_decode_frame_config;
9995
    uint32_t p_skip_frame;
9996
    uint32_t p_decode_frame;
9997
    uint32_t p_do_decode_frame;
9998
    uint32_t p_decode_up_to_id_part1;
9999
    uint32_t p_decode_header;
10000
    uint32_t p_decode_lsd;
10001
    uint32_t p_decode_extension;
10002
    uint32_t p_skip_blocks;
10003
    uint32_t p_decode_ae;
10004
    uint32_t p_decode_gc;
10005
    uint32_t p_decode_id_part0;
10006
    uint32_t p_decode_id_part1;
10007
    uint32_t p_decode_id_part2;
10008
  } private_impl;
10009
10010
  struct {
10011
    uint8_t f_compressed[4096];
10012
    uint8_t f_palettes[2][1024];
10013
    uint8_t f_dst_palette[1024];
10014
    uint8_t f_lzw_suffixes[4096][8];
10015
    uint16_t f_lzw_lm1s[4096];
10016
    uint8_t f_lzw_output[8199];
10017
10018
    struct {
10019
      uint32_t v_background_color;
10020
    } s_do_decode_frame_config;
10021
    struct {
10022
      uint64_t scratch;
10023
    } s_skip_frame;
10024
    struct {
10025
      uint64_t scratch;
10026
    } s_decode_header;
10027
    struct {
10028
      uint8_t v_flags;
10029
      uint8_t v_background_color_index;
10030
      uint32_t v_num_palette_entries;
10031
      uint32_t v_i;
10032
      uint64_t scratch;
10033
    } s_decode_lsd;
10034
    struct {
10035
      uint64_t scratch;
10036
    } s_skip_blocks;
10037
    struct {
10038
      uint8_t v_block_size;
10039
      bool v_is_animexts;
10040
      bool v_is_netscape;
10041
      bool v_is_iccp;
10042
      bool v_is_xmp;
10043
      uint64_t scratch;
10044
    } s_decode_ae;
10045
    struct {
10046
      uint64_t scratch;
10047
    } s_decode_gc;
10048
    struct {
10049
      uint64_t scratch;
10050
    } s_decode_id_part0;
10051
    struct {
10052
      uint8_t v_which_palette;
10053
      uint32_t v_num_palette_entries;
10054
      uint32_t v_i;
10055
      uint64_t scratch;
10056
    } s_decode_id_part1;
10057
    struct {
10058
      uint64_t v_block_size;
10059
      bool v_need_block_size;
10060
      uint64_t scratch;
10061
    } s_decode_id_part2;
10062
  } private_data;
10063
10064
#ifdef __cplusplus
10065
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10066
  using unique_ptr = std::unique_ptr<wuffs_gif__decoder, wuffs_unique_ptr_deleter>;
10067
10068
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10069
10070
  static inline unique_ptr
10071
  alloc() {
10072
    return unique_ptr(wuffs_gif__decoder__alloc());
10073
  }
10074
10075
  static inline wuffs_base__image_decoder::unique_ptr
10076
  alloc_as__wuffs_base__image_decoder() {
10077
    return wuffs_base__image_decoder::unique_ptr(
10078
        wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder());
10079
  }
10080
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10081
10082
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10083
  // Disallow constructing or copying an object via standard C++ mechanisms,
10084
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10085
  // size and field layout is not part of the public, stable, memory-safe API.
10086
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10087
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10088
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10089
  //
10090
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10091
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10092
  // order to provide convenience methods. These forward on "this", so that you
10093
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10094
  wuffs_gif__decoder__struct() = delete;
10095
  wuffs_gif__decoder__struct(const wuffs_gif__decoder__struct&) = delete;
10096
  wuffs_gif__decoder__struct& operator=(
10097
      const wuffs_gif__decoder__struct&) = delete;
10098
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10099
10100
#if !defined(WUFFS_IMPLEMENTATION)
10101
  // As above, the size of the struct is not part of the public API, and unless
10102
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10103
  // allocated, not stack allocated. Its size is not intended to be known at
10104
  // compile time, but it is unfortunately divulged as a side effect of
10105
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10106
  // instead of "sizeof T", invoking the operator. To make the two values
10107
  // different, so that passing the latter will be rejected by the initialize
10108
  // function, we add an arbitrary amount of dead weight.
10109
  uint8_t dead_weight[123000000];  // 123 MB.
10110
#endif  // !defined(WUFFS_IMPLEMENTATION)
10111
10112
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10113
  initialize(
10114
      size_t sizeof_star_self,
10115
      uint64_t wuffs_version,
10116
      uint32_t options) {
10117
    return wuffs_gif__decoder__initialize(
10118
        this, sizeof_star_self, wuffs_version, options);
10119
  }
10120
10121
  inline wuffs_base__image_decoder*
10122
  upcast_as__wuffs_base__image_decoder() {
10123
    return (wuffs_base__image_decoder*)this;
10124
  }
10125
10126
  inline uint64_t
10127
  get_quirk(
10128
      uint32_t a_key) const {
10129
    return wuffs_gif__decoder__get_quirk(this, a_key);
10130
  }
10131
10132
  inline wuffs_base__status
10133
  set_quirk(
10134
      uint32_t a_key,
10135
      uint64_t a_value) {
10136
    return wuffs_gif__decoder__set_quirk(this, a_key, a_value);
10137
  }
10138
10139
  inline wuffs_base__status
10140
  decode_image_config(
10141
      wuffs_base__image_config* a_dst,
10142
      wuffs_base__io_buffer* a_src) {
10143
    return wuffs_gif__decoder__decode_image_config(this, a_dst, a_src);
10144
  }
10145
10146
  inline wuffs_base__empty_struct
10147
  set_report_metadata(
10148
      uint32_t a_fourcc,
10149
      bool a_report) {
10150
    return wuffs_gif__decoder__set_report_metadata(this, a_fourcc, a_report);
10151
  }
10152
10153
  inline wuffs_base__status
10154
  tell_me_more(
10155
      wuffs_base__io_buffer* a_dst,
10156
      wuffs_base__more_information* a_minfo,
10157
      wuffs_base__io_buffer* a_src) {
10158
    return wuffs_gif__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
10159
  }
10160
10161
  inline uint32_t
10162
  num_animation_loops() const {
10163
    return wuffs_gif__decoder__num_animation_loops(this);
10164
  }
10165
10166
  inline uint64_t
10167
  num_decoded_frame_configs() const {
10168
    return wuffs_gif__decoder__num_decoded_frame_configs(this);
10169
  }
10170
10171
  inline uint64_t
10172
  num_decoded_frames() const {
10173
    return wuffs_gif__decoder__num_decoded_frames(this);
10174
  }
10175
10176
  inline wuffs_base__rect_ie_u32
10177
  frame_dirty_rect() const {
10178
    return wuffs_gif__decoder__frame_dirty_rect(this);
10179
  }
10180
10181
  inline wuffs_base__range_ii_u64
10182
  workbuf_len() const {
10183
    return wuffs_gif__decoder__workbuf_len(this);
10184
  }
10185
10186
  inline wuffs_base__status
10187
  restart_frame(
10188
      uint64_t a_index,
10189
      uint64_t a_io_position) {
10190
    return wuffs_gif__decoder__restart_frame(this, a_index, a_io_position);
10191
  }
10192
10193
  inline wuffs_base__status
10194
  decode_frame_config(
10195
      wuffs_base__frame_config* a_dst,
10196
      wuffs_base__io_buffer* a_src) {
10197
    return wuffs_gif__decoder__decode_frame_config(this, a_dst, a_src);
10198
  }
10199
10200
  inline wuffs_base__status
10201
  decode_frame(
10202
      wuffs_base__pixel_buffer* a_dst,
10203
      wuffs_base__io_buffer* a_src,
10204
      wuffs_base__pixel_blend a_blend,
10205
      wuffs_base__slice_u8 a_workbuf,
10206
      wuffs_base__decode_frame_options* a_opts) {
10207
    return wuffs_gif__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
10208
  }
10209
10210
#endif  // __cplusplus
10211
};  // struct wuffs_gif__decoder__struct
10212
10213
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10214
10215
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF) || defined(WUFFS_NONMONOLITHIC)
10216
10217
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
10218
10219
// ---------------- Status Codes
10220
10221
extern const char wuffs_gzip__error__bad_checksum[];
10222
extern const char wuffs_gzip__error__bad_compression_method[];
10223
extern const char wuffs_gzip__error__bad_encoding_flags[];
10224
extern const char wuffs_gzip__error__bad_header[];
10225
extern const char wuffs_gzip__error__truncated_input[];
10226
10227
// ---------------- Public Consts
10228
10229
#define WUFFS_GZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
10230
10231
#define WUFFS_GZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
10232
10233
// ---------------- Struct Declarations
10234
10235
typedef struct wuffs_gzip__decoder__struct wuffs_gzip__decoder;
10236
10237
#ifdef __cplusplus
10238
extern "C" {
10239
#endif
10240
10241
// ---------------- Public Initializer Prototypes
10242
10243
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10244
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10245
//
10246
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10247
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10248
10249
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10250
wuffs_gzip__decoder__initialize(
10251
    wuffs_gzip__decoder* self,
10252
    size_t sizeof_star_self,
10253
    uint64_t wuffs_version,
10254
    uint32_t options);
10255
10256
size_t
10257
sizeof__wuffs_gzip__decoder(void);
10258
10259
// ---------------- Allocs
10260
10261
// These functions allocate and initialize Wuffs structs. They return NULL if
10262
// memory allocation fails. If they return non-NULL, there is no need to call
10263
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10264
// calling free on the returned pointer. That pointer is effectively a C++
10265
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10266
10267
wuffs_gzip__decoder*
10268
wuffs_gzip__decoder__alloc(void);
10269
10270
static inline wuffs_base__io_transformer*
10271
wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
10272
  return (wuffs_base__io_transformer*)(wuffs_gzip__decoder__alloc());
10273
}
10274
10275
// ---------------- Upcasts
10276
10277
static inline wuffs_base__io_transformer*
10278
wuffs_gzip__decoder__upcast_as__wuffs_base__io_transformer(
10279
    wuffs_gzip__decoder* p) {
10280
  return (wuffs_base__io_transformer*)p;
10281
}
10282
10283
// ---------------- Public Function Prototypes
10284
10285
WUFFS_BASE__GENERATED_C_CODE
10286
WUFFS_BASE__MAYBE_STATIC uint64_t
10287
wuffs_gzip__decoder__get_quirk(
10288
    const wuffs_gzip__decoder* self,
10289
    uint32_t a_key);
10290
10291
WUFFS_BASE__GENERATED_C_CODE
10292
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10293
wuffs_gzip__decoder__set_quirk(
10294
    wuffs_gzip__decoder* self,
10295
    uint32_t a_key,
10296
    uint64_t a_value);
10297
10298
WUFFS_BASE__GENERATED_C_CODE
10299
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
10300
wuffs_gzip__decoder__dst_history_retain_length(
10301
    const wuffs_gzip__decoder* self);
10302
10303
WUFFS_BASE__GENERATED_C_CODE
10304
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10305
wuffs_gzip__decoder__workbuf_len(
10306
    const wuffs_gzip__decoder* self);
10307
10308
WUFFS_BASE__GENERATED_C_CODE
10309
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10310
wuffs_gzip__decoder__transform_io(
10311
    wuffs_gzip__decoder* self,
10312
    wuffs_base__io_buffer* a_dst,
10313
    wuffs_base__io_buffer* a_src,
10314
    wuffs_base__slice_u8 a_workbuf);
10315
10316
#ifdef __cplusplus
10317
}  // extern "C"
10318
#endif
10319
10320
// ---------------- Struct Definitions
10321
10322
// These structs' fields, and the sizeof them, are private implementation
10323
// details that aren't guaranteed to be stable across Wuffs versions.
10324
//
10325
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10326
10327
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10328
10329
struct wuffs_gzip__decoder__struct {
10330
  // Do not access the private_impl's or private_data's fields directly. There
10331
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10332
  // the wuffs_foo__bar__baz functions.
10333
  //
10334
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10335
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10336
10337
  struct {
10338
    uint32_t magic;
10339
    uint32_t active_coroutine;
10340
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
10341
    wuffs_base__vtable null_vtable;
10342
10343
    bool f_ignore_checksum;
10344
10345
    uint32_t p_transform_io;
10346
    uint32_t p_do_transform_io;
10347
  } private_impl;
10348
10349
  struct {
10350
    wuffs_crc32__ieee_hasher f_checksum;
10351
    wuffs_deflate__decoder f_flate;
10352
10353
    struct {
10354
      uint8_t v_flags;
10355
      uint32_t v_checksum_have;
10356
      uint32_t v_decoded_length_have;
10357
      uint32_t v_checksum_want;
10358
      uint64_t scratch;
10359
    } s_do_transform_io;
10360
  } private_data;
10361
10362
#ifdef __cplusplus
10363
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10364
  using unique_ptr = std::unique_ptr<wuffs_gzip__decoder, wuffs_unique_ptr_deleter>;
10365
10366
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10367
10368
  static inline unique_ptr
10369
  alloc() {
10370
    return unique_ptr(wuffs_gzip__decoder__alloc());
10371
  }
10372
10373
  static inline wuffs_base__io_transformer::unique_ptr
10374
  alloc_as__wuffs_base__io_transformer() {
10375
    return wuffs_base__io_transformer::unique_ptr(
10376
        wuffs_gzip__decoder__alloc_as__wuffs_base__io_transformer());
10377
  }
10378
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10379
10380
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10381
  // Disallow constructing or copying an object via standard C++ mechanisms,
10382
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10383
  // size and field layout is not part of the public, stable, memory-safe API.
10384
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10385
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10386
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10387
  //
10388
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10389
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10390
  // order to provide convenience methods. These forward on "this", so that you
10391
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10392
  wuffs_gzip__decoder__struct() = delete;
10393
  wuffs_gzip__decoder__struct(const wuffs_gzip__decoder__struct&) = delete;
10394
  wuffs_gzip__decoder__struct& operator=(
10395
      const wuffs_gzip__decoder__struct&) = delete;
10396
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10397
10398
#if !defined(WUFFS_IMPLEMENTATION)
10399
  // As above, the size of the struct is not part of the public API, and unless
10400
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10401
  // allocated, not stack allocated. Its size is not intended to be known at
10402
  // compile time, but it is unfortunately divulged as a side effect of
10403
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10404
  // instead of "sizeof T", invoking the operator. To make the two values
10405
  // different, so that passing the latter will be rejected by the initialize
10406
  // function, we add an arbitrary amount of dead weight.
10407
  uint8_t dead_weight[123000000];  // 123 MB.
10408
#endif  // !defined(WUFFS_IMPLEMENTATION)
10409
10410
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10411
  initialize(
10412
      size_t sizeof_star_self,
10413
      uint64_t wuffs_version,
10414
      uint32_t options) {
10415
    return wuffs_gzip__decoder__initialize(
10416
        this, sizeof_star_self, wuffs_version, options);
10417
  }
10418
10419
  inline wuffs_base__io_transformer*
10420
  upcast_as__wuffs_base__io_transformer() {
10421
    return (wuffs_base__io_transformer*)this;
10422
  }
10423
10424
  inline uint64_t
10425
  get_quirk(
10426
      uint32_t a_key) const {
10427
    return wuffs_gzip__decoder__get_quirk(this, a_key);
10428
  }
10429
10430
  inline wuffs_base__status
10431
  set_quirk(
10432
      uint32_t a_key,
10433
      uint64_t a_value) {
10434
    return wuffs_gzip__decoder__set_quirk(this, a_key, a_value);
10435
  }
10436
10437
  inline wuffs_base__optional_u63
10438
  dst_history_retain_length() const {
10439
    return wuffs_gzip__decoder__dst_history_retain_length(this);
10440
  }
10441
10442
  inline wuffs_base__range_ii_u64
10443
  workbuf_len() const {
10444
    return wuffs_gzip__decoder__workbuf_len(this);
10445
  }
10446
10447
  inline wuffs_base__status
10448
  transform_io(
10449
      wuffs_base__io_buffer* a_dst,
10450
      wuffs_base__io_buffer* a_src,
10451
      wuffs_base__slice_u8 a_workbuf) {
10452
    return wuffs_gzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
10453
  }
10454
10455
#endif  // __cplusplus
10456
};  // struct wuffs_gzip__decoder__struct
10457
10458
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10459
10460
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP) || defined(WUFFS_NONMONOLITHIC)
10461
10462
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM) || defined(WUFFS_NONMONOLITHIC)
10463
10464
// ---------------- Status Codes
10465
10466
extern const char wuffs_handsum__error__bad_header[];
10467
extern const char wuffs_handsum__error__truncated_input[];
10468
extern const char wuffs_handsum__error__unsupported_handsum_file[];
10469
10470
// ---------------- Public Consts
10471
10472
#define WUFFS_HANDSUM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
10473
10474
// ---------------- Struct Declarations
10475
10476
typedef struct wuffs_handsum__decoder__struct wuffs_handsum__decoder;
10477
10478
#ifdef __cplusplus
10479
extern "C" {
10480
#endif
10481
10482
// ---------------- Public Initializer Prototypes
10483
10484
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10485
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10486
//
10487
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10488
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10489
10490
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10491
wuffs_handsum__decoder__initialize(
10492
    wuffs_handsum__decoder* self,
10493
    size_t sizeof_star_self,
10494
    uint64_t wuffs_version,
10495
    uint32_t options);
10496
10497
size_t
10498
sizeof__wuffs_handsum__decoder(void);
10499
10500
// ---------------- Allocs
10501
10502
// These functions allocate and initialize Wuffs structs. They return NULL if
10503
// memory allocation fails. If they return non-NULL, there is no need to call
10504
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10505
// calling free on the returned pointer. That pointer is effectively a C++
10506
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10507
10508
wuffs_handsum__decoder*
10509
wuffs_handsum__decoder__alloc(void);
10510
10511
static inline wuffs_base__image_decoder*
10512
wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder(void) {
10513
  return (wuffs_base__image_decoder*)(wuffs_handsum__decoder__alloc());
10514
}
10515
10516
// ---------------- Upcasts
10517
10518
static inline wuffs_base__image_decoder*
10519
wuffs_handsum__decoder__upcast_as__wuffs_base__image_decoder(
10520
    wuffs_handsum__decoder* p) {
10521
  return (wuffs_base__image_decoder*)p;
10522
}
10523
10524
// ---------------- Public Function Prototypes
10525
10526
WUFFS_BASE__GENERATED_C_CODE
10527
WUFFS_BASE__MAYBE_STATIC uint64_t
10528
wuffs_handsum__decoder__get_quirk(
10529
    const wuffs_handsum__decoder* self,
10530
    uint32_t a_key);
10531
10532
WUFFS_BASE__GENERATED_C_CODE
10533
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10534
wuffs_handsum__decoder__set_quirk(
10535
    wuffs_handsum__decoder* self,
10536
    uint32_t a_key,
10537
    uint64_t a_value);
10538
10539
WUFFS_BASE__GENERATED_C_CODE
10540
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10541
wuffs_handsum__decoder__decode_image_config(
10542
    wuffs_handsum__decoder* self,
10543
    wuffs_base__image_config* a_dst,
10544
    wuffs_base__io_buffer* a_src);
10545
10546
WUFFS_BASE__GENERATED_C_CODE
10547
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10548
wuffs_handsum__decoder__decode_frame_config(
10549
    wuffs_handsum__decoder* self,
10550
    wuffs_base__frame_config* a_dst,
10551
    wuffs_base__io_buffer* a_src);
10552
10553
WUFFS_BASE__GENERATED_C_CODE
10554
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10555
wuffs_handsum__decoder__decode_frame(
10556
    wuffs_handsum__decoder* self,
10557
    wuffs_base__pixel_buffer* a_dst,
10558
    wuffs_base__io_buffer* a_src,
10559
    wuffs_base__pixel_blend a_blend,
10560
    wuffs_base__slice_u8 a_workbuf,
10561
    wuffs_base__decode_frame_options* a_opts);
10562
10563
WUFFS_BASE__GENERATED_C_CODE
10564
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
10565
wuffs_handsum__decoder__frame_dirty_rect(
10566
    const wuffs_handsum__decoder* self);
10567
10568
WUFFS_BASE__GENERATED_C_CODE
10569
WUFFS_BASE__MAYBE_STATIC uint32_t
10570
wuffs_handsum__decoder__num_animation_loops(
10571
    const wuffs_handsum__decoder* self);
10572
10573
WUFFS_BASE__GENERATED_C_CODE
10574
WUFFS_BASE__MAYBE_STATIC uint64_t
10575
wuffs_handsum__decoder__num_decoded_frame_configs(
10576
    const wuffs_handsum__decoder* self);
10577
10578
WUFFS_BASE__GENERATED_C_CODE
10579
WUFFS_BASE__MAYBE_STATIC uint64_t
10580
wuffs_handsum__decoder__num_decoded_frames(
10581
    const wuffs_handsum__decoder* self);
10582
10583
WUFFS_BASE__GENERATED_C_CODE
10584
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10585
wuffs_handsum__decoder__restart_frame(
10586
    wuffs_handsum__decoder* self,
10587
    uint64_t a_index,
10588
    uint64_t a_io_position);
10589
10590
WUFFS_BASE__GENERATED_C_CODE
10591
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
10592
wuffs_handsum__decoder__set_report_metadata(
10593
    wuffs_handsum__decoder* self,
10594
    uint32_t a_fourcc,
10595
    bool a_report);
10596
10597
WUFFS_BASE__GENERATED_C_CODE
10598
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10599
wuffs_handsum__decoder__tell_me_more(
10600
    wuffs_handsum__decoder* self,
10601
    wuffs_base__io_buffer* a_dst,
10602
    wuffs_base__more_information* a_minfo,
10603
    wuffs_base__io_buffer* a_src);
10604
10605
WUFFS_BASE__GENERATED_C_CODE
10606
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10607
wuffs_handsum__decoder__workbuf_len(
10608
    const wuffs_handsum__decoder* self);
10609
10610
#ifdef __cplusplus
10611
}  // extern "C"
10612
#endif
10613
10614
// ---------------- Struct Definitions
10615
10616
// These structs' fields, and the sizeof them, are private implementation
10617
// details that aren't guaranteed to be stable across Wuffs versions.
10618
//
10619
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10620
10621
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10622
10623
struct wuffs_handsum__decoder__struct {
10624
  // Do not access the private_impl's or private_data's fields directly. There
10625
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
10626
  // the wuffs_foo__bar__baz functions.
10627
  //
10628
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
10629
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
10630
10631
  struct {
10632
    uint32_t magic;
10633
    uint32_t active_coroutine;
10634
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
10635
    wuffs_base__vtable null_vtable;
10636
10637
    uint32_t f_width;
10638
    uint32_t f_height;
10639
    uint8_t f_call_sequence;
10640
    uint16_t f_bit_offset;
10641
    uint16_t f_coeffs[40];
10642
    wuffs_base__pixel_swizzler f_swizzler;
10643
10644
    uint32_t p_decode_image_config;
10645
    uint32_t p_do_decode_image_config;
10646
    uint32_t p_decode_frame_config;
10647
    uint32_t p_do_decode_frame_config;
10648
    uint32_t p_decode_frame;
10649
    uint32_t p_do_decode_frame;
10650
  } private_impl;
10651
10652
  struct {
10653
    uint8_t f_bits[64];
10654
    uint8_t f_buffers[2][32][128];
10655
10656
    struct {
10657
      uint64_t scratch;
10658
    } s_do_decode_image_config;
10659
    struct {
10660
      uint32_t v_num_read;
10661
    } s_do_decode_frame;
10662
  } private_data;
10663
10664
#ifdef __cplusplus
10665
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10666
  using unique_ptr = std::unique_ptr<wuffs_handsum__decoder, wuffs_unique_ptr_deleter>;
10667
10668
  // On failure, the alloc_etc functions return nullptr. They don't throw.
10669
10670
  static inline unique_ptr
10671
  alloc() {
10672
    return unique_ptr(wuffs_handsum__decoder__alloc());
10673
  }
10674
10675
  static inline wuffs_base__image_decoder::unique_ptr
10676
  alloc_as__wuffs_base__image_decoder() {
10677
    return wuffs_base__image_decoder::unique_ptr(
10678
        wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder());
10679
  }
10680
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
10681
10682
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10683
  // Disallow constructing or copying an object via standard C++ mechanisms,
10684
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
10685
  // size and field layout is not part of the public, stable, memory-safe API.
10686
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
10687
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
10688
  // their first argument) rather than tweaking bar.private_impl.qux fields.
10689
  //
10690
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
10691
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
10692
  // order to provide convenience methods. These forward on "this", so that you
10693
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
10694
  wuffs_handsum__decoder__struct() = delete;
10695
  wuffs_handsum__decoder__struct(const wuffs_handsum__decoder__struct&) = delete;
10696
  wuffs_handsum__decoder__struct& operator=(
10697
      const wuffs_handsum__decoder__struct&) = delete;
10698
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
10699
10700
#if !defined(WUFFS_IMPLEMENTATION)
10701
  // As above, the size of the struct is not part of the public API, and unless
10702
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
10703
  // allocated, not stack allocated. Its size is not intended to be known at
10704
  // compile time, but it is unfortunately divulged as a side effect of
10705
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
10706
  // instead of "sizeof T", invoking the operator. To make the two values
10707
  // different, so that passing the latter will be rejected by the initialize
10708
  // function, we add an arbitrary amount of dead weight.
10709
  uint8_t dead_weight[123000000];  // 123 MB.
10710
#endif  // !defined(WUFFS_IMPLEMENTATION)
10711
10712
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10713
  initialize(
10714
      size_t sizeof_star_self,
10715
      uint64_t wuffs_version,
10716
      uint32_t options) {
10717
    return wuffs_handsum__decoder__initialize(
10718
        this, sizeof_star_self, wuffs_version, options);
10719
  }
10720
10721
  inline wuffs_base__image_decoder*
10722
  upcast_as__wuffs_base__image_decoder() {
10723
    return (wuffs_base__image_decoder*)this;
10724
  }
10725
10726
  inline uint64_t
10727
  get_quirk(
10728
      uint32_t a_key) const {
10729
    return wuffs_handsum__decoder__get_quirk(this, a_key);
10730
  }
10731
10732
  inline wuffs_base__status
10733
  set_quirk(
10734
      uint32_t a_key,
10735
      uint64_t a_value) {
10736
    return wuffs_handsum__decoder__set_quirk(this, a_key, a_value);
10737
  }
10738
10739
  inline wuffs_base__status
10740
  decode_image_config(
10741
      wuffs_base__image_config* a_dst,
10742
      wuffs_base__io_buffer* a_src) {
10743
    return wuffs_handsum__decoder__decode_image_config(this, a_dst, a_src);
10744
  }
10745
10746
  inline wuffs_base__status
10747
  decode_frame_config(
10748
      wuffs_base__frame_config* a_dst,
10749
      wuffs_base__io_buffer* a_src) {
10750
    return wuffs_handsum__decoder__decode_frame_config(this, a_dst, a_src);
10751
  }
10752
10753
  inline wuffs_base__status
10754
  decode_frame(
10755
      wuffs_base__pixel_buffer* a_dst,
10756
      wuffs_base__io_buffer* a_src,
10757
      wuffs_base__pixel_blend a_blend,
10758
      wuffs_base__slice_u8 a_workbuf,
10759
      wuffs_base__decode_frame_options* a_opts) {
10760
    return wuffs_handsum__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
10761
  }
10762
10763
  inline wuffs_base__rect_ie_u32
10764
  frame_dirty_rect() const {
10765
    return wuffs_handsum__decoder__frame_dirty_rect(this);
10766
  }
10767
10768
  inline uint32_t
10769
  num_animation_loops() const {
10770
    return wuffs_handsum__decoder__num_animation_loops(this);
10771
  }
10772
10773
  inline uint64_t
10774
  num_decoded_frame_configs() const {
10775
    return wuffs_handsum__decoder__num_decoded_frame_configs(this);
10776
  }
10777
10778
  inline uint64_t
10779
  num_decoded_frames() const {
10780
    return wuffs_handsum__decoder__num_decoded_frames(this);
10781
  }
10782
10783
  inline wuffs_base__status
10784
  restart_frame(
10785
      uint64_t a_index,
10786
      uint64_t a_io_position) {
10787
    return wuffs_handsum__decoder__restart_frame(this, a_index, a_io_position);
10788
  }
10789
10790
  inline wuffs_base__empty_struct
10791
  set_report_metadata(
10792
      uint32_t a_fourcc,
10793
      bool a_report) {
10794
    return wuffs_handsum__decoder__set_report_metadata(this, a_fourcc, a_report);
10795
  }
10796
10797
  inline wuffs_base__status
10798
  tell_me_more(
10799
      wuffs_base__io_buffer* a_dst,
10800
      wuffs_base__more_information* a_minfo,
10801
      wuffs_base__io_buffer* a_src) {
10802
    return wuffs_handsum__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
10803
  }
10804
10805
  inline wuffs_base__range_ii_u64
10806
  workbuf_len() const {
10807
    return wuffs_handsum__decoder__workbuf_len(this);
10808
  }
10809
10810
#endif  // __cplusplus
10811
};  // struct wuffs_handsum__decoder__struct
10812
10813
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
10814
10815
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM) || defined(WUFFS_NONMONOLITHIC)
10816
10817
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
10818
10819
// ---------------- Status Codes
10820
10821
extern const char wuffs_jpeg__error__bad_dht_marker[];
10822
extern const char wuffs_jpeg__error__bad_dqt_marker[];
10823
extern const char wuffs_jpeg__error__bad_dri_marker[];
10824
extern const char wuffs_jpeg__error__bad_sof_marker[];
10825
extern const char wuffs_jpeg__error__bad_sos_marker[];
10826
extern const char wuffs_jpeg__error__bad_header[];
10827
extern const char wuffs_jpeg__error__bad_marker[];
10828
extern const char wuffs_jpeg__error__bad_scan_count[];
10829
extern const char wuffs_jpeg__error__missing_huffman_table[];
10830
extern const char wuffs_jpeg__error__missing_quantization_table[];
10831
extern const char wuffs_jpeg__error__rejected_progressive_jpeg[];
10832
extern const char wuffs_jpeg__error__short_sos_bitstream[];
10833
extern const char wuffs_jpeg__error__truncated_input[];
10834
extern const char wuffs_jpeg__error__unsupported_arithmetic_coding[];
10835
extern const char wuffs_jpeg__error__unsupported_color_model[];
10836
extern const char wuffs_jpeg__error__unsupported_fractional_sampling[];
10837
extern const char wuffs_jpeg__error__unsupported_hierarchical_coding[];
10838
extern const char wuffs_jpeg__error__unsupported_implicit_height[];
10839
extern const char wuffs_jpeg__error__unsupported_lossless_coding[];
10840
extern const char wuffs_jpeg__error__unsupported_marker[];
10841
extern const char wuffs_jpeg__error__unsupported_precision_12_bits[];
10842
extern const char wuffs_jpeg__error__unsupported_precision_16_bits[];
10843
extern const char wuffs_jpeg__error__unsupported_precision[];
10844
extern const char wuffs_jpeg__error__unsupported_scan_count[];
10845
10846
// ---------------- Public Consts
10847
10848
#define WUFFS_JPEG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 51552191232u
10849
10850
#define WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS 1162824704u
10851
10852
// ---------------- Struct Declarations
10853
10854
typedef struct wuffs_jpeg__decoder__struct wuffs_jpeg__decoder;
10855
10856
#ifdef __cplusplus
10857
extern "C" {
10858
#endif
10859
10860
// ---------------- Public Initializer Prototypes
10861
10862
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
10863
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
10864
//
10865
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
10866
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
10867
10868
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
10869
wuffs_jpeg__decoder__initialize(
10870
    wuffs_jpeg__decoder* self,
10871
    size_t sizeof_star_self,
10872
    uint64_t wuffs_version,
10873
    uint32_t options);
10874
10875
size_t
10876
sizeof__wuffs_jpeg__decoder(void);
10877
10878
// ---------------- Allocs
10879
10880
// These functions allocate and initialize Wuffs structs. They return NULL if
10881
// memory allocation fails. If they return non-NULL, there is no need to call
10882
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
10883
// calling free on the returned pointer. That pointer is effectively a C++
10884
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
10885
10886
wuffs_jpeg__decoder*
10887
wuffs_jpeg__decoder__alloc(void);
10888
10889
static inline wuffs_base__image_decoder*
10890
wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder(void) {
10891
  return (wuffs_base__image_decoder*)(wuffs_jpeg__decoder__alloc());
10892
}
10893
10894
// ---------------- Upcasts
10895
10896
static inline wuffs_base__image_decoder*
10897
wuffs_jpeg__decoder__upcast_as__wuffs_base__image_decoder(
10898
    wuffs_jpeg__decoder* p) {
10899
  return (wuffs_base__image_decoder*)p;
10900
}
10901
10902
// ---------------- Public Function Prototypes
10903
10904
WUFFS_BASE__GENERATED_C_CODE
10905
WUFFS_BASE__MAYBE_STATIC uint64_t
10906
wuffs_jpeg__decoder__get_quirk(
10907
    const wuffs_jpeg__decoder* self,
10908
    uint32_t a_key);
10909
10910
WUFFS_BASE__GENERATED_C_CODE
10911
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10912
wuffs_jpeg__decoder__set_quirk(
10913
    wuffs_jpeg__decoder* self,
10914
    uint32_t a_key,
10915
    uint64_t a_value);
10916
10917
WUFFS_BASE__GENERATED_C_CODE
10918
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10919
wuffs_jpeg__decoder__decode_image_config(
10920
    wuffs_jpeg__decoder* self,
10921
    wuffs_base__image_config* a_dst,
10922
    wuffs_base__io_buffer* a_src);
10923
10924
WUFFS_BASE__GENERATED_C_CODE
10925
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10926
wuffs_jpeg__decoder__decode_frame_config(
10927
    wuffs_jpeg__decoder* self,
10928
    wuffs_base__frame_config* a_dst,
10929
    wuffs_base__io_buffer* a_src);
10930
10931
WUFFS_BASE__GENERATED_C_CODE
10932
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10933
wuffs_jpeg__decoder__decode_frame(
10934
    wuffs_jpeg__decoder* self,
10935
    wuffs_base__pixel_buffer* a_dst,
10936
    wuffs_base__io_buffer* a_src,
10937
    wuffs_base__pixel_blend a_blend,
10938
    wuffs_base__slice_u8 a_workbuf,
10939
    wuffs_base__decode_frame_options* a_opts);
10940
10941
WUFFS_BASE__GENERATED_C_CODE
10942
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
10943
wuffs_jpeg__decoder__frame_dirty_rect(
10944
    const wuffs_jpeg__decoder* self);
10945
10946
WUFFS_BASE__GENERATED_C_CODE
10947
WUFFS_BASE__MAYBE_STATIC uint32_t
10948
wuffs_jpeg__decoder__num_animation_loops(
10949
    const wuffs_jpeg__decoder* self);
10950
10951
WUFFS_BASE__GENERATED_C_CODE
10952
WUFFS_BASE__MAYBE_STATIC uint64_t
10953
wuffs_jpeg__decoder__num_decoded_frame_configs(
10954
    const wuffs_jpeg__decoder* self);
10955
10956
WUFFS_BASE__GENERATED_C_CODE
10957
WUFFS_BASE__MAYBE_STATIC uint64_t
10958
wuffs_jpeg__decoder__num_decoded_frames(
10959
    const wuffs_jpeg__decoder* self);
10960
10961
WUFFS_BASE__GENERATED_C_CODE
10962
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10963
wuffs_jpeg__decoder__restart_frame(
10964
    wuffs_jpeg__decoder* self,
10965
    uint64_t a_index,
10966
    uint64_t a_io_position);
10967
10968
WUFFS_BASE__GENERATED_C_CODE
10969
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
10970
wuffs_jpeg__decoder__set_report_metadata(
10971
    wuffs_jpeg__decoder* self,
10972
    uint32_t a_fourcc,
10973
    bool a_report);
10974
10975
WUFFS_BASE__GENERATED_C_CODE
10976
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
10977
wuffs_jpeg__decoder__tell_me_more(
10978
    wuffs_jpeg__decoder* self,
10979
    wuffs_base__io_buffer* a_dst,
10980
    wuffs_base__more_information* a_minfo,
10981
    wuffs_base__io_buffer* a_src);
10982
10983
WUFFS_BASE__GENERATED_C_CODE
10984
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
10985
wuffs_jpeg__decoder__workbuf_len(
10986
    const wuffs_jpeg__decoder* self);
10987
10988
#ifdef __cplusplus
10989
}  // extern "C"
10990
#endif
10991
10992
// ---------------- Struct Definitions
10993
10994
// These structs' fields, and the sizeof them, are private implementation
10995
// details that aren't guaranteed to be stable across Wuffs versions.
10996
//
10997
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
10998
10999
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11000
11001
struct wuffs_jpeg__decoder__struct {
11002
  // Do not access the private_impl's or private_data's fields directly. There
11003
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11004
  // the wuffs_foo__bar__baz functions.
11005
  //
11006
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11007
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11008
11009
  struct {
11010
    uint32_t magic;
11011
    uint32_t active_coroutine;
11012
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
11013
    wuffs_base__vtable null_vtable;
11014
11015
    uint32_t f_width;
11016
    uint32_t f_height;
11017
    uint32_t f_width_in_mcus;
11018
    uint32_t f_height_in_mcus;
11019
    uint8_t f_call_sequence;
11020
    bool f_test_only_interrupt_decode_mcu;
11021
    bool f_is_jfif;
11022
    uint8_t f_is_adobe;
11023
    bool f_is_rgb_or_cmyk;
11024
    uint8_t f_sof_marker;
11025
    uint8_t f_next_restart_marker;
11026
    uint8_t f_max_incl_components_h;
11027
    uint8_t f_max_incl_components_v;
11028
    uint32_t f_num_components;
11029
    uint8_t f_components_c[4];
11030
    uint8_t f_components_h[4];
11031
    uint8_t f_components_v[4];
11032
    uint8_t f_components_tq[4];
11033
    uint32_t f_components_workbuf_widths[4];
11034
    uint32_t f_components_workbuf_heights[4];
11035
    uint64_t f_components_workbuf_offsets[9];
11036
    uint32_t f_scan_count;
11037
    uint32_t f_scan_num_components;
11038
    uint8_t f_scan_comps_cselector[4];
11039
    uint8_t f_scan_comps_td[4];
11040
    uint8_t f_scan_comps_ta[4];
11041
    uint8_t f_scan_ss;
11042
    uint8_t f_scan_se;
11043
    uint8_t f_scan_ah;
11044
    uint8_t f_scan_al;
11045
    uint32_t f_scan_width_in_mcus;
11046
    uint32_t f_scan_height_in_mcus;
11047
    uint8_t f_scan_comps_bx_offset[16];
11048
    uint8_t f_scan_comps_by_offset[16];
11049
    uint32_t f_mcu_num_blocks;
11050
    uint32_t f_mcu_current_block;
11051
    uint32_t f_mcu_zig_index;
11052
    uint8_t f_mcu_blocks_sselector[16];
11053
    uint64_t f_mcu_blocks_offset[10];
11054
    uint32_t f_mcu_blocks_mx_mul[10];
11055
    uint32_t f_mcu_blocks_my_mul[10];
11056
    uint8_t f_mcu_blocks_dc_hselector[10];
11057
    uint8_t f_mcu_blocks_ac_hselector[10];
11058
    uint16_t f_mcu_previous_dc_values[4];
11059
    uint8_t f_block_smoothing_lowest_scan_al[4][10];
11060
    uint16_t f_block_smoothing_dc_values[5][5];
11061
    uint32_t f_block_smoothing_mx_max_incl;
11062
    uint32_t f_block_smoothing_my_max_incl;
11063
    uint16_t f_restart_interval;
11064
    uint16_t f_saved_restart_interval;
11065
    uint16_t f_restarts_remaining;
11066
    uint16_t f_eob_run;
11067
    uint64_t f_frame_config_io_position;
11068
    uint32_t f_payload_length;
11069
    bool f_seen_dqt[4];
11070
    bool f_saved_seen_dqt[4];
11071
    bool f_seen_dht[8];
11072
    uint64_t f_bitstream_bits;
11073
    uint32_t f_bitstream_n_bits;
11074
    uint32_t f_bitstream_ri;
11075
    uint32_t f_bitstream_wi;
11076
    bool f_bitstream_is_closed;
11077
    bool f_expect_multiple_scans;
11078
    bool f_use_lower_quality;
11079
    bool f_reject_progressive_jpegs;
11080
    bool f_swizzle_immediately;
11081
    wuffs_base__status f_swizzle_immediately_status;
11082
    uint32_t f_swizzle_immediately_b_offsets[10];
11083
    uint32_t f_swizzle_immediately_c_offsets[5];
11084
    uint32_t f_bitstream_padding;
11085
    uint16_t f_quant_tables[4][64];
11086
    uint16_t f_saved_quant_tables[4][64];
11087
    uint8_t f_huff_tables_symbols[8][256];
11088
    uint32_t f_huff_tables_slow[8][16];
11089
    uint16_t f_huff_tables_fast[8][256];
11090
    wuffs_base__pixel_swizzler f_swizzler;
11091
11092
    wuffs_base__empty_struct (*choosy_decode_idct)(
11093
        wuffs_jpeg__decoder* self,
11094
        wuffs_base__slice_u8 a_dst_buffer,
11095
        uint64_t a_dst_stride,
11096
        uint32_t a_q);
11097
    uint32_t p_decode_image_config;
11098
    uint32_t p_do_decode_image_config;
11099
    uint32_t p_decode_dqt;
11100
    uint32_t p_decode_dri;
11101
    uint32_t p_decode_appn;
11102
    uint32_t p_decode_sof;
11103
    uint32_t p_decode_frame_config;
11104
    uint32_t p_do_decode_frame_config;
11105
    uint32_t p_decode_frame;
11106
    uint32_t p_do_decode_frame;
11107
    uint32_t p_decode_dht;
11108
    uint32_t p_decode_sos;
11109
    uint32_t p_prepare_scan;
11110
    wuffs_base__empty_struct (*choosy_load_mcu_blocks_for_single_component)(
11111
        wuffs_jpeg__decoder* self,
11112
        uint32_t a_mx,
11113
        uint32_t a_my,
11114
        wuffs_base__slice_u8 a_workbuf,
11115
        uint32_t a_csel);
11116
    uint32_t p_skip_past_the_next_restart_marker;
11117
    uint32_t (*choosy_decode_mcu)(
11118
        wuffs_jpeg__decoder* self,
11119
        wuffs_base__pixel_buffer* a_dst,
11120
        wuffs_base__slice_u8 a_workbuf,
11121
        uint32_t a_mx,
11122
        uint32_t a_my);
11123
  } private_impl;
11124
11125
  struct {
11126
    uint8_t f_bitstream_buffer[2048];
11127
    uint16_t f_mcu_blocks[10][64];
11128
    uint8_t f_swizzle_immediately_buffer[640];
11129
    uint8_t f_swizzle_ycck_scratch_buffer_2k[2048];
11130
    uint8_t f_dht_temp_counts[16];
11131
    uint8_t f_dht_temp_bit_lengths[256];
11132
    uint16_t f_dht_temp_bit_strings[256];
11133
    uint8_t f_dst_palette[1024];
11134
11135
    struct {
11136
      uint8_t v_marker;
11137
      uint64_t scratch;
11138
    } s_do_decode_image_config;
11139
    struct {
11140
      uint8_t v_q;
11141
      uint32_t v_i;
11142
    } s_decode_dqt;
11143
    struct {
11144
      uint64_t scratch;
11145
    } s_decode_dri;
11146
    struct {
11147
      uint64_t scratch;
11148
    } s_decode_appn;
11149
    struct {
11150
      uint32_t v_i;
11151
      uint64_t scratch;
11152
    } s_decode_sof;
11153
    struct {
11154
      uint8_t v_marker;
11155
      uint64_t scratch;
11156
    } s_do_decode_frame;
11157
    struct {
11158
      uint8_t v_tc4_th;
11159
      uint32_t v_total_count;
11160
      uint32_t v_i;
11161
    } s_decode_dht;
11162
    struct {
11163
      uint32_t v_my;
11164
      uint32_t v_mx;
11165
    } s_decode_sos;
11166
    struct {
11167
      uint32_t v_i;
11168
      uint64_t scratch;
11169
    } s_prepare_scan;
11170
  } private_data;
11171
11172
#ifdef __cplusplus
11173
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11174
  using unique_ptr = std::unique_ptr<wuffs_jpeg__decoder, wuffs_unique_ptr_deleter>;
11175
11176
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11177
11178
  static inline unique_ptr
11179
  alloc() {
11180
    return unique_ptr(wuffs_jpeg__decoder__alloc());
11181
  }
11182
11183
  static inline wuffs_base__image_decoder::unique_ptr
11184
  alloc_as__wuffs_base__image_decoder() {
11185
    return wuffs_base__image_decoder::unique_ptr(
11186
        wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder());
11187
  }
11188
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11189
11190
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11191
  // Disallow constructing or copying an object via standard C++ mechanisms,
11192
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11193
  // size and field layout is not part of the public, stable, memory-safe API.
11194
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11195
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11196
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11197
  //
11198
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11199
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11200
  // order to provide convenience methods. These forward on "this", so that you
11201
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11202
  wuffs_jpeg__decoder__struct() = delete;
11203
  wuffs_jpeg__decoder__struct(const wuffs_jpeg__decoder__struct&) = delete;
11204
  wuffs_jpeg__decoder__struct& operator=(
11205
      const wuffs_jpeg__decoder__struct&) = delete;
11206
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11207
11208
#if !defined(WUFFS_IMPLEMENTATION)
11209
  // As above, the size of the struct is not part of the public API, and unless
11210
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11211
  // allocated, not stack allocated. Its size is not intended to be known at
11212
  // compile time, but it is unfortunately divulged as a side effect of
11213
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11214
  // instead of "sizeof T", invoking the operator. To make the two values
11215
  // different, so that passing the latter will be rejected by the initialize
11216
  // function, we add an arbitrary amount of dead weight.
11217
  uint8_t dead_weight[123000000];  // 123 MB.
11218
#endif  // !defined(WUFFS_IMPLEMENTATION)
11219
11220
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11221
  initialize(
11222
      size_t sizeof_star_self,
11223
      uint64_t wuffs_version,
11224
      uint32_t options) {
11225
    return wuffs_jpeg__decoder__initialize(
11226
        this, sizeof_star_self, wuffs_version, options);
11227
  }
11228
11229
  inline wuffs_base__image_decoder*
11230
  upcast_as__wuffs_base__image_decoder() {
11231
    return (wuffs_base__image_decoder*)this;
11232
  }
11233
11234
  inline uint64_t
11235
  get_quirk(
11236
      uint32_t a_key) const {
11237
    return wuffs_jpeg__decoder__get_quirk(this, a_key);
11238
  }
11239
11240
  inline wuffs_base__status
11241
  set_quirk(
11242
      uint32_t a_key,
11243
      uint64_t a_value) {
11244
    return wuffs_jpeg__decoder__set_quirk(this, a_key, a_value);
11245
  }
11246
11247
  inline wuffs_base__status
11248
  decode_image_config(
11249
      wuffs_base__image_config* a_dst,
11250
      wuffs_base__io_buffer* a_src) {
11251
    return wuffs_jpeg__decoder__decode_image_config(this, a_dst, a_src);
11252
  }
11253
11254
  inline wuffs_base__status
11255
  decode_frame_config(
11256
      wuffs_base__frame_config* a_dst,
11257
      wuffs_base__io_buffer* a_src) {
11258
    return wuffs_jpeg__decoder__decode_frame_config(this, a_dst, a_src);
11259
  }
11260
11261
  inline wuffs_base__status
11262
  decode_frame(
11263
      wuffs_base__pixel_buffer* a_dst,
11264
      wuffs_base__io_buffer* a_src,
11265
      wuffs_base__pixel_blend a_blend,
11266
      wuffs_base__slice_u8 a_workbuf,
11267
      wuffs_base__decode_frame_options* a_opts) {
11268
    return wuffs_jpeg__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
11269
  }
11270
11271
  inline wuffs_base__rect_ie_u32
11272
  frame_dirty_rect() const {
11273
    return wuffs_jpeg__decoder__frame_dirty_rect(this);
11274
  }
11275
11276
  inline uint32_t
11277
  num_animation_loops() const {
11278
    return wuffs_jpeg__decoder__num_animation_loops(this);
11279
  }
11280
11281
  inline uint64_t
11282
  num_decoded_frame_configs() const {
11283
    return wuffs_jpeg__decoder__num_decoded_frame_configs(this);
11284
  }
11285
11286
  inline uint64_t
11287
  num_decoded_frames() const {
11288
    return wuffs_jpeg__decoder__num_decoded_frames(this);
11289
  }
11290
11291
  inline wuffs_base__status
11292
  restart_frame(
11293
      uint64_t a_index,
11294
      uint64_t a_io_position) {
11295
    return wuffs_jpeg__decoder__restart_frame(this, a_index, a_io_position);
11296
  }
11297
11298
  inline wuffs_base__empty_struct
11299
  set_report_metadata(
11300
      uint32_t a_fourcc,
11301
      bool a_report) {
11302
    return wuffs_jpeg__decoder__set_report_metadata(this, a_fourcc, a_report);
11303
  }
11304
11305
  inline wuffs_base__status
11306
  tell_me_more(
11307
      wuffs_base__io_buffer* a_dst,
11308
      wuffs_base__more_information* a_minfo,
11309
      wuffs_base__io_buffer* a_src) {
11310
    return wuffs_jpeg__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
11311
  }
11312
11313
  inline wuffs_base__range_ii_u64
11314
  workbuf_len() const {
11315
    return wuffs_jpeg__decoder__workbuf_len(this);
11316
  }
11317
11318
#endif  // __cplusplus
11319
};  // struct wuffs_jpeg__decoder__struct
11320
11321
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11322
11323
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG) || defined(WUFFS_NONMONOLITHIC)
11324
11325
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
11326
11327
// ---------------- Status Codes
11328
11329
extern const char wuffs_json__error__bad_c0_control_code[];
11330
extern const char wuffs_json__error__bad_utf_8[];
11331
extern const char wuffs_json__error__bad_backslash_escape[];
11332
extern const char wuffs_json__error__bad_input[];
11333
extern const char wuffs_json__error__bad_new_line_in_a_string[];
11334
extern const char wuffs_json__error__bad_quirk_combination[];
11335
extern const char wuffs_json__error__unsupported_number_length[];
11336
extern const char wuffs_json__error__unsupported_recursion_depth[];
11337
11338
// ---------------- Public Consts
11339
11340
#define WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
11341
11342
#define WUFFS_JSON__DECODER_DEPTH_MAX_INCL 1024u
11343
11344
#define WUFFS_JSON__DECODER_DST_TOKEN_BUFFER_LENGTH_MIN_INCL 1u
11345
11346
#define WUFFS_JSON__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 100u
11347
11348
#define WUFFS_JSON__QUIRK_ALLOW_ASCII_CONTROL_CODES 1167656960u
11349
11350
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_A 1167656961u
11351
11352
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_CAPITAL_U 1167656962u
11353
11354
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_E 1167656963u
11355
11356
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_NEW_LINE 1167656964u
11357
11358
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_QUESTION_MARK 1167656965u
11359
11360
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_SINGLE_QUOTE 1167656966u
11361
11362
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_V 1167656967u
11363
11364
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_X_AS_CODE_POINTS 1167656969u
11365
11366
#define WUFFS_JSON__QUIRK_ALLOW_BACKSLASH_ZERO 1167656970u
11367
11368
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_BLOCK 1167656971u
11369
11370
#define WUFFS_JSON__QUIRK_ALLOW_COMMENT_LINE 1167656972u
11371
11372
#define WUFFS_JSON__QUIRK_ALLOW_EXTRA_COMMA 1167656973u
11373
11374
#define WUFFS_JSON__QUIRK_ALLOW_INF_NAN_NUMBERS 1167656974u
11375
11376
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_ASCII_RECORD_SEPARATOR 1167656975u
11377
11378
#define WUFFS_JSON__QUIRK_ALLOW_LEADING_UNICODE_BYTE_ORDER_MARK 1167656976u
11379
11380
#define WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER 1167656977u
11381
11382
#define WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF 1167656978u
11383
11384
#define WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T 1167656979u
11385
11386
#define WUFFS_JSON__QUIRK_REPLACE_INVALID_UNICODE 1167656980u
11387
11388
// ---------------- Struct Declarations
11389
11390
typedef struct wuffs_json__decoder__struct wuffs_json__decoder;
11391
11392
#ifdef __cplusplus
11393
extern "C" {
11394
#endif
11395
11396
// ---------------- Public Initializer Prototypes
11397
11398
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11399
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11400
//
11401
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11402
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11403
11404
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11405
wuffs_json__decoder__initialize(
11406
    wuffs_json__decoder* self,
11407
    size_t sizeof_star_self,
11408
    uint64_t wuffs_version,
11409
    uint32_t options);
11410
11411
size_t
11412
sizeof__wuffs_json__decoder(void);
11413
11414
// ---------------- Allocs
11415
11416
// These functions allocate and initialize Wuffs structs. They return NULL if
11417
// memory allocation fails. If they return non-NULL, there is no need to call
11418
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11419
// calling free on the returned pointer. That pointer is effectively a C++
11420
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11421
11422
wuffs_json__decoder*
11423
wuffs_json__decoder__alloc(void);
11424
11425
static inline wuffs_base__token_decoder*
11426
wuffs_json__decoder__alloc_as__wuffs_base__token_decoder(void) {
11427
  return (wuffs_base__token_decoder*)(wuffs_json__decoder__alloc());
11428
}
11429
11430
// ---------------- Upcasts
11431
11432
static inline wuffs_base__token_decoder*
11433
wuffs_json__decoder__upcast_as__wuffs_base__token_decoder(
11434
    wuffs_json__decoder* p) {
11435
  return (wuffs_base__token_decoder*)p;
11436
}
11437
11438
// ---------------- Public Function Prototypes
11439
11440
WUFFS_BASE__GENERATED_C_CODE
11441
WUFFS_BASE__MAYBE_STATIC uint64_t
11442
wuffs_json__decoder__get_quirk(
11443
    const wuffs_json__decoder* self,
11444
    uint32_t a_key);
11445
11446
WUFFS_BASE__GENERATED_C_CODE
11447
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11448
wuffs_json__decoder__set_quirk(
11449
    wuffs_json__decoder* self,
11450
    uint32_t a_key,
11451
    uint64_t a_value);
11452
11453
WUFFS_BASE__GENERATED_C_CODE
11454
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11455
wuffs_json__decoder__workbuf_len(
11456
    const wuffs_json__decoder* self);
11457
11458
WUFFS_BASE__GENERATED_C_CODE
11459
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11460
wuffs_json__decoder__decode_tokens(
11461
    wuffs_json__decoder* self,
11462
    wuffs_base__token_buffer* a_dst,
11463
    wuffs_base__io_buffer* a_src,
11464
    wuffs_base__slice_u8 a_workbuf);
11465
11466
#ifdef __cplusplus
11467
}  // extern "C"
11468
#endif
11469
11470
// ---------------- Struct Definitions
11471
11472
// These structs' fields, and the sizeof them, are private implementation
11473
// details that aren't guaranteed to be stable across Wuffs versions.
11474
//
11475
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11476
11477
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11478
11479
struct wuffs_json__decoder__struct {
11480
  // Do not access the private_impl's or private_data's fields directly. There
11481
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11482
  // the wuffs_foo__bar__baz functions.
11483
  //
11484
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11485
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11486
11487
  struct {
11488
    uint32_t magic;
11489
    uint32_t active_coroutine;
11490
    wuffs_base__vtable vtable_for__wuffs_base__token_decoder;
11491
    wuffs_base__vtable null_vtable;
11492
11493
    bool f_quirks[21];
11494
    bool f_allow_leading_ars;
11495
    bool f_allow_leading_ubom;
11496
    bool f_end_of_data;
11497
    uint8_t f_trailer_stop;
11498
    uint8_t f_comment_type;
11499
11500
    uint32_t p_decode_tokens;
11501
    uint32_t p_decode_leading;
11502
    uint32_t p_decode_comment;
11503
    uint32_t p_decode_inf_nan;
11504
    uint32_t p_decode_trailer;
11505
  } private_impl;
11506
11507
  struct {
11508
    uint32_t f_stack[32];
11509
11510
    struct {
11511
      uint32_t v_depth;
11512
      uint32_t v_expect;
11513
      uint32_t v_expect_after_value;
11514
    } s_decode_tokens;
11515
  } private_data;
11516
11517
#ifdef __cplusplus
11518
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11519
  using unique_ptr = std::unique_ptr<wuffs_json__decoder, wuffs_unique_ptr_deleter>;
11520
11521
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11522
11523
  static inline unique_ptr
11524
  alloc() {
11525
    return unique_ptr(wuffs_json__decoder__alloc());
11526
  }
11527
11528
  static inline wuffs_base__token_decoder::unique_ptr
11529
  alloc_as__wuffs_base__token_decoder() {
11530
    return wuffs_base__token_decoder::unique_ptr(
11531
        wuffs_json__decoder__alloc_as__wuffs_base__token_decoder());
11532
  }
11533
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11534
11535
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11536
  // Disallow constructing or copying an object via standard C++ mechanisms,
11537
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11538
  // size and field layout is not part of the public, stable, memory-safe API.
11539
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11540
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11541
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11542
  //
11543
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11544
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11545
  // order to provide convenience methods. These forward on "this", so that you
11546
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11547
  wuffs_json__decoder__struct() = delete;
11548
  wuffs_json__decoder__struct(const wuffs_json__decoder__struct&) = delete;
11549
  wuffs_json__decoder__struct& operator=(
11550
      const wuffs_json__decoder__struct&) = delete;
11551
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11552
11553
#if !defined(WUFFS_IMPLEMENTATION)
11554
  // As above, the size of the struct is not part of the public API, and unless
11555
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11556
  // allocated, not stack allocated. Its size is not intended to be known at
11557
  // compile time, but it is unfortunately divulged as a side effect of
11558
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11559
  // instead of "sizeof T", invoking the operator. To make the two values
11560
  // different, so that passing the latter will be rejected by the initialize
11561
  // function, we add an arbitrary amount of dead weight.
11562
  uint8_t dead_weight[123000000];  // 123 MB.
11563
#endif  // !defined(WUFFS_IMPLEMENTATION)
11564
11565
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11566
  initialize(
11567
      size_t sizeof_star_self,
11568
      uint64_t wuffs_version,
11569
      uint32_t options) {
11570
    return wuffs_json__decoder__initialize(
11571
        this, sizeof_star_self, wuffs_version, options);
11572
  }
11573
11574
  inline wuffs_base__token_decoder*
11575
  upcast_as__wuffs_base__token_decoder() {
11576
    return (wuffs_base__token_decoder*)this;
11577
  }
11578
11579
  inline uint64_t
11580
  get_quirk(
11581
      uint32_t a_key) const {
11582
    return wuffs_json__decoder__get_quirk(this, a_key);
11583
  }
11584
11585
  inline wuffs_base__status
11586
  set_quirk(
11587
      uint32_t a_key,
11588
      uint64_t a_value) {
11589
    return wuffs_json__decoder__set_quirk(this, a_key, a_value);
11590
  }
11591
11592
  inline wuffs_base__range_ii_u64
11593
  workbuf_len() const {
11594
    return wuffs_json__decoder__workbuf_len(this);
11595
  }
11596
11597
  inline wuffs_base__status
11598
  decode_tokens(
11599
      wuffs_base__token_buffer* a_dst,
11600
      wuffs_base__io_buffer* a_src,
11601
      wuffs_base__slice_u8 a_workbuf) {
11602
    return wuffs_json__decoder__decode_tokens(this, a_dst, a_src, a_workbuf);
11603
  }
11604
11605
#endif  // __cplusplus
11606
};  // struct wuffs_json__decoder__struct
11607
11608
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11609
11610
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON) || defined(WUFFS_NONMONOLITHIC)
11611
11612
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
11613
11614
// ---------------- Status Codes
11615
11616
extern const char wuffs_lzma__error__bad_lzma2_header[];
11617
extern const char wuffs_lzma__error__bad_bitstream_trailer[];
11618
extern const char wuffs_lzma__error__bad_code[];
11619
extern const char wuffs_lzma__error__bad_decoded_length[];
11620
extern const char wuffs_lzma__error__bad_distance[];
11621
extern const char wuffs_lzma__error__bad_header[];
11622
extern const char wuffs_lzma__error__truncated_input[];
11623
extern const char wuffs_lzma__error__unsupported_decoded_length[];
11624
extern const char wuffs_lzma__error__unsupported_properties[];
11625
11626
// ---------------- Public Consts
11627
11628
#define WUFFS_LZMA__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11629
11630
#define WUFFS_LZMA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
11631
11632
#define WUFFS_LZMA__QUIRK_ALLOW_NON_ZERO_INITIAL_BYTE 1290294272u
11633
11634
#define WUFFS_LZMA__QUIRK_FORMAT_EXTENSION 1290294273u
11635
11636
// ---------------- Struct Declarations
11637
11638
typedef struct wuffs_lzma__decoder__struct wuffs_lzma__decoder;
11639
11640
#ifdef __cplusplus
11641
extern "C" {
11642
#endif
11643
11644
// ---------------- Public Initializer Prototypes
11645
11646
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11647
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11648
//
11649
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11650
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11651
11652
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11653
wuffs_lzma__decoder__initialize(
11654
    wuffs_lzma__decoder* self,
11655
    size_t sizeof_star_self,
11656
    uint64_t wuffs_version,
11657
    uint32_t options);
11658
11659
size_t
11660
sizeof__wuffs_lzma__decoder(void);
11661
11662
// ---------------- Allocs
11663
11664
// These functions allocate and initialize Wuffs structs. They return NULL if
11665
// memory allocation fails. If they return non-NULL, there is no need to call
11666
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11667
// calling free on the returned pointer. That pointer is effectively a C++
11668
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11669
11670
wuffs_lzma__decoder*
11671
wuffs_lzma__decoder__alloc(void);
11672
11673
static inline wuffs_base__io_transformer*
11674
wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer(void) {
11675
  return (wuffs_base__io_transformer*)(wuffs_lzma__decoder__alloc());
11676
}
11677
11678
// ---------------- Upcasts
11679
11680
static inline wuffs_base__io_transformer*
11681
wuffs_lzma__decoder__upcast_as__wuffs_base__io_transformer(
11682
    wuffs_lzma__decoder* p) {
11683
  return (wuffs_base__io_transformer*)p;
11684
}
11685
11686
// ---------------- Public Function Prototypes
11687
11688
WUFFS_BASE__GENERATED_C_CODE
11689
WUFFS_BASE__MAYBE_STATIC uint64_t
11690
wuffs_lzma__decoder__get_quirk(
11691
    const wuffs_lzma__decoder* self,
11692
    uint32_t a_key);
11693
11694
WUFFS_BASE__GENERATED_C_CODE
11695
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11696
wuffs_lzma__decoder__set_quirk(
11697
    wuffs_lzma__decoder* self,
11698
    uint32_t a_key,
11699
    uint64_t a_value);
11700
11701
WUFFS_BASE__GENERATED_C_CODE
11702
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
11703
wuffs_lzma__decoder__dst_history_retain_length(
11704
    const wuffs_lzma__decoder* self);
11705
11706
WUFFS_BASE__GENERATED_C_CODE
11707
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
11708
wuffs_lzma__decoder__workbuf_len(
11709
    const wuffs_lzma__decoder* self);
11710
11711
WUFFS_BASE__GENERATED_C_CODE
11712
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
11713
wuffs_lzma__decoder__transform_io(
11714
    wuffs_lzma__decoder* self,
11715
    wuffs_base__io_buffer* a_dst,
11716
    wuffs_base__io_buffer* a_src,
11717
    wuffs_base__slice_u8 a_workbuf);
11718
11719
#ifdef __cplusplus
11720
}  // extern "C"
11721
#endif
11722
11723
// ---------------- Struct Definitions
11724
11725
// These structs' fields, and the sizeof them, are private implementation
11726
// details that aren't guaranteed to be stable across Wuffs versions.
11727
//
11728
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
11729
11730
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11731
11732
struct wuffs_lzma__decoder__struct {
11733
  // Do not access the private_impl's or private_data's fields directly. There
11734
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
11735
  // the wuffs_foo__bar__baz functions.
11736
  //
11737
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
11738
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
11739
11740
  struct {
11741
    uint32_t magic;
11742
    uint32_t active_coroutine;
11743
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
11744
    wuffs_base__vtable null_vtable;
11745
11746
    uint32_t f_lc;
11747
    uint32_t f_lp;
11748
    uint32_t f_pb;
11749
    uint32_t f_format_extension;
11750
    uint32_t f_dict_size;
11751
    uint32_t f_dict_workbuf_index;
11752
    uint32_t f_dict_seen;
11753
    uint64_t f_decoded_length;
11754
    uint64_t f_lzma2_encoded_length_have;
11755
    uint64_t f_lzma2_encoded_length_want;
11756
    bool f_lzma2_need_prob_reset;
11757
    bool f_lzma2_need_properties;
11758
    bool f_lzma2_need_dict_reset;
11759
    bool f_prev_lzma2_chunk_was_uncompressed;
11760
    bool f_allow_non_zero_initial_byte;
11761
    bool f_end_of_chunk;
11762
    uint8_t f_stashed_bytes[2];
11763
    uint32_t f_stashed_bits;
11764
    uint32_t f_stashed_range;
11765
    uint32_t f_stashed_state;
11766
    uint32_t f_stashed_rep0;
11767
    uint32_t f_stashed_rep1;
11768
    uint32_t f_stashed_rep2;
11769
    uint32_t f_stashed_rep3;
11770
    uint64_t f_stashed_pos;
11771
    uint64_t f_stashed_pos_end;
11772
11773
    uint32_t p_decode_bitstream_slow;
11774
    uint32_t p_transform_io;
11775
    uint32_t p_do_transform_io;
11776
    uint32_t p_decode_bitstream;
11777
    uint32_t p_update_stashed_bytes;
11778
    uint32_t p_decode_optional_end_of_stream;
11779
  } private_impl;
11780
11781
  struct {
11782
    uint16_t f_probs_ao00[192];
11783
    uint16_t f_probs_ao20[12];
11784
    uint16_t f_probs_ao40[12];
11785
    uint16_t f_probs_ao41[192];
11786
    uint16_t f_probs_ao60[12];
11787
    uint16_t f_probs_ao63[12];
11788
    uint16_t f_probs_match_len_low[16][8];
11789
    uint16_t f_probs_match_len_mid[16][8];
11790
    uint16_t f_probs_match_len_high[1][256];
11791
    uint16_t f_probs_longrep_len_low[16][8];
11792
    uint16_t f_probs_longrep_len_mid[16][8];
11793
    uint16_t f_probs_longrep_len_high[1][256];
11794
    uint16_t f_probs_slot[4][64];
11795
    uint16_t f_probs_small_dist[128];
11796
    uint16_t f_probs_large_dist[16];
11797
    uint16_t f_probs_lit[16][768];
11798
11799
    struct {
11800
      uint32_t v_bits;
11801
      uint32_t v_range;
11802
      uint32_t v_state;
11803
      uint32_t v_rep0;
11804
      uint32_t v_rep1;
11805
      uint32_t v_rep2;
11806
      uint32_t v_rep3;
11807
      uint32_t v_rep;
11808
      uint64_t v_pos;
11809
      uint64_t v_pos_end;
11810
      uint32_t v_lc;
11811
      uint64_t v_lp_mask;
11812
      uint64_t v_pb_mask;
11813
      uint32_t v_tree_node;
11814
      uint8_t v_prev_byte;
11815
      uint32_t v_match_byte;
11816
      uint32_t v_len_state;
11817
      uint32_t v_slot;
11818
      uint32_t v_len;
11819
      uint32_t v_lanl_offset;
11820
      uint32_t v_num_extra_bits;
11821
      uint32_t v_dist_extra_bits;
11822
      uint32_t v_i;
11823
      uint32_t v_index_lit;
11824
      uint32_t v_index_len;
11825
      uint32_t v_index_small_dist_base;
11826
      uint32_t v_index_small_dist_extra;
11827
      uint32_t v_index_large_dist;
11828
      uint32_t v_dist;
11829
      uint64_t scratch;
11830
    } s_decode_bitstream_slow;
11831
    struct {
11832
      uint8_t v_header_byte;
11833
      uint32_t v_length;
11834
      uint64_t scratch;
11835
    } s_do_transform_io;
11836
  } private_data;
11837
11838
#ifdef __cplusplus
11839
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11840
  using unique_ptr = std::unique_ptr<wuffs_lzma__decoder, wuffs_unique_ptr_deleter>;
11841
11842
  // On failure, the alloc_etc functions return nullptr. They don't throw.
11843
11844
  static inline unique_ptr
11845
  alloc() {
11846
    return unique_ptr(wuffs_lzma__decoder__alloc());
11847
  }
11848
11849
  static inline wuffs_base__io_transformer::unique_ptr
11850
  alloc_as__wuffs_base__io_transformer() {
11851
    return wuffs_base__io_transformer::unique_ptr(
11852
        wuffs_lzma__decoder__alloc_as__wuffs_base__io_transformer());
11853
  }
11854
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
11855
11856
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11857
  // Disallow constructing or copying an object via standard C++ mechanisms,
11858
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
11859
  // size and field layout is not part of the public, stable, memory-safe API.
11860
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
11861
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
11862
  // their first argument) rather than tweaking bar.private_impl.qux fields.
11863
  //
11864
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
11865
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
11866
  // order to provide convenience methods. These forward on "this", so that you
11867
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
11868
  wuffs_lzma__decoder__struct() = delete;
11869
  wuffs_lzma__decoder__struct(const wuffs_lzma__decoder__struct&) = delete;
11870
  wuffs_lzma__decoder__struct& operator=(
11871
      const wuffs_lzma__decoder__struct&) = delete;
11872
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
11873
11874
#if !defined(WUFFS_IMPLEMENTATION)
11875
  // As above, the size of the struct is not part of the public API, and unless
11876
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
11877
  // allocated, not stack allocated. Its size is not intended to be known at
11878
  // compile time, but it is unfortunately divulged as a side effect of
11879
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
11880
  // instead of "sizeof T", invoking the operator. To make the two values
11881
  // different, so that passing the latter will be rejected by the initialize
11882
  // function, we add an arbitrary amount of dead weight.
11883
  uint8_t dead_weight[123000000];  // 123 MB.
11884
#endif  // !defined(WUFFS_IMPLEMENTATION)
11885
11886
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11887
  initialize(
11888
      size_t sizeof_star_self,
11889
      uint64_t wuffs_version,
11890
      uint32_t options) {
11891
    return wuffs_lzma__decoder__initialize(
11892
        this, sizeof_star_self, wuffs_version, options);
11893
  }
11894
11895
  inline wuffs_base__io_transformer*
11896
  upcast_as__wuffs_base__io_transformer() {
11897
    return (wuffs_base__io_transformer*)this;
11898
  }
11899
11900
  inline uint64_t
11901
  get_quirk(
11902
      uint32_t a_key) const {
11903
    return wuffs_lzma__decoder__get_quirk(this, a_key);
11904
  }
11905
11906
  inline wuffs_base__status
11907
  set_quirk(
11908
      uint32_t a_key,
11909
      uint64_t a_value) {
11910
    return wuffs_lzma__decoder__set_quirk(this, a_key, a_value);
11911
  }
11912
11913
  inline wuffs_base__optional_u63
11914
  dst_history_retain_length() const {
11915
    return wuffs_lzma__decoder__dst_history_retain_length(this);
11916
  }
11917
11918
  inline wuffs_base__range_ii_u64
11919
  workbuf_len() const {
11920
    return wuffs_lzma__decoder__workbuf_len(this);
11921
  }
11922
11923
  inline wuffs_base__status
11924
  transform_io(
11925
      wuffs_base__io_buffer* a_dst,
11926
      wuffs_base__io_buffer* a_src,
11927
      wuffs_base__slice_u8 a_workbuf) {
11928
    return wuffs_lzma__decoder__transform_io(this, a_dst, a_src, a_workbuf);
11929
  }
11930
11931
#endif  // __cplusplus
11932
};  // struct wuffs_lzma__decoder__struct
11933
11934
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
11935
11936
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA) || defined(WUFFS_NONMONOLITHIC)
11937
11938
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
11939
11940
// ---------------- Status Codes
11941
11942
extern const char wuffs_lzip__error__bad_checksum[];
11943
extern const char wuffs_lzip__error__bad_footer[];
11944
extern const char wuffs_lzip__error__bad_header[];
11945
extern const char wuffs_lzip__error__truncated_input[];
11946
11947
// ---------------- Public Consts
11948
11949
#define WUFFS_LZIP__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
11950
11951
#define WUFFS_LZIP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
11952
11953
// ---------------- Struct Declarations
11954
11955
typedef struct wuffs_lzip__decoder__struct wuffs_lzip__decoder;
11956
11957
#ifdef __cplusplus
11958
extern "C" {
11959
#endif
11960
11961
// ---------------- Public Initializer Prototypes
11962
11963
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
11964
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
11965
//
11966
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
11967
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
11968
11969
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
11970
wuffs_lzip__decoder__initialize(
11971
    wuffs_lzip__decoder* self,
11972
    size_t sizeof_star_self,
11973
    uint64_t wuffs_version,
11974
    uint32_t options);
11975
11976
size_t
11977
sizeof__wuffs_lzip__decoder(void);
11978
11979
// ---------------- Allocs
11980
11981
// These functions allocate and initialize Wuffs structs. They return NULL if
11982
// memory allocation fails. If they return non-NULL, there is no need to call
11983
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
11984
// calling free on the returned pointer. That pointer is effectively a C++
11985
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
11986
11987
wuffs_lzip__decoder*
11988
wuffs_lzip__decoder__alloc(void);
11989
11990
static inline wuffs_base__io_transformer*
11991
wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer(void) {
11992
  return (wuffs_base__io_transformer*)(wuffs_lzip__decoder__alloc());
11993
}
11994
11995
// ---------------- Upcasts
11996
11997
static inline wuffs_base__io_transformer*
11998
wuffs_lzip__decoder__upcast_as__wuffs_base__io_transformer(
11999
    wuffs_lzip__decoder* p) {
12000
  return (wuffs_base__io_transformer*)p;
12001
}
12002
12003
// ---------------- Public Function Prototypes
12004
12005
WUFFS_BASE__GENERATED_C_CODE
12006
WUFFS_BASE__MAYBE_STATIC uint64_t
12007
wuffs_lzip__decoder__get_quirk(
12008
    const wuffs_lzip__decoder* self,
12009
    uint32_t a_key);
12010
12011
WUFFS_BASE__GENERATED_C_CODE
12012
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12013
wuffs_lzip__decoder__set_quirk(
12014
    wuffs_lzip__decoder* self,
12015
    uint32_t a_key,
12016
    uint64_t a_value);
12017
12018
WUFFS_BASE__GENERATED_C_CODE
12019
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
12020
wuffs_lzip__decoder__dst_history_retain_length(
12021
    const wuffs_lzip__decoder* self);
12022
12023
WUFFS_BASE__GENERATED_C_CODE
12024
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12025
wuffs_lzip__decoder__workbuf_len(
12026
    const wuffs_lzip__decoder* self);
12027
12028
WUFFS_BASE__GENERATED_C_CODE
12029
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12030
wuffs_lzip__decoder__transform_io(
12031
    wuffs_lzip__decoder* self,
12032
    wuffs_base__io_buffer* a_dst,
12033
    wuffs_base__io_buffer* a_src,
12034
    wuffs_base__slice_u8 a_workbuf);
12035
12036
#ifdef __cplusplus
12037
}  // extern "C"
12038
#endif
12039
12040
// ---------------- Struct Definitions
12041
12042
// These structs' fields, and the sizeof them, are private implementation
12043
// details that aren't guaranteed to be stable across Wuffs versions.
12044
//
12045
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12046
12047
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12048
12049
struct wuffs_lzip__decoder__struct {
12050
  // Do not access the private_impl's or private_data's fields directly. There
12051
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12052
  // the wuffs_foo__bar__baz functions.
12053
  //
12054
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12055
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12056
12057
  struct {
12058
    uint32_t magic;
12059
    uint32_t active_coroutine;
12060
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
12061
    wuffs_base__vtable null_vtable;
12062
12063
    bool f_ignore_checksum;
12064
    uint64_t f_dsize_have;
12065
    uint64_t f_ssize_have;
12066
12067
    uint32_t p_transform_io;
12068
    uint32_t p_do_transform_io;
12069
  } private_impl;
12070
12071
  struct {
12072
    wuffs_crc32__ieee_hasher f_crc32;
12073
    wuffs_lzma__decoder f_lzma;
12074
12075
    struct {
12076
      uint64_t scratch;
12077
    } s_do_transform_io;
12078
  } private_data;
12079
12080
#ifdef __cplusplus
12081
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12082
  using unique_ptr = std::unique_ptr<wuffs_lzip__decoder, wuffs_unique_ptr_deleter>;
12083
12084
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12085
12086
  static inline unique_ptr
12087
  alloc() {
12088
    return unique_ptr(wuffs_lzip__decoder__alloc());
12089
  }
12090
12091
  static inline wuffs_base__io_transformer::unique_ptr
12092
  alloc_as__wuffs_base__io_transformer() {
12093
    return wuffs_base__io_transformer::unique_ptr(
12094
        wuffs_lzip__decoder__alloc_as__wuffs_base__io_transformer());
12095
  }
12096
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12097
12098
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12099
  // Disallow constructing or copying an object via standard C++ mechanisms,
12100
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12101
  // size and field layout is not part of the public, stable, memory-safe API.
12102
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12103
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12104
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12105
  //
12106
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12107
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12108
  // order to provide convenience methods. These forward on "this", so that you
12109
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12110
  wuffs_lzip__decoder__struct() = delete;
12111
  wuffs_lzip__decoder__struct(const wuffs_lzip__decoder__struct&) = delete;
12112
  wuffs_lzip__decoder__struct& operator=(
12113
      const wuffs_lzip__decoder__struct&) = delete;
12114
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12115
12116
#if !defined(WUFFS_IMPLEMENTATION)
12117
  // As above, the size of the struct is not part of the public API, and unless
12118
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12119
  // allocated, not stack allocated. Its size is not intended to be known at
12120
  // compile time, but it is unfortunately divulged as a side effect of
12121
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12122
  // instead of "sizeof T", invoking the operator. To make the two values
12123
  // different, so that passing the latter will be rejected by the initialize
12124
  // function, we add an arbitrary amount of dead weight.
12125
  uint8_t dead_weight[123000000];  // 123 MB.
12126
#endif  // !defined(WUFFS_IMPLEMENTATION)
12127
12128
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12129
  initialize(
12130
      size_t sizeof_star_self,
12131
      uint64_t wuffs_version,
12132
      uint32_t options) {
12133
    return wuffs_lzip__decoder__initialize(
12134
        this, sizeof_star_self, wuffs_version, options);
12135
  }
12136
12137
  inline wuffs_base__io_transformer*
12138
  upcast_as__wuffs_base__io_transformer() {
12139
    return (wuffs_base__io_transformer*)this;
12140
  }
12141
12142
  inline uint64_t
12143
  get_quirk(
12144
      uint32_t a_key) const {
12145
    return wuffs_lzip__decoder__get_quirk(this, a_key);
12146
  }
12147
12148
  inline wuffs_base__status
12149
  set_quirk(
12150
      uint32_t a_key,
12151
      uint64_t a_value) {
12152
    return wuffs_lzip__decoder__set_quirk(this, a_key, a_value);
12153
  }
12154
12155
  inline wuffs_base__optional_u63
12156
  dst_history_retain_length() const {
12157
    return wuffs_lzip__decoder__dst_history_retain_length(this);
12158
  }
12159
12160
  inline wuffs_base__range_ii_u64
12161
  workbuf_len() const {
12162
    return wuffs_lzip__decoder__workbuf_len(this);
12163
  }
12164
12165
  inline wuffs_base__status
12166
  transform_io(
12167
      wuffs_base__io_buffer* a_dst,
12168
      wuffs_base__io_buffer* a_src,
12169
      wuffs_base__slice_u8 a_workbuf) {
12170
    return wuffs_lzip__decoder__transform_io(this, a_dst, a_src, a_workbuf);
12171
  }
12172
12173
#endif  // __cplusplus
12174
};  // struct wuffs_lzip__decoder__struct
12175
12176
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12177
12178
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP) || defined(WUFFS_NONMONOLITHIC)
12179
12180
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
12181
12182
// ---------------- Status Codes
12183
12184
extern const char wuffs_lzw__error__bad_code[];
12185
extern const char wuffs_lzw__error__truncated_input[];
12186
12187
// ---------------- Public Consts
12188
12189
#define WUFFS_LZW__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
12190
12191
#define WUFFS_LZW__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12192
12193
#define WUFFS_LZW__QUIRK_LITERAL_WIDTH_PLUS_ONE 1290672128u
12194
12195
// ---------------- Struct Declarations
12196
12197
typedef struct wuffs_lzw__decoder__struct wuffs_lzw__decoder;
12198
12199
#ifdef __cplusplus
12200
extern "C" {
12201
#endif
12202
12203
// ---------------- Public Initializer Prototypes
12204
12205
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12206
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12207
//
12208
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12209
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12210
12211
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12212
wuffs_lzw__decoder__initialize(
12213
    wuffs_lzw__decoder* self,
12214
    size_t sizeof_star_self,
12215
    uint64_t wuffs_version,
12216
    uint32_t options);
12217
12218
size_t
12219
sizeof__wuffs_lzw__decoder(void);
12220
12221
// ---------------- Allocs
12222
12223
// These functions allocate and initialize Wuffs structs. They return NULL if
12224
// memory allocation fails. If they return non-NULL, there is no need to call
12225
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12226
// calling free on the returned pointer. That pointer is effectively a C++
12227
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12228
12229
wuffs_lzw__decoder*
12230
wuffs_lzw__decoder__alloc(void);
12231
12232
static inline wuffs_base__io_transformer*
12233
wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer(void) {
12234
  return (wuffs_base__io_transformer*)(wuffs_lzw__decoder__alloc());
12235
}
12236
12237
// ---------------- Upcasts
12238
12239
static inline wuffs_base__io_transformer*
12240
wuffs_lzw__decoder__upcast_as__wuffs_base__io_transformer(
12241
    wuffs_lzw__decoder* p) {
12242
  return (wuffs_base__io_transformer*)p;
12243
}
12244
12245
// ---------------- Public Function Prototypes
12246
12247
WUFFS_BASE__GENERATED_C_CODE
12248
WUFFS_BASE__MAYBE_STATIC uint64_t
12249
wuffs_lzw__decoder__get_quirk(
12250
    const wuffs_lzw__decoder* self,
12251
    uint32_t a_key);
12252
12253
WUFFS_BASE__GENERATED_C_CODE
12254
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12255
wuffs_lzw__decoder__set_quirk(
12256
    wuffs_lzw__decoder* self,
12257
    uint32_t a_key,
12258
    uint64_t a_value);
12259
12260
WUFFS_BASE__GENERATED_C_CODE
12261
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
12262
wuffs_lzw__decoder__dst_history_retain_length(
12263
    const wuffs_lzw__decoder* self);
12264
12265
WUFFS_BASE__GENERATED_C_CODE
12266
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12267
wuffs_lzw__decoder__workbuf_len(
12268
    const wuffs_lzw__decoder* self);
12269
12270
WUFFS_BASE__GENERATED_C_CODE
12271
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12272
wuffs_lzw__decoder__transform_io(
12273
    wuffs_lzw__decoder* self,
12274
    wuffs_base__io_buffer* a_dst,
12275
    wuffs_base__io_buffer* a_src,
12276
    wuffs_base__slice_u8 a_workbuf);
12277
12278
WUFFS_BASE__GENERATED_C_CODE
12279
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
12280
wuffs_lzw__decoder__flush(
12281
    wuffs_lzw__decoder* self);
12282
12283
#ifdef __cplusplus
12284
}  // extern "C"
12285
#endif
12286
12287
// ---------------- Struct Definitions
12288
12289
// These structs' fields, and the sizeof them, are private implementation
12290
// details that aren't guaranteed to be stable across Wuffs versions.
12291
//
12292
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12293
12294
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12295
12296
struct wuffs_lzw__decoder__struct {
12297
  // Do not access the private_impl's or private_data's fields directly. There
12298
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12299
  // the wuffs_foo__bar__baz functions.
12300
  //
12301
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12302
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12303
12304
  struct {
12305
    uint32_t magic;
12306
    uint32_t active_coroutine;
12307
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
12308
    wuffs_base__vtable null_vtable;
12309
12310
    uint32_t f_pending_literal_width_plus_one;
12311
    uint32_t f_literal_width;
12312
    uint32_t f_clear_code;
12313
    uint32_t f_end_code;
12314
    uint32_t f_save_code;
12315
    uint32_t f_prev_code;
12316
    uint32_t f_width;
12317
    uint32_t f_bits;
12318
    uint32_t f_n_bits;
12319
    uint32_t f_output_ri;
12320
    uint32_t f_output_wi;
12321
    uint32_t f_read_from_return_value;
12322
    uint16_t f_prefixes[4096];
12323
12324
    uint32_t p_transform_io;
12325
    uint32_t p_write_to;
12326
  } private_impl;
12327
12328
  struct {
12329
    uint8_t f_suffixes[4096][8];
12330
    uint16_t f_lm1s[4096];
12331
    uint8_t f_output[8199];
12332
  } private_data;
12333
12334
#ifdef __cplusplus
12335
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12336
  using unique_ptr = std::unique_ptr<wuffs_lzw__decoder, wuffs_unique_ptr_deleter>;
12337
12338
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12339
12340
  static inline unique_ptr
12341
  alloc() {
12342
    return unique_ptr(wuffs_lzw__decoder__alloc());
12343
  }
12344
12345
  static inline wuffs_base__io_transformer::unique_ptr
12346
  alloc_as__wuffs_base__io_transformer() {
12347
    return wuffs_base__io_transformer::unique_ptr(
12348
        wuffs_lzw__decoder__alloc_as__wuffs_base__io_transformer());
12349
  }
12350
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12351
12352
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12353
  // Disallow constructing or copying an object via standard C++ mechanisms,
12354
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12355
  // size and field layout is not part of the public, stable, memory-safe API.
12356
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12357
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12358
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12359
  //
12360
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12361
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12362
  // order to provide convenience methods. These forward on "this", so that you
12363
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12364
  wuffs_lzw__decoder__struct() = delete;
12365
  wuffs_lzw__decoder__struct(const wuffs_lzw__decoder__struct&) = delete;
12366
  wuffs_lzw__decoder__struct& operator=(
12367
      const wuffs_lzw__decoder__struct&) = delete;
12368
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12369
12370
#if !defined(WUFFS_IMPLEMENTATION)
12371
  // As above, the size of the struct is not part of the public API, and unless
12372
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12373
  // allocated, not stack allocated. Its size is not intended to be known at
12374
  // compile time, but it is unfortunately divulged as a side effect of
12375
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12376
  // instead of "sizeof T", invoking the operator. To make the two values
12377
  // different, so that passing the latter will be rejected by the initialize
12378
  // function, we add an arbitrary amount of dead weight.
12379
  uint8_t dead_weight[123000000];  // 123 MB.
12380
#endif  // !defined(WUFFS_IMPLEMENTATION)
12381
12382
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12383
  initialize(
12384
      size_t sizeof_star_self,
12385
      uint64_t wuffs_version,
12386
      uint32_t options) {
12387
    return wuffs_lzw__decoder__initialize(
12388
        this, sizeof_star_self, wuffs_version, options);
12389
  }
12390
12391
  inline wuffs_base__io_transformer*
12392
  upcast_as__wuffs_base__io_transformer() {
12393
    return (wuffs_base__io_transformer*)this;
12394
  }
12395
12396
  inline uint64_t
12397
  get_quirk(
12398
      uint32_t a_key) const {
12399
    return wuffs_lzw__decoder__get_quirk(this, a_key);
12400
  }
12401
12402
  inline wuffs_base__status
12403
  set_quirk(
12404
      uint32_t a_key,
12405
      uint64_t a_value) {
12406
    return wuffs_lzw__decoder__set_quirk(this, a_key, a_value);
12407
  }
12408
12409
  inline wuffs_base__optional_u63
12410
  dst_history_retain_length() const {
12411
    return wuffs_lzw__decoder__dst_history_retain_length(this);
12412
  }
12413
12414
  inline wuffs_base__range_ii_u64
12415
  workbuf_len() const {
12416
    return wuffs_lzw__decoder__workbuf_len(this);
12417
  }
12418
12419
  inline wuffs_base__status
12420
  transform_io(
12421
      wuffs_base__io_buffer* a_dst,
12422
      wuffs_base__io_buffer* a_src,
12423
      wuffs_base__slice_u8 a_workbuf) {
12424
    return wuffs_lzw__decoder__transform_io(this, a_dst, a_src, a_workbuf);
12425
  }
12426
12427
  inline wuffs_base__slice_u8
12428
  flush() {
12429
    return wuffs_lzw__decoder__flush(this);
12430
  }
12431
12432
#endif  // __cplusplus
12433
};  // struct wuffs_lzw__decoder__struct
12434
12435
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12436
12437
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW) || defined(WUFFS_NONMONOLITHIC)
12438
12439
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
12440
12441
// ---------------- Status Codes
12442
12443
extern const char wuffs_netpbm__error__bad_header[];
12444
extern const char wuffs_netpbm__error__truncated_input[];
12445
extern const char wuffs_netpbm__error__unsupported_netpbm_file[];
12446
12447
// ---------------- Public Consts
12448
12449
#define WUFFS_NETPBM__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12450
12451
// ---------------- Struct Declarations
12452
12453
typedef struct wuffs_netpbm__decoder__struct wuffs_netpbm__decoder;
12454
12455
#ifdef __cplusplus
12456
extern "C" {
12457
#endif
12458
12459
// ---------------- Public Initializer Prototypes
12460
12461
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12462
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12463
//
12464
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12465
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12466
12467
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12468
wuffs_netpbm__decoder__initialize(
12469
    wuffs_netpbm__decoder* self,
12470
    size_t sizeof_star_self,
12471
    uint64_t wuffs_version,
12472
    uint32_t options);
12473
12474
size_t
12475
sizeof__wuffs_netpbm__decoder(void);
12476
12477
// ---------------- Allocs
12478
12479
// These functions allocate and initialize Wuffs structs. They return NULL if
12480
// memory allocation fails. If they return non-NULL, there is no need to call
12481
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12482
// calling free on the returned pointer. That pointer is effectively a C++
12483
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12484
12485
wuffs_netpbm__decoder*
12486
wuffs_netpbm__decoder__alloc(void);
12487
12488
static inline wuffs_base__image_decoder*
12489
wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder(void) {
12490
  return (wuffs_base__image_decoder*)(wuffs_netpbm__decoder__alloc());
12491
}
12492
12493
// ---------------- Upcasts
12494
12495
static inline wuffs_base__image_decoder*
12496
wuffs_netpbm__decoder__upcast_as__wuffs_base__image_decoder(
12497
    wuffs_netpbm__decoder* p) {
12498
  return (wuffs_base__image_decoder*)p;
12499
}
12500
12501
// ---------------- Public Function Prototypes
12502
12503
WUFFS_BASE__GENERATED_C_CODE
12504
WUFFS_BASE__MAYBE_STATIC uint64_t
12505
wuffs_netpbm__decoder__get_quirk(
12506
    const wuffs_netpbm__decoder* self,
12507
    uint32_t a_key);
12508
12509
WUFFS_BASE__GENERATED_C_CODE
12510
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12511
wuffs_netpbm__decoder__set_quirk(
12512
    wuffs_netpbm__decoder* self,
12513
    uint32_t a_key,
12514
    uint64_t a_value);
12515
12516
WUFFS_BASE__GENERATED_C_CODE
12517
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12518
wuffs_netpbm__decoder__decode_image_config(
12519
    wuffs_netpbm__decoder* self,
12520
    wuffs_base__image_config* a_dst,
12521
    wuffs_base__io_buffer* a_src);
12522
12523
WUFFS_BASE__GENERATED_C_CODE
12524
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12525
wuffs_netpbm__decoder__decode_frame_config(
12526
    wuffs_netpbm__decoder* self,
12527
    wuffs_base__frame_config* a_dst,
12528
    wuffs_base__io_buffer* a_src);
12529
12530
WUFFS_BASE__GENERATED_C_CODE
12531
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12532
wuffs_netpbm__decoder__decode_frame(
12533
    wuffs_netpbm__decoder* self,
12534
    wuffs_base__pixel_buffer* a_dst,
12535
    wuffs_base__io_buffer* a_src,
12536
    wuffs_base__pixel_blend a_blend,
12537
    wuffs_base__slice_u8 a_workbuf,
12538
    wuffs_base__decode_frame_options* a_opts);
12539
12540
WUFFS_BASE__GENERATED_C_CODE
12541
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12542
wuffs_netpbm__decoder__frame_dirty_rect(
12543
    const wuffs_netpbm__decoder* self);
12544
12545
WUFFS_BASE__GENERATED_C_CODE
12546
WUFFS_BASE__MAYBE_STATIC uint32_t
12547
wuffs_netpbm__decoder__num_animation_loops(
12548
    const wuffs_netpbm__decoder* self);
12549
12550
WUFFS_BASE__GENERATED_C_CODE
12551
WUFFS_BASE__MAYBE_STATIC uint64_t
12552
wuffs_netpbm__decoder__num_decoded_frame_configs(
12553
    const wuffs_netpbm__decoder* self);
12554
12555
WUFFS_BASE__GENERATED_C_CODE
12556
WUFFS_BASE__MAYBE_STATIC uint64_t
12557
wuffs_netpbm__decoder__num_decoded_frames(
12558
    const wuffs_netpbm__decoder* self);
12559
12560
WUFFS_BASE__GENERATED_C_CODE
12561
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12562
wuffs_netpbm__decoder__restart_frame(
12563
    wuffs_netpbm__decoder* self,
12564
    uint64_t a_index,
12565
    uint64_t a_io_position);
12566
12567
WUFFS_BASE__GENERATED_C_CODE
12568
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12569
wuffs_netpbm__decoder__set_report_metadata(
12570
    wuffs_netpbm__decoder* self,
12571
    uint32_t a_fourcc,
12572
    bool a_report);
12573
12574
WUFFS_BASE__GENERATED_C_CODE
12575
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12576
wuffs_netpbm__decoder__tell_me_more(
12577
    wuffs_netpbm__decoder* self,
12578
    wuffs_base__io_buffer* a_dst,
12579
    wuffs_base__more_information* a_minfo,
12580
    wuffs_base__io_buffer* a_src);
12581
12582
WUFFS_BASE__GENERATED_C_CODE
12583
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12584
wuffs_netpbm__decoder__workbuf_len(
12585
    const wuffs_netpbm__decoder* self);
12586
12587
#ifdef __cplusplus
12588
}  // extern "C"
12589
#endif
12590
12591
// ---------------- Struct Definitions
12592
12593
// These structs' fields, and the sizeof them, are private implementation
12594
// details that aren't guaranteed to be stable across Wuffs versions.
12595
//
12596
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12597
12598
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12599
12600
struct wuffs_netpbm__decoder__struct {
12601
  // Do not access the private_impl's or private_data's fields directly. There
12602
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12603
  // the wuffs_foo__bar__baz functions.
12604
  //
12605
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12606
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12607
12608
  struct {
12609
    uint32_t magic;
12610
    uint32_t active_coroutine;
12611
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12612
    wuffs_base__vtable null_vtable;
12613
12614
    uint32_t f_pixfmt;
12615
    uint32_t f_width;
12616
    uint32_t f_height;
12617
    uint32_t f_max_value;
12618
    uint8_t f_call_sequence;
12619
    uint64_t f_frame_config_io_position;
12620
    uint32_t f_dst_x;
12621
    uint32_t f_dst_y;
12622
    wuffs_base__pixel_swizzler f_swizzler;
12623
12624
    uint32_t p_decode_image_config;
12625
    uint32_t p_do_decode_image_config;
12626
    uint32_t p_decode_frame_config;
12627
    uint32_t p_do_decode_frame_config;
12628
    uint32_t p_decode_frame;
12629
    uint32_t p_do_decode_frame;
12630
  } private_impl;
12631
12632
  struct {
12633
    uint8_t f_buffer[8];
12634
  } private_data;
12635
12636
#ifdef __cplusplus
12637
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12638
  using unique_ptr = std::unique_ptr<wuffs_netpbm__decoder, wuffs_unique_ptr_deleter>;
12639
12640
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12641
12642
  static inline unique_ptr
12643
  alloc() {
12644
    return unique_ptr(wuffs_netpbm__decoder__alloc());
12645
  }
12646
12647
  static inline wuffs_base__image_decoder::unique_ptr
12648
  alloc_as__wuffs_base__image_decoder() {
12649
    return wuffs_base__image_decoder::unique_ptr(
12650
        wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder());
12651
  }
12652
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12653
12654
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12655
  // Disallow constructing or copying an object via standard C++ mechanisms,
12656
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
12657
  // size and field layout is not part of the public, stable, memory-safe API.
12658
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
12659
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
12660
  // their first argument) rather than tweaking bar.private_impl.qux fields.
12661
  //
12662
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
12663
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
12664
  // order to provide convenience methods. These forward on "this", so that you
12665
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
12666
  wuffs_netpbm__decoder__struct() = delete;
12667
  wuffs_netpbm__decoder__struct(const wuffs_netpbm__decoder__struct&) = delete;
12668
  wuffs_netpbm__decoder__struct& operator=(
12669
      const wuffs_netpbm__decoder__struct&) = delete;
12670
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
12671
12672
#if !defined(WUFFS_IMPLEMENTATION)
12673
  // As above, the size of the struct is not part of the public API, and unless
12674
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
12675
  // allocated, not stack allocated. Its size is not intended to be known at
12676
  // compile time, but it is unfortunately divulged as a side effect of
12677
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
12678
  // instead of "sizeof T", invoking the operator. To make the two values
12679
  // different, so that passing the latter will be rejected by the initialize
12680
  // function, we add an arbitrary amount of dead weight.
12681
  uint8_t dead_weight[123000000];  // 123 MB.
12682
#endif  // !defined(WUFFS_IMPLEMENTATION)
12683
12684
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12685
  initialize(
12686
      size_t sizeof_star_self,
12687
      uint64_t wuffs_version,
12688
      uint32_t options) {
12689
    return wuffs_netpbm__decoder__initialize(
12690
        this, sizeof_star_self, wuffs_version, options);
12691
  }
12692
12693
  inline wuffs_base__image_decoder*
12694
  upcast_as__wuffs_base__image_decoder() {
12695
    return (wuffs_base__image_decoder*)this;
12696
  }
12697
12698
  inline uint64_t
12699
  get_quirk(
12700
      uint32_t a_key) const {
12701
    return wuffs_netpbm__decoder__get_quirk(this, a_key);
12702
  }
12703
12704
  inline wuffs_base__status
12705
  set_quirk(
12706
      uint32_t a_key,
12707
      uint64_t a_value) {
12708
    return wuffs_netpbm__decoder__set_quirk(this, a_key, a_value);
12709
  }
12710
12711
  inline wuffs_base__status
12712
  decode_image_config(
12713
      wuffs_base__image_config* a_dst,
12714
      wuffs_base__io_buffer* a_src) {
12715
    return wuffs_netpbm__decoder__decode_image_config(this, a_dst, a_src);
12716
  }
12717
12718
  inline wuffs_base__status
12719
  decode_frame_config(
12720
      wuffs_base__frame_config* a_dst,
12721
      wuffs_base__io_buffer* a_src) {
12722
    return wuffs_netpbm__decoder__decode_frame_config(this, a_dst, a_src);
12723
  }
12724
12725
  inline wuffs_base__status
12726
  decode_frame(
12727
      wuffs_base__pixel_buffer* a_dst,
12728
      wuffs_base__io_buffer* a_src,
12729
      wuffs_base__pixel_blend a_blend,
12730
      wuffs_base__slice_u8 a_workbuf,
12731
      wuffs_base__decode_frame_options* a_opts) {
12732
    return wuffs_netpbm__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
12733
  }
12734
12735
  inline wuffs_base__rect_ie_u32
12736
  frame_dirty_rect() const {
12737
    return wuffs_netpbm__decoder__frame_dirty_rect(this);
12738
  }
12739
12740
  inline uint32_t
12741
  num_animation_loops() const {
12742
    return wuffs_netpbm__decoder__num_animation_loops(this);
12743
  }
12744
12745
  inline uint64_t
12746
  num_decoded_frame_configs() const {
12747
    return wuffs_netpbm__decoder__num_decoded_frame_configs(this);
12748
  }
12749
12750
  inline uint64_t
12751
  num_decoded_frames() const {
12752
    return wuffs_netpbm__decoder__num_decoded_frames(this);
12753
  }
12754
12755
  inline wuffs_base__status
12756
  restart_frame(
12757
      uint64_t a_index,
12758
      uint64_t a_io_position) {
12759
    return wuffs_netpbm__decoder__restart_frame(this, a_index, a_io_position);
12760
  }
12761
12762
  inline wuffs_base__empty_struct
12763
  set_report_metadata(
12764
      uint32_t a_fourcc,
12765
      bool a_report) {
12766
    return wuffs_netpbm__decoder__set_report_metadata(this, a_fourcc, a_report);
12767
  }
12768
12769
  inline wuffs_base__status
12770
  tell_me_more(
12771
      wuffs_base__io_buffer* a_dst,
12772
      wuffs_base__more_information* a_minfo,
12773
      wuffs_base__io_buffer* a_src) {
12774
    return wuffs_netpbm__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
12775
  }
12776
12777
  inline wuffs_base__range_ii_u64
12778
  workbuf_len() const {
12779
    return wuffs_netpbm__decoder__workbuf_len(this);
12780
  }
12781
12782
#endif  // __cplusplus
12783
};  // struct wuffs_netpbm__decoder__struct
12784
12785
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12786
12787
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM) || defined(WUFFS_NONMONOLITHIC)
12788
12789
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
12790
12791
// ---------------- Status Codes
12792
12793
extern const char wuffs_nie__error__bad_header[];
12794
extern const char wuffs_nie__error__truncated_input[];
12795
extern const char wuffs_nie__error__unsupported_nie_file[];
12796
12797
// ---------------- Public Consts
12798
12799
#define WUFFS_NIE__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
12800
12801
// ---------------- Struct Declarations
12802
12803
typedef struct wuffs_nie__decoder__struct wuffs_nie__decoder;
12804
12805
#ifdef __cplusplus
12806
extern "C" {
12807
#endif
12808
12809
// ---------------- Public Initializer Prototypes
12810
12811
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
12812
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
12813
//
12814
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
12815
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
12816
12817
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
12818
wuffs_nie__decoder__initialize(
12819
    wuffs_nie__decoder* self,
12820
    size_t sizeof_star_self,
12821
    uint64_t wuffs_version,
12822
    uint32_t options);
12823
12824
size_t
12825
sizeof__wuffs_nie__decoder(void);
12826
12827
// ---------------- Allocs
12828
12829
// These functions allocate and initialize Wuffs structs. They return NULL if
12830
// memory allocation fails. If they return non-NULL, there is no need to call
12831
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
12832
// calling free on the returned pointer. That pointer is effectively a C++
12833
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
12834
12835
wuffs_nie__decoder*
12836
wuffs_nie__decoder__alloc(void);
12837
12838
static inline wuffs_base__image_decoder*
12839
wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder(void) {
12840
  return (wuffs_base__image_decoder*)(wuffs_nie__decoder__alloc());
12841
}
12842
12843
// ---------------- Upcasts
12844
12845
static inline wuffs_base__image_decoder*
12846
wuffs_nie__decoder__upcast_as__wuffs_base__image_decoder(
12847
    wuffs_nie__decoder* p) {
12848
  return (wuffs_base__image_decoder*)p;
12849
}
12850
12851
// ---------------- Public Function Prototypes
12852
12853
WUFFS_BASE__GENERATED_C_CODE
12854
WUFFS_BASE__MAYBE_STATIC uint64_t
12855
wuffs_nie__decoder__get_quirk(
12856
    const wuffs_nie__decoder* self,
12857
    uint32_t a_key);
12858
12859
WUFFS_BASE__GENERATED_C_CODE
12860
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12861
wuffs_nie__decoder__set_quirk(
12862
    wuffs_nie__decoder* self,
12863
    uint32_t a_key,
12864
    uint64_t a_value);
12865
12866
WUFFS_BASE__GENERATED_C_CODE
12867
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12868
wuffs_nie__decoder__decode_image_config(
12869
    wuffs_nie__decoder* self,
12870
    wuffs_base__image_config* a_dst,
12871
    wuffs_base__io_buffer* a_src);
12872
12873
WUFFS_BASE__GENERATED_C_CODE
12874
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12875
wuffs_nie__decoder__decode_frame_config(
12876
    wuffs_nie__decoder* self,
12877
    wuffs_base__frame_config* a_dst,
12878
    wuffs_base__io_buffer* a_src);
12879
12880
WUFFS_BASE__GENERATED_C_CODE
12881
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12882
wuffs_nie__decoder__decode_frame(
12883
    wuffs_nie__decoder* self,
12884
    wuffs_base__pixel_buffer* a_dst,
12885
    wuffs_base__io_buffer* a_src,
12886
    wuffs_base__pixel_blend a_blend,
12887
    wuffs_base__slice_u8 a_workbuf,
12888
    wuffs_base__decode_frame_options* a_opts);
12889
12890
WUFFS_BASE__GENERATED_C_CODE
12891
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
12892
wuffs_nie__decoder__frame_dirty_rect(
12893
    const wuffs_nie__decoder* self);
12894
12895
WUFFS_BASE__GENERATED_C_CODE
12896
WUFFS_BASE__MAYBE_STATIC uint32_t
12897
wuffs_nie__decoder__num_animation_loops(
12898
    const wuffs_nie__decoder* self);
12899
12900
WUFFS_BASE__GENERATED_C_CODE
12901
WUFFS_BASE__MAYBE_STATIC uint64_t
12902
wuffs_nie__decoder__num_decoded_frame_configs(
12903
    const wuffs_nie__decoder* self);
12904
12905
WUFFS_BASE__GENERATED_C_CODE
12906
WUFFS_BASE__MAYBE_STATIC uint64_t
12907
wuffs_nie__decoder__num_decoded_frames(
12908
    const wuffs_nie__decoder* self);
12909
12910
WUFFS_BASE__GENERATED_C_CODE
12911
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12912
wuffs_nie__decoder__restart_frame(
12913
    wuffs_nie__decoder* self,
12914
    uint64_t a_index,
12915
    uint64_t a_io_position);
12916
12917
WUFFS_BASE__GENERATED_C_CODE
12918
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
12919
wuffs_nie__decoder__set_report_metadata(
12920
    wuffs_nie__decoder* self,
12921
    uint32_t a_fourcc,
12922
    bool a_report);
12923
12924
WUFFS_BASE__GENERATED_C_CODE
12925
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
12926
wuffs_nie__decoder__tell_me_more(
12927
    wuffs_nie__decoder* self,
12928
    wuffs_base__io_buffer* a_dst,
12929
    wuffs_base__more_information* a_minfo,
12930
    wuffs_base__io_buffer* a_src);
12931
12932
WUFFS_BASE__GENERATED_C_CODE
12933
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
12934
wuffs_nie__decoder__workbuf_len(
12935
    const wuffs_nie__decoder* self);
12936
12937
#ifdef __cplusplus
12938
}  // extern "C"
12939
#endif
12940
12941
// ---------------- Struct Definitions
12942
12943
// These structs' fields, and the sizeof them, are private implementation
12944
// details that aren't guaranteed to be stable across Wuffs versions.
12945
//
12946
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
12947
12948
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
12949
12950
struct wuffs_nie__decoder__struct {
12951
  // Do not access the private_impl's or private_data's fields directly. There
12952
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
12953
  // the wuffs_foo__bar__baz functions.
12954
  //
12955
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
12956
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
12957
12958
  struct {
12959
    uint32_t magic;
12960
    uint32_t active_coroutine;
12961
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
12962
    wuffs_base__vtable null_vtable;
12963
12964
    uint32_t f_pixfmt;
12965
    uint32_t f_width;
12966
    uint32_t f_height;
12967
    uint8_t f_call_sequence;
12968
    uint32_t f_dst_x;
12969
    uint32_t f_dst_y;
12970
    wuffs_base__pixel_swizzler f_swizzler;
12971
12972
    uint32_t p_decode_image_config;
12973
    uint32_t p_do_decode_image_config;
12974
    uint32_t p_decode_frame_config;
12975
    uint32_t p_do_decode_frame_config;
12976
    uint32_t p_decode_frame;
12977
    uint32_t p_do_decode_frame;
12978
  } private_impl;
12979
12980
  struct {
12981
    struct {
12982
      uint64_t scratch;
12983
    } s_do_decode_image_config;
12984
  } private_data;
12985
12986
#ifdef __cplusplus
12987
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
12988
  using unique_ptr = std::unique_ptr<wuffs_nie__decoder, wuffs_unique_ptr_deleter>;
12989
12990
  // On failure, the alloc_etc functions return nullptr. They don't throw.
12991
12992
  static inline unique_ptr
12993
  alloc() {
12994
    return unique_ptr(wuffs_nie__decoder__alloc());
12995
  }
12996
12997
  static inline wuffs_base__image_decoder::unique_ptr
12998
  alloc_as__wuffs_base__image_decoder() {
12999
    return wuffs_base__image_decoder::unique_ptr(
13000
        wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder());
13001
  }
13002
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13003
13004
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13005
  // Disallow constructing or copying an object via standard C++ mechanisms,
13006
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13007
  // size and field layout is not part of the public, stable, memory-safe API.
13008
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13009
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13010
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13011
  //
13012
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13013
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13014
  // order to provide convenience methods. These forward on "this", so that you
13015
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13016
  wuffs_nie__decoder__struct() = delete;
13017
  wuffs_nie__decoder__struct(const wuffs_nie__decoder__struct&) = delete;
13018
  wuffs_nie__decoder__struct& operator=(
13019
      const wuffs_nie__decoder__struct&) = delete;
13020
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13021
13022
#if !defined(WUFFS_IMPLEMENTATION)
13023
  // As above, the size of the struct is not part of the public API, and unless
13024
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13025
  // allocated, not stack allocated. Its size is not intended to be known at
13026
  // compile time, but it is unfortunately divulged as a side effect of
13027
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13028
  // instead of "sizeof T", invoking the operator. To make the two values
13029
  // different, so that passing the latter will be rejected by the initialize
13030
  // function, we add an arbitrary amount of dead weight.
13031
  uint8_t dead_weight[123000000];  // 123 MB.
13032
#endif  // !defined(WUFFS_IMPLEMENTATION)
13033
13034
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13035
  initialize(
13036
      size_t sizeof_star_self,
13037
      uint64_t wuffs_version,
13038
      uint32_t options) {
13039
    return wuffs_nie__decoder__initialize(
13040
        this, sizeof_star_self, wuffs_version, options);
13041
  }
13042
13043
  inline wuffs_base__image_decoder*
13044
  upcast_as__wuffs_base__image_decoder() {
13045
    return (wuffs_base__image_decoder*)this;
13046
  }
13047
13048
  inline uint64_t
13049
  get_quirk(
13050
      uint32_t a_key) const {
13051
    return wuffs_nie__decoder__get_quirk(this, a_key);
13052
  }
13053
13054
  inline wuffs_base__status
13055
  set_quirk(
13056
      uint32_t a_key,
13057
      uint64_t a_value) {
13058
    return wuffs_nie__decoder__set_quirk(this, a_key, a_value);
13059
  }
13060
13061
  inline wuffs_base__status
13062
  decode_image_config(
13063
      wuffs_base__image_config* a_dst,
13064
      wuffs_base__io_buffer* a_src) {
13065
    return wuffs_nie__decoder__decode_image_config(this, a_dst, a_src);
13066
  }
13067
13068
  inline wuffs_base__status
13069
  decode_frame_config(
13070
      wuffs_base__frame_config* a_dst,
13071
      wuffs_base__io_buffer* a_src) {
13072
    return wuffs_nie__decoder__decode_frame_config(this, a_dst, a_src);
13073
  }
13074
13075
  inline wuffs_base__status
13076
  decode_frame(
13077
      wuffs_base__pixel_buffer* a_dst,
13078
      wuffs_base__io_buffer* a_src,
13079
      wuffs_base__pixel_blend a_blend,
13080
      wuffs_base__slice_u8 a_workbuf,
13081
      wuffs_base__decode_frame_options* a_opts) {
13082
    return wuffs_nie__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13083
  }
13084
13085
  inline wuffs_base__rect_ie_u32
13086
  frame_dirty_rect() const {
13087
    return wuffs_nie__decoder__frame_dirty_rect(this);
13088
  }
13089
13090
  inline uint32_t
13091
  num_animation_loops() const {
13092
    return wuffs_nie__decoder__num_animation_loops(this);
13093
  }
13094
13095
  inline uint64_t
13096
  num_decoded_frame_configs() const {
13097
    return wuffs_nie__decoder__num_decoded_frame_configs(this);
13098
  }
13099
13100
  inline uint64_t
13101
  num_decoded_frames() const {
13102
    return wuffs_nie__decoder__num_decoded_frames(this);
13103
  }
13104
13105
  inline wuffs_base__status
13106
  restart_frame(
13107
      uint64_t a_index,
13108
      uint64_t a_io_position) {
13109
    return wuffs_nie__decoder__restart_frame(this, a_index, a_io_position);
13110
  }
13111
13112
  inline wuffs_base__empty_struct
13113
  set_report_metadata(
13114
      uint32_t a_fourcc,
13115
      bool a_report) {
13116
    return wuffs_nie__decoder__set_report_metadata(this, a_fourcc, a_report);
13117
  }
13118
13119
  inline wuffs_base__status
13120
  tell_me_more(
13121
      wuffs_base__io_buffer* a_dst,
13122
      wuffs_base__more_information* a_minfo,
13123
      wuffs_base__io_buffer* a_src) {
13124
    return wuffs_nie__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13125
  }
13126
13127
  inline wuffs_base__range_ii_u64
13128
  workbuf_len() const {
13129
    return wuffs_nie__decoder__workbuf_len(this);
13130
  }
13131
13132
#endif  // __cplusplus
13133
};  // struct wuffs_nie__decoder__struct
13134
13135
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13136
13137
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE) || defined(WUFFS_NONMONOLITHIC)
13138
13139
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
13140
13141
// ---------------- Status Codes
13142
13143
extern const char wuffs_zlib__note__dictionary_required[];
13144
extern const char wuffs_zlib__error__bad_checksum[];
13145
extern const char wuffs_zlib__error__bad_compression_method[];
13146
extern const char wuffs_zlib__error__bad_compression_window_size[];
13147
extern const char wuffs_zlib__error__bad_parity_check[];
13148
extern const char wuffs_zlib__error__incorrect_dictionary[];
13149
extern const char wuffs_zlib__error__truncated_input[];
13150
13151
// ---------------- Public Consts
13152
13153
#define WUFFS_ZLIB__QUIRK_JUST_RAW_DEFLATE 2056083456u
13154
13155
#define WUFFS_ZLIB__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
13156
13157
#define WUFFS_ZLIB__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 1u
13158
13159
// ---------------- Struct Declarations
13160
13161
typedef struct wuffs_zlib__decoder__struct wuffs_zlib__decoder;
13162
13163
#ifdef __cplusplus
13164
extern "C" {
13165
#endif
13166
13167
// ---------------- Public Initializer Prototypes
13168
13169
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13170
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13171
//
13172
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13173
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13174
13175
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13176
wuffs_zlib__decoder__initialize(
13177
    wuffs_zlib__decoder* self,
13178
    size_t sizeof_star_self,
13179
    uint64_t wuffs_version,
13180
    uint32_t options);
13181
13182
size_t
13183
sizeof__wuffs_zlib__decoder(void);
13184
13185
// ---------------- Allocs
13186
13187
// These functions allocate and initialize Wuffs structs. They return NULL if
13188
// memory allocation fails. If they return non-NULL, there is no need to call
13189
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13190
// calling free on the returned pointer. That pointer is effectively a C++
13191
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13192
13193
wuffs_zlib__decoder*
13194
wuffs_zlib__decoder__alloc(void);
13195
13196
static inline wuffs_base__io_transformer*
13197
0
wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer(void) {
13198
0
  return (wuffs_base__io_transformer*)(wuffs_zlib__decoder__alloc());
13199
0
}
13200
13201
// ---------------- Upcasts
13202
13203
static inline wuffs_base__io_transformer*
13204
wuffs_zlib__decoder__upcast_as__wuffs_base__io_transformer(
13205
0
    wuffs_zlib__decoder* p) {
13206
0
  return (wuffs_base__io_transformer*)p;
13207
0
}
13208
13209
// ---------------- Public Function Prototypes
13210
13211
WUFFS_BASE__GENERATED_C_CODE
13212
WUFFS_BASE__MAYBE_STATIC uint32_t
13213
wuffs_zlib__decoder__dictionary_id(
13214
    const wuffs_zlib__decoder* self);
13215
13216
WUFFS_BASE__GENERATED_C_CODE
13217
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13218
wuffs_zlib__decoder__add_dictionary(
13219
    wuffs_zlib__decoder* self,
13220
    wuffs_base__slice_u8 a_dict);
13221
13222
WUFFS_BASE__GENERATED_C_CODE
13223
WUFFS_BASE__MAYBE_STATIC uint64_t
13224
wuffs_zlib__decoder__get_quirk(
13225
    const wuffs_zlib__decoder* self,
13226
    uint32_t a_key);
13227
13228
WUFFS_BASE__GENERATED_C_CODE
13229
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13230
wuffs_zlib__decoder__set_quirk(
13231
    wuffs_zlib__decoder* self,
13232
    uint32_t a_key,
13233
    uint64_t a_value);
13234
13235
WUFFS_BASE__GENERATED_C_CODE
13236
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
13237
wuffs_zlib__decoder__dst_history_retain_length(
13238
    const wuffs_zlib__decoder* self);
13239
13240
WUFFS_BASE__GENERATED_C_CODE
13241
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
13242
wuffs_zlib__decoder__workbuf_len(
13243
    const wuffs_zlib__decoder* self);
13244
13245
WUFFS_BASE__GENERATED_C_CODE
13246
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13247
wuffs_zlib__decoder__transform_io(
13248
    wuffs_zlib__decoder* self,
13249
    wuffs_base__io_buffer* a_dst,
13250
    wuffs_base__io_buffer* a_src,
13251
    wuffs_base__slice_u8 a_workbuf);
13252
13253
#ifdef __cplusplus
13254
}  // extern "C"
13255
#endif
13256
13257
// ---------------- Struct Definitions
13258
13259
// These structs' fields, and the sizeof them, are private implementation
13260
// details that aren't guaranteed to be stable across Wuffs versions.
13261
//
13262
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13263
13264
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13265
13266
struct wuffs_zlib__decoder__struct {
13267
  // Do not access the private_impl's or private_data's fields directly. There
13268
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13269
  // the wuffs_foo__bar__baz functions.
13270
  //
13271
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13272
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13273
13274
  struct {
13275
    uint32_t magic;
13276
    uint32_t active_coroutine;
13277
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
13278
    wuffs_base__vtable null_vtable;
13279
13280
    bool f_bad_call_sequence;
13281
    bool f_header_complete;
13282
    bool f_got_dictionary;
13283
    bool f_want_dictionary;
13284
    bool f_quirks[1];
13285
    bool f_ignore_checksum;
13286
    uint32_t f_dict_id_have;
13287
    uint32_t f_dict_id_want;
13288
13289
    uint32_t p_transform_io;
13290
    uint32_t p_do_transform_io;
13291
  } private_impl;
13292
13293
  struct {
13294
    wuffs_adler32__hasher f_checksum;
13295
    wuffs_adler32__hasher f_dict_id_hasher;
13296
    wuffs_deflate__decoder f_flate;
13297
13298
    struct {
13299
      uint32_t v_checksum_have;
13300
      uint64_t scratch;
13301
    } s_do_transform_io;
13302
  } private_data;
13303
13304
#ifdef __cplusplus
13305
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13306
  using unique_ptr = std::unique_ptr<wuffs_zlib__decoder, wuffs_unique_ptr_deleter>;
13307
13308
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13309
13310
  static inline unique_ptr
13311
  alloc() {
13312
    return unique_ptr(wuffs_zlib__decoder__alloc());
13313
  }
13314
13315
  static inline wuffs_base__io_transformer::unique_ptr
13316
  alloc_as__wuffs_base__io_transformer() {
13317
    return wuffs_base__io_transformer::unique_ptr(
13318
        wuffs_zlib__decoder__alloc_as__wuffs_base__io_transformer());
13319
  }
13320
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13321
13322
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13323
  // Disallow constructing or copying an object via standard C++ mechanisms,
13324
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13325
  // size and field layout is not part of the public, stable, memory-safe API.
13326
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13327
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13328
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13329
  //
13330
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13331
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13332
  // order to provide convenience methods. These forward on "this", so that you
13333
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13334
  wuffs_zlib__decoder__struct() = delete;
13335
  wuffs_zlib__decoder__struct(const wuffs_zlib__decoder__struct&) = delete;
13336
  wuffs_zlib__decoder__struct& operator=(
13337
      const wuffs_zlib__decoder__struct&) = delete;
13338
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13339
13340
#if !defined(WUFFS_IMPLEMENTATION)
13341
  // As above, the size of the struct is not part of the public API, and unless
13342
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13343
  // allocated, not stack allocated. Its size is not intended to be known at
13344
  // compile time, but it is unfortunately divulged as a side effect of
13345
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13346
  // instead of "sizeof T", invoking the operator. To make the two values
13347
  // different, so that passing the latter will be rejected by the initialize
13348
  // function, we add an arbitrary amount of dead weight.
13349
  uint8_t dead_weight[123000000];  // 123 MB.
13350
#endif  // !defined(WUFFS_IMPLEMENTATION)
13351
13352
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13353
  initialize(
13354
      size_t sizeof_star_self,
13355
      uint64_t wuffs_version,
13356
      uint32_t options) {
13357
    return wuffs_zlib__decoder__initialize(
13358
        this, sizeof_star_self, wuffs_version, options);
13359
  }
13360
13361
  inline wuffs_base__io_transformer*
13362
  upcast_as__wuffs_base__io_transformer() {
13363
    return (wuffs_base__io_transformer*)this;
13364
  }
13365
13366
  inline uint32_t
13367
  dictionary_id() const {
13368
    return wuffs_zlib__decoder__dictionary_id(this);
13369
  }
13370
13371
  inline wuffs_base__empty_struct
13372
  add_dictionary(
13373
      wuffs_base__slice_u8 a_dict) {
13374
    return wuffs_zlib__decoder__add_dictionary(this, a_dict);
13375
  }
13376
13377
  inline uint64_t
13378
  get_quirk(
13379
      uint32_t a_key) const {
13380
    return wuffs_zlib__decoder__get_quirk(this, a_key);
13381
  }
13382
13383
  inline wuffs_base__status
13384
  set_quirk(
13385
      uint32_t a_key,
13386
      uint64_t a_value) {
13387
    return wuffs_zlib__decoder__set_quirk(this, a_key, a_value);
13388
  }
13389
13390
  inline wuffs_base__optional_u63
13391
  dst_history_retain_length() const {
13392
    return wuffs_zlib__decoder__dst_history_retain_length(this);
13393
  }
13394
13395
  inline wuffs_base__range_ii_u64
13396
  workbuf_len() const {
13397
    return wuffs_zlib__decoder__workbuf_len(this);
13398
  }
13399
13400
  inline wuffs_base__status
13401
  transform_io(
13402
      wuffs_base__io_buffer* a_dst,
13403
      wuffs_base__io_buffer* a_src,
13404
      wuffs_base__slice_u8 a_workbuf) {
13405
    return wuffs_zlib__decoder__transform_io(this, a_dst, a_src, a_workbuf);
13406
  }
13407
13408
#endif  // __cplusplus
13409
};  // struct wuffs_zlib__decoder__struct
13410
13411
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13412
13413
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB) || defined(WUFFS_NONMONOLITHIC)
13414
13415
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
13416
13417
// ---------------- Status Codes
13418
13419
extern const char wuffs_png__error__bad_animation_sequence_number[];
13420
extern const char wuffs_png__error__bad_checksum[];
13421
extern const char wuffs_png__error__bad_chunk[];
13422
extern const char wuffs_png__error__bad_filter[];
13423
extern const char wuffs_png__error__bad_header[];
13424
extern const char wuffs_png__error__bad_text_chunk_not_latin_1[];
13425
extern const char wuffs_png__error__missing_palette[];
13426
extern const char wuffs_png__error__truncated_input[];
13427
extern const char wuffs_png__error__unsupported_cgbi_extension[];
13428
extern const char wuffs_png__error__unsupported_png_compression_method[];
13429
extern const char wuffs_png__error__unsupported_png_file[];
13430
13431
// ---------------- Public Consts
13432
13433
#define WUFFS_PNG__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 2251799562027015u
13434
13435
#define WUFFS_PNG__DECODER_SRC_IO_BUFFER_LENGTH_MIN_INCL 8u
13436
13437
// ---------------- Struct Declarations
13438
13439
typedef struct wuffs_png__decoder__struct wuffs_png__decoder;
13440
13441
#ifdef __cplusplus
13442
extern "C" {
13443
#endif
13444
13445
// ---------------- Public Initializer Prototypes
13446
13447
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13448
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13449
//
13450
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13451
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13452
13453
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13454
wuffs_png__decoder__initialize(
13455
    wuffs_png__decoder* self,
13456
    size_t sizeof_star_self,
13457
    uint64_t wuffs_version,
13458
    uint32_t options);
13459
13460
size_t
13461
sizeof__wuffs_png__decoder(void);
13462
13463
// ---------------- Allocs
13464
13465
// These functions allocate and initialize Wuffs structs. They return NULL if
13466
// memory allocation fails. If they return non-NULL, there is no need to call
13467
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13468
// calling free on the returned pointer. That pointer is effectively a C++
13469
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13470
13471
wuffs_png__decoder*
13472
wuffs_png__decoder__alloc(void);
13473
13474
static inline wuffs_base__image_decoder*
13475
0
wuffs_png__decoder__alloc_as__wuffs_base__image_decoder(void) {
13476
0
  return (wuffs_base__image_decoder*)(wuffs_png__decoder__alloc());
13477
0
}
13478
13479
// ---------------- Upcasts
13480
13481
static inline wuffs_base__image_decoder*
13482
wuffs_png__decoder__upcast_as__wuffs_base__image_decoder(
13483
5.56k
    wuffs_png__decoder* p) {
13484
5.56k
  return (wuffs_base__image_decoder*)p;
13485
5.56k
}
13486
13487
// ---------------- Public Function Prototypes
13488
13489
WUFFS_BASE__GENERATED_C_CODE
13490
WUFFS_BASE__MAYBE_STATIC uint64_t
13491
wuffs_png__decoder__get_quirk(
13492
    const wuffs_png__decoder* self,
13493
    uint32_t a_key);
13494
13495
WUFFS_BASE__GENERATED_C_CODE
13496
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13497
wuffs_png__decoder__set_quirk(
13498
    wuffs_png__decoder* self,
13499
    uint32_t a_key,
13500
    uint64_t a_value);
13501
13502
WUFFS_BASE__GENERATED_C_CODE
13503
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13504
wuffs_png__decoder__decode_image_config(
13505
    wuffs_png__decoder* self,
13506
    wuffs_base__image_config* a_dst,
13507
    wuffs_base__io_buffer* a_src);
13508
13509
WUFFS_BASE__GENERATED_C_CODE
13510
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13511
wuffs_png__decoder__decode_frame_config(
13512
    wuffs_png__decoder* self,
13513
    wuffs_base__frame_config* a_dst,
13514
    wuffs_base__io_buffer* a_src);
13515
13516
WUFFS_BASE__GENERATED_C_CODE
13517
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13518
wuffs_png__decoder__decode_frame(
13519
    wuffs_png__decoder* self,
13520
    wuffs_base__pixel_buffer* a_dst,
13521
    wuffs_base__io_buffer* a_src,
13522
    wuffs_base__pixel_blend a_blend,
13523
    wuffs_base__slice_u8 a_workbuf,
13524
    wuffs_base__decode_frame_options* a_opts);
13525
13526
WUFFS_BASE__GENERATED_C_CODE
13527
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
13528
wuffs_png__decoder__frame_dirty_rect(
13529
    const wuffs_png__decoder* self);
13530
13531
WUFFS_BASE__GENERATED_C_CODE
13532
WUFFS_BASE__MAYBE_STATIC uint32_t
13533
wuffs_png__decoder__num_animation_loops(
13534
    const wuffs_png__decoder* self);
13535
13536
WUFFS_BASE__GENERATED_C_CODE
13537
WUFFS_BASE__MAYBE_STATIC uint64_t
13538
wuffs_png__decoder__num_decoded_frame_configs(
13539
    const wuffs_png__decoder* self);
13540
13541
WUFFS_BASE__GENERATED_C_CODE
13542
WUFFS_BASE__MAYBE_STATIC uint64_t
13543
wuffs_png__decoder__num_decoded_frames(
13544
    const wuffs_png__decoder* self);
13545
13546
WUFFS_BASE__GENERATED_C_CODE
13547
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13548
wuffs_png__decoder__restart_frame(
13549
    wuffs_png__decoder* self,
13550
    uint64_t a_index,
13551
    uint64_t a_io_position);
13552
13553
WUFFS_BASE__GENERATED_C_CODE
13554
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
13555
wuffs_png__decoder__set_report_metadata(
13556
    wuffs_png__decoder* self,
13557
    uint32_t a_fourcc,
13558
    bool a_report);
13559
13560
WUFFS_BASE__GENERATED_C_CODE
13561
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13562
wuffs_png__decoder__tell_me_more(
13563
    wuffs_png__decoder* self,
13564
    wuffs_base__io_buffer* a_dst,
13565
    wuffs_base__more_information* a_minfo,
13566
    wuffs_base__io_buffer* a_src);
13567
13568
WUFFS_BASE__GENERATED_C_CODE
13569
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
13570
wuffs_png__decoder__workbuf_len(
13571
    const wuffs_png__decoder* self);
13572
13573
#ifdef __cplusplus
13574
}  // extern "C"
13575
#endif
13576
13577
// ---------------- Struct Definitions
13578
13579
// These structs' fields, and the sizeof them, are private implementation
13580
// details that aren't guaranteed to be stable across Wuffs versions.
13581
//
13582
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
13583
13584
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13585
13586
struct wuffs_png__decoder__struct {
13587
  // Do not access the private_impl's or private_data's fields directly. There
13588
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
13589
  // the wuffs_foo__bar__baz functions.
13590
  //
13591
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
13592
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
13593
13594
  struct {
13595
    uint32_t magic;
13596
    uint32_t active_coroutine;
13597
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
13598
    wuffs_base__vtable null_vtable;
13599
13600
    uint32_t f_width;
13601
    uint32_t f_height;
13602
    uint64_t f_pass_bytes_per_row;
13603
    uint64_t f_workbuf_wi;
13604
    uint64_t f_workbuf_hist_pos_base;
13605
    uint64_t f_overall_workbuf_length;
13606
    uint64_t f_pass_workbuf_length;
13607
    uint8_t f_call_sequence;
13608
    bool f_report_metadata_chrm;
13609
    bool f_report_metadata_exif;
13610
    bool f_report_metadata_gama;
13611
    bool f_report_metadata_iccp;
13612
    bool f_report_metadata_kvp;
13613
    bool f_report_metadata_srgb;
13614
    bool f_ignore_checksum;
13615
    uint8_t f_depth;
13616
    uint8_t f_color_type;
13617
    uint8_t f_filter_distance;
13618
    uint8_t f_interlace_pass;
13619
    bool f_seen_actl;
13620
    bool f_seen_chrm;
13621
    bool f_seen_fctl;
13622
    bool f_seen_exif;
13623
    bool f_seen_gama;
13624
    bool f_seen_iccp;
13625
    bool f_seen_idat;
13626
    bool f_seen_ihdr;
13627
    bool f_seen_plte;
13628
    bool f_seen_srgb;
13629
    bool f_seen_trns;
13630
    bool f_metadata_is_zlib_compressed;
13631
    bool f_zlib_is_dirty;
13632
    uint32_t f_chunk_type;
13633
    uint8_t f_chunk_type_array[4];
13634
    uint32_t f_chunk_length;
13635
    uint64_t f_remap_transparency;
13636
    uint32_t f_dst_pixfmt;
13637
    uint32_t f_src_pixfmt;
13638
    uint32_t f_num_animation_frames_value;
13639
    uint32_t f_num_animation_loops_value;
13640
    uint32_t f_num_decoded_frame_configs_value;
13641
    uint32_t f_num_decoded_frames_value;
13642
    uint32_t f_frame_rect_x0;
13643
    uint32_t f_frame_rect_y0;
13644
    uint32_t f_frame_rect_x1;
13645
    uint32_t f_frame_rect_y1;
13646
    uint32_t f_first_rect_x0;
13647
    uint32_t f_first_rect_y0;
13648
    uint32_t f_first_rect_x1;
13649
    uint32_t f_first_rect_y1;
13650
    uint64_t f_frame_config_io_position;
13651
    uint64_t f_first_config_io_position;
13652
    uint64_t f_frame_duration;
13653
    uint64_t f_first_duration;
13654
    uint8_t f_frame_disposal;
13655
    uint8_t f_first_disposal;
13656
    bool f_frame_overwrite_instead_of_blend;
13657
    bool f_first_overwrite_instead_of_blend;
13658
    uint32_t f_next_animation_seq_num;
13659
    uint32_t f_metadata_flavor;
13660
    uint32_t f_metadata_fourcc;
13661
    uint64_t f_metadata_x;
13662
    uint64_t f_metadata_y;
13663
    uint64_t f_metadata_z;
13664
    uint32_t f_ztxt_ri;
13665
    uint32_t f_ztxt_wi;
13666
    uint64_t f_ztxt_hist_pos;
13667
    wuffs_base__pixel_swizzler f_swizzler;
13668
13669
    wuffs_base__empty_struct (*choosy_filter_1)(
13670
        wuffs_png__decoder* self,
13671
        wuffs_base__slice_u8 a_curr);
13672
    wuffs_base__empty_struct (*choosy_filter_3)(
13673
        wuffs_png__decoder* self,
13674
        wuffs_base__slice_u8 a_curr,
13675
        wuffs_base__slice_u8 a_prev);
13676
    wuffs_base__empty_struct (*choosy_filter_4)(
13677
        wuffs_png__decoder* self,
13678
        wuffs_base__slice_u8 a_curr,
13679
        wuffs_base__slice_u8 a_prev);
13680
    uint32_t p_decode_image_config;
13681
    uint32_t p_do_decode_image_config;
13682
    uint32_t p_decode_ihdr;
13683
    uint32_t p_decode_other_chunk;
13684
    uint32_t p_decode_actl;
13685
    uint32_t p_decode_chrm;
13686
    uint32_t p_decode_fctl;
13687
    uint32_t p_decode_gama;
13688
    uint32_t p_decode_iccp;
13689
    uint32_t p_decode_plte;
13690
    uint32_t p_decode_srgb;
13691
    uint32_t p_decode_trns;
13692
    uint32_t p_decode_frame_config;
13693
    uint32_t p_do_decode_frame_config;
13694
    uint32_t p_skip_frame;
13695
    uint32_t p_decode_frame;
13696
    uint32_t p_do_decode_frame;
13697
    uint32_t p_decode_pass;
13698
    uint32_t p_tell_me_more;
13699
    uint32_t p_do_tell_me_more;
13700
    wuffs_base__status (*choosy_filter_and_swizzle)(
13701
        wuffs_png__decoder* self,
13702
        wuffs_base__pixel_buffer* a_dst,
13703
        wuffs_base__slice_u8 a_workbuf);
13704
  } private_impl;
13705
13706
  struct {
13707
    wuffs_crc32__ieee_hasher f_crc32;
13708
    wuffs_zlib__decoder f_zlib;
13709
    uint8_t f_dst_palette[1024];
13710
    uint8_t f_src_palette[1024];
13711
13712
    struct {
13713
      uint32_t v_checksum_have;
13714
      uint64_t scratch;
13715
    } s_do_decode_image_config;
13716
    struct {
13717
      uint64_t scratch;
13718
    } s_decode_ihdr;
13719
    struct {
13720
      uint64_t scratch;
13721
    } s_decode_other_chunk;
13722
    struct {
13723
      uint64_t scratch;
13724
    } s_decode_actl;
13725
    struct {
13726
      uint64_t scratch;
13727
    } s_decode_chrm;
13728
    struct {
13729
      uint32_t v_x0;
13730
      uint32_t v_x1;
13731
      uint32_t v_y1;
13732
      uint64_t scratch;
13733
    } s_decode_fctl;
13734
    struct {
13735
      uint64_t scratch;
13736
    } s_decode_gama;
13737
    struct {
13738
      uint32_t v_num_entries;
13739
      uint32_t v_i;
13740
      uint64_t scratch;
13741
    } s_decode_plte;
13742
    struct {
13743
      uint32_t v_i;
13744
      uint32_t v_n;
13745
      uint64_t scratch;
13746
    } s_decode_trns;
13747
    struct {
13748
      uint64_t scratch;
13749
    } s_do_decode_frame_config;
13750
    struct {
13751
      uint64_t scratch;
13752
    } s_skip_frame;
13753
    struct {
13754
      uint64_t scratch;
13755
    } s_do_decode_frame;
13756
    struct {
13757
      uint64_t scratch;
13758
    } s_decode_pass;
13759
    struct {
13760
      wuffs_base__status v_zlib_status;
13761
      uint64_t scratch;
13762
    } s_do_tell_me_more;
13763
  } private_data;
13764
13765
#ifdef __cplusplus
13766
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13767
  using unique_ptr = std::unique_ptr<wuffs_png__decoder, wuffs_unique_ptr_deleter>;
13768
13769
  // On failure, the alloc_etc functions return nullptr. They don't throw.
13770
13771
  static inline unique_ptr
13772
  alloc() {
13773
    return unique_ptr(wuffs_png__decoder__alloc());
13774
  }
13775
13776
  static inline wuffs_base__image_decoder::unique_ptr
13777
  alloc_as__wuffs_base__image_decoder() {
13778
    return wuffs_base__image_decoder::unique_ptr(
13779
        wuffs_png__decoder__alloc_as__wuffs_base__image_decoder());
13780
  }
13781
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
13782
13783
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13784
  // Disallow constructing or copying an object via standard C++ mechanisms,
13785
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
13786
  // size and field layout is not part of the public, stable, memory-safe API.
13787
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
13788
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
13789
  // their first argument) rather than tweaking bar.private_impl.qux fields.
13790
  //
13791
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
13792
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
13793
  // order to provide convenience methods. These forward on "this", so that you
13794
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
13795
  wuffs_png__decoder__struct() = delete;
13796
  wuffs_png__decoder__struct(const wuffs_png__decoder__struct&) = delete;
13797
  wuffs_png__decoder__struct& operator=(
13798
      const wuffs_png__decoder__struct&) = delete;
13799
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
13800
13801
#if !defined(WUFFS_IMPLEMENTATION)
13802
  // As above, the size of the struct is not part of the public API, and unless
13803
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
13804
  // allocated, not stack allocated. Its size is not intended to be known at
13805
  // compile time, but it is unfortunately divulged as a side effect of
13806
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
13807
  // instead of "sizeof T", invoking the operator. To make the two values
13808
  // different, so that passing the latter will be rejected by the initialize
13809
  // function, we add an arbitrary amount of dead weight.
13810
  uint8_t dead_weight[123000000];  // 123 MB.
13811
#endif  // !defined(WUFFS_IMPLEMENTATION)
13812
13813
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13814
  initialize(
13815
      size_t sizeof_star_self,
13816
      uint64_t wuffs_version,
13817
      uint32_t options) {
13818
    return wuffs_png__decoder__initialize(
13819
        this, sizeof_star_self, wuffs_version, options);
13820
  }
13821
13822
  inline wuffs_base__image_decoder*
13823
  upcast_as__wuffs_base__image_decoder() {
13824
    return (wuffs_base__image_decoder*)this;
13825
  }
13826
13827
  inline uint64_t
13828
  get_quirk(
13829
      uint32_t a_key) const {
13830
    return wuffs_png__decoder__get_quirk(this, a_key);
13831
  }
13832
13833
  inline wuffs_base__status
13834
  set_quirk(
13835
      uint32_t a_key,
13836
      uint64_t a_value) {
13837
    return wuffs_png__decoder__set_quirk(this, a_key, a_value);
13838
  }
13839
13840
  inline wuffs_base__status
13841
  decode_image_config(
13842
      wuffs_base__image_config* a_dst,
13843
      wuffs_base__io_buffer* a_src) {
13844
    return wuffs_png__decoder__decode_image_config(this, a_dst, a_src);
13845
  }
13846
13847
  inline wuffs_base__status
13848
  decode_frame_config(
13849
      wuffs_base__frame_config* a_dst,
13850
      wuffs_base__io_buffer* a_src) {
13851
    return wuffs_png__decoder__decode_frame_config(this, a_dst, a_src);
13852
  }
13853
13854
  inline wuffs_base__status
13855
  decode_frame(
13856
      wuffs_base__pixel_buffer* a_dst,
13857
      wuffs_base__io_buffer* a_src,
13858
      wuffs_base__pixel_blend a_blend,
13859
      wuffs_base__slice_u8 a_workbuf,
13860
      wuffs_base__decode_frame_options* a_opts) {
13861
    return wuffs_png__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
13862
  }
13863
13864
  inline wuffs_base__rect_ie_u32
13865
  frame_dirty_rect() const {
13866
    return wuffs_png__decoder__frame_dirty_rect(this);
13867
  }
13868
13869
  inline uint32_t
13870
  num_animation_loops() const {
13871
    return wuffs_png__decoder__num_animation_loops(this);
13872
  }
13873
13874
  inline uint64_t
13875
  num_decoded_frame_configs() const {
13876
    return wuffs_png__decoder__num_decoded_frame_configs(this);
13877
  }
13878
13879
  inline uint64_t
13880
  num_decoded_frames() const {
13881
    return wuffs_png__decoder__num_decoded_frames(this);
13882
  }
13883
13884
  inline wuffs_base__status
13885
  restart_frame(
13886
      uint64_t a_index,
13887
      uint64_t a_io_position) {
13888
    return wuffs_png__decoder__restart_frame(this, a_index, a_io_position);
13889
  }
13890
13891
  inline wuffs_base__empty_struct
13892
  set_report_metadata(
13893
      uint32_t a_fourcc,
13894
      bool a_report) {
13895
    return wuffs_png__decoder__set_report_metadata(this, a_fourcc, a_report);
13896
  }
13897
13898
  inline wuffs_base__status
13899
  tell_me_more(
13900
      wuffs_base__io_buffer* a_dst,
13901
      wuffs_base__more_information* a_minfo,
13902
      wuffs_base__io_buffer* a_src) {
13903
    return wuffs_png__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
13904
  }
13905
13906
  inline wuffs_base__range_ii_u64
13907
  workbuf_len() const {
13908
    return wuffs_png__decoder__workbuf_len(this);
13909
  }
13910
13911
#endif  // __cplusplus
13912
};  // struct wuffs_png__decoder__struct
13913
13914
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
13915
13916
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG) || defined(WUFFS_NONMONOLITHIC)
13917
13918
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
13919
13920
// ---------------- Status Codes
13921
13922
extern const char wuffs_qoi__error__bad_footer[];
13923
extern const char wuffs_qoi__error__bad_header[];
13924
extern const char wuffs_qoi__error__truncated_input[];
13925
13926
// ---------------- Public Consts
13927
13928
#define WUFFS_QOI__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
13929
13930
// ---------------- Struct Declarations
13931
13932
typedef struct wuffs_qoi__decoder__struct wuffs_qoi__decoder;
13933
13934
#ifdef __cplusplus
13935
extern "C" {
13936
#endif
13937
13938
// ---------------- Public Initializer Prototypes
13939
13940
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
13941
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
13942
//
13943
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
13944
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
13945
13946
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
13947
wuffs_qoi__decoder__initialize(
13948
    wuffs_qoi__decoder* self,
13949
    size_t sizeof_star_self,
13950
    uint64_t wuffs_version,
13951
    uint32_t options);
13952
13953
size_t
13954
sizeof__wuffs_qoi__decoder(void);
13955
13956
// ---------------- Allocs
13957
13958
// These functions allocate and initialize Wuffs structs. They return NULL if
13959
// memory allocation fails. If they return non-NULL, there is no need to call
13960
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
13961
// calling free on the returned pointer. That pointer is effectively a C++
13962
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
13963
13964
wuffs_qoi__decoder*
13965
wuffs_qoi__decoder__alloc(void);
13966
13967
static inline wuffs_base__image_decoder*
13968
wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder(void) {
13969
  return (wuffs_base__image_decoder*)(wuffs_qoi__decoder__alloc());
13970
}
13971
13972
// ---------------- Upcasts
13973
13974
static inline wuffs_base__image_decoder*
13975
wuffs_qoi__decoder__upcast_as__wuffs_base__image_decoder(
13976
    wuffs_qoi__decoder* p) {
13977
  return (wuffs_base__image_decoder*)p;
13978
}
13979
13980
// ---------------- Public Function Prototypes
13981
13982
WUFFS_BASE__GENERATED_C_CODE
13983
WUFFS_BASE__MAYBE_STATIC uint64_t
13984
wuffs_qoi__decoder__get_quirk(
13985
    const wuffs_qoi__decoder* self,
13986
    uint32_t a_key);
13987
13988
WUFFS_BASE__GENERATED_C_CODE
13989
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13990
wuffs_qoi__decoder__set_quirk(
13991
    wuffs_qoi__decoder* self,
13992
    uint32_t a_key,
13993
    uint64_t a_value);
13994
13995
WUFFS_BASE__GENERATED_C_CODE
13996
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
13997
wuffs_qoi__decoder__decode_image_config(
13998
    wuffs_qoi__decoder* self,
13999
    wuffs_base__image_config* a_dst,
14000
    wuffs_base__io_buffer* a_src);
14001
14002
WUFFS_BASE__GENERATED_C_CODE
14003
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14004
wuffs_qoi__decoder__decode_frame_config(
14005
    wuffs_qoi__decoder* self,
14006
    wuffs_base__frame_config* a_dst,
14007
    wuffs_base__io_buffer* a_src);
14008
14009
WUFFS_BASE__GENERATED_C_CODE
14010
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14011
wuffs_qoi__decoder__decode_frame(
14012
    wuffs_qoi__decoder* self,
14013
    wuffs_base__pixel_buffer* a_dst,
14014
    wuffs_base__io_buffer* a_src,
14015
    wuffs_base__pixel_blend a_blend,
14016
    wuffs_base__slice_u8 a_workbuf,
14017
    wuffs_base__decode_frame_options* a_opts);
14018
14019
WUFFS_BASE__GENERATED_C_CODE
14020
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14021
wuffs_qoi__decoder__frame_dirty_rect(
14022
    const wuffs_qoi__decoder* self);
14023
14024
WUFFS_BASE__GENERATED_C_CODE
14025
WUFFS_BASE__MAYBE_STATIC uint32_t
14026
wuffs_qoi__decoder__num_animation_loops(
14027
    const wuffs_qoi__decoder* self);
14028
14029
WUFFS_BASE__GENERATED_C_CODE
14030
WUFFS_BASE__MAYBE_STATIC uint64_t
14031
wuffs_qoi__decoder__num_decoded_frame_configs(
14032
    const wuffs_qoi__decoder* self);
14033
14034
WUFFS_BASE__GENERATED_C_CODE
14035
WUFFS_BASE__MAYBE_STATIC uint64_t
14036
wuffs_qoi__decoder__num_decoded_frames(
14037
    const wuffs_qoi__decoder* self);
14038
14039
WUFFS_BASE__GENERATED_C_CODE
14040
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14041
wuffs_qoi__decoder__restart_frame(
14042
    wuffs_qoi__decoder* self,
14043
    uint64_t a_index,
14044
    uint64_t a_io_position);
14045
14046
WUFFS_BASE__GENERATED_C_CODE
14047
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14048
wuffs_qoi__decoder__set_report_metadata(
14049
    wuffs_qoi__decoder* self,
14050
    uint32_t a_fourcc,
14051
    bool a_report);
14052
14053
WUFFS_BASE__GENERATED_C_CODE
14054
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14055
wuffs_qoi__decoder__tell_me_more(
14056
    wuffs_qoi__decoder* self,
14057
    wuffs_base__io_buffer* a_dst,
14058
    wuffs_base__more_information* a_minfo,
14059
    wuffs_base__io_buffer* a_src);
14060
14061
WUFFS_BASE__GENERATED_C_CODE
14062
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14063
wuffs_qoi__decoder__workbuf_len(
14064
    const wuffs_qoi__decoder* self);
14065
14066
#ifdef __cplusplus
14067
}  // extern "C"
14068
#endif
14069
14070
// ---------------- Struct Definitions
14071
14072
// These structs' fields, and the sizeof them, are private implementation
14073
// details that aren't guaranteed to be stable across Wuffs versions.
14074
//
14075
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14076
14077
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14078
14079
struct wuffs_qoi__decoder__struct {
14080
  // Do not access the private_impl's or private_data's fields directly. There
14081
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14082
  // the wuffs_foo__bar__baz functions.
14083
  //
14084
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14085
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14086
14087
  struct {
14088
    uint32_t magic;
14089
    uint32_t active_coroutine;
14090
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14091
    wuffs_base__vtable null_vtable;
14092
14093
    uint32_t f_pixfmt;
14094
    uint32_t f_width;
14095
    uint32_t f_height;
14096
    uint64_t f_remaining_pixels_times_4;
14097
    uint8_t f_call_sequence;
14098
    uint32_t f_buffer_index;
14099
    uint32_t f_dst_x;
14100
    uint32_t f_dst_y;
14101
    wuffs_base__pixel_swizzler f_swizzler;
14102
14103
    uint32_t p_decode_image_config;
14104
    uint32_t p_do_decode_image_config;
14105
    uint32_t p_decode_frame_config;
14106
    uint32_t p_do_decode_frame_config;
14107
    uint32_t p_decode_frame;
14108
    uint32_t p_do_decode_frame;
14109
    uint32_t p_from_src_to_buffer;
14110
  } private_impl;
14111
14112
  struct {
14113
    uint8_t f_pixel[4];
14114
    uint8_t f_cache[256];
14115
    uint8_t f_buffer[8196];
14116
14117
    struct {
14118
      uint64_t scratch;
14119
    } s_do_decode_image_config;
14120
    struct {
14121
      uint64_t scratch;
14122
    } s_do_decode_frame;
14123
    struct {
14124
      uint8_t v_dg;
14125
      uint32_t v_bi;
14126
      uint32_t v_bk;
14127
    } s_from_src_to_buffer;
14128
  } private_data;
14129
14130
#ifdef __cplusplus
14131
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14132
  using unique_ptr = std::unique_ptr<wuffs_qoi__decoder, wuffs_unique_ptr_deleter>;
14133
14134
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14135
14136
  static inline unique_ptr
14137
  alloc() {
14138
    return unique_ptr(wuffs_qoi__decoder__alloc());
14139
  }
14140
14141
  static inline wuffs_base__image_decoder::unique_ptr
14142
  alloc_as__wuffs_base__image_decoder() {
14143
    return wuffs_base__image_decoder::unique_ptr(
14144
        wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder());
14145
  }
14146
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14147
14148
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14149
  // Disallow constructing or copying an object via standard C++ mechanisms,
14150
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14151
  // size and field layout is not part of the public, stable, memory-safe API.
14152
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14153
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14154
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14155
  //
14156
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14157
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14158
  // order to provide convenience methods. These forward on "this", so that you
14159
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14160
  wuffs_qoi__decoder__struct() = delete;
14161
  wuffs_qoi__decoder__struct(const wuffs_qoi__decoder__struct&) = delete;
14162
  wuffs_qoi__decoder__struct& operator=(
14163
      const wuffs_qoi__decoder__struct&) = delete;
14164
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14165
14166
#if !defined(WUFFS_IMPLEMENTATION)
14167
  // As above, the size of the struct is not part of the public API, and unless
14168
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14169
  // allocated, not stack allocated. Its size is not intended to be known at
14170
  // compile time, but it is unfortunately divulged as a side effect of
14171
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14172
  // instead of "sizeof T", invoking the operator. To make the two values
14173
  // different, so that passing the latter will be rejected by the initialize
14174
  // function, we add an arbitrary amount of dead weight.
14175
  uint8_t dead_weight[123000000];  // 123 MB.
14176
#endif  // !defined(WUFFS_IMPLEMENTATION)
14177
14178
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14179
  initialize(
14180
      size_t sizeof_star_self,
14181
      uint64_t wuffs_version,
14182
      uint32_t options) {
14183
    return wuffs_qoi__decoder__initialize(
14184
        this, sizeof_star_self, wuffs_version, options);
14185
  }
14186
14187
  inline wuffs_base__image_decoder*
14188
  upcast_as__wuffs_base__image_decoder() {
14189
    return (wuffs_base__image_decoder*)this;
14190
  }
14191
14192
  inline uint64_t
14193
  get_quirk(
14194
      uint32_t a_key) const {
14195
    return wuffs_qoi__decoder__get_quirk(this, a_key);
14196
  }
14197
14198
  inline wuffs_base__status
14199
  set_quirk(
14200
      uint32_t a_key,
14201
      uint64_t a_value) {
14202
    return wuffs_qoi__decoder__set_quirk(this, a_key, a_value);
14203
  }
14204
14205
  inline wuffs_base__status
14206
  decode_image_config(
14207
      wuffs_base__image_config* a_dst,
14208
      wuffs_base__io_buffer* a_src) {
14209
    return wuffs_qoi__decoder__decode_image_config(this, a_dst, a_src);
14210
  }
14211
14212
  inline wuffs_base__status
14213
  decode_frame_config(
14214
      wuffs_base__frame_config* a_dst,
14215
      wuffs_base__io_buffer* a_src) {
14216
    return wuffs_qoi__decoder__decode_frame_config(this, a_dst, a_src);
14217
  }
14218
14219
  inline wuffs_base__status
14220
  decode_frame(
14221
      wuffs_base__pixel_buffer* a_dst,
14222
      wuffs_base__io_buffer* a_src,
14223
      wuffs_base__pixel_blend a_blend,
14224
      wuffs_base__slice_u8 a_workbuf,
14225
      wuffs_base__decode_frame_options* a_opts) {
14226
    return wuffs_qoi__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14227
  }
14228
14229
  inline wuffs_base__rect_ie_u32
14230
  frame_dirty_rect() const {
14231
    return wuffs_qoi__decoder__frame_dirty_rect(this);
14232
  }
14233
14234
  inline uint32_t
14235
  num_animation_loops() const {
14236
    return wuffs_qoi__decoder__num_animation_loops(this);
14237
  }
14238
14239
  inline uint64_t
14240
  num_decoded_frame_configs() const {
14241
    return wuffs_qoi__decoder__num_decoded_frame_configs(this);
14242
  }
14243
14244
  inline uint64_t
14245
  num_decoded_frames() const {
14246
    return wuffs_qoi__decoder__num_decoded_frames(this);
14247
  }
14248
14249
  inline wuffs_base__status
14250
  restart_frame(
14251
      uint64_t a_index,
14252
      uint64_t a_io_position) {
14253
    return wuffs_qoi__decoder__restart_frame(this, a_index, a_io_position);
14254
  }
14255
14256
  inline wuffs_base__empty_struct
14257
  set_report_metadata(
14258
      uint32_t a_fourcc,
14259
      bool a_report) {
14260
    return wuffs_qoi__decoder__set_report_metadata(this, a_fourcc, a_report);
14261
  }
14262
14263
  inline wuffs_base__status
14264
  tell_me_more(
14265
      wuffs_base__io_buffer* a_dst,
14266
      wuffs_base__more_information* a_minfo,
14267
      wuffs_base__io_buffer* a_src) {
14268
    return wuffs_qoi__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14269
  }
14270
14271
  inline wuffs_base__range_ii_u64
14272
  workbuf_len() const {
14273
    return wuffs_qoi__decoder__workbuf_len(this);
14274
  }
14275
14276
#endif  // __cplusplus
14277
};  // struct wuffs_qoi__decoder__struct
14278
14279
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14280
14281
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI) || defined(WUFFS_NONMONOLITHIC)
14282
14283
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
14284
14285
// ---------------- Status Codes
14286
14287
// ---------------- Public Consts
14288
14289
// ---------------- Struct Declarations
14290
14291
typedef struct wuffs_sha256__hasher__struct wuffs_sha256__hasher;
14292
14293
#ifdef __cplusplus
14294
extern "C" {
14295
#endif
14296
14297
// ---------------- Public Initializer Prototypes
14298
14299
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14300
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14301
//
14302
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14303
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14304
14305
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14306
wuffs_sha256__hasher__initialize(
14307
    wuffs_sha256__hasher* self,
14308
    size_t sizeof_star_self,
14309
    uint64_t wuffs_version,
14310
    uint32_t options);
14311
14312
size_t
14313
sizeof__wuffs_sha256__hasher(void);
14314
14315
// ---------------- Allocs
14316
14317
// These functions allocate and initialize Wuffs structs. They return NULL if
14318
// memory allocation fails. If they return non-NULL, there is no need to call
14319
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14320
// calling free on the returned pointer. That pointer is effectively a C++
14321
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14322
14323
wuffs_sha256__hasher*
14324
wuffs_sha256__hasher__alloc(void);
14325
14326
static inline wuffs_base__hasher_bitvec256*
14327
wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256(void) {
14328
  return (wuffs_base__hasher_bitvec256*)(wuffs_sha256__hasher__alloc());
14329
}
14330
14331
// ---------------- Upcasts
14332
14333
static inline wuffs_base__hasher_bitvec256*
14334
wuffs_sha256__hasher__upcast_as__wuffs_base__hasher_bitvec256(
14335
    wuffs_sha256__hasher* p) {
14336
  return (wuffs_base__hasher_bitvec256*)p;
14337
}
14338
14339
// ---------------- Public Function Prototypes
14340
14341
WUFFS_BASE__GENERATED_C_CODE
14342
WUFFS_BASE__MAYBE_STATIC uint64_t
14343
wuffs_sha256__hasher__get_quirk(
14344
    const wuffs_sha256__hasher* self,
14345
    uint32_t a_key);
14346
14347
WUFFS_BASE__GENERATED_C_CODE
14348
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14349
wuffs_sha256__hasher__set_quirk(
14350
    wuffs_sha256__hasher* self,
14351
    uint32_t a_key,
14352
    uint64_t a_value);
14353
14354
WUFFS_BASE__GENERATED_C_CODE
14355
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14356
wuffs_sha256__hasher__update(
14357
    wuffs_sha256__hasher* self,
14358
    wuffs_base__slice_u8 a_x);
14359
14360
WUFFS_BASE__GENERATED_C_CODE
14361
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
14362
wuffs_sha256__hasher__update_bitvec256(
14363
    wuffs_sha256__hasher* self,
14364
    wuffs_base__slice_u8 a_x);
14365
14366
WUFFS_BASE__GENERATED_C_CODE
14367
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
14368
wuffs_sha256__hasher__checksum_bitvec256(
14369
    const wuffs_sha256__hasher* self);
14370
14371
#ifdef __cplusplus
14372
}  // extern "C"
14373
#endif
14374
14375
// ---------------- Struct Definitions
14376
14377
// These structs' fields, and the sizeof them, are private implementation
14378
// details that aren't guaranteed to be stable across Wuffs versions.
14379
//
14380
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14381
14382
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14383
14384
struct wuffs_sha256__hasher__struct {
14385
  // Do not access the private_impl's or private_data's fields directly. There
14386
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14387
  // the wuffs_foo__bar__baz functions.
14388
  //
14389
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14390
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14391
14392
  struct {
14393
    uint32_t magic;
14394
    uint32_t active_coroutine;
14395
    wuffs_base__vtable vtable_for__wuffs_base__hasher_bitvec256;
14396
    wuffs_base__vtable null_vtable;
14397
14398
    uint64_t f_length_modulo_u64;
14399
    bool f_length_overflows_u64;
14400
    uint8_t f_padding0;
14401
    uint8_t f_padding1;
14402
    uint8_t f_padding2;
14403
    uint32_t f_buf_len;
14404
    uint8_t f_buf_data[64];
14405
    uint32_t f_h0;
14406
    uint32_t f_h1;
14407
    uint32_t f_h2;
14408
    uint32_t f_h3;
14409
    uint32_t f_h4;
14410
    uint32_t f_h5;
14411
    uint32_t f_h6;
14412
    uint32_t f_h7;
14413
  } private_impl;
14414
14415
#ifdef __cplusplus
14416
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14417
  using unique_ptr = std::unique_ptr<wuffs_sha256__hasher, wuffs_unique_ptr_deleter>;
14418
14419
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14420
14421
  static inline unique_ptr
14422
  alloc() {
14423
    return unique_ptr(wuffs_sha256__hasher__alloc());
14424
  }
14425
14426
  static inline wuffs_base__hasher_bitvec256::unique_ptr
14427
  alloc_as__wuffs_base__hasher_bitvec256() {
14428
    return wuffs_base__hasher_bitvec256::unique_ptr(
14429
        wuffs_sha256__hasher__alloc_as__wuffs_base__hasher_bitvec256());
14430
  }
14431
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14432
14433
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14434
  // Disallow constructing or copying an object via standard C++ mechanisms,
14435
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14436
  // size and field layout is not part of the public, stable, memory-safe API.
14437
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14438
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14439
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14440
  //
14441
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14442
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14443
  // order to provide convenience methods. These forward on "this", so that you
14444
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14445
  wuffs_sha256__hasher__struct() = delete;
14446
  wuffs_sha256__hasher__struct(const wuffs_sha256__hasher__struct&) = delete;
14447
  wuffs_sha256__hasher__struct& operator=(
14448
      const wuffs_sha256__hasher__struct&) = delete;
14449
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14450
14451
#if !defined(WUFFS_IMPLEMENTATION)
14452
  // As above, the size of the struct is not part of the public API, and unless
14453
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14454
  // allocated, not stack allocated. Its size is not intended to be known at
14455
  // compile time, but it is unfortunately divulged as a side effect of
14456
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14457
  // instead of "sizeof T", invoking the operator. To make the two values
14458
  // different, so that passing the latter will be rejected by the initialize
14459
  // function, we add an arbitrary amount of dead weight.
14460
  uint8_t dead_weight[123000000];  // 123 MB.
14461
#endif  // !defined(WUFFS_IMPLEMENTATION)
14462
14463
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14464
  initialize(
14465
      size_t sizeof_star_self,
14466
      uint64_t wuffs_version,
14467
      uint32_t options) {
14468
    return wuffs_sha256__hasher__initialize(
14469
        this, sizeof_star_self, wuffs_version, options);
14470
  }
14471
14472
  inline wuffs_base__hasher_bitvec256*
14473
  upcast_as__wuffs_base__hasher_bitvec256() {
14474
    return (wuffs_base__hasher_bitvec256*)this;
14475
  }
14476
14477
  inline uint64_t
14478
  get_quirk(
14479
      uint32_t a_key) const {
14480
    return wuffs_sha256__hasher__get_quirk(this, a_key);
14481
  }
14482
14483
  inline wuffs_base__status
14484
  set_quirk(
14485
      uint32_t a_key,
14486
      uint64_t a_value) {
14487
    return wuffs_sha256__hasher__set_quirk(this, a_key, a_value);
14488
  }
14489
14490
  inline wuffs_base__empty_struct
14491
  update(
14492
      wuffs_base__slice_u8 a_x) {
14493
    return wuffs_sha256__hasher__update(this, a_x);
14494
  }
14495
14496
  inline wuffs_base__bitvec256
14497
  update_bitvec256(
14498
      wuffs_base__slice_u8 a_x) {
14499
    return wuffs_sha256__hasher__update_bitvec256(this, a_x);
14500
  }
14501
14502
  inline wuffs_base__bitvec256
14503
  checksum_bitvec256() const {
14504
    return wuffs_sha256__hasher__checksum_bitvec256(this);
14505
  }
14506
14507
#endif  // __cplusplus
14508
};  // struct wuffs_sha256__hasher__struct
14509
14510
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14511
14512
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256) || defined(WUFFS_NONMONOLITHIC)
14513
14514
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
14515
14516
// ---------------- Status Codes
14517
14518
extern const char wuffs_targa__error__bad_header[];
14519
extern const char wuffs_targa__error__bad_run_length_encoding[];
14520
extern const char wuffs_targa__error__truncated_input[];
14521
extern const char wuffs_targa__error__unsupported_targa_file[];
14522
14523
// ---------------- Public Consts
14524
14525
#define WUFFS_TARGA__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14526
14527
// ---------------- Struct Declarations
14528
14529
typedef struct wuffs_targa__decoder__struct wuffs_targa__decoder;
14530
14531
#ifdef __cplusplus
14532
extern "C" {
14533
#endif
14534
14535
// ---------------- Public Initializer Prototypes
14536
14537
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14538
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14539
//
14540
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14541
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14542
14543
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14544
wuffs_targa__decoder__initialize(
14545
    wuffs_targa__decoder* self,
14546
    size_t sizeof_star_self,
14547
    uint64_t wuffs_version,
14548
    uint32_t options);
14549
14550
size_t
14551
sizeof__wuffs_targa__decoder(void);
14552
14553
// ---------------- Allocs
14554
14555
// These functions allocate and initialize Wuffs structs. They return NULL if
14556
// memory allocation fails. If they return non-NULL, there is no need to call
14557
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14558
// calling free on the returned pointer. That pointer is effectively a C++
14559
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14560
14561
wuffs_targa__decoder*
14562
wuffs_targa__decoder__alloc(void);
14563
14564
static inline wuffs_base__image_decoder*
14565
wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder(void) {
14566
  return (wuffs_base__image_decoder*)(wuffs_targa__decoder__alloc());
14567
}
14568
14569
// ---------------- Upcasts
14570
14571
static inline wuffs_base__image_decoder*
14572
wuffs_targa__decoder__upcast_as__wuffs_base__image_decoder(
14573
    wuffs_targa__decoder* p) {
14574
  return (wuffs_base__image_decoder*)p;
14575
}
14576
14577
// ---------------- Public Function Prototypes
14578
14579
WUFFS_BASE__GENERATED_C_CODE
14580
WUFFS_BASE__MAYBE_STATIC uint64_t
14581
wuffs_targa__decoder__get_quirk(
14582
    const wuffs_targa__decoder* self,
14583
    uint32_t a_key);
14584
14585
WUFFS_BASE__GENERATED_C_CODE
14586
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14587
wuffs_targa__decoder__set_quirk(
14588
    wuffs_targa__decoder* self,
14589
    uint32_t a_key,
14590
    uint64_t a_value);
14591
14592
WUFFS_BASE__GENERATED_C_CODE
14593
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14594
wuffs_targa__decoder__decode_image_config(
14595
    wuffs_targa__decoder* self,
14596
    wuffs_base__image_config* a_dst,
14597
    wuffs_base__io_buffer* a_src);
14598
14599
WUFFS_BASE__GENERATED_C_CODE
14600
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14601
wuffs_targa__decoder__decode_frame_config(
14602
    wuffs_targa__decoder* self,
14603
    wuffs_base__frame_config* a_dst,
14604
    wuffs_base__io_buffer* a_src);
14605
14606
WUFFS_BASE__GENERATED_C_CODE
14607
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14608
wuffs_targa__decoder__decode_frame(
14609
    wuffs_targa__decoder* self,
14610
    wuffs_base__pixel_buffer* a_dst,
14611
    wuffs_base__io_buffer* a_src,
14612
    wuffs_base__pixel_blend a_blend,
14613
    wuffs_base__slice_u8 a_workbuf,
14614
    wuffs_base__decode_frame_options* a_opts);
14615
14616
WUFFS_BASE__GENERATED_C_CODE
14617
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14618
wuffs_targa__decoder__frame_dirty_rect(
14619
    const wuffs_targa__decoder* self);
14620
14621
WUFFS_BASE__GENERATED_C_CODE
14622
WUFFS_BASE__MAYBE_STATIC uint32_t
14623
wuffs_targa__decoder__num_animation_loops(
14624
    const wuffs_targa__decoder* self);
14625
14626
WUFFS_BASE__GENERATED_C_CODE
14627
WUFFS_BASE__MAYBE_STATIC uint64_t
14628
wuffs_targa__decoder__num_decoded_frame_configs(
14629
    const wuffs_targa__decoder* self);
14630
14631
WUFFS_BASE__GENERATED_C_CODE
14632
WUFFS_BASE__MAYBE_STATIC uint64_t
14633
wuffs_targa__decoder__num_decoded_frames(
14634
    const wuffs_targa__decoder* self);
14635
14636
WUFFS_BASE__GENERATED_C_CODE
14637
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14638
wuffs_targa__decoder__restart_frame(
14639
    wuffs_targa__decoder* self,
14640
    uint64_t a_index,
14641
    uint64_t a_io_position);
14642
14643
WUFFS_BASE__GENERATED_C_CODE
14644
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
14645
wuffs_targa__decoder__set_report_metadata(
14646
    wuffs_targa__decoder* self,
14647
    uint32_t a_fourcc,
14648
    bool a_report);
14649
14650
WUFFS_BASE__GENERATED_C_CODE
14651
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14652
wuffs_targa__decoder__tell_me_more(
14653
    wuffs_targa__decoder* self,
14654
    wuffs_base__io_buffer* a_dst,
14655
    wuffs_base__more_information* a_minfo,
14656
    wuffs_base__io_buffer* a_src);
14657
14658
WUFFS_BASE__GENERATED_C_CODE
14659
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
14660
wuffs_targa__decoder__workbuf_len(
14661
    const wuffs_targa__decoder* self);
14662
14663
#ifdef __cplusplus
14664
}  // extern "C"
14665
#endif
14666
14667
// ---------------- Struct Definitions
14668
14669
// These structs' fields, and the sizeof them, are private implementation
14670
// details that aren't guaranteed to be stable across Wuffs versions.
14671
//
14672
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
14673
14674
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14675
14676
struct wuffs_targa__decoder__struct {
14677
  // Do not access the private_impl's or private_data's fields directly. There
14678
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
14679
  // the wuffs_foo__bar__baz functions.
14680
  //
14681
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
14682
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
14683
14684
  struct {
14685
    uint32_t magic;
14686
    uint32_t active_coroutine;
14687
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
14688
    wuffs_base__vtable null_vtable;
14689
14690
    uint32_t f_width;
14691
    uint32_t f_height;
14692
    uint8_t f_call_sequence;
14693
    uint8_t f_header_id_length;
14694
    uint8_t f_header_color_map_type;
14695
    uint8_t f_header_image_type;
14696
    uint16_t f_header_color_map_first_entry_index;
14697
    uint16_t f_header_color_map_length;
14698
    uint8_t f_header_color_map_entry_size;
14699
    uint8_t f_header_pixel_depth;
14700
    uint8_t f_header_image_descriptor;
14701
    bool f_opaque;
14702
    uint32_t f_scratch_bytes_per_pixel;
14703
    uint32_t f_src_bytes_per_pixel;
14704
    uint32_t f_src_pixfmt;
14705
    uint64_t f_frame_config_io_position;
14706
    wuffs_base__pixel_swizzler f_swizzler;
14707
14708
    uint32_t p_decode_image_config;
14709
    uint32_t p_do_decode_image_config;
14710
    uint32_t p_decode_frame_config;
14711
    uint32_t p_do_decode_frame_config;
14712
    uint32_t p_decode_frame;
14713
    uint32_t p_do_decode_frame;
14714
  } private_impl;
14715
14716
  struct {
14717
    uint8_t f_dst_palette[1024];
14718
    uint8_t f_src_palette[1024];
14719
    uint8_t f_scratch[4];
14720
14721
    struct {
14722
      uint32_t v_i;
14723
      uint64_t scratch;
14724
    } s_do_decode_image_config;
14725
    struct {
14726
      uint64_t v_dst_bytes_per_pixel;
14727
      uint32_t v_dst_x;
14728
      uint32_t v_dst_y;
14729
      uint64_t v_mark;
14730
      uint32_t v_num_pixels32;
14731
      uint32_t v_lit_length;
14732
      uint32_t v_run_length;
14733
      uint64_t v_num_dst_bytes;
14734
      uint64_t scratch;
14735
    } s_do_decode_frame;
14736
  } private_data;
14737
14738
#ifdef __cplusplus
14739
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14740
  using unique_ptr = std::unique_ptr<wuffs_targa__decoder, wuffs_unique_ptr_deleter>;
14741
14742
  // On failure, the alloc_etc functions return nullptr. They don't throw.
14743
14744
  static inline unique_ptr
14745
  alloc() {
14746
    return unique_ptr(wuffs_targa__decoder__alloc());
14747
  }
14748
14749
  static inline wuffs_base__image_decoder::unique_ptr
14750
  alloc_as__wuffs_base__image_decoder() {
14751
    return wuffs_base__image_decoder::unique_ptr(
14752
        wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder());
14753
  }
14754
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
14755
14756
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14757
  // Disallow constructing or copying an object via standard C++ mechanisms,
14758
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
14759
  // size and field layout is not part of the public, stable, memory-safe API.
14760
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
14761
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
14762
  // their first argument) rather than tweaking bar.private_impl.qux fields.
14763
  //
14764
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
14765
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
14766
  // order to provide convenience methods. These forward on "this", so that you
14767
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
14768
  wuffs_targa__decoder__struct() = delete;
14769
  wuffs_targa__decoder__struct(const wuffs_targa__decoder__struct&) = delete;
14770
  wuffs_targa__decoder__struct& operator=(
14771
      const wuffs_targa__decoder__struct&) = delete;
14772
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
14773
14774
#if !defined(WUFFS_IMPLEMENTATION)
14775
  // As above, the size of the struct is not part of the public API, and unless
14776
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
14777
  // allocated, not stack allocated. Its size is not intended to be known at
14778
  // compile time, but it is unfortunately divulged as a side effect of
14779
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
14780
  // instead of "sizeof T", invoking the operator. To make the two values
14781
  // different, so that passing the latter will be rejected by the initialize
14782
  // function, we add an arbitrary amount of dead weight.
14783
  uint8_t dead_weight[123000000];  // 123 MB.
14784
#endif  // !defined(WUFFS_IMPLEMENTATION)
14785
14786
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14787
  initialize(
14788
      size_t sizeof_star_self,
14789
      uint64_t wuffs_version,
14790
      uint32_t options) {
14791
    return wuffs_targa__decoder__initialize(
14792
        this, sizeof_star_self, wuffs_version, options);
14793
  }
14794
14795
  inline wuffs_base__image_decoder*
14796
  upcast_as__wuffs_base__image_decoder() {
14797
    return (wuffs_base__image_decoder*)this;
14798
  }
14799
14800
  inline uint64_t
14801
  get_quirk(
14802
      uint32_t a_key) const {
14803
    return wuffs_targa__decoder__get_quirk(this, a_key);
14804
  }
14805
14806
  inline wuffs_base__status
14807
  set_quirk(
14808
      uint32_t a_key,
14809
      uint64_t a_value) {
14810
    return wuffs_targa__decoder__set_quirk(this, a_key, a_value);
14811
  }
14812
14813
  inline wuffs_base__status
14814
  decode_image_config(
14815
      wuffs_base__image_config* a_dst,
14816
      wuffs_base__io_buffer* a_src) {
14817
    return wuffs_targa__decoder__decode_image_config(this, a_dst, a_src);
14818
  }
14819
14820
  inline wuffs_base__status
14821
  decode_frame_config(
14822
      wuffs_base__frame_config* a_dst,
14823
      wuffs_base__io_buffer* a_src) {
14824
    return wuffs_targa__decoder__decode_frame_config(this, a_dst, a_src);
14825
  }
14826
14827
  inline wuffs_base__status
14828
  decode_frame(
14829
      wuffs_base__pixel_buffer* a_dst,
14830
      wuffs_base__io_buffer* a_src,
14831
      wuffs_base__pixel_blend a_blend,
14832
      wuffs_base__slice_u8 a_workbuf,
14833
      wuffs_base__decode_frame_options* a_opts) {
14834
    return wuffs_targa__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
14835
  }
14836
14837
  inline wuffs_base__rect_ie_u32
14838
  frame_dirty_rect() const {
14839
    return wuffs_targa__decoder__frame_dirty_rect(this);
14840
  }
14841
14842
  inline uint32_t
14843
  num_animation_loops() const {
14844
    return wuffs_targa__decoder__num_animation_loops(this);
14845
  }
14846
14847
  inline uint64_t
14848
  num_decoded_frame_configs() const {
14849
    return wuffs_targa__decoder__num_decoded_frame_configs(this);
14850
  }
14851
14852
  inline uint64_t
14853
  num_decoded_frames() const {
14854
    return wuffs_targa__decoder__num_decoded_frames(this);
14855
  }
14856
14857
  inline wuffs_base__status
14858
  restart_frame(
14859
      uint64_t a_index,
14860
      uint64_t a_io_position) {
14861
    return wuffs_targa__decoder__restart_frame(this, a_index, a_io_position);
14862
  }
14863
14864
  inline wuffs_base__empty_struct
14865
  set_report_metadata(
14866
      uint32_t a_fourcc,
14867
      bool a_report) {
14868
    return wuffs_targa__decoder__set_report_metadata(this, a_fourcc, a_report);
14869
  }
14870
14871
  inline wuffs_base__status
14872
  tell_me_more(
14873
      wuffs_base__io_buffer* a_dst,
14874
      wuffs_base__more_information* a_minfo,
14875
      wuffs_base__io_buffer* a_src) {
14876
    return wuffs_targa__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
14877
  }
14878
14879
  inline wuffs_base__range_ii_u64
14880
  workbuf_len() const {
14881
    return wuffs_targa__decoder__workbuf_len(this);
14882
  }
14883
14884
#endif  // __cplusplus
14885
};  // struct wuffs_targa__decoder__struct
14886
14887
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
14888
14889
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA) || defined(WUFFS_NONMONOLITHIC)
14890
14891
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
14892
14893
// ---------------- Status Codes
14894
14895
extern const char wuffs_thumbhash__error__bad_header[];
14896
extern const char wuffs_thumbhash__error__truncated_input[];
14897
14898
// ---------------- Public Consts
14899
14900
#define WUFFS_THUMBHASH__QUIRK_JUST_RAW_THUMBHASH 1712283648u
14901
14902
#define WUFFS_THUMBHASH__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
14903
14904
// ---------------- Struct Declarations
14905
14906
typedef struct wuffs_thumbhash__decoder__struct wuffs_thumbhash__decoder;
14907
14908
#ifdef __cplusplus
14909
extern "C" {
14910
#endif
14911
14912
// ---------------- Public Initializer Prototypes
14913
14914
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
14915
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
14916
//
14917
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
14918
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
14919
14920
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
14921
wuffs_thumbhash__decoder__initialize(
14922
    wuffs_thumbhash__decoder* self,
14923
    size_t sizeof_star_self,
14924
    uint64_t wuffs_version,
14925
    uint32_t options);
14926
14927
size_t
14928
sizeof__wuffs_thumbhash__decoder(void);
14929
14930
// ---------------- Allocs
14931
14932
// These functions allocate and initialize Wuffs structs. They return NULL if
14933
// memory allocation fails. If they return non-NULL, there is no need to call
14934
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
14935
// calling free on the returned pointer. That pointer is effectively a C++
14936
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
14937
14938
wuffs_thumbhash__decoder*
14939
wuffs_thumbhash__decoder__alloc(void);
14940
14941
static inline wuffs_base__image_decoder*
14942
wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder(void) {
14943
  return (wuffs_base__image_decoder*)(wuffs_thumbhash__decoder__alloc());
14944
}
14945
14946
// ---------------- Upcasts
14947
14948
static inline wuffs_base__image_decoder*
14949
wuffs_thumbhash__decoder__upcast_as__wuffs_base__image_decoder(
14950
    wuffs_thumbhash__decoder* p) {
14951
  return (wuffs_base__image_decoder*)p;
14952
}
14953
14954
// ---------------- Public Function Prototypes
14955
14956
WUFFS_BASE__GENERATED_C_CODE
14957
WUFFS_BASE__MAYBE_STATIC uint64_t
14958
wuffs_thumbhash__decoder__get_quirk(
14959
    const wuffs_thumbhash__decoder* self,
14960
    uint32_t a_key);
14961
14962
WUFFS_BASE__GENERATED_C_CODE
14963
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14964
wuffs_thumbhash__decoder__set_quirk(
14965
    wuffs_thumbhash__decoder* self,
14966
    uint32_t a_key,
14967
    uint64_t a_value);
14968
14969
WUFFS_BASE__GENERATED_C_CODE
14970
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14971
wuffs_thumbhash__decoder__decode_image_config(
14972
    wuffs_thumbhash__decoder* self,
14973
    wuffs_base__image_config* a_dst,
14974
    wuffs_base__io_buffer* a_src);
14975
14976
WUFFS_BASE__GENERATED_C_CODE
14977
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14978
wuffs_thumbhash__decoder__decode_frame_config(
14979
    wuffs_thumbhash__decoder* self,
14980
    wuffs_base__frame_config* a_dst,
14981
    wuffs_base__io_buffer* a_src);
14982
14983
WUFFS_BASE__GENERATED_C_CODE
14984
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
14985
wuffs_thumbhash__decoder__decode_frame(
14986
    wuffs_thumbhash__decoder* self,
14987
    wuffs_base__pixel_buffer* a_dst,
14988
    wuffs_base__io_buffer* a_src,
14989
    wuffs_base__pixel_blend a_blend,
14990
    wuffs_base__slice_u8 a_workbuf,
14991
    wuffs_base__decode_frame_options* a_opts);
14992
14993
WUFFS_BASE__GENERATED_C_CODE
14994
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
14995
wuffs_thumbhash__decoder__frame_dirty_rect(
14996
    const wuffs_thumbhash__decoder* self);
14997
14998
WUFFS_BASE__GENERATED_C_CODE
14999
WUFFS_BASE__MAYBE_STATIC uint32_t
15000
wuffs_thumbhash__decoder__num_animation_loops(
15001
    const wuffs_thumbhash__decoder* self);
15002
15003
WUFFS_BASE__GENERATED_C_CODE
15004
WUFFS_BASE__MAYBE_STATIC uint64_t
15005
wuffs_thumbhash__decoder__num_decoded_frame_configs(
15006
    const wuffs_thumbhash__decoder* self);
15007
15008
WUFFS_BASE__GENERATED_C_CODE
15009
WUFFS_BASE__MAYBE_STATIC uint64_t
15010
wuffs_thumbhash__decoder__num_decoded_frames(
15011
    const wuffs_thumbhash__decoder* self);
15012
15013
WUFFS_BASE__GENERATED_C_CODE
15014
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15015
wuffs_thumbhash__decoder__restart_frame(
15016
    wuffs_thumbhash__decoder* self,
15017
    uint64_t a_index,
15018
    uint64_t a_io_position);
15019
15020
WUFFS_BASE__GENERATED_C_CODE
15021
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15022
wuffs_thumbhash__decoder__set_report_metadata(
15023
    wuffs_thumbhash__decoder* self,
15024
    uint32_t a_fourcc,
15025
    bool a_report);
15026
15027
WUFFS_BASE__GENERATED_C_CODE
15028
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15029
wuffs_thumbhash__decoder__tell_me_more(
15030
    wuffs_thumbhash__decoder* self,
15031
    wuffs_base__io_buffer* a_dst,
15032
    wuffs_base__more_information* a_minfo,
15033
    wuffs_base__io_buffer* a_src);
15034
15035
WUFFS_BASE__GENERATED_C_CODE
15036
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15037
wuffs_thumbhash__decoder__workbuf_len(
15038
    const wuffs_thumbhash__decoder* self);
15039
15040
#ifdef __cplusplus
15041
}  // extern "C"
15042
#endif
15043
15044
// ---------------- Struct Definitions
15045
15046
// These structs' fields, and the sizeof them, are private implementation
15047
// details that aren't guaranteed to be stable across Wuffs versions.
15048
//
15049
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15050
15051
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15052
15053
struct wuffs_thumbhash__decoder__struct {
15054
  // Do not access the private_impl's or private_data's fields directly. There
15055
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15056
  // the wuffs_foo__bar__baz functions.
15057
  //
15058
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15059
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15060
15061
  struct {
15062
    uint32_t magic;
15063
    uint32_t active_coroutine;
15064
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15065
    wuffs_base__vtable null_vtable;
15066
15067
    uint32_t f_pixfmt;
15068
    uint8_t f_w_dimension_code;
15069
    uint8_t f_h_dimension_code;
15070
    uint8_t f_call_sequence;
15071
    uint8_t f_frame_config_io_position;
15072
    uint64_t f_l_dc;
15073
    uint64_t f_p_dc;
15074
    uint64_t f_q_dc;
15075
    uint64_t f_a_dc;
15076
    bool f_quirk_just_raw_thumbhash;
15077
    uint8_t f_l_scale;
15078
    uint8_t f_p_scale;
15079
    uint8_t f_q_scale;
15080
    uint8_t f_a_scale;
15081
    uint8_t f_has_alpha;
15082
    uint8_t f_l_count;
15083
    uint8_t f_is_landscape;
15084
    uint32_t f_lx;
15085
    uint32_t f_ly;
15086
    wuffs_base__pixel_swizzler f_swizzler;
15087
15088
    uint32_t p_decode_image_config;
15089
    uint32_t p_do_decode_image_config;
15090
    uint32_t p_decode_frame_config;
15091
    uint32_t p_do_decode_frame_config;
15092
    uint32_t p_decode_frame;
15093
    uint32_t p_do_decode_frame;
15094
    uint32_t p_from_src_to_coeffs;
15095
  } private_impl;
15096
15097
  struct {
15098
    uint32_t f_lac[32];
15099
    uint32_t f_pac[8];
15100
    uint32_t f_qac[8];
15101
    uint32_t f_aac[16];
15102
    uint8_t f_pixels[32][128];
15103
15104
    struct {
15105
      uint64_t scratch;
15106
    } s_do_decode_image_config;
15107
    struct {
15108
      uint32_t v_cy;
15109
      uint32_t v_cx;
15110
      uint32_t v_i;
15111
      bool v_has_bits;
15112
    } s_from_src_to_coeffs;
15113
  } private_data;
15114
15115
#ifdef __cplusplus
15116
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15117
  using unique_ptr = std::unique_ptr<wuffs_thumbhash__decoder, wuffs_unique_ptr_deleter>;
15118
15119
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15120
15121
  static inline unique_ptr
15122
  alloc() {
15123
    return unique_ptr(wuffs_thumbhash__decoder__alloc());
15124
  }
15125
15126
  static inline wuffs_base__image_decoder::unique_ptr
15127
  alloc_as__wuffs_base__image_decoder() {
15128
    return wuffs_base__image_decoder::unique_ptr(
15129
        wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder());
15130
  }
15131
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15132
15133
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15134
  // Disallow constructing or copying an object via standard C++ mechanisms,
15135
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15136
  // size and field layout is not part of the public, stable, memory-safe API.
15137
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15138
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15139
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15140
  //
15141
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15142
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15143
  // order to provide convenience methods. These forward on "this", so that you
15144
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15145
  wuffs_thumbhash__decoder__struct() = delete;
15146
  wuffs_thumbhash__decoder__struct(const wuffs_thumbhash__decoder__struct&) = delete;
15147
  wuffs_thumbhash__decoder__struct& operator=(
15148
      const wuffs_thumbhash__decoder__struct&) = delete;
15149
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15150
15151
#if !defined(WUFFS_IMPLEMENTATION)
15152
  // As above, the size of the struct is not part of the public API, and unless
15153
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15154
  // allocated, not stack allocated. Its size is not intended to be known at
15155
  // compile time, but it is unfortunately divulged as a side effect of
15156
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15157
  // instead of "sizeof T", invoking the operator. To make the two values
15158
  // different, so that passing the latter will be rejected by the initialize
15159
  // function, we add an arbitrary amount of dead weight.
15160
  uint8_t dead_weight[123000000];  // 123 MB.
15161
#endif  // !defined(WUFFS_IMPLEMENTATION)
15162
15163
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15164
  initialize(
15165
      size_t sizeof_star_self,
15166
      uint64_t wuffs_version,
15167
      uint32_t options) {
15168
    return wuffs_thumbhash__decoder__initialize(
15169
        this, sizeof_star_self, wuffs_version, options);
15170
  }
15171
15172
  inline wuffs_base__image_decoder*
15173
  upcast_as__wuffs_base__image_decoder() {
15174
    return (wuffs_base__image_decoder*)this;
15175
  }
15176
15177
  inline uint64_t
15178
  get_quirk(
15179
      uint32_t a_key) const {
15180
    return wuffs_thumbhash__decoder__get_quirk(this, a_key);
15181
  }
15182
15183
  inline wuffs_base__status
15184
  set_quirk(
15185
      uint32_t a_key,
15186
      uint64_t a_value) {
15187
    return wuffs_thumbhash__decoder__set_quirk(this, a_key, a_value);
15188
  }
15189
15190
  inline wuffs_base__status
15191
  decode_image_config(
15192
      wuffs_base__image_config* a_dst,
15193
      wuffs_base__io_buffer* a_src) {
15194
    return wuffs_thumbhash__decoder__decode_image_config(this, a_dst, a_src);
15195
  }
15196
15197
  inline wuffs_base__status
15198
  decode_frame_config(
15199
      wuffs_base__frame_config* a_dst,
15200
      wuffs_base__io_buffer* a_src) {
15201
    return wuffs_thumbhash__decoder__decode_frame_config(this, a_dst, a_src);
15202
  }
15203
15204
  inline wuffs_base__status
15205
  decode_frame(
15206
      wuffs_base__pixel_buffer* a_dst,
15207
      wuffs_base__io_buffer* a_src,
15208
      wuffs_base__pixel_blend a_blend,
15209
      wuffs_base__slice_u8 a_workbuf,
15210
      wuffs_base__decode_frame_options* a_opts) {
15211
    return wuffs_thumbhash__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15212
  }
15213
15214
  inline wuffs_base__rect_ie_u32
15215
  frame_dirty_rect() const {
15216
    return wuffs_thumbhash__decoder__frame_dirty_rect(this);
15217
  }
15218
15219
  inline uint32_t
15220
  num_animation_loops() const {
15221
    return wuffs_thumbhash__decoder__num_animation_loops(this);
15222
  }
15223
15224
  inline uint64_t
15225
  num_decoded_frame_configs() const {
15226
    return wuffs_thumbhash__decoder__num_decoded_frame_configs(this);
15227
  }
15228
15229
  inline uint64_t
15230
  num_decoded_frames() const {
15231
    return wuffs_thumbhash__decoder__num_decoded_frames(this);
15232
  }
15233
15234
  inline wuffs_base__status
15235
  restart_frame(
15236
      uint64_t a_index,
15237
      uint64_t a_io_position) {
15238
    return wuffs_thumbhash__decoder__restart_frame(this, a_index, a_io_position);
15239
  }
15240
15241
  inline wuffs_base__empty_struct
15242
  set_report_metadata(
15243
      uint32_t a_fourcc,
15244
      bool a_report) {
15245
    return wuffs_thumbhash__decoder__set_report_metadata(this, a_fourcc, a_report);
15246
  }
15247
15248
  inline wuffs_base__status
15249
  tell_me_more(
15250
      wuffs_base__io_buffer* a_dst,
15251
      wuffs_base__more_information* a_minfo,
15252
      wuffs_base__io_buffer* a_src) {
15253
    return wuffs_thumbhash__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15254
  }
15255
15256
  inline wuffs_base__range_ii_u64
15257
  workbuf_len() const {
15258
    return wuffs_thumbhash__decoder__workbuf_len(this);
15259
  }
15260
15261
#endif  // __cplusplus
15262
};  // struct wuffs_thumbhash__decoder__struct
15263
15264
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15265
15266
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH) || defined(WUFFS_NONMONOLITHIC)
15267
15268
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
15269
15270
// ---------------- Status Codes
15271
15272
extern const char wuffs_vp8__error__bad_header[];
15273
extern const char wuffs_vp8__error__truncated_input[];
15274
extern const char wuffs_vp8__error__unsupported_vp8_file[];
15275
15276
// ---------------- Public Consts
15277
15278
#define WUFFS_VP8__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15279
15280
// ---------------- Struct Declarations
15281
15282
typedef struct wuffs_vp8__decoder__struct wuffs_vp8__decoder;
15283
15284
#ifdef __cplusplus
15285
extern "C" {
15286
#endif
15287
15288
// ---------------- Public Initializer Prototypes
15289
15290
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15291
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15292
//
15293
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15294
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15295
15296
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15297
wuffs_vp8__decoder__initialize(
15298
    wuffs_vp8__decoder* self,
15299
    size_t sizeof_star_self,
15300
    uint64_t wuffs_version,
15301
    uint32_t options);
15302
15303
size_t
15304
sizeof__wuffs_vp8__decoder(void);
15305
15306
// ---------------- Allocs
15307
15308
// These functions allocate and initialize Wuffs structs. They return NULL if
15309
// memory allocation fails. If they return non-NULL, there is no need to call
15310
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15311
// calling free on the returned pointer. That pointer is effectively a C++
15312
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15313
15314
wuffs_vp8__decoder*
15315
wuffs_vp8__decoder__alloc(void);
15316
15317
static inline wuffs_base__image_decoder*
15318
wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder(void) {
15319
  return (wuffs_base__image_decoder*)(wuffs_vp8__decoder__alloc());
15320
}
15321
15322
// ---------------- Upcasts
15323
15324
static inline wuffs_base__image_decoder*
15325
wuffs_vp8__decoder__upcast_as__wuffs_base__image_decoder(
15326
    wuffs_vp8__decoder* p) {
15327
  return (wuffs_base__image_decoder*)p;
15328
}
15329
15330
// ---------------- Public Function Prototypes
15331
15332
WUFFS_BASE__GENERATED_C_CODE
15333
WUFFS_BASE__MAYBE_STATIC uint64_t
15334
wuffs_vp8__decoder__get_quirk(
15335
    const wuffs_vp8__decoder* self,
15336
    uint32_t a_key);
15337
15338
WUFFS_BASE__GENERATED_C_CODE
15339
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15340
wuffs_vp8__decoder__set_quirk(
15341
    wuffs_vp8__decoder* self,
15342
    uint32_t a_key,
15343
    uint64_t a_value);
15344
15345
WUFFS_BASE__GENERATED_C_CODE
15346
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15347
wuffs_vp8__decoder__decode_image_config(
15348
    wuffs_vp8__decoder* self,
15349
    wuffs_base__image_config* a_dst,
15350
    wuffs_base__io_buffer* a_src);
15351
15352
WUFFS_BASE__GENERATED_C_CODE
15353
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15354
wuffs_vp8__decoder__decode_frame_config(
15355
    wuffs_vp8__decoder* self,
15356
    wuffs_base__frame_config* a_dst,
15357
    wuffs_base__io_buffer* a_src);
15358
15359
WUFFS_BASE__GENERATED_C_CODE
15360
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15361
wuffs_vp8__decoder__decode_frame(
15362
    wuffs_vp8__decoder* self,
15363
    wuffs_base__pixel_buffer* a_dst,
15364
    wuffs_base__io_buffer* a_src,
15365
    wuffs_base__pixel_blend a_blend,
15366
    wuffs_base__slice_u8 a_workbuf,
15367
    wuffs_base__decode_frame_options* a_opts);
15368
15369
WUFFS_BASE__GENERATED_C_CODE
15370
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15371
wuffs_vp8__decoder__frame_dirty_rect(
15372
    const wuffs_vp8__decoder* self);
15373
15374
WUFFS_BASE__GENERATED_C_CODE
15375
WUFFS_BASE__MAYBE_STATIC uint32_t
15376
wuffs_vp8__decoder__num_animation_loops(
15377
    const wuffs_vp8__decoder* self);
15378
15379
WUFFS_BASE__GENERATED_C_CODE
15380
WUFFS_BASE__MAYBE_STATIC uint64_t
15381
wuffs_vp8__decoder__num_decoded_frame_configs(
15382
    const wuffs_vp8__decoder* self);
15383
15384
WUFFS_BASE__GENERATED_C_CODE
15385
WUFFS_BASE__MAYBE_STATIC uint64_t
15386
wuffs_vp8__decoder__num_decoded_frames(
15387
    const wuffs_vp8__decoder* self);
15388
15389
WUFFS_BASE__GENERATED_C_CODE
15390
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15391
wuffs_vp8__decoder__restart_frame(
15392
    wuffs_vp8__decoder* self,
15393
    uint64_t a_index,
15394
    uint64_t a_io_position);
15395
15396
WUFFS_BASE__GENERATED_C_CODE
15397
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15398
wuffs_vp8__decoder__set_report_metadata(
15399
    wuffs_vp8__decoder* self,
15400
    uint32_t a_fourcc,
15401
    bool a_report);
15402
15403
WUFFS_BASE__GENERATED_C_CODE
15404
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15405
wuffs_vp8__decoder__tell_me_more(
15406
    wuffs_vp8__decoder* self,
15407
    wuffs_base__io_buffer* a_dst,
15408
    wuffs_base__more_information* a_minfo,
15409
    wuffs_base__io_buffer* a_src);
15410
15411
WUFFS_BASE__GENERATED_C_CODE
15412
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15413
wuffs_vp8__decoder__workbuf_len(
15414
    const wuffs_vp8__decoder* self);
15415
15416
#ifdef __cplusplus
15417
}  // extern "C"
15418
#endif
15419
15420
// ---------------- Struct Definitions
15421
15422
// These structs' fields, and the sizeof them, are private implementation
15423
// details that aren't guaranteed to be stable across Wuffs versions.
15424
//
15425
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15426
15427
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15428
15429
struct wuffs_vp8__decoder__struct {
15430
  // Do not access the private_impl's or private_data's fields directly. There
15431
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15432
  // the wuffs_foo__bar__baz functions.
15433
  //
15434
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15435
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15436
15437
  struct {
15438
    uint32_t magic;
15439
    uint32_t active_coroutine;
15440
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15441
    wuffs_base__vtable null_vtable;
15442
15443
    uint32_t f_width;
15444
    uint32_t f_height;
15445
    uint8_t f_call_sequence;
15446
    uint64_t f_frame_config_io_position;
15447
    uint32_t f_dst_x;
15448
    uint32_t f_dst_y;
15449
    wuffs_base__pixel_swizzler f_swizzler;
15450
15451
    uint32_t p_decode_image_config;
15452
    uint32_t p_do_decode_image_config;
15453
    uint32_t p_decode_frame_config;
15454
    uint32_t p_do_decode_frame_config;
15455
    uint32_t p_decode_frame;
15456
    uint32_t p_do_decode_frame;
15457
  } private_impl;
15458
15459
  struct {
15460
    struct {
15461
      uint64_t scratch;
15462
    } s_do_decode_image_config;
15463
  } private_data;
15464
15465
#ifdef __cplusplus
15466
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15467
  using unique_ptr = std::unique_ptr<wuffs_vp8__decoder, wuffs_unique_ptr_deleter>;
15468
15469
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15470
15471
  static inline unique_ptr
15472
  alloc() {
15473
    return unique_ptr(wuffs_vp8__decoder__alloc());
15474
  }
15475
15476
  static inline wuffs_base__image_decoder::unique_ptr
15477
  alloc_as__wuffs_base__image_decoder() {
15478
    return wuffs_base__image_decoder::unique_ptr(
15479
        wuffs_vp8__decoder__alloc_as__wuffs_base__image_decoder());
15480
  }
15481
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15482
15483
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15484
  // Disallow constructing or copying an object via standard C++ mechanisms,
15485
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15486
  // size and field layout is not part of the public, stable, memory-safe API.
15487
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15488
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15489
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15490
  //
15491
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15492
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15493
  // order to provide convenience methods. These forward on "this", so that you
15494
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15495
  wuffs_vp8__decoder__struct() = delete;
15496
  wuffs_vp8__decoder__struct(const wuffs_vp8__decoder__struct&) = delete;
15497
  wuffs_vp8__decoder__struct& operator=(
15498
      const wuffs_vp8__decoder__struct&) = delete;
15499
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15500
15501
#if !defined(WUFFS_IMPLEMENTATION)
15502
  // As above, the size of the struct is not part of the public API, and unless
15503
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15504
  // allocated, not stack allocated. Its size is not intended to be known at
15505
  // compile time, but it is unfortunately divulged as a side effect of
15506
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15507
  // instead of "sizeof T", invoking the operator. To make the two values
15508
  // different, so that passing the latter will be rejected by the initialize
15509
  // function, we add an arbitrary amount of dead weight.
15510
  uint8_t dead_weight[123000000];  // 123 MB.
15511
#endif  // !defined(WUFFS_IMPLEMENTATION)
15512
15513
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15514
  initialize(
15515
      size_t sizeof_star_self,
15516
      uint64_t wuffs_version,
15517
      uint32_t options) {
15518
    return wuffs_vp8__decoder__initialize(
15519
        this, sizeof_star_self, wuffs_version, options);
15520
  }
15521
15522
  inline wuffs_base__image_decoder*
15523
  upcast_as__wuffs_base__image_decoder() {
15524
    return (wuffs_base__image_decoder*)this;
15525
  }
15526
15527
  inline uint64_t
15528
  get_quirk(
15529
      uint32_t a_key) const {
15530
    return wuffs_vp8__decoder__get_quirk(this, a_key);
15531
  }
15532
15533
  inline wuffs_base__status
15534
  set_quirk(
15535
      uint32_t a_key,
15536
      uint64_t a_value) {
15537
    return wuffs_vp8__decoder__set_quirk(this, a_key, a_value);
15538
  }
15539
15540
  inline wuffs_base__status
15541
  decode_image_config(
15542
      wuffs_base__image_config* a_dst,
15543
      wuffs_base__io_buffer* a_src) {
15544
    return wuffs_vp8__decoder__decode_image_config(this, a_dst, a_src);
15545
  }
15546
15547
  inline wuffs_base__status
15548
  decode_frame_config(
15549
      wuffs_base__frame_config* a_dst,
15550
      wuffs_base__io_buffer* a_src) {
15551
    return wuffs_vp8__decoder__decode_frame_config(this, a_dst, a_src);
15552
  }
15553
15554
  inline wuffs_base__status
15555
  decode_frame(
15556
      wuffs_base__pixel_buffer* a_dst,
15557
      wuffs_base__io_buffer* a_src,
15558
      wuffs_base__pixel_blend a_blend,
15559
      wuffs_base__slice_u8 a_workbuf,
15560
      wuffs_base__decode_frame_options* a_opts) {
15561
    return wuffs_vp8__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15562
  }
15563
15564
  inline wuffs_base__rect_ie_u32
15565
  frame_dirty_rect() const {
15566
    return wuffs_vp8__decoder__frame_dirty_rect(this);
15567
  }
15568
15569
  inline uint32_t
15570
  num_animation_loops() const {
15571
    return wuffs_vp8__decoder__num_animation_loops(this);
15572
  }
15573
15574
  inline uint64_t
15575
  num_decoded_frame_configs() const {
15576
    return wuffs_vp8__decoder__num_decoded_frame_configs(this);
15577
  }
15578
15579
  inline uint64_t
15580
  num_decoded_frames() const {
15581
    return wuffs_vp8__decoder__num_decoded_frames(this);
15582
  }
15583
15584
  inline wuffs_base__status
15585
  restart_frame(
15586
      uint64_t a_index,
15587
      uint64_t a_io_position) {
15588
    return wuffs_vp8__decoder__restart_frame(this, a_index, a_io_position);
15589
  }
15590
15591
  inline wuffs_base__empty_struct
15592
  set_report_metadata(
15593
      uint32_t a_fourcc,
15594
      bool a_report) {
15595
    return wuffs_vp8__decoder__set_report_metadata(this, a_fourcc, a_report);
15596
  }
15597
15598
  inline wuffs_base__status
15599
  tell_me_more(
15600
      wuffs_base__io_buffer* a_dst,
15601
      wuffs_base__more_information* a_minfo,
15602
      wuffs_base__io_buffer* a_src) {
15603
    return wuffs_vp8__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15604
  }
15605
15606
  inline wuffs_base__range_ii_u64
15607
  workbuf_len() const {
15608
    return wuffs_vp8__decoder__workbuf_len(this);
15609
  }
15610
15611
#endif  // __cplusplus
15612
};  // struct wuffs_vp8__decoder__struct
15613
15614
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15615
15616
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8) || defined(WUFFS_NONMONOLITHIC)
15617
15618
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
15619
15620
// ---------------- Status Codes
15621
15622
extern const char wuffs_wbmp__error__bad_header[];
15623
extern const char wuffs_wbmp__error__truncated_input[];
15624
15625
// ---------------- Public Consts
15626
15627
#define WUFFS_WBMP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15628
15629
// ---------------- Struct Declarations
15630
15631
typedef struct wuffs_wbmp__decoder__struct wuffs_wbmp__decoder;
15632
15633
#ifdef __cplusplus
15634
extern "C" {
15635
#endif
15636
15637
// ---------------- Public Initializer Prototypes
15638
15639
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
15640
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
15641
//
15642
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
15643
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
15644
15645
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15646
wuffs_wbmp__decoder__initialize(
15647
    wuffs_wbmp__decoder* self,
15648
    size_t sizeof_star_self,
15649
    uint64_t wuffs_version,
15650
    uint32_t options);
15651
15652
size_t
15653
sizeof__wuffs_wbmp__decoder(void);
15654
15655
// ---------------- Allocs
15656
15657
// These functions allocate and initialize Wuffs structs. They return NULL if
15658
// memory allocation fails. If they return non-NULL, there is no need to call
15659
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
15660
// calling free on the returned pointer. That pointer is effectively a C++
15661
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
15662
15663
wuffs_wbmp__decoder*
15664
wuffs_wbmp__decoder__alloc(void);
15665
15666
static inline wuffs_base__image_decoder*
15667
wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder(void) {
15668
  return (wuffs_base__image_decoder*)(wuffs_wbmp__decoder__alloc());
15669
}
15670
15671
// ---------------- Upcasts
15672
15673
static inline wuffs_base__image_decoder*
15674
wuffs_wbmp__decoder__upcast_as__wuffs_base__image_decoder(
15675
    wuffs_wbmp__decoder* p) {
15676
  return (wuffs_base__image_decoder*)p;
15677
}
15678
15679
// ---------------- Public Function Prototypes
15680
15681
WUFFS_BASE__GENERATED_C_CODE
15682
WUFFS_BASE__MAYBE_STATIC uint64_t
15683
wuffs_wbmp__decoder__get_quirk(
15684
    const wuffs_wbmp__decoder* self,
15685
    uint32_t a_key);
15686
15687
WUFFS_BASE__GENERATED_C_CODE
15688
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15689
wuffs_wbmp__decoder__set_quirk(
15690
    wuffs_wbmp__decoder* self,
15691
    uint32_t a_key,
15692
    uint64_t a_value);
15693
15694
WUFFS_BASE__GENERATED_C_CODE
15695
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15696
wuffs_wbmp__decoder__decode_image_config(
15697
    wuffs_wbmp__decoder* self,
15698
    wuffs_base__image_config* a_dst,
15699
    wuffs_base__io_buffer* a_src);
15700
15701
WUFFS_BASE__GENERATED_C_CODE
15702
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15703
wuffs_wbmp__decoder__decode_frame_config(
15704
    wuffs_wbmp__decoder* self,
15705
    wuffs_base__frame_config* a_dst,
15706
    wuffs_base__io_buffer* a_src);
15707
15708
WUFFS_BASE__GENERATED_C_CODE
15709
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15710
wuffs_wbmp__decoder__decode_frame(
15711
    wuffs_wbmp__decoder* self,
15712
    wuffs_base__pixel_buffer* a_dst,
15713
    wuffs_base__io_buffer* a_src,
15714
    wuffs_base__pixel_blend a_blend,
15715
    wuffs_base__slice_u8 a_workbuf,
15716
    wuffs_base__decode_frame_options* a_opts);
15717
15718
WUFFS_BASE__GENERATED_C_CODE
15719
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
15720
wuffs_wbmp__decoder__frame_dirty_rect(
15721
    const wuffs_wbmp__decoder* self);
15722
15723
WUFFS_BASE__GENERATED_C_CODE
15724
WUFFS_BASE__MAYBE_STATIC uint32_t
15725
wuffs_wbmp__decoder__num_animation_loops(
15726
    const wuffs_wbmp__decoder* self);
15727
15728
WUFFS_BASE__GENERATED_C_CODE
15729
WUFFS_BASE__MAYBE_STATIC uint64_t
15730
wuffs_wbmp__decoder__num_decoded_frame_configs(
15731
    const wuffs_wbmp__decoder* self);
15732
15733
WUFFS_BASE__GENERATED_C_CODE
15734
WUFFS_BASE__MAYBE_STATIC uint64_t
15735
wuffs_wbmp__decoder__num_decoded_frames(
15736
    const wuffs_wbmp__decoder* self);
15737
15738
WUFFS_BASE__GENERATED_C_CODE
15739
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15740
wuffs_wbmp__decoder__restart_frame(
15741
    wuffs_wbmp__decoder* self,
15742
    uint64_t a_index,
15743
    uint64_t a_io_position);
15744
15745
WUFFS_BASE__GENERATED_C_CODE
15746
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
15747
wuffs_wbmp__decoder__set_report_metadata(
15748
    wuffs_wbmp__decoder* self,
15749
    uint32_t a_fourcc,
15750
    bool a_report);
15751
15752
WUFFS_BASE__GENERATED_C_CODE
15753
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
15754
wuffs_wbmp__decoder__tell_me_more(
15755
    wuffs_wbmp__decoder* self,
15756
    wuffs_base__io_buffer* a_dst,
15757
    wuffs_base__more_information* a_minfo,
15758
    wuffs_base__io_buffer* a_src);
15759
15760
WUFFS_BASE__GENERATED_C_CODE
15761
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
15762
wuffs_wbmp__decoder__workbuf_len(
15763
    const wuffs_wbmp__decoder* self);
15764
15765
#ifdef __cplusplus
15766
}  // extern "C"
15767
#endif
15768
15769
// ---------------- Struct Definitions
15770
15771
// These structs' fields, and the sizeof them, are private implementation
15772
// details that aren't guaranteed to be stable across Wuffs versions.
15773
//
15774
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
15775
15776
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15777
15778
struct wuffs_wbmp__decoder__struct {
15779
  // Do not access the private_impl's or private_data's fields directly. There
15780
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
15781
  // the wuffs_foo__bar__baz functions.
15782
  //
15783
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
15784
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
15785
15786
  struct {
15787
    uint32_t magic;
15788
    uint32_t active_coroutine;
15789
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
15790
    wuffs_base__vtable null_vtable;
15791
15792
    uint32_t f_width;
15793
    uint32_t f_height;
15794
    uint8_t f_call_sequence;
15795
    uint64_t f_frame_config_io_position;
15796
    wuffs_base__pixel_swizzler f_swizzler;
15797
15798
    uint32_t p_decode_image_config;
15799
    uint32_t p_do_decode_image_config;
15800
    uint32_t p_decode_frame_config;
15801
    uint32_t p_do_decode_frame_config;
15802
    uint32_t p_decode_frame;
15803
    uint32_t p_do_decode_frame;
15804
  } private_impl;
15805
15806
  struct {
15807
    struct {
15808
      uint32_t v_i;
15809
      uint32_t v_p;
15810
    } s_do_decode_image_config;
15811
    struct {
15812
      uint64_t v_dst_bytes_per_pixel;
15813
      uint32_t v_dst_x;
15814
      uint32_t v_dst_y;
15815
      uint8_t v_src[1];
15816
      uint8_t v_c8;
15817
    } s_do_decode_frame;
15818
  } private_data;
15819
15820
#ifdef __cplusplus
15821
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15822
  using unique_ptr = std::unique_ptr<wuffs_wbmp__decoder, wuffs_unique_ptr_deleter>;
15823
15824
  // On failure, the alloc_etc functions return nullptr. They don't throw.
15825
15826
  static inline unique_ptr
15827
  alloc() {
15828
    return unique_ptr(wuffs_wbmp__decoder__alloc());
15829
  }
15830
15831
  static inline wuffs_base__image_decoder::unique_ptr
15832
  alloc_as__wuffs_base__image_decoder() {
15833
    return wuffs_base__image_decoder::unique_ptr(
15834
        wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder());
15835
  }
15836
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
15837
15838
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15839
  // Disallow constructing or copying an object via standard C++ mechanisms,
15840
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
15841
  // size and field layout is not part of the public, stable, memory-safe API.
15842
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
15843
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
15844
  // their first argument) rather than tweaking bar.private_impl.qux fields.
15845
  //
15846
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
15847
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
15848
  // order to provide convenience methods. These forward on "this", so that you
15849
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
15850
  wuffs_wbmp__decoder__struct() = delete;
15851
  wuffs_wbmp__decoder__struct(const wuffs_wbmp__decoder__struct&) = delete;
15852
  wuffs_wbmp__decoder__struct& operator=(
15853
      const wuffs_wbmp__decoder__struct&) = delete;
15854
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
15855
15856
#if !defined(WUFFS_IMPLEMENTATION)
15857
  // As above, the size of the struct is not part of the public API, and unless
15858
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
15859
  // allocated, not stack allocated. Its size is not intended to be known at
15860
  // compile time, but it is unfortunately divulged as a side effect of
15861
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
15862
  // instead of "sizeof T", invoking the operator. To make the two values
15863
  // different, so that passing the latter will be rejected by the initialize
15864
  // function, we add an arbitrary amount of dead weight.
15865
  uint8_t dead_weight[123000000];  // 123 MB.
15866
#endif  // !defined(WUFFS_IMPLEMENTATION)
15867
15868
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
15869
  initialize(
15870
      size_t sizeof_star_self,
15871
      uint64_t wuffs_version,
15872
      uint32_t options) {
15873
    return wuffs_wbmp__decoder__initialize(
15874
        this, sizeof_star_self, wuffs_version, options);
15875
  }
15876
15877
  inline wuffs_base__image_decoder*
15878
  upcast_as__wuffs_base__image_decoder() {
15879
    return (wuffs_base__image_decoder*)this;
15880
  }
15881
15882
  inline uint64_t
15883
  get_quirk(
15884
      uint32_t a_key) const {
15885
    return wuffs_wbmp__decoder__get_quirk(this, a_key);
15886
  }
15887
15888
  inline wuffs_base__status
15889
  set_quirk(
15890
      uint32_t a_key,
15891
      uint64_t a_value) {
15892
    return wuffs_wbmp__decoder__set_quirk(this, a_key, a_value);
15893
  }
15894
15895
  inline wuffs_base__status
15896
  decode_image_config(
15897
      wuffs_base__image_config* a_dst,
15898
      wuffs_base__io_buffer* a_src) {
15899
    return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src);
15900
  }
15901
15902
  inline wuffs_base__status
15903
  decode_frame_config(
15904
      wuffs_base__frame_config* a_dst,
15905
      wuffs_base__io_buffer* a_src) {
15906
    return wuffs_wbmp__decoder__decode_frame_config(this, a_dst, a_src);
15907
  }
15908
15909
  inline wuffs_base__status
15910
  decode_frame(
15911
      wuffs_base__pixel_buffer* a_dst,
15912
      wuffs_base__io_buffer* a_src,
15913
      wuffs_base__pixel_blend a_blend,
15914
      wuffs_base__slice_u8 a_workbuf,
15915
      wuffs_base__decode_frame_options* a_opts) {
15916
    return wuffs_wbmp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
15917
  }
15918
15919
  inline wuffs_base__rect_ie_u32
15920
  frame_dirty_rect() const {
15921
    return wuffs_wbmp__decoder__frame_dirty_rect(this);
15922
  }
15923
15924
  inline uint32_t
15925
  num_animation_loops() const {
15926
    return wuffs_wbmp__decoder__num_animation_loops(this);
15927
  }
15928
15929
  inline uint64_t
15930
  num_decoded_frame_configs() const {
15931
    return wuffs_wbmp__decoder__num_decoded_frame_configs(this);
15932
  }
15933
15934
  inline uint64_t
15935
  num_decoded_frames() const {
15936
    return wuffs_wbmp__decoder__num_decoded_frames(this);
15937
  }
15938
15939
  inline wuffs_base__status
15940
  restart_frame(
15941
      uint64_t a_index,
15942
      uint64_t a_io_position) {
15943
    return wuffs_wbmp__decoder__restart_frame(this, a_index, a_io_position);
15944
  }
15945
15946
  inline wuffs_base__empty_struct
15947
  set_report_metadata(
15948
      uint32_t a_fourcc,
15949
      bool a_report) {
15950
    return wuffs_wbmp__decoder__set_report_metadata(this, a_fourcc, a_report);
15951
  }
15952
15953
  inline wuffs_base__status
15954
  tell_me_more(
15955
      wuffs_base__io_buffer* a_dst,
15956
      wuffs_base__more_information* a_minfo,
15957
      wuffs_base__io_buffer* a_src) {
15958
    return wuffs_wbmp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
15959
  }
15960
15961
  inline wuffs_base__range_ii_u64
15962
  workbuf_len() const {
15963
    return wuffs_wbmp__decoder__workbuf_len(this);
15964
  }
15965
15966
#endif  // __cplusplus
15967
};  // struct wuffs_wbmp__decoder__struct
15968
15969
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
15970
15971
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP) || defined(WUFFS_NONMONOLITHIC)
15972
15973
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
15974
15975
// ---------------- Status Codes
15976
15977
extern const char wuffs_webp__error__bad_huffman_code_over_subscribed[];
15978
extern const char wuffs_webp__error__bad_huffman_code_under_subscribed[];
15979
extern const char wuffs_webp__error__bad_huffman_code[];
15980
extern const char wuffs_webp__error__bad_back_reference[];
15981
extern const char wuffs_webp__error__bad_color_cache[];
15982
extern const char wuffs_webp__error__bad_header[];
15983
extern const char wuffs_webp__error__bad_transform[];
15984
extern const char wuffs_webp__error__short_chunk[];
15985
extern const char wuffs_webp__error__truncated_input[];
15986
extern const char wuffs_webp__error__unsupported_number_of_huffman_groups[];
15987
extern const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[];
15988
extern const char wuffs_webp__error__unsupported_webp_file[];
15989
15990
// ---------------- Public Consts
15991
15992
#define WUFFS_WEBP__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 0u
15993
15994
// ---------------- Struct Declarations
15995
15996
typedef struct wuffs_webp__decoder__struct wuffs_webp__decoder;
15997
15998
#ifdef __cplusplus
15999
extern "C" {
16000
#endif
16001
16002
// ---------------- Public Initializer Prototypes
16003
16004
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16005
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16006
//
16007
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16008
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16009
16010
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16011
wuffs_webp__decoder__initialize(
16012
    wuffs_webp__decoder* self,
16013
    size_t sizeof_star_self,
16014
    uint64_t wuffs_version,
16015
    uint32_t options);
16016
16017
size_t
16018
sizeof__wuffs_webp__decoder(void);
16019
16020
// ---------------- Allocs
16021
16022
// These functions allocate and initialize Wuffs structs. They return NULL if
16023
// memory allocation fails. If they return non-NULL, there is no need to call
16024
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16025
// calling free on the returned pointer. That pointer is effectively a C++
16026
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16027
16028
wuffs_webp__decoder*
16029
wuffs_webp__decoder__alloc(void);
16030
16031
static inline wuffs_base__image_decoder*
16032
wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder(void) {
16033
  return (wuffs_base__image_decoder*)(wuffs_webp__decoder__alloc());
16034
}
16035
16036
// ---------------- Upcasts
16037
16038
static inline wuffs_base__image_decoder*
16039
wuffs_webp__decoder__upcast_as__wuffs_base__image_decoder(
16040
    wuffs_webp__decoder* p) {
16041
  return (wuffs_base__image_decoder*)p;
16042
}
16043
16044
// ---------------- Public Function Prototypes
16045
16046
WUFFS_BASE__GENERATED_C_CODE
16047
WUFFS_BASE__MAYBE_STATIC uint64_t
16048
wuffs_webp__decoder__get_quirk(
16049
    const wuffs_webp__decoder* self,
16050
    uint32_t a_key);
16051
16052
WUFFS_BASE__GENERATED_C_CODE
16053
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16054
wuffs_webp__decoder__set_quirk(
16055
    wuffs_webp__decoder* self,
16056
    uint32_t a_key,
16057
    uint64_t a_value);
16058
16059
WUFFS_BASE__GENERATED_C_CODE
16060
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16061
wuffs_webp__decoder__decode_image_config(
16062
    wuffs_webp__decoder* self,
16063
    wuffs_base__image_config* a_dst,
16064
    wuffs_base__io_buffer* a_src);
16065
16066
WUFFS_BASE__GENERATED_C_CODE
16067
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16068
wuffs_webp__decoder__decode_frame_config(
16069
    wuffs_webp__decoder* self,
16070
    wuffs_base__frame_config* a_dst,
16071
    wuffs_base__io_buffer* a_src);
16072
16073
WUFFS_BASE__GENERATED_C_CODE
16074
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16075
wuffs_webp__decoder__decode_frame(
16076
    wuffs_webp__decoder* self,
16077
    wuffs_base__pixel_buffer* a_dst,
16078
    wuffs_base__io_buffer* a_src,
16079
    wuffs_base__pixel_blend a_blend,
16080
    wuffs_base__slice_u8 a_workbuf,
16081
    wuffs_base__decode_frame_options* a_opts);
16082
16083
WUFFS_BASE__GENERATED_C_CODE
16084
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
16085
wuffs_webp__decoder__frame_dirty_rect(
16086
    const wuffs_webp__decoder* self);
16087
16088
WUFFS_BASE__GENERATED_C_CODE
16089
WUFFS_BASE__MAYBE_STATIC uint32_t
16090
wuffs_webp__decoder__num_animation_loops(
16091
    const wuffs_webp__decoder* self);
16092
16093
WUFFS_BASE__GENERATED_C_CODE
16094
WUFFS_BASE__MAYBE_STATIC uint64_t
16095
wuffs_webp__decoder__num_decoded_frame_configs(
16096
    const wuffs_webp__decoder* self);
16097
16098
WUFFS_BASE__GENERATED_C_CODE
16099
WUFFS_BASE__MAYBE_STATIC uint64_t
16100
wuffs_webp__decoder__num_decoded_frames(
16101
    const wuffs_webp__decoder* self);
16102
16103
WUFFS_BASE__GENERATED_C_CODE
16104
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16105
wuffs_webp__decoder__restart_frame(
16106
    wuffs_webp__decoder* self,
16107
    uint64_t a_index,
16108
    uint64_t a_io_position);
16109
16110
WUFFS_BASE__GENERATED_C_CODE
16111
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16112
wuffs_webp__decoder__set_report_metadata(
16113
    wuffs_webp__decoder* self,
16114
    uint32_t a_fourcc,
16115
    bool a_report);
16116
16117
WUFFS_BASE__GENERATED_C_CODE
16118
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16119
wuffs_webp__decoder__tell_me_more(
16120
    wuffs_webp__decoder* self,
16121
    wuffs_base__io_buffer* a_dst,
16122
    wuffs_base__more_information* a_minfo,
16123
    wuffs_base__io_buffer* a_src);
16124
16125
WUFFS_BASE__GENERATED_C_CODE
16126
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
16127
wuffs_webp__decoder__workbuf_len(
16128
    const wuffs_webp__decoder* self);
16129
16130
#ifdef __cplusplus
16131
}  // extern "C"
16132
#endif
16133
16134
// ---------------- Struct Definitions
16135
16136
// These structs' fields, and the sizeof them, are private implementation
16137
// details that aren't guaranteed to be stable across Wuffs versions.
16138
//
16139
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16140
16141
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16142
16143
struct wuffs_webp__decoder__struct {
16144
  // Do not access the private_impl's or private_data's fields directly. There
16145
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16146
  // the wuffs_foo__bar__baz functions.
16147
  //
16148
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16149
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16150
16151
  struct {
16152
    uint32_t magic;
16153
    uint32_t active_coroutine;
16154
    wuffs_base__vtable vtable_for__wuffs_base__image_decoder;
16155
    wuffs_base__vtable null_vtable;
16156
16157
    uint32_t f_pixfmt;
16158
    uint32_t f_width;
16159
    uint32_t f_height;
16160
    uint8_t f_call_sequence;
16161
    uint8_t f_code_length_code_lengths[19];
16162
    bool f_sub_chunk_has_padding;
16163
    bool f_is_vp8_lossy;
16164
    uint64_t f_frame_config_io_position;
16165
    uint32_t f_riff_chunk_length;
16166
    uint32_t f_sub_chunk_length;
16167
    uint32_t f_bits;
16168
    uint32_t f_n_bits;
16169
    bool f_seen_transform[4];
16170
    uint8_t f_transform_type[4];
16171
    uint8_t f_transform_tile_size_log2[4];
16172
    uint32_t f_n_transforms;
16173
    uint32_t f_color_cache_bits;
16174
    uint32_t f_overall_color_cache_bits;
16175
    uint32_t f_overall_tile_size_log2;
16176
    uint32_t f_overall_n_huffman_groups;
16177
    uint32_t f_ht_n_symbols;
16178
    uint32_t f_ht_code_lengths_remaining;
16179
    uint32_t f_color_indexing_palette_size;
16180
    uint32_t f_color_indexing_width;
16181
    uint32_t f_workbuf_offset_for_transform[4];
16182
    uint32_t f_workbuf_offset_for_color_indexing;
16183
    wuffs_base__pixel_swizzler f_swizzler;
16184
16185
    uint32_t p_decode_huffman_groups;
16186
    uint32_t p_decode_huffman_tree;
16187
    uint32_t p_decode_huffman_tree_simple;
16188
    uint32_t p_decode_code_length_code_lengths;
16189
    uint32_t p_build_code_lengths;
16190
    uint32_t p_decode_pixels_slow;
16191
    uint32_t p_decode_image_config;
16192
    uint32_t p_do_decode_image_config;
16193
    uint32_t p_do_decode_image_config_limited;
16194
    uint32_t p_do_decode_image_config_limited_vp8l;
16195
    uint32_t p_decode_frame_config;
16196
    uint32_t p_do_decode_frame_config;
16197
    uint32_t p_decode_frame;
16198
    uint32_t p_do_decode_frame;
16199
    uint32_t p_decode_transform;
16200
    uint32_t p_decode_color_cache_parameters;
16201
    uint32_t p_decode_hg_table;
16202
    uint32_t p_decode_pixels;
16203
  } private_impl;
16204
16205
  struct {
16206
    wuffs_vp8__decoder f_vp8;
16207
    uint8_t f_palette[1024];
16208
    uint32_t f_color_cache[2048];
16209
    uint16_t f_codes[2328];
16210
    uint16_t f_code_lengths[2328];
16211
    uint16_t f_code_lengths_huffman_nodes[37];
16212
    uint16_t f_huffman_nodes[256][6267];
16213
16214
    struct {
16215
      uint32_t v_hg;
16216
      uint32_t v_ht;
16217
    } s_decode_huffman_groups;
16218
    struct {
16219
      uint32_t v_use_second_symbol;
16220
      uint32_t v_first_symbol_n_bits;
16221
      uint32_t v_symbol0;
16222
      uint32_t v_base_offset;
16223
    } s_decode_huffman_tree_simple;
16224
    struct {
16225
      uint32_t v_n_codes;
16226
      uint32_t v_i;
16227
    } s_decode_code_length_code_lengths;
16228
    struct {
16229
      uint32_t v_length_n_bits;
16230
      uint16_t v_prev_code_length;
16231
      uint32_t v_s;
16232
      uint32_t v_s_max;
16233
      uint16_t v_node;
16234
      uint16_t v_repeat_value;
16235
      uint32_t v_repeat_n_bits;
16236
    } s_build_code_lengths;
16237
    struct {
16238
      uint64_t v_p;
16239
      uint64_t v_p_max;
16240
      uint32_t v_tile_size_log2;
16241
      uint32_t v_width_in_tiles;
16242
      uint32_t v_x;
16243
      uint32_t v_y;
16244
      uint32_t v_hg;
16245
      uint16_t v_node;
16246
      uint32_t v_color;
16247
      uint32_t v_back_ref_len_n_bits;
16248
      uint32_t v_back_ref_len_minus_1;
16249
      uint32_t v_back_ref_dist_n_bits;
16250
      uint32_t v_back_ref_dist_premap_minus_1;
16251
      uint64_t v_color_cache_p;
16252
    } s_decode_pixels_slow;
16253
    struct {
16254
      uint64_t scratch;
16255
    } s_do_decode_image_config;
16256
    struct {
16257
      uint64_t scratch;
16258
    } s_do_decode_image_config_limited;
16259
    struct {
16260
      uint64_t scratch;
16261
    } s_do_decode_image_config_limited_vp8l;
16262
    struct {
16263
      uint32_t v_width;
16264
    } s_do_decode_frame;
16265
    struct {
16266
      uint32_t v_transform_type;
16267
      uint32_t v_tile_size_log2;
16268
    } s_decode_transform;
16269
    struct {
16270
      uint32_t v_tile_size_log2;
16271
    } s_decode_hg_table;
16272
  } private_data;
16273
16274
#ifdef __cplusplus
16275
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16276
  using unique_ptr = std::unique_ptr<wuffs_webp__decoder, wuffs_unique_ptr_deleter>;
16277
16278
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16279
16280
  static inline unique_ptr
16281
  alloc() {
16282
    return unique_ptr(wuffs_webp__decoder__alloc());
16283
  }
16284
16285
  static inline wuffs_base__image_decoder::unique_ptr
16286
  alloc_as__wuffs_base__image_decoder() {
16287
    return wuffs_base__image_decoder::unique_ptr(
16288
        wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder());
16289
  }
16290
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16291
16292
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16293
  // Disallow constructing or copying an object via standard C++ mechanisms,
16294
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16295
  // size and field layout is not part of the public, stable, memory-safe API.
16296
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16297
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16298
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16299
  //
16300
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16301
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16302
  // order to provide convenience methods. These forward on "this", so that you
16303
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16304
  wuffs_webp__decoder__struct() = delete;
16305
  wuffs_webp__decoder__struct(const wuffs_webp__decoder__struct&) = delete;
16306
  wuffs_webp__decoder__struct& operator=(
16307
      const wuffs_webp__decoder__struct&) = delete;
16308
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16309
16310
#if !defined(WUFFS_IMPLEMENTATION)
16311
  // As above, the size of the struct is not part of the public API, and unless
16312
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16313
  // allocated, not stack allocated. Its size is not intended to be known at
16314
  // compile time, but it is unfortunately divulged as a side effect of
16315
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16316
  // instead of "sizeof T", invoking the operator. To make the two values
16317
  // different, so that passing the latter will be rejected by the initialize
16318
  // function, we add an arbitrary amount of dead weight.
16319
  uint8_t dead_weight[123000000];  // 123 MB.
16320
#endif  // !defined(WUFFS_IMPLEMENTATION)
16321
16322
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16323
  initialize(
16324
      size_t sizeof_star_self,
16325
      uint64_t wuffs_version,
16326
      uint32_t options) {
16327
    return wuffs_webp__decoder__initialize(
16328
        this, sizeof_star_self, wuffs_version, options);
16329
  }
16330
16331
  inline wuffs_base__image_decoder*
16332
  upcast_as__wuffs_base__image_decoder() {
16333
    return (wuffs_base__image_decoder*)this;
16334
  }
16335
16336
  inline uint64_t
16337
  get_quirk(
16338
      uint32_t a_key) const {
16339
    return wuffs_webp__decoder__get_quirk(this, a_key);
16340
  }
16341
16342
  inline wuffs_base__status
16343
  set_quirk(
16344
      uint32_t a_key,
16345
      uint64_t a_value) {
16346
    return wuffs_webp__decoder__set_quirk(this, a_key, a_value);
16347
  }
16348
16349
  inline wuffs_base__status
16350
  decode_image_config(
16351
      wuffs_base__image_config* a_dst,
16352
      wuffs_base__io_buffer* a_src) {
16353
    return wuffs_webp__decoder__decode_image_config(this, a_dst, a_src);
16354
  }
16355
16356
  inline wuffs_base__status
16357
  decode_frame_config(
16358
      wuffs_base__frame_config* a_dst,
16359
      wuffs_base__io_buffer* a_src) {
16360
    return wuffs_webp__decoder__decode_frame_config(this, a_dst, a_src);
16361
  }
16362
16363
  inline wuffs_base__status
16364
  decode_frame(
16365
      wuffs_base__pixel_buffer* a_dst,
16366
      wuffs_base__io_buffer* a_src,
16367
      wuffs_base__pixel_blend a_blend,
16368
      wuffs_base__slice_u8 a_workbuf,
16369
      wuffs_base__decode_frame_options* a_opts) {
16370
    return wuffs_webp__decoder__decode_frame(this, a_dst, a_src, a_blend, a_workbuf, a_opts);
16371
  }
16372
16373
  inline wuffs_base__rect_ie_u32
16374
  frame_dirty_rect() const {
16375
    return wuffs_webp__decoder__frame_dirty_rect(this);
16376
  }
16377
16378
  inline uint32_t
16379
  num_animation_loops() const {
16380
    return wuffs_webp__decoder__num_animation_loops(this);
16381
  }
16382
16383
  inline uint64_t
16384
  num_decoded_frame_configs() const {
16385
    return wuffs_webp__decoder__num_decoded_frame_configs(this);
16386
  }
16387
16388
  inline uint64_t
16389
  num_decoded_frames() const {
16390
    return wuffs_webp__decoder__num_decoded_frames(this);
16391
  }
16392
16393
  inline wuffs_base__status
16394
  restart_frame(
16395
      uint64_t a_index,
16396
      uint64_t a_io_position) {
16397
    return wuffs_webp__decoder__restart_frame(this, a_index, a_io_position);
16398
  }
16399
16400
  inline wuffs_base__empty_struct
16401
  set_report_metadata(
16402
      uint32_t a_fourcc,
16403
      bool a_report) {
16404
    return wuffs_webp__decoder__set_report_metadata(this, a_fourcc, a_report);
16405
  }
16406
16407
  inline wuffs_base__status
16408
  tell_me_more(
16409
      wuffs_base__io_buffer* a_dst,
16410
      wuffs_base__more_information* a_minfo,
16411
      wuffs_base__io_buffer* a_src) {
16412
    return wuffs_webp__decoder__tell_me_more(this, a_dst, a_minfo, a_src);
16413
  }
16414
16415
  inline wuffs_base__range_ii_u64
16416
  workbuf_len() const {
16417
    return wuffs_webp__decoder__workbuf_len(this);
16418
  }
16419
16420
#endif  // __cplusplus
16421
};  // struct wuffs_webp__decoder__struct
16422
16423
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16424
16425
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP) || defined(WUFFS_NONMONOLITHIC)
16426
16427
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
16428
16429
// ---------------- Status Codes
16430
16431
// ---------------- Public Consts
16432
16433
// ---------------- Struct Declarations
16434
16435
typedef struct wuffs_xxhash32__hasher__struct wuffs_xxhash32__hasher;
16436
16437
#ifdef __cplusplus
16438
extern "C" {
16439
#endif
16440
16441
// ---------------- Public Initializer Prototypes
16442
16443
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16444
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16445
//
16446
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16447
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16448
16449
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16450
wuffs_xxhash32__hasher__initialize(
16451
    wuffs_xxhash32__hasher* self,
16452
    size_t sizeof_star_self,
16453
    uint64_t wuffs_version,
16454
    uint32_t options);
16455
16456
size_t
16457
sizeof__wuffs_xxhash32__hasher(void);
16458
16459
// ---------------- Allocs
16460
16461
// These functions allocate and initialize Wuffs structs. They return NULL if
16462
// memory allocation fails. If they return non-NULL, there is no need to call
16463
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16464
// calling free on the returned pointer. That pointer is effectively a C++
16465
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16466
16467
wuffs_xxhash32__hasher*
16468
wuffs_xxhash32__hasher__alloc(void);
16469
16470
static inline wuffs_base__hasher_u32*
16471
wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32(void) {
16472
  return (wuffs_base__hasher_u32*)(wuffs_xxhash32__hasher__alloc());
16473
}
16474
16475
// ---------------- Upcasts
16476
16477
static inline wuffs_base__hasher_u32*
16478
wuffs_xxhash32__hasher__upcast_as__wuffs_base__hasher_u32(
16479
    wuffs_xxhash32__hasher* p) {
16480
  return (wuffs_base__hasher_u32*)p;
16481
}
16482
16483
// ---------------- Public Function Prototypes
16484
16485
WUFFS_BASE__GENERATED_C_CODE
16486
WUFFS_BASE__MAYBE_STATIC uint64_t
16487
wuffs_xxhash32__hasher__get_quirk(
16488
    const wuffs_xxhash32__hasher* self,
16489
    uint32_t a_key);
16490
16491
WUFFS_BASE__GENERATED_C_CODE
16492
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16493
wuffs_xxhash32__hasher__set_quirk(
16494
    wuffs_xxhash32__hasher* self,
16495
    uint32_t a_key,
16496
    uint64_t a_value);
16497
16498
WUFFS_BASE__GENERATED_C_CODE
16499
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16500
wuffs_xxhash32__hasher__update(
16501
    wuffs_xxhash32__hasher* self,
16502
    wuffs_base__slice_u8 a_x);
16503
16504
WUFFS_BASE__GENERATED_C_CODE
16505
WUFFS_BASE__MAYBE_STATIC uint32_t
16506
wuffs_xxhash32__hasher__update_u32(
16507
    wuffs_xxhash32__hasher* self,
16508
    wuffs_base__slice_u8 a_x);
16509
16510
WUFFS_BASE__GENERATED_C_CODE
16511
WUFFS_BASE__MAYBE_STATIC uint32_t
16512
wuffs_xxhash32__hasher__checksum_u32(
16513
    const wuffs_xxhash32__hasher* self);
16514
16515
#ifdef __cplusplus
16516
}  // extern "C"
16517
#endif
16518
16519
// ---------------- Struct Definitions
16520
16521
// These structs' fields, and the sizeof them, are private implementation
16522
// details that aren't guaranteed to be stable across Wuffs versions.
16523
//
16524
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16525
16526
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16527
16528
struct wuffs_xxhash32__hasher__struct {
16529
  // Do not access the private_impl's or private_data's fields directly. There
16530
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16531
  // the wuffs_foo__bar__baz functions.
16532
  //
16533
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16534
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16535
16536
  struct {
16537
    uint32_t magic;
16538
    uint32_t active_coroutine;
16539
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u32;
16540
    wuffs_base__vtable null_vtable;
16541
16542
    uint32_t f_length_modulo_u32;
16543
    bool f_length_overflows_u32;
16544
    uint8_t f_padding0;
16545
    uint8_t f_padding1;
16546
    uint8_t f_buf_len;
16547
    uint8_t f_buf_data[16];
16548
    uint32_t f_v0;
16549
    uint32_t f_v1;
16550
    uint32_t f_v2;
16551
    uint32_t f_v3;
16552
  } private_impl;
16553
16554
#ifdef __cplusplus
16555
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16556
  using unique_ptr = std::unique_ptr<wuffs_xxhash32__hasher, wuffs_unique_ptr_deleter>;
16557
16558
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16559
16560
  static inline unique_ptr
16561
  alloc() {
16562
    return unique_ptr(wuffs_xxhash32__hasher__alloc());
16563
  }
16564
16565
  static inline wuffs_base__hasher_u32::unique_ptr
16566
  alloc_as__wuffs_base__hasher_u32() {
16567
    return wuffs_base__hasher_u32::unique_ptr(
16568
        wuffs_xxhash32__hasher__alloc_as__wuffs_base__hasher_u32());
16569
  }
16570
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16571
16572
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16573
  // Disallow constructing or copying an object via standard C++ mechanisms,
16574
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16575
  // size and field layout is not part of the public, stable, memory-safe API.
16576
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16577
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16578
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16579
  //
16580
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16581
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16582
  // order to provide convenience methods. These forward on "this", so that you
16583
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16584
  wuffs_xxhash32__hasher__struct() = delete;
16585
  wuffs_xxhash32__hasher__struct(const wuffs_xxhash32__hasher__struct&) = delete;
16586
  wuffs_xxhash32__hasher__struct& operator=(
16587
      const wuffs_xxhash32__hasher__struct&) = delete;
16588
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16589
16590
#if !defined(WUFFS_IMPLEMENTATION)
16591
  // As above, the size of the struct is not part of the public API, and unless
16592
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16593
  // allocated, not stack allocated. Its size is not intended to be known at
16594
  // compile time, but it is unfortunately divulged as a side effect of
16595
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16596
  // instead of "sizeof T", invoking the operator. To make the two values
16597
  // different, so that passing the latter will be rejected by the initialize
16598
  // function, we add an arbitrary amount of dead weight.
16599
  uint8_t dead_weight[123000000];  // 123 MB.
16600
#endif  // !defined(WUFFS_IMPLEMENTATION)
16601
16602
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16603
  initialize(
16604
      size_t sizeof_star_self,
16605
      uint64_t wuffs_version,
16606
      uint32_t options) {
16607
    return wuffs_xxhash32__hasher__initialize(
16608
        this, sizeof_star_self, wuffs_version, options);
16609
  }
16610
16611
  inline wuffs_base__hasher_u32*
16612
  upcast_as__wuffs_base__hasher_u32() {
16613
    return (wuffs_base__hasher_u32*)this;
16614
  }
16615
16616
  inline uint64_t
16617
  get_quirk(
16618
      uint32_t a_key) const {
16619
    return wuffs_xxhash32__hasher__get_quirk(this, a_key);
16620
  }
16621
16622
  inline wuffs_base__status
16623
  set_quirk(
16624
      uint32_t a_key,
16625
      uint64_t a_value) {
16626
    return wuffs_xxhash32__hasher__set_quirk(this, a_key, a_value);
16627
  }
16628
16629
  inline wuffs_base__empty_struct
16630
  update(
16631
      wuffs_base__slice_u8 a_x) {
16632
    return wuffs_xxhash32__hasher__update(this, a_x);
16633
  }
16634
16635
  inline uint32_t
16636
  update_u32(
16637
      wuffs_base__slice_u8 a_x) {
16638
    return wuffs_xxhash32__hasher__update_u32(this, a_x);
16639
  }
16640
16641
  inline uint32_t
16642
  checksum_u32() const {
16643
    return wuffs_xxhash32__hasher__checksum_u32(this);
16644
  }
16645
16646
#endif  // __cplusplus
16647
};  // struct wuffs_xxhash32__hasher__struct
16648
16649
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16650
16651
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32) || defined(WUFFS_NONMONOLITHIC)
16652
16653
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16654
16655
// ---------------- Status Codes
16656
16657
// ---------------- Public Consts
16658
16659
// ---------------- Struct Declarations
16660
16661
typedef struct wuffs_xxhash64__hasher__struct wuffs_xxhash64__hasher;
16662
16663
#ifdef __cplusplus
16664
extern "C" {
16665
#endif
16666
16667
// ---------------- Public Initializer Prototypes
16668
16669
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16670
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16671
//
16672
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16673
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16674
16675
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16676
wuffs_xxhash64__hasher__initialize(
16677
    wuffs_xxhash64__hasher* self,
16678
    size_t sizeof_star_self,
16679
    uint64_t wuffs_version,
16680
    uint32_t options);
16681
16682
size_t
16683
sizeof__wuffs_xxhash64__hasher(void);
16684
16685
// ---------------- Allocs
16686
16687
// These functions allocate and initialize Wuffs structs. They return NULL if
16688
// memory allocation fails. If they return non-NULL, there is no need to call
16689
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16690
// calling free on the returned pointer. That pointer is effectively a C++
16691
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16692
16693
wuffs_xxhash64__hasher*
16694
wuffs_xxhash64__hasher__alloc(void);
16695
16696
static inline wuffs_base__hasher_u64*
16697
wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64(void) {
16698
  return (wuffs_base__hasher_u64*)(wuffs_xxhash64__hasher__alloc());
16699
}
16700
16701
// ---------------- Upcasts
16702
16703
static inline wuffs_base__hasher_u64*
16704
wuffs_xxhash64__hasher__upcast_as__wuffs_base__hasher_u64(
16705
    wuffs_xxhash64__hasher* p) {
16706
  return (wuffs_base__hasher_u64*)p;
16707
}
16708
16709
// ---------------- Public Function Prototypes
16710
16711
WUFFS_BASE__GENERATED_C_CODE
16712
WUFFS_BASE__MAYBE_STATIC uint64_t
16713
wuffs_xxhash64__hasher__get_quirk(
16714
    const wuffs_xxhash64__hasher* self,
16715
    uint32_t a_key);
16716
16717
WUFFS_BASE__GENERATED_C_CODE
16718
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16719
wuffs_xxhash64__hasher__set_quirk(
16720
    wuffs_xxhash64__hasher* self,
16721
    uint32_t a_key,
16722
    uint64_t a_value);
16723
16724
WUFFS_BASE__GENERATED_C_CODE
16725
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
16726
wuffs_xxhash64__hasher__update(
16727
    wuffs_xxhash64__hasher* self,
16728
    wuffs_base__slice_u8 a_x);
16729
16730
WUFFS_BASE__GENERATED_C_CODE
16731
WUFFS_BASE__MAYBE_STATIC uint64_t
16732
wuffs_xxhash64__hasher__update_u64(
16733
    wuffs_xxhash64__hasher* self,
16734
    wuffs_base__slice_u8 a_x);
16735
16736
WUFFS_BASE__GENERATED_C_CODE
16737
WUFFS_BASE__MAYBE_STATIC uint64_t
16738
wuffs_xxhash64__hasher__checksum_u64(
16739
    const wuffs_xxhash64__hasher* self);
16740
16741
#ifdef __cplusplus
16742
}  // extern "C"
16743
#endif
16744
16745
// ---------------- Struct Definitions
16746
16747
// These structs' fields, and the sizeof them, are private implementation
16748
// details that aren't guaranteed to be stable across Wuffs versions.
16749
//
16750
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16751
16752
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16753
16754
struct wuffs_xxhash64__hasher__struct {
16755
  // Do not access the private_impl's or private_data's fields directly. There
16756
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
16757
  // the wuffs_foo__bar__baz functions.
16758
  //
16759
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
16760
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
16761
16762
  struct {
16763
    uint32_t magic;
16764
    uint32_t active_coroutine;
16765
    wuffs_base__vtable vtable_for__wuffs_base__hasher_u64;
16766
    wuffs_base__vtable null_vtable;
16767
16768
    uint64_t f_length_modulo_u64;
16769
    bool f_length_overflows_u64;
16770
    uint8_t f_padding0;
16771
    uint8_t f_padding1;
16772
    uint8_t f_padding2;
16773
    uint32_t f_buf_len;
16774
    uint8_t f_buf_data[32];
16775
    uint64_t f_v0;
16776
    uint64_t f_v1;
16777
    uint64_t f_v2;
16778
    uint64_t f_v3;
16779
  } private_impl;
16780
16781
#ifdef __cplusplus
16782
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16783
  using unique_ptr = std::unique_ptr<wuffs_xxhash64__hasher, wuffs_unique_ptr_deleter>;
16784
16785
  // On failure, the alloc_etc functions return nullptr. They don't throw.
16786
16787
  static inline unique_ptr
16788
  alloc() {
16789
    return unique_ptr(wuffs_xxhash64__hasher__alloc());
16790
  }
16791
16792
  static inline wuffs_base__hasher_u64::unique_ptr
16793
  alloc_as__wuffs_base__hasher_u64() {
16794
    return wuffs_base__hasher_u64::unique_ptr(
16795
        wuffs_xxhash64__hasher__alloc_as__wuffs_base__hasher_u64());
16796
  }
16797
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
16798
16799
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16800
  // Disallow constructing or copying an object via standard C++ mechanisms,
16801
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
16802
  // size and field layout is not part of the public, stable, memory-safe API.
16803
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
16804
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
16805
  // their first argument) rather than tweaking bar.private_impl.qux fields.
16806
  //
16807
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
16808
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
16809
  // order to provide convenience methods. These forward on "this", so that you
16810
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
16811
  wuffs_xxhash64__hasher__struct() = delete;
16812
  wuffs_xxhash64__hasher__struct(const wuffs_xxhash64__hasher__struct&) = delete;
16813
  wuffs_xxhash64__hasher__struct& operator=(
16814
      const wuffs_xxhash64__hasher__struct&) = delete;
16815
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
16816
16817
#if !defined(WUFFS_IMPLEMENTATION)
16818
  // As above, the size of the struct is not part of the public API, and unless
16819
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
16820
  // allocated, not stack allocated. Its size is not intended to be known at
16821
  // compile time, but it is unfortunately divulged as a side effect of
16822
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
16823
  // instead of "sizeof T", invoking the operator. To make the two values
16824
  // different, so that passing the latter will be rejected by the initialize
16825
  // function, we add an arbitrary amount of dead weight.
16826
  uint8_t dead_weight[123000000];  // 123 MB.
16827
#endif  // !defined(WUFFS_IMPLEMENTATION)
16828
16829
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16830
  initialize(
16831
      size_t sizeof_star_self,
16832
      uint64_t wuffs_version,
16833
      uint32_t options) {
16834
    return wuffs_xxhash64__hasher__initialize(
16835
        this, sizeof_star_self, wuffs_version, options);
16836
  }
16837
16838
  inline wuffs_base__hasher_u64*
16839
  upcast_as__wuffs_base__hasher_u64() {
16840
    return (wuffs_base__hasher_u64*)this;
16841
  }
16842
16843
  inline uint64_t
16844
  get_quirk(
16845
      uint32_t a_key) const {
16846
    return wuffs_xxhash64__hasher__get_quirk(this, a_key);
16847
  }
16848
16849
  inline wuffs_base__status
16850
  set_quirk(
16851
      uint32_t a_key,
16852
      uint64_t a_value) {
16853
    return wuffs_xxhash64__hasher__set_quirk(this, a_key, a_value);
16854
  }
16855
16856
  inline wuffs_base__empty_struct
16857
  update(
16858
      wuffs_base__slice_u8 a_x) {
16859
    return wuffs_xxhash64__hasher__update(this, a_x);
16860
  }
16861
16862
  inline uint64_t
16863
  update_u64(
16864
      wuffs_base__slice_u8 a_x) {
16865
    return wuffs_xxhash64__hasher__update_u64(this, a_x);
16866
  }
16867
16868
  inline uint64_t
16869
  checksum_u64() const {
16870
    return wuffs_xxhash64__hasher__checksum_u64(this);
16871
  }
16872
16873
#endif  // __cplusplus
16874
};  // struct wuffs_xxhash64__hasher__struct
16875
16876
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
16877
16878
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64) || defined(WUFFS_NONMONOLITHIC)
16879
16880
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
16881
16882
// ---------------- Status Codes
16883
16884
extern const char wuffs_xz__error__bad_bcj_offset[];
16885
extern const char wuffs_xz__error__bad_block_header[];
16886
extern const char wuffs_xz__error__bad_checksum[];
16887
extern const char wuffs_xz__error__bad_filter[];
16888
extern const char wuffs_xz__error__bad_footer[];
16889
extern const char wuffs_xz__error__bad_header[];
16890
extern const char wuffs_xz__error__bad_header_concatenated_stream[];
16891
extern const char wuffs_xz__error__bad_index[];
16892
extern const char wuffs_xz__error__bad_padding[];
16893
extern const char wuffs_xz__error__truncated_input[];
16894
extern const char wuffs_xz__error__unsupported_checksum_algorithm[];
16895
extern const char wuffs_xz__error__unsupported_filter[];
16896
extern const char wuffs_xz__error__unsupported_filter_combination[];
16897
16898
// ---------------- Public Consts
16899
16900
#define WUFFS_XZ__QUIRK_DECODE_STANDALONE_CONCATENATED_STREAMS 1963655168u
16901
16902
#define WUFFS_XZ__DECODER_DST_HISTORY_RETAIN_LENGTH_MAX_INCL_WORST_CASE 0u
16903
16904
#define WUFFS_XZ__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE 4294967568u
16905
16906
// ---------------- Struct Declarations
16907
16908
typedef struct wuffs_xz__decoder__struct wuffs_xz__decoder;
16909
16910
#ifdef __cplusplus
16911
extern "C" {
16912
#endif
16913
16914
// ---------------- Public Initializer Prototypes
16915
16916
// For any given "wuffs_foo__bar* self", "wuffs_foo__bar__initialize(self,
16917
// etc)" should be called before any other "wuffs_foo__bar__xxx(self, etc)".
16918
//
16919
// Pass sizeof(*self) and WUFFS_VERSION for sizeof_star_self and wuffs_version.
16920
// Pass 0 (or some combination of WUFFS_INITIALIZE__XXX) for options.
16921
16922
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
16923
wuffs_xz__decoder__initialize(
16924
    wuffs_xz__decoder* self,
16925
    size_t sizeof_star_self,
16926
    uint64_t wuffs_version,
16927
    uint32_t options);
16928
16929
size_t
16930
sizeof__wuffs_xz__decoder(void);
16931
16932
// ---------------- Allocs
16933
16934
// These functions allocate and initialize Wuffs structs. They return NULL if
16935
// memory allocation fails. If they return non-NULL, there is no need to call
16936
// wuffs_foo__bar__initialize, but the caller is responsible for eventually
16937
// calling free on the returned pointer. That pointer is effectively a C++
16938
// std::unique_ptr<T, wuffs_unique_ptr_deleter>.
16939
16940
wuffs_xz__decoder*
16941
wuffs_xz__decoder__alloc(void);
16942
16943
static inline wuffs_base__io_transformer*
16944
wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer(void) {
16945
  return (wuffs_base__io_transformer*)(wuffs_xz__decoder__alloc());
16946
}
16947
16948
// ---------------- Upcasts
16949
16950
static inline wuffs_base__io_transformer*
16951
wuffs_xz__decoder__upcast_as__wuffs_base__io_transformer(
16952
    wuffs_xz__decoder* p) {
16953
  return (wuffs_base__io_transformer*)p;
16954
}
16955
16956
// ---------------- Public Function Prototypes
16957
16958
WUFFS_BASE__GENERATED_C_CODE
16959
WUFFS_BASE__MAYBE_STATIC uint64_t
16960
wuffs_xz__decoder__get_quirk(
16961
    const wuffs_xz__decoder* self,
16962
    uint32_t a_key);
16963
16964
WUFFS_BASE__GENERATED_C_CODE
16965
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16966
wuffs_xz__decoder__set_quirk(
16967
    wuffs_xz__decoder* self,
16968
    uint32_t a_key,
16969
    uint64_t a_value);
16970
16971
WUFFS_BASE__GENERATED_C_CODE
16972
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
16973
wuffs_xz__decoder__dst_history_retain_length(
16974
    const wuffs_xz__decoder* self);
16975
16976
WUFFS_BASE__GENERATED_C_CODE
16977
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
16978
wuffs_xz__decoder__workbuf_len(
16979
    const wuffs_xz__decoder* self);
16980
16981
WUFFS_BASE__GENERATED_C_CODE
16982
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
16983
wuffs_xz__decoder__transform_io(
16984
    wuffs_xz__decoder* self,
16985
    wuffs_base__io_buffer* a_dst,
16986
    wuffs_base__io_buffer* a_src,
16987
    wuffs_base__slice_u8 a_workbuf);
16988
16989
#ifdef __cplusplus
16990
}  // extern "C"
16991
#endif
16992
16993
// ---------------- Struct Definitions
16994
16995
// These structs' fields, and the sizeof them, are private implementation
16996
// details that aren't guaranteed to be stable across Wuffs versions.
16997
//
16998
// See https://en.wikipedia.org/wiki/Opaque_pointer#C
16999
17000
#if defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
17001
17002
struct wuffs_xz__decoder__struct {
17003
  // Do not access the private_impl's or private_data's fields directly. There
17004
  // is no API/ABI compatibility or safety guarantee if you do so. Instead, use
17005
  // the wuffs_foo__bar__baz functions.
17006
  //
17007
  // It is a struct, not a struct*, so that the outermost wuffs_foo__bar struct
17008
  // can be stack allocated when WUFFS_IMPLEMENTATION is defined.
17009
17010
  struct {
17011
    uint32_t magic;
17012
    uint32_t active_coroutine;
17013
    wuffs_base__vtable vtable_for__wuffs_base__io_transformer;
17014
    wuffs_base__vtable null_vtable;
17015
17016
    uint32_t f_filters[3];
17017
    uint32_t f_num_non_final_filters;
17018
    uint8_t f_checksummer;
17019
    bool f_ignore_checksum;
17020
    bool f_standalone_format;
17021
    bool f_lzma_needs_reset;
17022
    bool f_block_has_compressed_size;
17023
    bool f_block_has_uncompressed_size;
17024
    uint8_t f_bcj_undo_index;
17025
    uint32_t f_bcj_pos;
17026
    uint32_t f_bcj_x86_prev_mask;
17027
    uint64_t f_block_compressed_size;
17028
    uint64_t f_block_uncompressed_size;
17029
    uint64_t f_compressed_size_for_index;
17030
    uint32_t f_verification_have_hashed_sizes[2];
17031
    uint32_t f_verification_want_hashed_sizes[2];
17032
    uint64_t f_verification_have_total_sizes[2];
17033
    uint64_t f_verification_want_total_sizes[2];
17034
    uint64_t f_num_actual_blocks;
17035
    uint64_t f_num_index_blocks;
17036
    uint64_t f_index_block_compressed_size;
17037
    uint64_t f_index_block_uncompressed_size;
17038
    uint64_t f_backwards_size;
17039
    bool f_started_verify_index;
17040
    uint16_t f_flags;
17041
17042
    uint8_t (*choosy_apply_non_final_filters)(
17043
        wuffs_xz__decoder* self,
17044
        wuffs_base__slice_u8 a_dst_slice);
17045
    uint32_t p_transform_io;
17046
    uint32_t p_do_transform_io;
17047
    uint32_t p_decode_block_header_with_padding;
17048
    uint32_t p_decode_block_header_sans_padding;
17049
    uint32_t p_verify_index;
17050
    uint32_t p_verify_footer;
17051
  } private_impl;
17052
17053
  struct {
17054
    uint8_t f_filter_data[3][256];
17055
    wuffs_crc32__ieee_hasher f_crc32;
17056
    wuffs_crc64__ecma_hasher f_crc64;
17057
    wuffs_sha256__hasher f_sha256;
17058
    wuffs_lzma__decoder f_lzma;
17059
17060
    struct {
17061
      uint32_t v_checksum32_have;
17062
      uint32_t v_checksum32_want;
17063
      wuffs_base__bitvec256 v_checksum256_have;
17064
      uint64_t v_compressed_size;
17065
      uint64_t v_uncompressed_size;
17066
      uint64_t scratch;
17067
    } s_do_transform_io;
17068
    struct {
17069
      uint64_t v_padded_size_have;
17070
      uint64_t v_padded_size_want;
17071
    } s_decode_block_header_with_padding;
17072
    struct {
17073
      uint8_t v_flags;
17074
      uint8_t v_filter_id;
17075
      uint32_t v_shift;
17076
      uint32_t v_f;
17077
      uint64_t scratch;
17078
    } s_decode_block_header_sans_padding;
17079
    struct {
17080
      uint32_t v_shift;
17081
    } s_verify_index;
17082
    struct {
17083
      uint64_t scratch;
17084
    } s_verify_footer;
17085
  } private_data;
17086
17087
#ifdef __cplusplus
17088
#if defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17089
  using unique_ptr = std::unique_ptr<wuffs_xz__decoder, wuffs_unique_ptr_deleter>;
17090
17091
  // On failure, the alloc_etc functions return nullptr. They don't throw.
17092
17093
  static inline unique_ptr
17094
  alloc() {
17095
    return unique_ptr(wuffs_xz__decoder__alloc());
17096
  }
17097
17098
  static inline wuffs_base__io_transformer::unique_ptr
17099
  alloc_as__wuffs_base__io_transformer() {
17100
    return wuffs_base__io_transformer::unique_ptr(
17101
        wuffs_xz__decoder__alloc_as__wuffs_base__io_transformer());
17102
  }
17103
#endif  // defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17104
17105
#if defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
17106
  // Disallow constructing or copying an object via standard C++ mechanisms,
17107
  // e.g. the "new" operator, as this struct is intentionally opaque. Its total
17108
  // size and field layout is not part of the public, stable, memory-safe API.
17109
  // Use malloc or memcpy and the sizeof__wuffs_foo__bar function instead, and
17110
  // call wuffs_foo__bar__baz methods (which all take a "this"-like pointer as
17111
  // their first argument) rather than tweaking bar.private_impl.qux fields.
17112
  //
17113
  // In C, we can just leave wuffs_foo__bar as an incomplete type (unless
17114
  // WUFFS_IMPLEMENTATION is #define'd). In C++, we define a complete type in
17115
  // order to provide convenience methods. These forward on "this", so that you
17116
  // can write "bar->baz(etc)" instead of "wuffs_foo__bar__baz(bar, etc)".
17117
  wuffs_xz__decoder__struct() = delete;
17118
  wuffs_xz__decoder__struct(const wuffs_xz__decoder__struct&) = delete;
17119
  wuffs_xz__decoder__struct& operator=(
17120
      const wuffs_xz__decoder__struct&) = delete;
17121
#endif  // defined(WUFFS_BASE__HAVE_EQ_DELETE) && !defined(WUFFS_IMPLEMENTATION)
17122
17123
#if !defined(WUFFS_IMPLEMENTATION)
17124
  // As above, the size of the struct is not part of the public API, and unless
17125
  // WUFFS_IMPLEMENTATION is #define'd, this struct type T should be heap
17126
  // allocated, not stack allocated. Its size is not intended to be known at
17127
  // compile time, but it is unfortunately divulged as a side effect of
17128
  // defining C++ convenience methods. Use "sizeof__T()", calling the function,
17129
  // instead of "sizeof T", invoking the operator. To make the two values
17130
  // different, so that passing the latter will be rejected by the initialize
17131
  // function, we add an arbitrary amount of dead weight.
17132
  uint8_t dead_weight[123000000];  // 123 MB.
17133
#endif  // !defined(WUFFS_IMPLEMENTATION)
17134
17135
  inline wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
17136
  initialize(
17137
      size_t sizeof_star_self,
17138
      uint64_t wuffs_version,
17139
      uint32_t options) {
17140
    return wuffs_xz__decoder__initialize(
17141
        this, sizeof_star_self, wuffs_version, options);
17142
  }
17143
17144
  inline wuffs_base__io_transformer*
17145
  upcast_as__wuffs_base__io_transformer() {
17146
    return (wuffs_base__io_transformer*)this;
17147
  }
17148
17149
  inline uint64_t
17150
  get_quirk(
17151
      uint32_t a_key) const {
17152
    return wuffs_xz__decoder__get_quirk(this, a_key);
17153
  }
17154
17155
  inline wuffs_base__status
17156
  set_quirk(
17157
      uint32_t a_key,
17158
      uint64_t a_value) {
17159
    return wuffs_xz__decoder__set_quirk(this, a_key, a_value);
17160
  }
17161
17162
  inline wuffs_base__optional_u63
17163
  dst_history_retain_length() const {
17164
    return wuffs_xz__decoder__dst_history_retain_length(this);
17165
  }
17166
17167
  inline wuffs_base__range_ii_u64
17168
  workbuf_len() const {
17169
    return wuffs_xz__decoder__workbuf_len(this);
17170
  }
17171
17172
  inline wuffs_base__status
17173
  transform_io(
17174
      wuffs_base__io_buffer* a_dst,
17175
      wuffs_base__io_buffer* a_src,
17176
      wuffs_base__slice_u8 a_workbuf) {
17177
    return wuffs_xz__decoder__transform_io(this, a_dst, a_src, a_workbuf);
17178
  }
17179
17180
#endif  // __cplusplus
17181
};  // struct wuffs_xz__decoder__struct
17182
17183
#endif  // defined(__cplusplus) || defined(WUFFS_IMPLEMENTATION)
17184
17185
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ) || defined(WUFFS_NONMONOLITHIC)
17186
17187
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17188
17189
// ---------------- Auxiliary - Base
17190
17191
// Auxiliary code is discussed at
17192
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
17193
17194
#include <stdio.h>
17195
17196
#include <string>
17197
#include <utility>
17198
17199
namespace wuffs_aux {
17200
17201
using IOBuffer = wuffs_base__io_buffer;
17202
17203
// MemOwner represents ownership of some memory. Dynamically allocated memory
17204
// (e.g. from malloc or new) is typically paired with free or delete, invoked
17205
// when the std::unique_ptr is destroyed. Statically allocated memory might use
17206
// MemOwner(nullptr, &free), even if that statically allocated memory is not
17207
// nullptr, since calling free(nullptr) is a no-op.
17208
using MemOwner = std::unique_ptr<void, decltype(&free)>;
17209
17210
using QuirkKeyValuePair = std::pair<uint32_t, uint64_t>;
17211
17212
namespace sync_io {
17213
17214
// --------
17215
17216
// DynIOBuffer is an IOBuffer that is backed by a dynamically sized byte array.
17217
// It owns that backing array and will free it in its destructor.
17218
//
17219
// The array size can be explicitly extended (by calling the grow method) but,
17220
// unlike a C++ std::vector, there is no implicit extension (e.g. by calling
17221
// std::vector::insert) and its maximum size is capped by the max_incl
17222
// constructor argument.
17223
//
17224
// It contains an IOBuffer-typed field whose reader side provides access to
17225
// previously written bytes and whose writer side provides access to the
17226
// allocated but not-yet-written-to slack space. For Go programmers, this slack
17227
// space is roughly analogous to the s[len(s):cap(s)] space of a slice s.
17228
class DynIOBuffer {
17229
 public:
17230
  enum GrowResult {
17231
    OK = 0,
17232
    FailedMaxInclExceeded = 1,
17233
    FailedOutOfMemory = 2,
17234
  };
17235
17236
  // m_buf holds the dynamically sized byte array and its read/write indexes:
17237
  //  - m_buf.meta.wi  is roughly analogous to a Go slice's length.
17238
  //  - m_buf.data.len is roughly analogous to a Go slice's capacity. It is
17239
  //    also equal to the m_buf.data.ptr malloc/realloc size.
17240
  //
17241
  // Users should not modify the m_buf.data.ptr or m_buf.data.len fields (as
17242
  // they are conceptually private to this class), but they can modify the
17243
  // bytes referenced by that pointer-length pair (e.g. compactions).
17244
  IOBuffer m_buf;
17245
17246
  // m_max_incl is an inclusive upper bound on the backing array size.
17247
  const uint64_t m_max_incl;
17248
17249
  // Constructor and destructor.
17250
  explicit DynIOBuffer(uint64_t max_incl);
17251
  ~DynIOBuffer();
17252
17253
  // Drop frees the byte array and resets m_buf. The DynIOBuffer can still be
17254
  // used after a drop call. It just restarts from zero.
17255
  void drop();
17256
17257
  // grow ensures that the byte array size is at least min_incl and at most
17258
  // max_incl. It returns FailedMaxInclExceeded if that would require
17259
  // allocating more than max_incl bytes, including the case where (min_incl >
17260
  // max_incl). It returns FailedOutOfMemory if memory allocation failed.
17261
  GrowResult grow(uint64_t min_incl);
17262
17263
 private:
17264
  // Delete the copy and assign constructors.
17265
  DynIOBuffer(const DynIOBuffer&) = delete;
17266
  DynIOBuffer& operator=(const DynIOBuffer&) = delete;
17267
17268
  static uint64_t round_up(uint64_t min_incl, uint64_t max_incl);
17269
};
17270
17271
// --------
17272
17273
class Input {
17274
 public:
17275
  virtual ~Input();
17276
17277
  virtual IOBuffer* BringsItsOwnIOBuffer();
17278
  virtual std::string CopyIn(IOBuffer* dst) = 0;
17279
};
17280
17281
// --------
17282
17283
// FileInput is an Input that reads from a file source.
17284
//
17285
// It does not take responsibility for closing the file when done.
17286
class FileInput : public Input {
17287
 public:
17288
  FileInput(FILE* f);
17289
17290
  virtual std::string CopyIn(IOBuffer* dst);
17291
17292
 private:
17293
  FILE* m_f;
17294
17295
  // Delete the copy and assign constructors.
17296
  FileInput(const FileInput&) = delete;
17297
  FileInput& operator=(const FileInput&) = delete;
17298
};
17299
17300
// --------
17301
17302
// MemoryInput is an Input that reads from an in-memory source.
17303
//
17304
// It does not take responsibility for freeing the memory when done.
17305
class MemoryInput : public Input {
17306
 public:
17307
  MemoryInput(const char* ptr, size_t len);
17308
  MemoryInput(const uint8_t* ptr, size_t len);
17309
17310
  virtual IOBuffer* BringsItsOwnIOBuffer();
17311
  virtual std::string CopyIn(IOBuffer* dst);
17312
17313
 private:
17314
  IOBuffer m_io;
17315
17316
  // Delete the copy and assign constructors.
17317
  MemoryInput(const MemoryInput&) = delete;
17318
  MemoryInput& operator=(const MemoryInput&) = delete;
17319
};
17320
17321
// --------
17322
17323
}  // namespace sync_io
17324
17325
}  // namespace wuffs_aux
17326
17327
// ---------------- Auxiliary - CBOR
17328
17329
namespace wuffs_aux {
17330
17331
struct DecodeCborResult {
17332
  DecodeCborResult(std::string&& error_message0, uint64_t cursor_position0);
17333
17334
  std::string error_message;
17335
  uint64_t cursor_position;
17336
};
17337
17338
class DecodeCborCallbacks {
17339
 public:
17340
  virtual ~DecodeCborCallbacks();
17341
17342
  // AppendXxx are called for leaf nodes: literals, numbers, strings, etc.
17343
17344
  virtual std::string AppendNull() = 0;
17345
  virtual std::string AppendUndefined() = 0;
17346
  virtual std::string AppendBool(bool val) = 0;
17347
  virtual std::string AppendF64(double val) = 0;
17348
  virtual std::string AppendI64(int64_t val) = 0;
17349
  virtual std::string AppendU64(uint64_t val) = 0;
17350
  virtual std::string AppendByteString(std::string&& val) = 0;
17351
  virtual std::string AppendTextString(std::string&& val) = 0;
17352
  virtual std::string AppendMinus1MinusX(uint64_t val) = 0;
17353
  virtual std::string AppendCborSimpleValue(uint8_t val) = 0;
17354
  virtual std::string AppendCborTag(uint64_t val) = 0;
17355
17356
  // Push and Pop are called for container nodes: CBOR arrays (lists) and CBOR
17357
  // maps (dictionaries).
17358
  //
17359
  // The flags bits combine exactly one of:
17360
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
17361
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
17362
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
17363
  // and exactly one of:
17364
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
17365
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
17366
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
17367
17368
  virtual std::string Push(uint32_t flags) = 0;
17369
  virtual std::string Pop(uint32_t flags) = 0;
17370
17371
  // Done is always the last Callback method called by DecodeCbor, whether or
17372
  // not parsing the input as CBOR encountered an error. Even when successful,
17373
  // trailing data may remain in input and buffer.
17374
  //
17375
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17376
  // as DecodeCbor may then de-allocate the backing array.
17377
  //
17378
  // The default Done implementation is a no-op.
17379
  virtual void  //
17380
  Done(DecodeCborResult& result, sync_io::Input& input, IOBuffer& buffer);
17381
};
17382
17383
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17384
// inner representations for several reasons:
17385
//  - It provides a home for the DefaultValue static method, for Foo callers
17386
//    that want to override some but not all optional arguments.
17387
//  - It provides the "Bar" name at Foo call sites, which can help self-
17388
//    document Foo calls with many arguemnts.
17389
//  - It provides some type safety against accidentally transposing or omitting
17390
//    adjacent fundamentally-numeric-typed optional arguments.
17391
17392
// DecodeCborArgQuirks wraps an optional argument to DecodeCbor.
17393
struct DecodeCborArgQuirks {
17394
  explicit DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
17395
                               const size_t len0);
17396
17397
  // DefaultValue returns an empty slice.
17398
  static DecodeCborArgQuirks DefaultValue();
17399
17400
  const QuirkKeyValuePair* ptr;
17401
  const size_t len;
17402
};
17403
17404
// DecodeCbor calls callbacks based on the CBOR-formatted data in input.
17405
//
17406
// On success, the returned error_message is empty and cursor_position counts
17407
// the number of bytes consumed. On failure, error_message is non-empty and
17408
// cursor_position is the location of the error. That error may be a content
17409
// error (invalid CBOR) or an input error (e.g. network failure).
17410
DecodeCborResult  //
17411
DecodeCbor(DecodeCborCallbacks& callbacks,
17412
           sync_io::Input& input,
17413
           DecodeCborArgQuirks quirks = DecodeCborArgQuirks::DefaultValue());
17414
17415
}  // namespace wuffs_aux
17416
17417
// ---------------- Auxiliary - Image
17418
17419
namespace wuffs_aux {
17420
17421
struct DecodeImageResult {
17422
  DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
17423
                    wuffs_base__pixel_buffer pixbuf0,
17424
                    std::string&& error_message0);
17425
  DecodeImageResult(std::string&& error_message0);
17426
17427
  MemOwner pixbuf_mem_owner;
17428
  wuffs_base__pixel_buffer pixbuf;
17429
  std::string error_message;
17430
};
17431
17432
// DecodeImageCallbacks are the callbacks given to DecodeImage. They are always
17433
// called in this order:
17434
//  1. SelectDecoder
17435
//  2. HandleMetadata
17436
//  3. SelectPixfmt
17437
//  4. AllocPixbuf
17438
//  5. AllocWorkbuf
17439
//  6. Done
17440
//
17441
// It may return early - the third callback might not be invoked if the second
17442
// one fails - but the final callback (Done) is always invoked.
17443
class DecodeImageCallbacks {
17444
 public:
17445
  // AllocPixbufResult holds a memory allocation (the result of malloc or new,
17446
  // a statically allocated pointer, etc), or an error message. The memory is
17447
  // de-allocated when mem_owner goes out of scope and is destroyed.
17448
  struct AllocPixbufResult {
17449
    AllocPixbufResult(MemOwner&& mem_owner0, wuffs_base__pixel_buffer pixbuf0);
17450
    AllocPixbufResult(std::string&& error_message0);
17451
17452
    MemOwner mem_owner;
17453
    wuffs_base__pixel_buffer pixbuf;
17454
    std::string error_message;
17455
  };
17456
17457
  // AllocWorkbufResult holds a memory allocation (the result of malloc or new,
17458
  // a statically allocated pointer, etc), or an error message. The memory is
17459
  // de-allocated when mem_owner goes out of scope and is destroyed.
17460
  struct AllocWorkbufResult {
17461
    AllocWorkbufResult(MemOwner&& mem_owner0, wuffs_base__slice_u8 workbuf0);
17462
    AllocWorkbufResult(std::string&& error_message0);
17463
17464
    MemOwner mem_owner;
17465
    wuffs_base__slice_u8 workbuf;
17466
    std::string error_message;
17467
  };
17468
17469
  virtual ~DecodeImageCallbacks();
17470
17471
  // SelectDecoder returns the image decoder for the input data's file format.
17472
  // Returning a nullptr means failure (DecodeImage_UnsupportedImageFormat).
17473
  //
17474
  // Common formats will have a FourCC value in the range [1 ..= 0x7FFF_FFFF],
17475
  // such as WUFFS_BASE__FOURCC__JPEG. A zero FourCC value means that Wuffs'
17476
  // standard library did not recognize the image format but if SelectDecoder
17477
  // was overridden, it may examine the input data's starting bytes and still
17478
  // provide its own image decoder, e.g. for an exotic image file format that's
17479
  // not in Wuffs' standard library. The prefix_etc fields have the same
17480
  // meaning as wuffs_base__magic_number_guess_fourcc arguments. SelectDecoder
17481
  // implementations should not modify prefix_data's contents.
17482
  //
17483
  // SelectDecoder might be called more than once, since some image file
17484
  // formats can wrap others. For example, a nominal BMP file can actually
17485
  // contain a JPEG or a PNG.
17486
  //
17487
  // The default SelectDecoder accepts the FOURCC codes listed below. For
17488
  // modular builds (i.e. when #define'ing WUFFS_CONFIG__MODULES), acceptance
17489
  // of the FOO file format is optional (for each value of FOO) and depends on
17490
  // the corresponding module to be enabled at compile time (i.e. #define'ing
17491
  // WUFFS_CONFIG__MODULE__FOO).
17492
  //
17493
  //  - WUFFS_BASE__FOURCC__BMP
17494
  //  - WUFFS_BASE__FOURCC__ETC2
17495
  //  - WUFFS_BASE__FOURCC__GIF
17496
  //  - WUFFS_BASE__FOURCC__HNSM
17497
  //  - WUFFS_BASE__FOURCC__JPEG
17498
  //  - WUFFS_BASE__FOURCC__NIE
17499
  //  - WUFFS_BASE__FOURCC__NPBM
17500
  //  - WUFFS_BASE__FOURCC__PNG
17501
  //  - WUFFS_BASE__FOURCC__QOI
17502
  //  - WUFFS_BASE__FOURCC__TGA
17503
  //  - WUFFS_BASE__FOURCC__TH
17504
  //  - WUFFS_BASE__FOURCC__WBMP
17505
  //  - WUFFS_BASE__FOURCC__WEBP
17506
  //
17507
  // The FOOBAR in WUFFS_BASE__FOURCC__FOBA is limited to four characters, but
17508
  // the FOOBAR in the corresponding WUFFS_CONFIG__MODULE__FOOBAR macro might
17509
  // be fuller and longer. For example, NPBM / NETPBM or TH / THUMBHASH.
17510
  virtual wuffs_base__image_decoder::unique_ptr  //
17511
  SelectDecoder(uint32_t fourcc,
17512
                wuffs_base__slice_u8 prefix_data,
17513
                bool prefix_closed);
17514
17515
  // HandleMetadata acknowledges image metadata. minfo.flavor will be one of:
17516
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH
17517
  //  - WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED
17518
  // If it is METADATA_RAW_PASSTHROUGH then raw contains the metadata bytes.
17519
  // Those bytes should not be retained beyond the the HandleMetadata call.
17520
  //
17521
  // minfo.metadata__fourcc() will typically match one of the
17522
  // DecodeImageArgFlags bits. For example, if (REPORT_METADATA_CHRM |
17523
  // REPORT_METADATA_GAMA) was passed to DecodeImage then the metadata FourCC
17524
  // will be either WUFFS_BASE__FOURCC__CHRM or WUFFS_BASE__FOURCC__GAMA.
17525
  //
17526
  // It returns an error message, or an empty string on success.
17527
  virtual std::string  //
17528
  HandleMetadata(const wuffs_base__more_information& minfo,
17529
                 wuffs_base__slice_u8 raw);
17530
17531
  // SelectPixfmt returns the destination pixel format for AllocPixbuf. It
17532
  // should return wuffs_base__make_pixel_format(etc) called with one of:
17533
  //  - WUFFS_BASE__PIXEL_FORMAT__Y
17534
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR_565
17535
  //  - WUFFS_BASE__PIXEL_FORMAT__BGR
17536
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL
17537
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE
17538
  //  - WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL
17539
  //  - WUFFS_BASE__PIXEL_FORMAT__RGB
17540
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL
17541
  //  - WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL
17542
  // or return image_config.pixcfg.pixel_format(). The latter means to use the
17543
  // image file's natural pixel format. For example, GIF images' natural pixel
17544
  // format is an indexed one.
17545
  //
17546
  // Returning otherwise means failure (DecodeImage_UnsupportedPixelFormat).
17547
  //
17548
  // The default SelectPixfmt implementation returns
17549
  // wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL) which
17550
  // is 4 bytes per pixel (8 bits per channel ร— 4 channels).
17551
  virtual wuffs_base__pixel_format  //
17552
  SelectPixfmt(const wuffs_base__image_config& image_config);
17553
17554
  // AllocPixbuf allocates the pixel buffer.
17555
  //
17556
  // allow_uninitialized_memory will be true if a valid background_color was
17557
  // passed to DecodeImage, since the pixel buffer's contents will be
17558
  // overwritten with that color after AllocPixbuf returns.
17559
  //
17560
  // The default AllocPixbuf implementation allocates either uninitialized or
17561
  // zeroed memory. Zeroed memory typically corresponds to filling with opaque
17562
  // black or transparent black, depending on the pixel format.
17563
  virtual AllocPixbufResult  //
17564
  AllocPixbuf(const wuffs_base__image_config& image_config,
17565
              bool allow_uninitialized_memory);
17566
17567
  // AllocWorkbuf allocates the work buffer. The allocated buffer's length
17568
  // should be at least len_range.min_incl, but larger allocations (up to
17569
  // len_range.max_incl) may have better performance (by using more memory).
17570
  //
17571
  // The default AllocWorkbuf implementation allocates len_range.max_incl bytes
17572
  // of either uninitialized or zeroed memory.
17573
  virtual AllocWorkbufResult  //
17574
  AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
17575
               bool allow_uninitialized_memory);
17576
17577
  // Done is always the last Callback method called by DecodeImage, whether or
17578
  // not parsing the input encountered an error. Even when successful, trailing
17579
  // data may remain in input and buffer.
17580
  //
17581
  // The image_decoder is the one returned by SelectDecoder (if SelectDecoder
17582
  // was successful), or a no-op unique_ptr otherwise. Like any unique_ptr,
17583
  // ownership moves to the Done implementation.
17584
  //
17585
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17586
  // as DecodeImage may then de-allocate the backing array.
17587
  //
17588
  // The default Done implementation is a no-op, other than running the
17589
  // image_decoder unique_ptr destructor.
17590
  virtual void  //
17591
  Done(DecodeImageResult& result,
17592
       sync_io::Input& input,
17593
       IOBuffer& buffer,
17594
       wuffs_base__image_decoder::unique_ptr image_decoder);
17595
};
17596
17597
extern const char DecodeImage_BufferIsTooShort[];
17598
extern const char DecodeImage_MaxInclDimensionExceeded[];
17599
extern const char DecodeImage_MaxInclMetadataLengthExceeded[];
17600
extern const char DecodeImage_OutOfMemory[];
17601
extern const char DecodeImage_UnexpectedEndOfFile[];
17602
extern const char DecodeImage_UnsupportedImageFormat[];
17603
extern const char DecodeImage_UnsupportedMetadata[];
17604
extern const char DecodeImage_UnsupportedPixelBlend[];
17605
extern const char DecodeImage_UnsupportedPixelConfiguration[];
17606
extern const char DecodeImage_UnsupportedPixelFormat[];
17607
17608
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17609
// inner representations for several reasons:
17610
//  - It provides a home for the DefaultValue static method, for Foo callers
17611
//    that want to override some but not all optional arguments.
17612
//  - It provides the "Bar" name at Foo call sites, which can help self-
17613
//    document Foo calls with many arguemnts.
17614
//  - It provides some type safety against accidentally transposing or omitting
17615
//    adjacent fundamentally-numeric-typed optional arguments.
17616
17617
// DecodeImageArgQuirks wraps an optional argument to DecodeImage.
17618
struct DecodeImageArgQuirks {
17619
  explicit DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
17620
                                const size_t len0);
17621
17622
  // DefaultValue returns an empty slice.
17623
  static DecodeImageArgQuirks DefaultValue();
17624
17625
  const QuirkKeyValuePair* ptr;
17626
  const size_t len;
17627
};
17628
17629
// DecodeImageArgFlags wraps an optional argument to DecodeImage.
17630
struct DecodeImageArgFlags {
17631
  explicit DecodeImageArgFlags(uint64_t repr0);
17632
17633
  // DefaultValue returns 0.
17634
  static DecodeImageArgFlags DefaultValue();
17635
17636
  // TODO: support all of the REPORT_METADATA_FOO flags, not just CHRM, EXIF,
17637
  // GAMA, ICCP, KVP, SRGB and XMP.
17638
17639
  // Background Color.
17640
  static constexpr uint64_t REPORT_METADATA_BGCL = 0x0001;
17641
  // Primary Chromaticities and White Point.
17642
  static constexpr uint64_t REPORT_METADATA_CHRM = 0x0002;
17643
  // Exchangeable Image File Format.
17644
  static constexpr uint64_t REPORT_METADATA_EXIF = 0x0004;
17645
  // Gamma Correction.
17646
  static constexpr uint64_t REPORT_METADATA_GAMA = 0x0008;
17647
  // International Color Consortium Profile.
17648
  static constexpr uint64_t REPORT_METADATA_ICCP = 0x0010;
17649
  // Key-Value Pair.
17650
  //
17651
  // For PNG files, this includes iTXt, tEXt and zTXt chunks. In the
17652
  // HandleMetadata callback, the raw argument contains UTF-8 strings.
17653
  static constexpr uint64_t REPORT_METADATA_KVP = 0x0020;
17654
  // Modification Time.
17655
  static constexpr uint64_t REPORT_METADATA_MTIM = 0x0040;
17656
  // Offset (2-Dimensional).
17657
  static constexpr uint64_t REPORT_METADATA_OFS2 = 0x0080;
17658
  // Physical Dimensions.
17659
  static constexpr uint64_t REPORT_METADATA_PHYD = 0x0100;
17660
  // Standard Red Green Blue (Rendering Intent).
17661
  static constexpr uint64_t REPORT_METADATA_SRGB = 0x0200;
17662
  // Extensible Metadata Platform.
17663
  static constexpr uint64_t REPORT_METADATA_XMP = 0x0400;
17664
17665
  uint64_t repr;
17666
};
17667
17668
// DecodeImageArgPixelBlend wraps an optional argument to DecodeImage.
17669
struct DecodeImageArgPixelBlend {
17670
  explicit DecodeImageArgPixelBlend(wuffs_base__pixel_blend repr0);
17671
17672
  // DefaultValue returns WUFFS_BASE__PIXEL_BLEND__SRC.
17673
  static DecodeImageArgPixelBlend DefaultValue();
17674
17675
  wuffs_base__pixel_blend repr;
17676
};
17677
17678
// DecodeImageArgBackgroundColor wraps an optional argument to DecodeImage.
17679
struct DecodeImageArgBackgroundColor {
17680
  explicit DecodeImageArgBackgroundColor(
17681
      wuffs_base__color_u32_argb_premul repr0);
17682
17683
  // DefaultValue returns 1, an invalid wuffs_base__color_u32_argb_premul.
17684
  static DecodeImageArgBackgroundColor DefaultValue();
17685
17686
  wuffs_base__color_u32_argb_premul repr;
17687
};
17688
17689
// DecodeImageArgMaxInclDimension wraps an optional argument to DecodeImage.
17690
struct DecodeImageArgMaxInclDimension {
17691
  explicit DecodeImageArgMaxInclDimension(uint32_t repr0);
17692
17693
  // DefaultValue returns 1048575 = 0x000F_FFFF, more than 1 million pixels.
17694
  static DecodeImageArgMaxInclDimension DefaultValue();
17695
17696
  uint32_t repr;
17697
};
17698
17699
// DecodeImageArgMaxInclMetadataLength wraps an optional argument to
17700
// DecodeImage.
17701
struct DecodeImageArgMaxInclMetadataLength {
17702
  explicit DecodeImageArgMaxInclMetadataLength(uint64_t repr0);
17703
17704
  // DefaultValue returns 16777215 = 0x00FF_FFFF, one less than 16 MiB.
17705
  static DecodeImageArgMaxInclMetadataLength DefaultValue();
17706
17707
  uint64_t repr;
17708
};
17709
17710
// DecodeImage decodes the image data in input. A variety of image file formats
17711
// can be decoded, depending on what callbacks.SelectDecoder returns.
17712
//
17713
// For animated formats, only the first frame is returned, since the API is
17714
// simpler for synchronous I/O and having DecodeImage only return when
17715
// completely done, but rendering animation often involves handling other
17716
// events in between animation frames. To decode multiple frames of animated
17717
// images, or for asynchronous I/O (e.g. when decoding an image streamed over
17718
// the network), use Wuffs' lower level C API instead of its higher level,
17719
// simplified C++ API (the wuffs_aux API).
17720
//
17721
// The DecodeImageResult's fields depend on whether decoding succeeded:
17722
//  - On total success, the error_message is empty and pixbuf.pixcfg.is_valid()
17723
//    is true.
17724
//  - On partial success (e.g. the input file was truncated but we are still
17725
//    able to decode some of the pixels), error_message is non-empty but
17726
//    pixbuf.pixcfg.is_valid() is still true. It is up to the caller whether to
17727
//    accept or reject partial success.
17728
//  - On failure, the error_message is non_empty and pixbuf.pixcfg.is_valid()
17729
//    is false.
17730
//
17731
// The callbacks allocate the pixel buffer memory and work buffer memory. On
17732
// success, pixel buffer memory ownership is passed to the DecodeImage caller
17733
// as the returned pixbuf_mem_owner. Regardless of success or failure, the work
17734
// buffer memory is deleted.
17735
//
17736
// The pixel_blend (one of the constants listed below) determines how to
17737
// composite the decoded image over the pixel buffer's original pixels (as
17738
// returned by callbacks.AllocPixbuf):
17739
//  - WUFFS_BASE__PIXEL_BLEND__SRC
17740
//  - WUFFS_BASE__PIXEL_BLEND__SRC_OVER
17741
//
17742
// The background_color is used to fill the pixel buffer after
17743
// callbacks.AllocPixbuf returns, if it is valid in the
17744
// wuffs_base__color_u32_argb_premul__is_valid sense. The default value,
17745
// 0x0000_0001, is not valid since its Blue channel value (0x01) is greater
17746
// than its Alpha channel value (0x00). A valid background_color will typically
17747
// be overwritten when pixel_blend is WUFFS_BASE__PIXEL_BLEND__SRC, but might
17748
// still be visible on partial (not total) success or when pixel_blend is
17749
// WUFFS_BASE__PIXEL_BLEND__SRC_OVER and the decoded image is not fully opaque.
17750
//
17751
// Decoding fails (with DecodeImage_MaxInclDimensionExceeded) if the image's
17752
// width or height is greater than max_incl_dimension or if any opted-in (via
17753
// flags bits) metadata is longer than max_incl_metadata_length.
17754
DecodeImageResult  //
17755
DecodeImage(DecodeImageCallbacks& callbacks,
17756
            sync_io::Input& input,
17757
            DecodeImageArgQuirks quirks = DecodeImageArgQuirks::DefaultValue(),
17758
            DecodeImageArgFlags flags = DecodeImageArgFlags::DefaultValue(),
17759
            DecodeImageArgPixelBlend pixel_blend =
17760
                DecodeImageArgPixelBlend::DefaultValue(),
17761
            DecodeImageArgBackgroundColor background_color =
17762
                DecodeImageArgBackgroundColor::DefaultValue(),
17763
            DecodeImageArgMaxInclDimension max_incl_dimension =
17764
                DecodeImageArgMaxInclDimension::DefaultValue(),
17765
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length =
17766
                DecodeImageArgMaxInclMetadataLength::DefaultValue());
17767
17768
}  // namespace wuffs_aux
17769
17770
// ---------------- Auxiliary - JSON
17771
17772
namespace wuffs_aux {
17773
17774
struct DecodeJsonResult {
17775
  DecodeJsonResult(std::string&& error_message0, uint64_t cursor_position0);
17776
17777
  std::string error_message;
17778
  uint64_t cursor_position;
17779
};
17780
17781
class DecodeJsonCallbacks {
17782
 public:
17783
  virtual ~DecodeJsonCallbacks();
17784
17785
  // AppendXxx are called for leaf nodes: literals, numbers and strings. For
17786
  // strings, the Callbacks implementation is responsible for tracking map keys
17787
  // versus other values.
17788
17789
  virtual std::string AppendNull() = 0;
17790
  virtual std::string AppendBool(bool val) = 0;
17791
  virtual std::string AppendF64(double val) = 0;
17792
  virtual std::string AppendI64(int64_t val) = 0;
17793
  virtual std::string AppendTextString(std::string&& val) = 0;
17794
17795
  // Push and Pop are called for container nodes: JSON arrays (lists) and JSON
17796
  // objects (dictionaries).
17797
  //
17798
  // The flags bits combine exactly one of:
17799
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE
17800
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST
17801
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT
17802
  // and exactly one of:
17803
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE
17804
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST
17805
  //  - WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT
17806
17807
  virtual std::string Push(uint32_t flags) = 0;
17808
  virtual std::string Pop(uint32_t flags) = 0;
17809
17810
  // Done is always the last Callback method called by DecodeJson, whether or
17811
  // not parsing the input as JSON encountered an error. Even when successful,
17812
  // trailing data may remain in input and buffer. See "Unintuitive JSON
17813
  // Parsing" (https://nullprogram.com/blog/2019/12/28/) which discusses JSON
17814
  // parsing and when it stops.
17815
  //
17816
  // Do not keep a reference to buffer or buffer.data.ptr after Done returns,
17817
  // as DecodeJson may then de-allocate the backing array.
17818
  //
17819
  // The default Done implementation is a no-op.
17820
  virtual void  //
17821
  Done(DecodeJsonResult& result, sync_io::Input& input, IOBuffer& buffer);
17822
};
17823
17824
extern const char DecodeJson_BadJsonPointer[];
17825
extern const char DecodeJson_NoMatch[];
17826
17827
// The FooArgBar types add structure to Foo's optional arguments. They wrap
17828
// inner representations for several reasons:
17829
//  - It provides a home for the DefaultValue static method, for Foo callers
17830
//    that want to override some but not all optional arguments.
17831
//  - It provides the "Bar" name at Foo call sites, which can help self-
17832
//    document Foo calls with many arguemnts.
17833
//  - It provides some type safety against accidentally transposing or omitting
17834
//    adjacent fundamentally-numeric-typed optional arguments.
17835
17836
// DecodeJsonArgQuirks wraps an optional argument to DecodeJson.
17837
struct DecodeJsonArgQuirks {
17838
  explicit DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
17839
                               const size_t len0);
17840
17841
  // DefaultValue returns an empty slice.
17842
  static DecodeJsonArgQuirks DefaultValue();
17843
17844
  const QuirkKeyValuePair* ptr;
17845
  const size_t len;
17846
};
17847
17848
// DecodeJsonArgJsonPointer wraps an optional argument to DecodeJson.
17849
struct DecodeJsonArgJsonPointer {
17850
  explicit DecodeJsonArgJsonPointer(std::string repr0);
17851
17852
  // DefaultValue returns an empty string.
17853
  static DecodeJsonArgJsonPointer DefaultValue();
17854
17855
  std::string repr;
17856
};
17857
17858
// DecodeJson calls callbacks based on the JSON-formatted data in input.
17859
//
17860
// On success, the returned error_message is empty and cursor_position counts
17861
// the number of bytes consumed. On failure, error_message is non-empty and
17862
// cursor_position is the location of the error. That error may be a content
17863
// error (invalid JSON) or an input error (e.g. network failure).
17864
//
17865
// json_pointer is a query in the JSON Pointer (RFC 6901) syntax. The callbacks
17866
// run for the input's sub-node that matches the query. DecodeJson_NoMatch is
17867
// returned if no matching sub-node was found. The empty query matches the
17868
// input's root node, consistent with JSON Pointer semantics.
17869
//
17870
// The JSON Pointer implementation is greedy: duplicate keys are not rejected
17871
// but only the first match for each '/'-separated fragment is followed.
17872
DecodeJsonResult  //
17873
DecodeJson(DecodeJsonCallbacks& callbacks,
17874
           sync_io::Input& input,
17875
           DecodeJsonArgQuirks quirks = DecodeJsonArgQuirks::DefaultValue(),
17876
           DecodeJsonArgJsonPointer json_pointer =
17877
               DecodeJsonArgJsonPointer::DefaultValue());
17878
17879
}  // namespace wuffs_aux
17880
17881
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
17882
17883
// ---------------- Wuffs' reimplementation of the STB API.
17884
//
17885
// This is a drop-in replacement of that third-party library.
17886
//
17887
// Disabled by default, unless you #define the
17888
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
17889
//
17890
// For API docs, see https://github.com/nothings/stb
17891
17892
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
17893
17894
#ifdef __cplusplus
17895
extern "C" {
17896
#endif
17897
17898
#if defined(WUFFS_CONFIG__STATIC_FUNCTIONS) || defined(STB_IMAGE_STATIC)
17899
#define WUFFS_DROP_IN__STB__MAYBE_STATIC static
17900
#else
17901
#define WUFFS_DROP_IN__STB__MAYBE_STATIC
17902
#endif
17903
17904
enum {
17905
  STBI_default = 0,
17906
  STBI_grey = 1,
17907
  STBI_grey_alpha = 2,
17908
  STBI_rgb = 3,
17909
  STBI_rgb_alpha = 4
17910
};
17911
17912
typedef unsigned char stbi_uc;
17913
typedef unsigned short stbi_us;
17914
17915
typedef struct {
17916
  int (*read)(void* user, char* data, int size);
17917
  void (*skip)(void* user, int n);
17918
  int (*eof)(void* user);
17919
} stbi_io_callbacks;
17920
17921
// --------
17922
17923
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17924
stbi_info_from_memory(                //
17925
    stbi_uc const* buffer,            //
17926
    int len,                          //
17927
    int* x,                           //
17928
    int* y,                           //
17929
    int* comp);
17930
17931
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17932
stbi_load_from_memory(                     //
17933
    stbi_uc const* buffer,                 //
17934
    int len,                               //
17935
    int* x,                                //
17936
    int* y,                                //
17937
    int* channels_in_file,                 //
17938
    int desired_channels);
17939
17940
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17941
stbi_info_from_callbacks(             //
17942
    stbi_io_callbacks const* clbk,    //
17943
    void* user,                       //
17944
    int* x,                           //
17945
    int* y,                           //
17946
    int* comp);
17947
17948
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17949
stbi_load_from_callbacks(                  //
17950
    stbi_io_callbacks const* clbk,         //
17951
    void* user,                            //
17952
    int* x,                                //
17953
    int* y,                                //
17954
    int* channels_in_file,                 //
17955
    int desired_channels);
17956
17957
// --------
17958
17959
#if !defined(STBI_NO_STDIO)
17960
17961
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17962
stbi_info(                            //
17963
    char const* filename,             //
17964
    int* x,                           //
17965
    int* y,                           //
17966
    int* comp);
17967
17968
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17969
stbi_load(                                 //
17970
    char const* filename,                  //
17971
    int* x,                                //
17972
    int* y,                                //
17973
    int* channels_in_file,                 //
17974
    int desired_channels);
17975
17976
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
17977
stbi_info_from_file(                  //
17978
    FILE* f,                          //
17979
    int* x,                           //
17980
    int* y,                           //
17981
    int* comp);
17982
17983
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
17984
stbi_load_from_file(                       //
17985
    FILE* f,                               //
17986
    int* x,                                //
17987
    int* y,                                //
17988
    int* channels_in_file,                 //
17989
    int desired_channels);
17990
17991
#endif  // !defined(STBI_NO_STDIO)
17992
17993
// --------
17994
17995
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
17996
stbi_image_free(                       //
17997
    void* retval_from_stbi_load);
17998
17999
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
18000
stbi_failure_reason(void);
18001
18002
#ifdef __cplusplus
18003
}
18004
#endif
18005
18006
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
18007
18008
// โ€ผ WUFFS C HEADER ENDS HERE.
18009
#ifdef WUFFS_IMPLEMENTATION
18010
18011
#ifdef __cplusplus
18012
extern "C" {
18013
#endif
18014
18015
// ---------------- Fundamentals
18016
18017
// WUFFS_BASE__MAGIC is a magic number to check that initializers are called.
18018
// It's not foolproof, given C doesn't automatically zero memory before use,
18019
// but it should catch 99.99% of cases.
18020
//
18021
// Its (non-zero) value is arbitrary, based on md5sum("wuffs").
18022
317k
#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71)
18023
18024
// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable
18025
// error was previously encountered.
18026
//
18027
// Its (non-zero) value is arbitrary, based on md5sum("disabled").
18028
13.2k
#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2)
18029
18030
// Use switch cases for coroutine suspension points, similar to the technique
18031
// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
18032
//
18033
// The implicit fallthrough is intentional.
18034
//
18035
// We use trivial macros instead of an explicit assignment and case statement
18036
// so that clang-format doesn't get confused by the unusual "case"s.
18037
102k
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;
18038
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \
18039
454k
  coro_susp_point = n;                            \
18040
476k
  case n:;
18041
18042
#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
18043
94.9k
  if (!status.repr) {                                           \
18044
15.8k
    goto ok;                                                    \
18045
79.1k
  } else if (*status.repr != '$') {                             \
18046
10.6k
    goto exit;                                                  \
18047
10.6k
  }                                                             \
18048
68.4k
  coro_susp_point = n;                                          \
18049
68.4k
  goto suspend;                                                 \
18050
68.4k
  case n:;
18051
18052
// The "defined(__clang__)" isn't redundant. While vanilla clang defines
18053
// __GNUC__, clang-cl (which mimics MSVC's cl.exe) does not.
18054
#if defined(__GNUC__) || defined(__clang__)
18055
105k
#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))
18056
293k
#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))
18057
#else
18058
#define WUFFS_BASE__LIKELY(expr) (expr)
18059
#define WUFFS_BASE__UNLIKELY(expr) (expr)
18060
#endif
18061
18062
// --------
18063
18064
static inline wuffs_base__empty_struct  //
18065
21.8k
wuffs_private_impl__ignore_status(wuffs_base__status z) {
18066
21.8k
  return wuffs_base__make_empty_struct();
18067
21.8k
}
18068
18069
static inline wuffs_base__status  //
18070
0
wuffs_private_impl__status__ensure_not_a_suspension(wuffs_base__status z) {
18071
0
  if (z.repr && (*z.repr == '$')) {
18072
0
    z.repr = wuffs_base__error__cannot_return_a_suspension;
18073
0
  }
18074
0
  return z;
18075
0
}
18076
18077
// --------
18078
18079
// wuffs_private_impl__iterate_total_advance returns the exclusive
18080
// pointer-offset at which iteration should stop. The overall slice has length
18081
// total_len, each iteration's sub-slice has length iter_len and are placed
18082
// iter_advance apart.
18083
//
18084
// The iter_advance may not be larger than iter_len. The iter_advance may be
18085
// smaller than iter_len, in which case the sub-slices will overlap.
18086
//
18087
// The return value r satisfies ((0 <= r) && (r <= total_len)).
18088
//
18089
// For example, if total_len = 15, iter_len = 5 and iter_advance = 3, there are
18090
// four iterations at offsets 0, 3, 6 and 9. This function returns 12.
18091
//
18092
// 0123456789012345
18093
// [....]
18094
//    [....]
18095
//       [....]
18096
//          [....]
18097
//             $
18098
// 0123456789012345
18099
//
18100
// For example, if total_len = 15, iter_len = 5 and iter_advance = 5, there are
18101
// three iterations at offsets 0, 5 and 10. This function returns 15.
18102
//
18103
// 0123456789012345
18104
// [....]
18105
//      [....]
18106
//           [....]
18107
//                $
18108
// 0123456789012345
18109
static inline size_t  //
18110
wuffs_private_impl__iterate_total_advance(size_t total_len,
18111
                                          size_t iter_len,
18112
1.24M
                                          size_t iter_advance) {
18113
1.24M
  if (total_len >= iter_len) {
18114
623k
    size_t n = total_len - iter_len;
18115
623k
    return ((n / iter_advance) * iter_advance) + iter_advance;
18116
623k
  }
18117
626k
  return 0;
18118
1.24M
}
18119
18120
// ---------------- Numeric Types
18121
18122
extern const uint8_t wuffs_private_impl__low_bits_mask__u8[8];
18123
extern const uint16_t wuffs_private_impl__low_bits_mask__u16[16];
18124
extern const uint32_t wuffs_private_impl__low_bits_mask__u32[32];
18125
extern const uint64_t wuffs_private_impl__low_bits_mask__u64[64];
18126
18127
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U8(n) \
18128
  (wuffs_private_impl__low_bits_mask__u8[n])
18129
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U16(n) \
18130
  (wuffs_private_impl__low_bits_mask__u16[n])
18131
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(n) \
18132
182k
  (wuffs_private_impl__low_bits_mask__u32[n])
18133
#define WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(n) \
18134
9.28M
  (wuffs_private_impl__low_bits_mask__u64[n])
18135
18136
// --------
18137
18138
static inline void  //
18139
0
wuffs_private_impl__u8__sat_add_indirect(uint8_t* x, uint8_t y) {
18140
0
  *x = wuffs_base__u8__sat_add(*x, y);
18141
0
}
18142
18143
static inline void  //
18144
0
wuffs_private_impl__u8__sat_sub_indirect(uint8_t* x, uint8_t y) {
18145
0
  *x = wuffs_base__u8__sat_sub(*x, y);
18146
0
}
18147
18148
static inline void  //
18149
0
wuffs_private_impl__u16__sat_add_indirect(uint16_t* x, uint16_t y) {
18150
0
  *x = wuffs_base__u16__sat_add(*x, y);
18151
0
}
18152
18153
static inline void  //
18154
0
wuffs_private_impl__u16__sat_sub_indirect(uint16_t* x, uint16_t y) {
18155
0
  *x = wuffs_base__u16__sat_sub(*x, y);
18156
0
}
18157
18158
static inline void  //
18159
8.33k
wuffs_private_impl__u32__sat_add_indirect(uint32_t* x, uint32_t y) {
18160
8.33k
  *x = wuffs_base__u32__sat_add(*x, y);
18161
8.33k
}
18162
18163
static inline void  //
18164
19.8k
wuffs_private_impl__u32__sat_sub_indirect(uint32_t* x, uint32_t y) {
18165
19.8k
  *x = wuffs_base__u32__sat_sub(*x, y);
18166
19.8k
}
18167
18168
static inline void  //
18169
35.2k
wuffs_private_impl__u64__sat_add_indirect(uint64_t* x, uint64_t y) {
18170
35.2k
  *x = wuffs_base__u64__sat_add(*x, y);
18171
35.2k
}
18172
18173
static inline void  //
18174
0
wuffs_private_impl__u64__sat_sub_indirect(uint64_t* x, uint64_t y) {
18175
0
  *x = wuffs_base__u64__sat_sub(*x, y);
18176
0
}
18177
18178
// ---------------- Numeric Types (Utility)
18179
18180
#define wuffs_base__utility__i64_divide(a, b) \
18181
  ((uint64_t)(((int64_t)(a)) / ((int64_t)(b))))
18182
18183
#define wuffs_base__utility__sign_extend_convert_u8_u32(a) \
18184
  ((uint32_t)(int32_t)(int8_t)(a))
18185
18186
#define wuffs_base__utility__sign_extend_convert_u8_u64(a) \
18187
  ((uint64_t)(int64_t)(int8_t)(a))
18188
18189
#define wuffs_base__utility__sign_extend_convert_u16_u32(a) \
18190
  ((uint32_t)(int32_t)(int16_t)(a))
18191
18192
#define wuffs_base__utility__sign_extend_convert_u16_u64(a) \
18193
  ((uint64_t)(int64_t)(int16_t)(a))
18194
18195
#define wuffs_base__utility__sign_extend_convert_u32_u64(a) \
18196
  ((uint64_t)(int64_t)(int32_t)(a))
18197
18198
#define wuffs_base__utility__sign_extend_rshift_u32(a, n) \
18199
  ((uint32_t)(((int32_t)(a)) >> (n)))
18200
18201
#define wuffs_base__utility__sign_extend_rshift_u64(a, n) \
18202
  ((uint64_t)(((int64_t)(a)) >> (n)))
18203
18204
#define wuffs_base__utility__make_bitvec256(e00, e01, e02, e03) \
18205
0
  wuffs_base__make_bitvec256(e00, e01, e02, e03)
18206
18207
#define wuffs_base__utility__make_optional_u63(h, v) \
18208
0
  wuffs_base__make_optional_u63(h, v)
18209
18210
// ---------------- Slices and Tables
18211
18212
// This function basically returns (ptr + len), except that that expression is
18213
// Undefined Behavior in C (but not C++) when ptr is NULL, even if len is zero.
18214
//
18215
// Precondition: (ptr != NULL) || (len == 0).
18216
static inline const uint8_t*  //
18217
6.80M
wuffs_private_impl__ptr_u8_plus_len(const uint8_t* ptr, size_t len) {
18218
6.80M
  return ptr ? (ptr + len) : NULL;
18219
6.80M
}
18220
18221
// --------
18222
18223
// wuffs_private_impl__slice_u8__prefix returns up to the first up_to bytes of
18224
// s.
18225
static inline wuffs_base__slice_u8  //
18226
0
wuffs_private_impl__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) {
18227
0
  if (((uint64_t)(s.len)) > up_to) {
18228
0
    s.len = ((size_t)up_to);
18229
0
  }
18230
0
  return s;
18231
0
}
18232
18233
// wuffs_private_impl__slice_u8__suffix returns up to the last up_to bytes of
18234
// s.
18235
static inline wuffs_base__slice_u8  //
18236
637
wuffs_private_impl__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) {
18237
637
  if (((uint64_t)(s.len)) > up_to) {
18238
630
    s.ptr += ((uint64_t)(s.len)) - up_to;
18239
630
    s.len = ((size_t)up_to);
18240
630
  }
18241
637
  return s;
18242
637
}
18243
18244
// wuffs_private_impl__slice_u8__copy_from_slice calls memmove(dst.ptr,
18245
// src.ptr, len) where len is the minimum of dst.len and src.len.
18246
//
18247
// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty
18248
// slice) is valid and results in a no-op.
18249
static inline uint64_t  //
18250
wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst,
18251
32.2k
                                              wuffs_base__slice_u8 src) {
18252
32.2k
  size_t len = dst.len < src.len ? dst.len : src.len;
18253
32.2k
  if (len > 0) {
18254
26.4k
    memmove(dst.ptr, src.ptr, len);
18255
26.4k
  }
18256
32.2k
  return len;
18257
32.2k
}
18258
18259
static inline wuffs_base__empty_struct  //
18260
wuffs_private_impl__bulk_load_host_endian(void* ptr,
18261
                                          size_t len,
18262
0
                                          wuffs_base__slice_u8 src) {
18263
0
  if (len && (len <= src.len)) {
18264
0
    memmove(ptr, src.ptr, len);
18265
0
  }
18266
0
  return wuffs_base__make_empty_struct();
18267
0
}
18268
18269
static inline wuffs_base__empty_struct  //
18270
0
wuffs_private_impl__bulk_memset(void* ptr, size_t len, uint8_t byte_value) {
18271
0
  if (len) {
18272
0
    memset(ptr, byte_value, len);
18273
0
  }
18274
0
  return wuffs_base__make_empty_struct();
18275
0
}
18276
18277
static inline wuffs_base__empty_struct  //
18278
wuffs_private_impl__bulk_save_host_endian(void* ptr,
18279
                                          size_t len,
18280
0
                                          wuffs_base__slice_u8 dst) {
18281
0
  if (len && (len <= dst.len)) {
18282
0
    memmove(dst.ptr, ptr, len);
18283
0
  }
18284
0
  return wuffs_base__make_empty_struct();
18285
0
}
18286
18287
// --------
18288
18289
static inline wuffs_base__slice_u8  //
18290
13.2M
wuffs_private_impl__table_u8__row_u32(wuffs_base__table_u8 t, uint32_t y) {
18291
13.2M
  if (t.ptr && (y < t.height)) {
18292
13.2M
    return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);
18293
13.2M
  }
18294
0
  return wuffs_base__empty_slice_u8();
18295
13.2M
}
18296
18297
// ---------------- Slices and Tables (Utility)
18298
18299
30.4k
#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8
18300
18301
// ---------------- Ranges and Rects
18302
18303
static inline uint32_t  //
18304
wuffs_private_impl__range_ii_u32__get_min_incl(
18305
0
    const wuffs_base__range_ii_u32* r) {
18306
0
  return r->min_incl;
18307
0
}
18308
18309
static inline uint32_t  //
18310
wuffs_private_impl__range_ii_u32__get_max_incl(
18311
0
    const wuffs_base__range_ii_u32* r) {
18312
0
  return r->max_incl;
18313
0
}
18314
18315
static inline uint32_t  //
18316
wuffs_private_impl__range_ie_u32__get_min_incl(
18317
0
    const wuffs_base__range_ie_u32* r) {
18318
0
  return r->min_incl;
18319
0
}
18320
18321
static inline uint32_t  //
18322
wuffs_private_impl__range_ie_u32__get_max_excl(
18323
0
    const wuffs_base__range_ie_u32* r) {
18324
0
  return r->max_excl;
18325
0
}
18326
18327
static inline uint64_t  //
18328
wuffs_private_impl__range_ii_u64__get_min_incl(
18329
0
    const wuffs_base__range_ii_u64* r) {
18330
0
  return r->min_incl;
18331
0
}
18332
18333
static inline uint64_t  //
18334
wuffs_private_impl__range_ii_u64__get_max_incl(
18335
0
    const wuffs_base__range_ii_u64* r) {
18336
0
  return r->max_incl;
18337
0
}
18338
18339
static inline uint64_t  //
18340
wuffs_private_impl__range_ie_u64__get_min_incl(
18341
0
    const wuffs_base__range_ie_u64* r) {
18342
0
  return r->min_incl;
18343
0
}
18344
18345
static inline uint64_t  //
18346
wuffs_private_impl__range_ie_u64__get_max_excl(
18347
0
    const wuffs_base__range_ie_u64* r) {
18348
0
  return r->max_excl;
18349
0
}
18350
18351
// ---------------- Ranges and Rects (Utility)
18352
18353
#define wuffs_base__utility__empty_range_ii_u32 wuffs_base__empty_range_ii_u32
18354
#define wuffs_base__utility__empty_range_ie_u32 wuffs_base__empty_range_ie_u32
18355
0
#define wuffs_base__utility__empty_range_ii_u64 wuffs_base__empty_range_ii_u64
18356
#define wuffs_base__utility__empty_range_ie_u64 wuffs_base__empty_range_ie_u64
18357
#define wuffs_base__utility__empty_rect_ii_u32 wuffs_base__empty_rect_ii_u32
18358
0
#define wuffs_base__utility__empty_rect_ie_u32 wuffs_base__empty_rect_ie_u32
18359
#define wuffs_base__utility__make_range_ii_u32 wuffs_base__make_range_ii_u32
18360
#define wuffs_base__utility__make_range_ie_u32 wuffs_base__make_range_ie_u32
18361
3.90k
#define wuffs_base__utility__make_range_ii_u64 wuffs_base__make_range_ii_u64
18362
#define wuffs_base__utility__make_range_ie_u64 wuffs_base__make_range_ie_u64
18363
#define wuffs_base__utility__make_rect_ii_u32 wuffs_base__make_rect_ii_u32
18364
11.8k
#define wuffs_base__utility__make_rect_ie_u32 wuffs_base__make_rect_ie_u32
18365
18366
// ---------------- I/O
18367
18368
static inline uint64_t  //
18369
55.1k
wuffs_private_impl__io__count_since(uint64_t mark, uint64_t index) {
18370
55.1k
  if (index >= mark) {
18371
55.1k
    return index - mark;
18372
55.1k
  }
18373
0
  return 0;
18374
55.1k
}
18375
18376
// TODO: drop the "const" in "const uint8_t* ptr". Some though required about
18377
// the base.io_reader.since method returning a mutable "slice base.u8".
18378
#if defined(__GNUC__)
18379
#pragma GCC diagnostic push
18380
#pragma GCC diagnostic ignored "-Wcast-qual"
18381
#endif
18382
static inline wuffs_base__slice_u8  //
18383
wuffs_private_impl__io__since(uint64_t mark,
18384
                              uint64_t index,
18385
58.9k
                              const uint8_t* ptr) {
18386
58.9k
  if (index >= mark) {
18387
58.9k
    return wuffs_base__make_slice_u8(((uint8_t*)ptr) + mark,
18388
58.9k
                                     ((size_t)(index - mark)));
18389
58.9k
  }
18390
0
  return wuffs_base__empty_slice_u8();
18391
58.9k
}
18392
#if defined(__GNUC__)
18393
#pragma GCC diagnostic pop
18394
#endif
18395
18396
// --------
18397
18398
static inline void  //
18399
wuffs_private_impl__io_reader__limit(const uint8_t** ptr_io2_r,
18400
                                     const uint8_t* iop_r,
18401
19.8k
                                     uint64_t limit) {
18402
19.8k
  if (((uint64_t)(*ptr_io2_r - iop_r)) > limit) {
18403
12.4k
    *ptr_io2_r = iop_r + limit;
18404
12.4k
  }
18405
19.8k
}
18406
18407
static inline uint32_t  //
18408
wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
18409
    const uint8_t** ptr_iop_r,
18410
    const uint8_t* io2_r,
18411
    uint32_t length,
18412
0
    wuffs_base__slice_u8 dst) {
18413
0
  const uint8_t* iop_r = *ptr_iop_r;
18414
0
  size_t n = dst.len;
18415
0
  if (n > length) {
18416
0
    n = length;
18417
0
  }
18418
0
  if (n > ((size_t)(io2_r - iop_r))) {
18419
0
    n = (size_t)(io2_r - iop_r);
18420
0
  }
18421
0
  if (n > 0) {
18422
0
    memmove(dst.ptr, iop_r, n);
18423
0
    *ptr_iop_r += n;
18424
0
  }
18425
0
  return (uint32_t)(n);
18426
0
}
18427
18428
// wuffs_private_impl__io_reader__match7 returns whether the io_reader's
18429
// upcoming bytes start with the given prefix (up to 7 bytes long). It is
18430
// peek-like, not read-like, in that there are no side-effects.
18431
//
18432
// The low 3 bits of a hold the prefix length, n.
18433
//
18434
// The high 56 bits of a hold the prefix itself, in little-endian order. The
18435
// first prefix byte is in bits 8..=15, the second prefix byte is in bits
18436
// 16..=23, etc. The high (8 * (7 - n)) bits are ignored.
18437
//
18438
// There are three possible return values:
18439
//  - 0 means success.
18440
//  - 1 means inconclusive, equivalent to "$short read".
18441
//  - 2 means failure.
18442
static inline uint32_t  //
18443
wuffs_private_impl__io_reader__match7(const uint8_t* iop_r,
18444
                                      const uint8_t* io2_r,
18445
                                      wuffs_base__io_buffer* r,
18446
0
                                      uint64_t a) {
18447
0
  uint32_t n = a & 7;
18448
0
  a >>= 8;
18449
0
  if ((io2_r - iop_r) >= 8) {
18450
0
    uint64_t x = wuffs_base__peek_u64le__no_bounds_check(iop_r);
18451
0
    uint32_t shift = 8 * (8 - n);
18452
0
    return ((a << shift) == (x << shift)) ? 0 : 2;
18453
0
  }
18454
0
  for (; n > 0; n--) {
18455
0
    if (iop_r >= io2_r) {
18456
0
      return (r && r->meta.closed) ? 2 : 1;
18457
0
    } else if (*iop_r != ((uint8_t)(a))) {
18458
0
      return 2;
18459
0
    }
18460
0
    iop_r++;
18461
0
    a >>= 8;
18462
0
  }
18463
0
  return 0;
18464
0
}
18465
18466
static inline wuffs_base__io_buffer*  //
18467
wuffs_private_impl__io_reader__set(wuffs_base__io_buffer* b,
18468
                                   const uint8_t** ptr_iop_r,
18469
                                   const uint8_t** ptr_io0_r,
18470
                                   const uint8_t** ptr_io1_r,
18471
                                   const uint8_t** ptr_io2_r,
18472
                                   wuffs_base__slice_u8 data,
18473
0
                                   uint64_t history_position) {
18474
0
  b->data = data;
18475
0
  b->meta.wi = data.len;
18476
0
  b->meta.ri = 0;
18477
0
  b->meta.pos = history_position;
18478
0
  b->meta.closed = false;
18479
0
18480
0
  *ptr_iop_r = data.ptr;
18481
0
  *ptr_io0_r = data.ptr;
18482
0
  *ptr_io1_r = data.ptr;
18483
0
  *ptr_io2_r = data.ptr + data.len;
18484
0
18485
0
  return b;
18486
0
}
18487
18488
// --------
18489
18490
static inline uint64_t  //
18491
wuffs_private_impl__io_writer__copy_from_slice(uint8_t** ptr_iop_w,
18492
                                               uint8_t* io2_w,
18493
0
                                               wuffs_base__slice_u8 src) {
18494
0
  uint8_t* iop_w = *ptr_iop_w;
18495
0
  size_t n = src.len;
18496
0
  if (n > ((size_t)(io2_w - iop_w))) {
18497
0
    n = (size_t)(io2_w - iop_w);
18498
0
  }
18499
0
  if (n > 0) {
18500
0
    memmove(iop_w, src.ptr, n);
18501
0
    *ptr_iop_w += n;
18502
0
  }
18503
0
  return (uint64_t)(n);
18504
0
}
18505
18506
static inline void  //
18507
wuffs_private_impl__io_writer__limit(uint8_t** ptr_io2_w,
18508
                                     uint8_t* iop_w,
18509
0
                                     uint64_t limit) {
18510
0
  if (((uint64_t)(*ptr_io2_w - iop_w)) > limit) {
18511
0
    *ptr_io2_w = iop_w + limit;
18512
0
  }
18513
0
}
18514
18515
static inline uint32_t  //
18516
wuffs_private_impl__io_writer__limited_copy_u32_from_history(
18517
    uint8_t** ptr_iop_w,
18518
    uint8_t* io0_w,
18519
    uint8_t* io2_w,
18520
    uint32_t length,
18521
43.3k
    uint32_t distance) {
18522
43.3k
  if (!distance) {
18523
0
    return 0;
18524
0
  }
18525
43.3k
  uint8_t* p = *ptr_iop_w;
18526
43.3k
  if ((size_t)(p - io0_w) < (size_t)(distance)) {
18527
0
    return 0;
18528
0
  }
18529
43.3k
  uint8_t* q = p - distance;
18530
43.3k
  size_t n = (size_t)(io2_w - p);
18531
43.3k
  if ((size_t)(length) > n) {
18532
4.82k
    length = (uint32_t)(n);
18533
38.5k
  } else {
18534
38.5k
    n = (size_t)(length);
18535
38.5k
  }
18536
  // TODO: unrolling by 3 seems best for the std/deflate benchmarks, but that
18537
  // is mostly because 3 is the minimum length for the deflate format. This
18538
  // function implementation shouldn't overfit to that one format. Perhaps the
18539
  // limited_copy_u32_from_history Wuffs method should also take an unroll hint
18540
  // argument, and the cgen can look if that argument is the constant
18541
  // expression '3'.
18542
  //
18543
  // See also wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast
18544
  // below.
18545
2.40M
  for (; n >= 3; n -= 3) {
18546
2.36M
    *p++ = *q++;
18547
2.36M
    *p++ = *q++;
18548
2.36M
    *p++ = *q++;
18549
2.36M
  }
18550
63.6k
  for (; n; n--) {
18551
20.3k
    *p++ = *q++;
18552
20.3k
  }
18553
43.3k
  *ptr_iop_w = p;
18554
43.3k
  return length;
18555
43.3k
}
18556
18557
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast is like
18558
// the wuffs_private_impl__io_writer__limited_copy_u32_from_history function
18559
// above, but has stronger pre-conditions.
18560
//
18561
// The caller needs to prove that:
18562
//  - length   >= 1
18563
//  - length   <= (io2_w      - *ptr_iop_w)
18564
//  - distance >= 1
18565
//  - distance <= (*ptr_iop_w - io0_w)
18566
static inline uint32_t  //
18567
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
18568
    uint8_t** ptr_iop_w,
18569
    uint8_t* io0_w,
18570
    uint8_t* io2_w,
18571
    uint32_t length,
18572
4.90M
    uint32_t distance) {
18573
4.90M
  uint8_t* p = *ptr_iop_w;
18574
4.90M
  uint8_t* q = p - distance;
18575
4.90M
  uint32_t n = length;
18576
424M
  for (; n >= 3; n -= 3) {
18577
420M
    *p++ = *q++;
18578
420M
    *p++ = *q++;
18579
420M
    *p++ = *q++;
18580
420M
  }
18581
4.92M
  for (; n; n--) {
18582
18.9k
    *p++ = *q++;
18583
18.9k
  }
18584
4.90M
  *ptr_iop_w = p;
18585
4.90M
  return length;
18586
4.90M
}
18587
18588
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp
18589
// is like the
18590
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function,
18591
// but also returns the cusp: a byte pair (as a u16le) being the last byte of
18592
// and next byte after the copied history.
18593
//
18594
// For example, if history was [10, 11, 12, 13, 14, 15, 16, 17, 18] then:
18595
//  - copying l=3, d=8 produces [11, 12, 13] and the cusp is (13, 14).
18596
//  - copying l=3, d=2 produces [17, 18, 17] and the cusp is (17, 18).
18597
//
18598
// The caller needs to prove that:
18599
//  - length   >= 1
18600
//  - length   <= (io2_w      - *ptr_iop_w)
18601
//  - distance >= 1
18602
//  - distance <= (*ptr_iop_w - io0_w)
18603
static inline uint32_t  //
18604
wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
18605
    uint8_t** ptr_iop_w,
18606
    uint8_t* io0_w,
18607
    uint8_t* io2_w,
18608
    uint32_t length,
18609
0
    uint32_t distance) {
18610
0
  uint8_t* p = *ptr_iop_w;
18611
0
  uint8_t* q = p - distance;
18612
0
  uint32_t n = length;
18613
0
  for (; n >= 3; n -= 3) {
18614
0
    *p++ = *q++;
18615
0
    *p++ = *q++;
18616
0
    *p++ = *q++;
18617
0
  }
18618
0
  for (; n; n--) {
18619
0
    *p++ = *q++;
18620
0
  }
18621
0
  *ptr_iop_w = p;
18622
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18623
0
}
18624
18625
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast
18626
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
18627
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
18628
//
18629
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18630
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18631
// multiple of 8), since there is always at least one 8 byte chunk copied.
18632
//
18633
// In terms of advancing *ptr_iop_w, length is not rounded up.
18634
//
18635
// The caller needs to prove that:
18636
//  - length       >= 1
18637
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18638
//  - distance     == 1
18639
//  - distance     <= (*ptr_iop_w - io0_w)
18640
static inline uint32_t  //
18641
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
18642
    uint8_t** ptr_iop_w,
18643
    uint8_t* io0_w,
18644
    uint8_t* io2_w,
18645
    uint32_t length,
18646
2.27M
    uint32_t distance) {
18647
2.27M
  uint8_t* p = *ptr_iop_w;
18648
2.27M
  uint64_t x = p[-1];
18649
2.27M
  x |= x << 8;
18650
2.27M
  x |= x << 16;
18651
2.27M
  x |= x << 32;
18652
2.27M
  uint32_t n = length;
18653
70.7M
  while (1) {
18654
70.7M
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18655
70.7M
    if (n <= 8) {
18656
2.27M
      p += n;
18657
2.27M
      break;
18658
2.27M
    }
18659
68.5M
    p += 8;
18660
68.5M
    n -= 8;
18661
68.5M
  }
18662
2.27M
  *ptr_iop_w = p;
18663
2.27M
  return length;
18664
2.27M
}
18665
18666
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp
18667
// copies the previous byte (the one immediately before *ptr_iop_w), copying 8
18668
// byte chunks at a time. Each chunk contains 8 repetitions of the same byte.
18669
// It also returns the cusp: a byte pair (as a u16le) being the last byte of
18670
// and next byte after the copied history.
18671
//
18672
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18673
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18674
// multiple of 8), since there is always at least one 8 byte chunk copied.
18675
//
18676
// In terms of advancing *ptr_iop_w, length is not rounded up.
18677
//
18678
// The caller needs to prove that:
18679
//  - length       >= 1
18680
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18681
//  - distance     == 1
18682
//  - distance     <= (*ptr_iop_w - io0_w)
18683
static inline uint32_t  //
18684
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast_return_cusp(
18685
    uint8_t** ptr_iop_w,
18686
    uint8_t* io0_w,
18687
    uint8_t* io2_w,
18688
    uint32_t length,
18689
0
    uint32_t distance) {
18690
0
  uint8_t* p = *ptr_iop_w;
18691
0
  uint8_t* q = p - distance;
18692
0
  uint64_t x = p[-1];
18693
0
  x |= x << 8;
18694
0
  x |= x << 16;
18695
0
  x |= x << 32;
18696
0
  uint32_t n = length;
18697
0
  while (1) {
18698
0
    wuffs_base__poke_u64le__no_bounds_check(p, x);
18699
0
    if (n <= 8) {
18700
0
      p += n;
18701
0
      q += n;
18702
0
      break;
18703
0
    }
18704
0
    p += 8;
18705
0
    q += 8;
18706
0
    n -= 8;
18707
0
  }
18708
0
  *ptr_iop_w = p;
18709
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18710
0
}
18711
18712
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast
18713
// is like the
18714
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18715
// above, but copies 8 byte chunks at a time.
18716
//
18717
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18718
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18719
// multiple of 8), since there is always at least one 8 byte chunk copied.
18720
//
18721
// In terms of advancing *ptr_iop_w, length is not rounded up.
18722
//
18723
// The caller needs to prove that:
18724
//  - length       >= 1
18725
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18726
//  - distance     >= 8
18727
//  - distance     <= (*ptr_iop_w - io0_w)
18728
static inline uint32_t  //
18729
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
18730
    uint8_t** ptr_iop_w,
18731
    uint8_t* io0_w,
18732
    uint8_t* io2_w,
18733
    uint32_t length,
18734
1.25M
    uint32_t distance) {
18735
1.25M
  uint8_t* p = *ptr_iop_w;
18736
1.25M
  uint8_t* q = p - distance;
18737
1.25M
  uint32_t n = length;
18738
4.11M
  while (1) {
18739
4.11M
    memcpy(p, q, 8);
18740
4.11M
    if (n <= 8) {
18741
1.25M
      p += n;
18742
1.25M
      break;
18743
1.25M
    }
18744
2.86M
    p += 8;
18745
2.86M
    q += 8;
18746
2.86M
    n -= 8;
18747
2.86M
  }
18748
1.25M
  *ptr_iop_w = p;
18749
1.25M
  return length;
18750
1.25M
}
18751
18752
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp
18753
// is like the
18754
// wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast function
18755
// above, but copies 8 byte chunks at a time. It also returns the cusp: a byte
18756
// pair (as a u16le) being the last byte of and next byte after the copied
18757
// history.
18758
//
18759
// In terms of number of bytes copied, length is rounded up to a multiple of 8.
18760
// As a special case, a zero length rounds up to 8 (even though 0 is already a
18761
// multiple of 8), since there is always at least one 8 byte chunk copied.
18762
//
18763
// In terms of advancing *ptr_iop_w, length is not rounded up.
18764
//
18765
// The caller needs to prove that:
18766
//  - length       >= 1
18767
//  - (length + 8) <= (io2_w      - *ptr_iop_w)
18768
//  - distance     >= 8
18769
//  - distance     <= (*ptr_iop_w - io0_w)
18770
static inline uint32_t  //
18771
wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
18772
    uint8_t** ptr_iop_w,
18773
    uint8_t* io0_w,
18774
    uint8_t* io2_w,
18775
    uint32_t length,
18776
0
    uint32_t distance) {
18777
0
  uint8_t* p = *ptr_iop_w;
18778
0
  uint8_t* q = p - distance;
18779
0
  uint32_t n = length;
18780
0
  while (1) {
18781
0
    memcpy(p, q, 8);
18782
0
    if (n <= 8) {
18783
0
      p += n;
18784
0
      q += n;
18785
0
      break;
18786
0
    }
18787
0
    p += 8;
18788
0
    q += 8;
18789
0
    n -= 8;
18790
0
  }
18791
0
  *ptr_iop_w = p;
18792
0
  return (uint32_t)wuffs_base__peek_u16le__no_bounds_check(q - 1);
18793
0
}
18794
18795
static inline uint32_t  //
18796
wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
18797
    uint8_t** ptr_iop_w,
18798
    uint8_t* io2_w,
18799
    uint32_t length,
18800
    const uint8_t** ptr_iop_r,
18801
1.34k
    const uint8_t* io2_r) {
18802
1.34k
  uint8_t* iop_w = *ptr_iop_w;
18803
1.34k
  size_t n = length;
18804
1.34k
  if (n > ((size_t)(io2_w - iop_w))) {
18805
453
    n = (size_t)(io2_w - iop_w);
18806
453
  }
18807
1.34k
  const uint8_t* iop_r = *ptr_iop_r;
18808
1.34k
  if (n > ((size_t)(io2_r - iop_r))) {
18809
463
    n = (size_t)(io2_r - iop_r);
18810
463
  }
18811
1.34k
  if (n > 0) {
18812
292
    memmove(iop_w, iop_r, n);
18813
292
    *ptr_iop_w += n;
18814
292
    *ptr_iop_r += n;
18815
292
  }
18816
1.34k
  return (uint32_t)(n);
18817
1.34k
}
18818
18819
static inline uint32_t  //
18820
wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
18821
    uint8_t** ptr_iop_w,
18822
    uint8_t* io2_w,
18823
    uint32_t length,
18824
206k
    wuffs_base__slice_u8 src) {
18825
206k
  uint8_t* iop_w = *ptr_iop_w;
18826
206k
  size_t n = src.len;
18827
206k
  if (n > length) {
18828
206k
    n = length;
18829
206k
  }
18830
206k
  if (n > ((size_t)(io2_w - iop_w))) {
18831
100
    n = (size_t)(io2_w - iop_w);
18832
100
  }
18833
206k
  if (n > 0) {
18834
206k
    memmove(iop_w, src.ptr, n);
18835
206k
    *ptr_iop_w += n;
18836
206k
  }
18837
206k
  return (uint32_t)(n);
18838
206k
}
18839
18840
static inline wuffs_base__io_buffer*  //
18841
wuffs_private_impl__io_writer__set(wuffs_base__io_buffer* b,
18842
                                   uint8_t** ptr_iop_w,
18843
                                   uint8_t** ptr_io0_w,
18844
                                   uint8_t** ptr_io1_w,
18845
                                   uint8_t** ptr_io2_w,
18846
                                   wuffs_base__slice_u8 data,
18847
19.8k
                                   uint64_t history_position) {
18848
19.8k
  b->data = data;
18849
19.8k
  b->meta.wi = 0;
18850
19.8k
  b->meta.ri = 0;
18851
19.8k
  b->meta.pos = history_position;
18852
19.8k
  b->meta.closed = false;
18853
18854
19.8k
  *ptr_iop_w = data.ptr;
18855
19.8k
  *ptr_io0_w = data.ptr;
18856
19.8k
  *ptr_io1_w = data.ptr;
18857
19.8k
  *ptr_io2_w = data.ptr + data.len;
18858
18859
19.8k
  return b;
18860
19.8k
}
18861
18862
// ---------------- I/O (Utility)
18863
18864
#define wuffs_base__utility__empty_io_reader wuffs_base__empty_io_reader
18865
#define wuffs_base__utility__empty_io_writer wuffs_base__empty_io_writer
18866
18867
// ---------------- Tokens
18868
18869
// ---------------- Tokens (Utility)
18870
18871
// ---------------- Memory Allocation
18872
18873
// ---------------- Images
18874
18875
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18876
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
18877
    const wuffs_base__pixel_swizzler* p,
18878
    uint32_t up_to_num_pixels,
18879
    wuffs_base__slice_u8 dst,
18880
    wuffs_base__slice_u8 dst_palette,
18881
    const uint8_t** ptr_iop_r,
18882
    const uint8_t* io2_r);
18883
18884
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18885
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
18886
    const wuffs_base__pixel_swizzler* p,
18887
    wuffs_base__slice_u8 dst,
18888
    wuffs_base__slice_u8 dst_palette,
18889
    const uint8_t** ptr_iop_r,
18890
    const uint8_t* io2_r);
18891
18892
WUFFS_BASE__MAYBE_STATIC uint64_t  //
18893
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
18894
    const wuffs_base__pixel_swizzler* p,
18895
    wuffs_base__slice_u8 dst,
18896
    wuffs_base__slice_u8 dst_palette,
18897
    uint64_t num_pixels);
18898
18899
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
18900
wuffs_base__pixel_swizzler__swizzle_ycck(
18901
    const wuffs_base__pixel_swizzler* p,
18902
    wuffs_base__pixel_buffer* dst,
18903
    wuffs_base__slice_u8 dst_palette,
18904
    uint32_t x_min_incl,
18905
    uint32_t x_max_excl,
18906
    uint32_t y_min_incl,
18907
    uint32_t y_max_excl,
18908
    wuffs_base__slice_u8 src0,
18909
    wuffs_base__slice_u8 src1,
18910
    wuffs_base__slice_u8 src2,
18911
    wuffs_base__slice_u8 src3,
18912
    uint32_t width0,
18913
    uint32_t width1,
18914
    uint32_t width2,
18915
    uint32_t width3,
18916
    uint32_t height0,
18917
    uint32_t height1,
18918
    uint32_t height2,
18919
    uint32_t height3,
18920
    uint32_t stride0,
18921
    uint32_t stride1,
18922
    uint32_t stride2,
18923
    uint32_t stride3,
18924
    uint8_t h0,
18925
    uint8_t h1,
18926
    uint8_t h2,
18927
    uint8_t h3,
18928
    uint8_t v0,
18929
    uint8_t v1,
18930
    uint8_t v2,
18931
    uint8_t v3,
18932
    bool is_rgb_or_cmyk,
18933
    bool triangle_filter_for_2to1,
18934
    wuffs_base__slice_u8 scratch_buffer_2k);
18935
18936
// ---------------- Images (Utility)
18937
18938
11.5k
#define wuffs_base__utility__make_pixel_format wuffs_base__make_pixel_format
18939
18940
// ---------------- String Conversions
18941
18942
// ---------------- Unicode and UTF-8
18943
18944
// ----------------
18945
18946
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
18947
    defined(WUFFS_CONFIG__MODULE__BASE__CORE)
18948
18949
const uint8_t wuffs_private_impl__low_bits_mask__u8[8] = {
18950
    0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F,
18951
};
18952
18953
const uint16_t wuffs_private_impl__low_bits_mask__u16[16] = {
18954
    0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F,
18955
    0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF,
18956
};
18957
18958
const uint32_t wuffs_private_impl__low_bits_mask__u32[32] = {
18959
    0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
18960
    0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
18961
    0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
18962
    0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
18963
    0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
18964
    0x3FFFFFFF, 0x7FFFFFFF,
18965
};
18966
18967
const uint64_t wuffs_private_impl__low_bits_mask__u64[64] = {
18968
    0x0000000000000000, 0x0000000000000001, 0x0000000000000003,
18969
    0x0000000000000007, 0x000000000000000F, 0x000000000000001F,
18970
    0x000000000000003F, 0x000000000000007F, 0x00000000000000FF,
18971
    0x00000000000001FF, 0x00000000000003FF, 0x00000000000007FF,
18972
    0x0000000000000FFF, 0x0000000000001FFF, 0x0000000000003FFF,
18973
    0x0000000000007FFF, 0x000000000000FFFF, 0x000000000001FFFF,
18974
    0x000000000003FFFF, 0x000000000007FFFF, 0x00000000000FFFFF,
18975
    0x00000000001FFFFF, 0x00000000003FFFFF, 0x00000000007FFFFF,
18976
    0x0000000000FFFFFF, 0x0000000001FFFFFF, 0x0000000003FFFFFF,
18977
    0x0000000007FFFFFF, 0x000000000FFFFFFF, 0x000000001FFFFFFF,
18978
    0x000000003FFFFFFF, 0x000000007FFFFFFF, 0x00000000FFFFFFFF,
18979
    0x00000001FFFFFFFF, 0x00000003FFFFFFFF, 0x00000007FFFFFFFF,
18980
    0x0000000FFFFFFFFF, 0x0000001FFFFFFFFF, 0x0000003FFFFFFFFF,
18981
    0x0000007FFFFFFFFF, 0x000000FFFFFFFFFF, 0x000001FFFFFFFFFF,
18982
    0x000003FFFFFFFFFF, 0x000007FFFFFFFFFF, 0x00000FFFFFFFFFFF,
18983
    0x00001FFFFFFFFFFF, 0x00003FFFFFFFFFFF, 0x00007FFFFFFFFFFF,
18984
    0x0000FFFFFFFFFFFF, 0x0001FFFFFFFFFFFF, 0x0003FFFFFFFFFFFF,
18985
    0x0007FFFFFFFFFFFF, 0x000FFFFFFFFFFFFF, 0x001FFFFFFFFFFFFF,
18986
    0x003FFFFFFFFFFFFF, 0x007FFFFFFFFFFFFF, 0x00FFFFFFFFFFFFFF,
18987
    0x01FFFFFFFFFFFFFF, 0x03FFFFFFFFFFFFFF, 0x07FFFFFFFFFFFFFF,
18988
    0x0FFFFFFFFFFFFFFF, 0x1FFFFFFFFFFFFFFF, 0x3FFFFFFFFFFFFFFF,
18989
    0x7FFFFFFFFFFFFFFF,
18990
};
18991
18992
const uint32_t wuffs_private_impl__pixel_format__bits_per_channel[16] = {
18993
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
18994
    0x08, 0x0A, 0x0C, 0x10, 0x18, 0x20, 0x30, 0x40,
18995
};
18996
18997
const char wuffs_base__note__i_o_redirect[] = "@base: I/O redirect";
18998
const char wuffs_base__note__end_of_data[] = "@base: end of data";
18999
const char wuffs_base__note__metadata_reported[] = "@base: metadata reported";
19000
const char wuffs_base__suspension__even_more_information[] = "$base: even more information";
19001
const char wuffs_base__suspension__mispositioned_read[] = "$base: mispositioned read";
19002
const char wuffs_base__suspension__mispositioned_write[] = "$base: mispositioned write";
19003
const char wuffs_base__suspension__short_read[] = "$base: short read";
19004
const char wuffs_base__suspension__short_workbuf[] = "$base: short workbuf";
19005
const char wuffs_base__suspension__short_write[] = "$base: short write";
19006
const char wuffs_base__error__bad_i_o_position[] = "#base: bad I/O position";
19007
const char wuffs_base__error__bad_argument_length_too_short[] = "#base: bad argument (length too short)";
19008
const char wuffs_base__error__bad_argument[] = "#base: bad argument";
19009
const char wuffs_base__error__bad_call_sequence[] = "#base: bad call sequence";
19010
const char wuffs_base__error__bad_data[] = "#base: bad data";
19011
const char wuffs_base__error__bad_receiver[] = "#base: bad receiver";
19012
const char wuffs_base__error__bad_restart[] = "#base: bad restart";
19013
const char wuffs_base__error__bad_sizeof_receiver[] = "#base: bad sizeof receiver";
19014
const char wuffs_base__error__bad_vtable[] = "#base: bad vtable";
19015
const char wuffs_base__error__bad_workbuf_length[] = "#base: bad workbuf length";
19016
const char wuffs_base__error__bad_wuffs_version[] = "#base: bad wuffs version";
19017
const char wuffs_base__error__cannot_return_a_suspension[] = "#base: cannot return a suspension";
19018
const char wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist[] = "#base: disabled by WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST";
19019
const char wuffs_base__error__disabled_by_previous_error[] = "#base: disabled by previous error";
19020
const char wuffs_base__error__initialize_falsely_claimed_already_zeroed[] = "#base: initialize falsely claimed already zeroed";
19021
const char wuffs_base__error__initialize_not_called[] = "#base: initialize not called";
19022
const char wuffs_base__error__insufficient_history[] = "#base: insufficient history";
19023
const char wuffs_base__error__interleaved_coroutine_calls[] = "#base: interleaved coroutine calls";
19024
const char wuffs_base__error__no_more_information[] = "#base: no more information";
19025
const char wuffs_base__error__not_enough_data[] = "#base: not enough data";
19026
const char wuffs_base__error__out_of_bounds[] = "#base: out of bounds";
19027
const char wuffs_base__error__unsupported_image_dimension[] = "#base: unsupported image dimension";
19028
const char wuffs_base__error__unsupported_method[] = "#base: unsupported method";
19029
const char wuffs_base__error__unsupported_option[] = "#base: unsupported option";
19030
const char wuffs_base__error__unsupported_pixel_swizzler_option[] = "#base: unsupported pixel swizzler option";
19031
const char wuffs_base__error__too_much_data[] = "#base: too much data";
19032
19033
const char wuffs_base__hasher_u32__vtable_name[] = "{vtable}wuffs_base__hasher_u32";
19034
const char wuffs_base__hasher_u64__vtable_name[] = "{vtable}wuffs_base__hasher_u64";
19035
const char wuffs_base__hasher_bitvec256__vtable_name[] = "{vtable}wuffs_base__hasher_bitvec256";
19036
const char wuffs_base__image_decoder__vtable_name[] = "{vtable}wuffs_base__image_decoder";
19037
const char wuffs_base__io_transformer__vtable_name[] = "{vtable}wuffs_base__io_transformer";
19038
const char wuffs_base__token_decoder__vtable_name[] = "{vtable}wuffs_base__token_decoder";
19039
19040
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
19041
        // defined(WUFFS_CONFIG__MODULE__BASE)  ||
19042
        // defined(WUFFS_CONFIG__MODULE__BASE__CORE)
19043
19044
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
19045
    defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
19046
19047
// ---------------- Interface Definitions.
19048
19049
WUFFS_BASE__GENERATED_C_CODE
19050
WUFFS_BASE__MAYBE_STATIC uint32_t
19051
wuffs_base__hasher_u32__checksum_u32(
19052
0
    const wuffs_base__hasher_u32* self) {
19053
0
  if (!self) {
19054
0
    return 0;
19055
0
  }
19056
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19057
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19058
0
    return 0;
19059
0
  }
19060
19061
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19062
0
  int i;
19063
0
  for (i = 0; i < 63; i++) {
19064
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19065
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19066
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19067
0
      return (*func_ptrs->checksum_u32)(self);
19068
0
    } else if (v->vtable_name == NULL) {
19069
0
      break;
19070
0
    }
19071
0
    v++;
19072
0
  }
19073
19074
0
  return 0;
19075
0
}
19076
19077
WUFFS_BASE__GENERATED_C_CODE
19078
WUFFS_BASE__MAYBE_STATIC uint64_t
19079
wuffs_base__hasher_u32__get_quirk(
19080
    const wuffs_base__hasher_u32* self,
19081
0
    uint32_t a_key) {
19082
0
  if (!self) {
19083
0
    return 0;
19084
0
  }
19085
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19086
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19087
0
    return 0;
19088
0
  }
19089
19090
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19091
0
  int i;
19092
0
  for (i = 0; i < 63; i++) {
19093
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19094
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19095
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19096
0
      return (*func_ptrs->get_quirk)(self, a_key);
19097
0
    } else if (v->vtable_name == NULL) {
19098
0
      break;
19099
0
    }
19100
0
    v++;
19101
0
  }
19102
19103
0
  return 0;
19104
0
}
19105
19106
WUFFS_BASE__GENERATED_C_CODE
19107
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19108
wuffs_base__hasher_u32__set_quirk(
19109
    wuffs_base__hasher_u32* self,
19110
    uint32_t a_key,
19111
0
    uint64_t a_value) {
19112
0
  if (!self) {
19113
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19114
0
  }
19115
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19116
0
    return wuffs_base__make_status(
19117
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19118
0
            ? wuffs_base__error__disabled_by_previous_error
19119
0
            : wuffs_base__error__initialize_not_called);
19120
0
  }
19121
19122
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19123
0
  int i;
19124
0
  for (i = 0; i < 63; i++) {
19125
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19126
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19127
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19128
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19129
0
    } else if (v->vtable_name == NULL) {
19130
0
      break;
19131
0
    }
19132
0
    v++;
19133
0
  }
19134
19135
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19136
0
}
19137
19138
WUFFS_BASE__GENERATED_C_CODE
19139
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19140
wuffs_base__hasher_u32__update(
19141
    wuffs_base__hasher_u32* self,
19142
0
    wuffs_base__slice_u8 a_x) {
19143
0
  if (!self) {
19144
0
    return wuffs_base__make_empty_struct();
19145
0
  }
19146
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19147
0
    return wuffs_base__make_empty_struct();
19148
0
  }
19149
19150
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19151
0
  int i;
19152
0
  for (i = 0; i < 63; i++) {
19153
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19154
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19155
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19156
0
      return (*func_ptrs->update)(self, a_x);
19157
0
    } else if (v->vtable_name == NULL) {
19158
0
      break;
19159
0
    }
19160
0
    v++;
19161
0
  }
19162
19163
0
  return wuffs_base__make_empty_struct();
19164
0
}
19165
19166
WUFFS_BASE__GENERATED_C_CODE
19167
WUFFS_BASE__MAYBE_STATIC uint32_t
19168
wuffs_base__hasher_u32__update_u32(
19169
    wuffs_base__hasher_u32* self,
19170
0
    wuffs_base__slice_u8 a_x) {
19171
0
  if (!self) {
19172
0
    return 0;
19173
0
  }
19174
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19175
0
    return 0;
19176
0
  }
19177
19178
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19179
0
  int i;
19180
0
  for (i = 0; i < 63; i++) {
19181
0
    if (v->vtable_name == wuffs_base__hasher_u32__vtable_name) {
19182
0
      const wuffs_base__hasher_u32__func_ptrs* func_ptrs =
19183
0
          (const wuffs_base__hasher_u32__func_ptrs*)(v->function_pointers);
19184
0
      return (*func_ptrs->update_u32)(self, a_x);
19185
0
    } else if (v->vtable_name == NULL) {
19186
0
      break;
19187
0
    }
19188
0
    v++;
19189
0
  }
19190
19191
0
  return 0;
19192
0
}
19193
19194
// --------
19195
19196
WUFFS_BASE__GENERATED_C_CODE
19197
WUFFS_BASE__MAYBE_STATIC uint64_t
19198
wuffs_base__hasher_u64__checksum_u64(
19199
0
    const wuffs_base__hasher_u64* self) {
19200
0
  if (!self) {
19201
0
    return 0;
19202
0
  }
19203
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19204
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19205
0
    return 0;
19206
0
  }
19207
19208
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19209
0
  int i;
19210
0
  for (i = 0; i < 63; i++) {
19211
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19212
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19213
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19214
0
      return (*func_ptrs->checksum_u64)(self);
19215
0
    } else if (v->vtable_name == NULL) {
19216
0
      break;
19217
0
    }
19218
0
    v++;
19219
0
  }
19220
19221
0
  return 0;
19222
0
}
19223
19224
WUFFS_BASE__GENERATED_C_CODE
19225
WUFFS_BASE__MAYBE_STATIC uint64_t
19226
wuffs_base__hasher_u64__get_quirk(
19227
    const wuffs_base__hasher_u64* self,
19228
0
    uint32_t a_key) {
19229
0
  if (!self) {
19230
0
    return 0;
19231
0
  }
19232
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19233
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19234
0
    return 0;
19235
0
  }
19236
19237
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19238
0
  int i;
19239
0
  for (i = 0; i < 63; i++) {
19240
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19241
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19242
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19243
0
      return (*func_ptrs->get_quirk)(self, a_key);
19244
0
    } else if (v->vtable_name == NULL) {
19245
0
      break;
19246
0
    }
19247
0
    v++;
19248
0
  }
19249
19250
0
  return 0;
19251
0
}
19252
19253
WUFFS_BASE__GENERATED_C_CODE
19254
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19255
wuffs_base__hasher_u64__set_quirk(
19256
    wuffs_base__hasher_u64* self,
19257
    uint32_t a_key,
19258
0
    uint64_t a_value) {
19259
0
  if (!self) {
19260
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19261
0
  }
19262
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19263
0
    return wuffs_base__make_status(
19264
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19265
0
            ? wuffs_base__error__disabled_by_previous_error
19266
0
            : wuffs_base__error__initialize_not_called);
19267
0
  }
19268
19269
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19270
0
  int i;
19271
0
  for (i = 0; i < 63; i++) {
19272
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19273
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19274
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19275
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19276
0
    } else if (v->vtable_name == NULL) {
19277
0
      break;
19278
0
    }
19279
0
    v++;
19280
0
  }
19281
19282
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19283
0
}
19284
19285
WUFFS_BASE__GENERATED_C_CODE
19286
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19287
wuffs_base__hasher_u64__update(
19288
    wuffs_base__hasher_u64* self,
19289
0
    wuffs_base__slice_u8 a_x) {
19290
0
  if (!self) {
19291
0
    return wuffs_base__make_empty_struct();
19292
0
  }
19293
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19294
0
    return wuffs_base__make_empty_struct();
19295
0
  }
19296
19297
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19298
0
  int i;
19299
0
  for (i = 0; i < 63; i++) {
19300
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19301
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19302
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19303
0
      return (*func_ptrs->update)(self, a_x);
19304
0
    } else if (v->vtable_name == NULL) {
19305
0
      break;
19306
0
    }
19307
0
    v++;
19308
0
  }
19309
19310
0
  return wuffs_base__make_empty_struct();
19311
0
}
19312
19313
WUFFS_BASE__GENERATED_C_CODE
19314
WUFFS_BASE__MAYBE_STATIC uint64_t
19315
wuffs_base__hasher_u64__update_u64(
19316
    wuffs_base__hasher_u64* self,
19317
0
    wuffs_base__slice_u8 a_x) {
19318
0
  if (!self) {
19319
0
    return 0;
19320
0
  }
19321
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19322
0
    return 0;
19323
0
  }
19324
19325
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19326
0
  int i;
19327
0
  for (i = 0; i < 63; i++) {
19328
0
    if (v->vtable_name == wuffs_base__hasher_u64__vtable_name) {
19329
0
      const wuffs_base__hasher_u64__func_ptrs* func_ptrs =
19330
0
          (const wuffs_base__hasher_u64__func_ptrs*)(v->function_pointers);
19331
0
      return (*func_ptrs->update_u64)(self, a_x);
19332
0
    } else if (v->vtable_name == NULL) {
19333
0
      break;
19334
0
    }
19335
0
    v++;
19336
0
  }
19337
19338
0
  return 0;
19339
0
}
19340
19341
// --------
19342
19343
WUFFS_BASE__GENERATED_C_CODE
19344
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
19345
wuffs_base__hasher_bitvec256__checksum_bitvec256(
19346
0
    const wuffs_base__hasher_bitvec256* self) {
19347
0
  if (!self) {
19348
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19349
0
  }
19350
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19351
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19352
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19353
0
  }
19354
19355
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19356
0
  int i;
19357
0
  for (i = 0; i < 63; i++) {
19358
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19359
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19360
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19361
0
      return (*func_ptrs->checksum_bitvec256)(self);
19362
0
    } else if (v->vtable_name == NULL) {
19363
0
      break;
19364
0
    }
19365
0
    v++;
19366
0
  }
19367
19368
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19369
0
}
19370
19371
WUFFS_BASE__GENERATED_C_CODE
19372
WUFFS_BASE__MAYBE_STATIC uint64_t
19373
wuffs_base__hasher_bitvec256__get_quirk(
19374
    const wuffs_base__hasher_bitvec256* self,
19375
0
    uint32_t a_key) {
19376
0
  if (!self) {
19377
0
    return 0;
19378
0
  }
19379
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19380
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19381
0
    return 0;
19382
0
  }
19383
19384
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19385
0
  int i;
19386
0
  for (i = 0; i < 63; i++) {
19387
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19388
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19389
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19390
0
      return (*func_ptrs->get_quirk)(self, a_key);
19391
0
    } else if (v->vtable_name == NULL) {
19392
0
      break;
19393
0
    }
19394
0
    v++;
19395
0
  }
19396
19397
0
  return 0;
19398
0
}
19399
19400
WUFFS_BASE__GENERATED_C_CODE
19401
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19402
wuffs_base__hasher_bitvec256__set_quirk(
19403
    wuffs_base__hasher_bitvec256* self,
19404
    uint32_t a_key,
19405
0
    uint64_t a_value) {
19406
0
  if (!self) {
19407
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19408
0
  }
19409
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19410
0
    return wuffs_base__make_status(
19411
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19412
0
            ? wuffs_base__error__disabled_by_previous_error
19413
0
            : wuffs_base__error__initialize_not_called);
19414
0
  }
19415
19416
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19417
0
  int i;
19418
0
  for (i = 0; i < 63; i++) {
19419
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19420
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19421
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19422
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19423
0
    } else if (v->vtable_name == NULL) {
19424
0
      break;
19425
0
    }
19426
0
    v++;
19427
0
  }
19428
19429
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19430
0
}
19431
19432
WUFFS_BASE__GENERATED_C_CODE
19433
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19434
wuffs_base__hasher_bitvec256__update(
19435
    wuffs_base__hasher_bitvec256* self,
19436
0
    wuffs_base__slice_u8 a_x) {
19437
0
  if (!self) {
19438
0
    return wuffs_base__make_empty_struct();
19439
0
  }
19440
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19441
0
    return wuffs_base__make_empty_struct();
19442
0
  }
19443
19444
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19445
0
  int i;
19446
0
  for (i = 0; i < 63; i++) {
19447
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19448
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19449
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19450
0
      return (*func_ptrs->update)(self, a_x);
19451
0
    } else if (v->vtable_name == NULL) {
19452
0
      break;
19453
0
    }
19454
0
    v++;
19455
0
  }
19456
19457
0
  return wuffs_base__make_empty_struct();
19458
0
}
19459
19460
WUFFS_BASE__GENERATED_C_CODE
19461
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
19462
wuffs_base__hasher_bitvec256__update_bitvec256(
19463
    wuffs_base__hasher_bitvec256* self,
19464
0
    wuffs_base__slice_u8 a_x) {
19465
0
  if (!self) {
19466
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19467
0
  }
19468
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19469
0
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19470
0
  }
19471
19472
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19473
0
  int i;
19474
0
  for (i = 0; i < 63; i++) {
19475
0
    if (v->vtable_name == wuffs_base__hasher_bitvec256__vtable_name) {
19476
0
      const wuffs_base__hasher_bitvec256__func_ptrs* func_ptrs =
19477
0
          (const wuffs_base__hasher_bitvec256__func_ptrs*)(v->function_pointers);
19478
0
      return (*func_ptrs->update_bitvec256)(self, a_x);
19479
0
    } else if (v->vtable_name == NULL) {
19480
0
      break;
19481
0
    }
19482
0
    v++;
19483
0
  }
19484
19485
0
  return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
19486
0
}
19487
19488
// --------
19489
19490
WUFFS_BASE__GENERATED_C_CODE
19491
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19492
wuffs_base__image_decoder__decode_frame(
19493
    wuffs_base__image_decoder* self,
19494
    wuffs_base__pixel_buffer* a_dst,
19495
    wuffs_base__io_buffer* a_src,
19496
    wuffs_base__pixel_blend a_blend,
19497
    wuffs_base__slice_u8 a_workbuf,
19498
5.92k
    wuffs_base__decode_frame_options* a_opts) {
19499
5.92k
  if (!self) {
19500
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19501
0
  }
19502
5.92k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19503
0
    return wuffs_base__make_status(
19504
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19505
0
            ? wuffs_base__error__disabled_by_previous_error
19506
0
            : wuffs_base__error__initialize_not_called);
19507
0
  }
19508
19509
5.92k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19510
5.92k
  int i;
19511
5.92k
  for (i = 0; i < 63; i++) {
19512
5.92k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19513
5.92k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19514
5.92k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19515
5.92k
      return (*func_ptrs->decode_frame)(self, a_dst, a_src, a_blend, a_workbuf, a_opts);
19516
5.92k
    } else if (v->vtable_name == NULL) {
19517
0
      break;
19518
0
    }
19519
0
    v++;
19520
0
  }
19521
19522
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19523
5.92k
}
19524
19525
WUFFS_BASE__GENERATED_C_CODE
19526
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19527
wuffs_base__image_decoder__decode_frame_config(
19528
    wuffs_base__image_decoder* self,
19529
    wuffs_base__frame_config* a_dst,
19530
6.30k
    wuffs_base__io_buffer* a_src) {
19531
6.30k
  if (!self) {
19532
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19533
0
  }
19534
6.30k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19535
0
    return wuffs_base__make_status(
19536
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19537
0
            ? wuffs_base__error__disabled_by_previous_error
19538
0
            : wuffs_base__error__initialize_not_called);
19539
0
  }
19540
19541
6.30k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19542
6.30k
  int i;
19543
6.30k
  for (i = 0; i < 63; i++) {
19544
6.30k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19545
6.30k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19546
6.30k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19547
6.30k
      return (*func_ptrs->decode_frame_config)(self, a_dst, a_src);
19548
6.30k
    } else if (v->vtable_name == NULL) {
19549
0
      break;
19550
0
    }
19551
0
    v++;
19552
0
  }
19553
19554
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19555
6.30k
}
19556
19557
WUFFS_BASE__GENERATED_C_CODE
19558
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19559
wuffs_base__image_decoder__decode_image_config(
19560
    wuffs_base__image_decoder* self,
19561
    wuffs_base__image_config* a_dst,
19562
5.56k
    wuffs_base__io_buffer* a_src) {
19563
5.56k
  if (!self) {
19564
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19565
0
  }
19566
5.56k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19567
0
    return wuffs_base__make_status(
19568
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19569
0
            ? wuffs_base__error__disabled_by_previous_error
19570
0
            : wuffs_base__error__initialize_not_called);
19571
0
  }
19572
19573
5.56k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19574
5.56k
  int i;
19575
5.56k
  for (i = 0; i < 63; i++) {
19576
5.56k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19577
5.56k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19578
5.56k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19579
5.56k
      return (*func_ptrs->decode_image_config)(self, a_dst, a_src);
19580
5.56k
    } else if (v->vtable_name == NULL) {
19581
0
      break;
19582
0
    }
19583
0
    v++;
19584
0
  }
19585
19586
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19587
5.56k
}
19588
19589
WUFFS_BASE__GENERATED_C_CODE
19590
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
19591
wuffs_base__image_decoder__frame_dirty_rect(
19592
5.92k
    const wuffs_base__image_decoder* self) {
19593
5.92k
  if (!self) {
19594
0
    return wuffs_base__utility__empty_rect_ie_u32();
19595
0
  }
19596
5.92k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19597
5.92k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19598
0
    return wuffs_base__utility__empty_rect_ie_u32();
19599
0
  }
19600
19601
5.92k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19602
5.92k
  int i;
19603
5.92k
  for (i = 0; i < 63; i++) {
19604
5.92k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19605
5.92k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19606
5.92k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19607
5.92k
      return (*func_ptrs->frame_dirty_rect)(self);
19608
5.92k
    } else if (v->vtable_name == NULL) {
19609
0
      break;
19610
0
    }
19611
0
    v++;
19612
0
  }
19613
19614
0
  return wuffs_base__utility__empty_rect_ie_u32();
19615
5.92k
}
19616
19617
WUFFS_BASE__GENERATED_C_CODE
19618
WUFFS_BASE__MAYBE_STATIC uint64_t
19619
wuffs_base__image_decoder__get_quirk(
19620
    const wuffs_base__image_decoder* self,
19621
0
    uint32_t a_key) {
19622
0
  if (!self) {
19623
0
    return 0;
19624
0
  }
19625
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19626
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19627
0
    return 0;
19628
0
  }
19629
19630
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19631
0
  int i;
19632
0
  for (i = 0; i < 63; i++) {
19633
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19634
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19635
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19636
0
      return (*func_ptrs->get_quirk)(self, a_key);
19637
0
    } else if (v->vtable_name == NULL) {
19638
0
      break;
19639
0
    }
19640
0
    v++;
19641
0
  }
19642
19643
0
  return 0;
19644
0
}
19645
19646
WUFFS_BASE__GENERATED_C_CODE
19647
WUFFS_BASE__MAYBE_STATIC uint32_t
19648
wuffs_base__image_decoder__num_animation_loops(
19649
0
    const wuffs_base__image_decoder* self) {
19650
0
  if (!self) {
19651
0
    return 0;
19652
0
  }
19653
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19654
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19655
0
    return 0;
19656
0
  }
19657
19658
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19659
0
  int i;
19660
0
  for (i = 0; i < 63; i++) {
19661
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19662
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19663
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19664
0
      return (*func_ptrs->num_animation_loops)(self);
19665
0
    } else if (v->vtable_name == NULL) {
19666
0
      break;
19667
0
    }
19668
0
    v++;
19669
0
  }
19670
19671
0
  return 0;
19672
0
}
19673
19674
WUFFS_BASE__GENERATED_C_CODE
19675
WUFFS_BASE__MAYBE_STATIC uint64_t
19676
wuffs_base__image_decoder__num_decoded_frame_configs(
19677
0
    const wuffs_base__image_decoder* self) {
19678
0
  if (!self) {
19679
0
    return 0;
19680
0
  }
19681
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19682
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19683
0
    return 0;
19684
0
  }
19685
19686
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19687
0
  int i;
19688
0
  for (i = 0; i < 63; i++) {
19689
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19690
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19691
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19692
0
      return (*func_ptrs->num_decoded_frame_configs)(self);
19693
0
    } else if (v->vtable_name == NULL) {
19694
0
      break;
19695
0
    }
19696
0
    v++;
19697
0
  }
19698
19699
0
  return 0;
19700
0
}
19701
19702
WUFFS_BASE__GENERATED_C_CODE
19703
WUFFS_BASE__MAYBE_STATIC uint64_t
19704
wuffs_base__image_decoder__num_decoded_frames(
19705
0
    const wuffs_base__image_decoder* self) {
19706
0
  if (!self) {
19707
0
    return 0;
19708
0
  }
19709
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19710
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19711
0
    return 0;
19712
0
  }
19713
19714
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19715
0
  int i;
19716
0
  for (i = 0; i < 63; i++) {
19717
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19718
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19719
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19720
0
      return (*func_ptrs->num_decoded_frames)(self);
19721
0
    } else if (v->vtable_name == NULL) {
19722
0
      break;
19723
0
    }
19724
0
    v++;
19725
0
  }
19726
19727
0
  return 0;
19728
0
}
19729
19730
WUFFS_BASE__GENERATED_C_CODE
19731
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19732
wuffs_base__image_decoder__restart_frame(
19733
    wuffs_base__image_decoder* self,
19734
    uint64_t a_index,
19735
0
    uint64_t a_io_position) {
19736
0
  if (!self) {
19737
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19738
0
  }
19739
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19740
0
    return wuffs_base__make_status(
19741
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19742
0
            ? wuffs_base__error__disabled_by_previous_error
19743
0
            : wuffs_base__error__initialize_not_called);
19744
0
  }
19745
19746
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19747
0
  int i;
19748
0
  for (i = 0; i < 63; i++) {
19749
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19750
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19751
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19752
0
      return (*func_ptrs->restart_frame)(self, a_index, a_io_position);
19753
0
    } else if (v->vtable_name == NULL) {
19754
0
      break;
19755
0
    }
19756
0
    v++;
19757
0
  }
19758
19759
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19760
0
}
19761
19762
WUFFS_BASE__GENERATED_C_CODE
19763
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19764
wuffs_base__image_decoder__set_quirk(
19765
    wuffs_base__image_decoder* self,
19766
    uint32_t a_key,
19767
0
    uint64_t a_value) {
19768
0
  if (!self) {
19769
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19770
0
  }
19771
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19772
0
    return wuffs_base__make_status(
19773
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19774
0
            ? wuffs_base__error__disabled_by_previous_error
19775
0
            : wuffs_base__error__initialize_not_called);
19776
0
  }
19777
19778
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19779
0
  int i;
19780
0
  for (i = 0; i < 63; i++) {
19781
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19782
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19783
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19784
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19785
0
    } else if (v->vtable_name == NULL) {
19786
0
      break;
19787
0
    }
19788
0
    v++;
19789
0
  }
19790
19791
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19792
0
}
19793
19794
WUFFS_BASE__GENERATED_C_CODE
19795
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
19796
wuffs_base__image_decoder__set_report_metadata(
19797
    wuffs_base__image_decoder* self,
19798
    uint32_t a_fourcc,
19799
0
    bool a_report) {
19800
0
  if (!self) {
19801
0
    return wuffs_base__make_empty_struct();
19802
0
  }
19803
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19804
0
    return wuffs_base__make_empty_struct();
19805
0
  }
19806
19807
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19808
0
  int i;
19809
0
  for (i = 0; i < 63; i++) {
19810
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19811
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19812
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19813
0
      return (*func_ptrs->set_report_metadata)(self, a_fourcc, a_report);
19814
0
    } else if (v->vtable_name == NULL) {
19815
0
      break;
19816
0
    }
19817
0
    v++;
19818
0
  }
19819
19820
0
  return wuffs_base__make_empty_struct();
19821
0
}
19822
19823
WUFFS_BASE__GENERATED_C_CODE
19824
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19825
wuffs_base__image_decoder__tell_me_more(
19826
    wuffs_base__image_decoder* self,
19827
    wuffs_base__io_buffer* a_dst,
19828
    wuffs_base__more_information* a_minfo,
19829
0
    wuffs_base__io_buffer* a_src) {
19830
0
  if (!self) {
19831
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19832
0
  }
19833
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19834
0
    return wuffs_base__make_status(
19835
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19836
0
            ? wuffs_base__error__disabled_by_previous_error
19837
0
            : wuffs_base__error__initialize_not_called);
19838
0
  }
19839
19840
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19841
0
  int i;
19842
0
  for (i = 0; i < 63; i++) {
19843
0
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19844
0
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19845
0
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19846
0
      return (*func_ptrs->tell_me_more)(self, a_dst, a_minfo, a_src);
19847
0
    } else if (v->vtable_name == NULL) {
19848
0
      break;
19849
0
    }
19850
0
    v++;
19851
0
  }
19852
19853
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19854
0
}
19855
19856
WUFFS_BASE__GENERATED_C_CODE
19857
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
19858
wuffs_base__image_decoder__workbuf_len(
19859
3.90k
    const wuffs_base__image_decoder* self) {
19860
3.90k
  if (!self) {
19861
0
    return wuffs_base__utility__empty_range_ii_u64();
19862
0
  }
19863
3.90k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19864
3.90k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19865
0
    return wuffs_base__utility__empty_range_ii_u64();
19866
0
  }
19867
19868
3.90k
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19869
3.90k
  int i;
19870
3.90k
  for (i = 0; i < 63; i++) {
19871
3.90k
    if (v->vtable_name == wuffs_base__image_decoder__vtable_name) {
19872
3.90k
      const wuffs_base__image_decoder__func_ptrs* func_ptrs =
19873
3.90k
          (const wuffs_base__image_decoder__func_ptrs*)(v->function_pointers);
19874
3.90k
      return (*func_ptrs->workbuf_len)(self);
19875
3.90k
    } else if (v->vtable_name == NULL) {
19876
0
      break;
19877
0
    }
19878
0
    v++;
19879
0
  }
19880
19881
0
  return wuffs_base__utility__empty_range_ii_u64();
19882
3.90k
}
19883
19884
// --------
19885
19886
WUFFS_BASE__GENERATED_C_CODE
19887
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
19888
wuffs_base__io_transformer__dst_history_retain_length(
19889
0
    const wuffs_base__io_transformer* self) {
19890
0
  if (!self) {
19891
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19892
0
  }
19893
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19894
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19895
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
19896
0
  }
19897
19898
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19899
0
  int i;
19900
0
  for (i = 0; i < 63; i++) {
19901
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19902
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19903
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19904
0
      return (*func_ptrs->dst_history_retain_length)(self);
19905
0
    } else if (v->vtable_name == NULL) {
19906
0
      break;
19907
0
    }
19908
0
    v++;
19909
0
  }
19910
19911
0
  return wuffs_base__utility__make_optional_u63(false, 0u);
19912
0
}
19913
19914
WUFFS_BASE__GENERATED_C_CODE
19915
WUFFS_BASE__MAYBE_STATIC uint64_t
19916
wuffs_base__io_transformer__get_quirk(
19917
    const wuffs_base__io_transformer* self,
19918
0
    uint32_t a_key) {
19919
0
  if (!self) {
19920
0
    return 0;
19921
0
  }
19922
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
19923
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
19924
0
    return 0;
19925
0
  }
19926
19927
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19928
0
  int i;
19929
0
  for (i = 0; i < 63; i++) {
19930
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19931
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19932
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19933
0
      return (*func_ptrs->get_quirk)(self, a_key);
19934
0
    } else if (v->vtable_name == NULL) {
19935
0
      break;
19936
0
    }
19937
0
    v++;
19938
0
  }
19939
19940
0
  return 0;
19941
0
}
19942
19943
WUFFS_BASE__GENERATED_C_CODE
19944
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19945
wuffs_base__io_transformer__set_quirk(
19946
    wuffs_base__io_transformer* self,
19947
    uint32_t a_key,
19948
0
    uint64_t a_value) {
19949
0
  if (!self) {
19950
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19951
0
  }
19952
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19953
0
    return wuffs_base__make_status(
19954
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19955
0
            ? wuffs_base__error__disabled_by_previous_error
19956
0
            : wuffs_base__error__initialize_not_called);
19957
0
  }
19958
19959
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19960
0
  int i;
19961
0
  for (i = 0; i < 63; i++) {
19962
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19963
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19964
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19965
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
19966
0
    } else if (v->vtable_name == NULL) {
19967
0
      break;
19968
0
    }
19969
0
    v++;
19970
0
  }
19971
19972
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
19973
0
}
19974
19975
WUFFS_BASE__GENERATED_C_CODE
19976
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
19977
wuffs_base__io_transformer__transform_io(
19978
    wuffs_base__io_transformer* self,
19979
    wuffs_base__io_buffer* a_dst,
19980
    wuffs_base__io_buffer* a_src,
19981
0
    wuffs_base__slice_u8 a_workbuf) {
19982
0
  if (!self) {
19983
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
19984
0
  }
19985
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
19986
0
    return wuffs_base__make_status(
19987
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
19988
0
            ? wuffs_base__error__disabled_by_previous_error
19989
0
            : wuffs_base__error__initialize_not_called);
19990
0
  }
19991
19992
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
19993
0
  int i;
19994
0
  for (i = 0; i < 63; i++) {
19995
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
19996
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
19997
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
19998
0
      return (*func_ptrs->transform_io)(self, a_dst, a_src, a_workbuf);
19999
0
    } else if (v->vtable_name == NULL) {
20000
0
      break;
20001
0
    }
20002
0
    v++;
20003
0
  }
20004
20005
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20006
0
}
20007
20008
WUFFS_BASE__GENERATED_C_CODE
20009
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
20010
wuffs_base__io_transformer__workbuf_len(
20011
0
    const wuffs_base__io_transformer* self) {
20012
0
  if (!self) {
20013
0
    return wuffs_base__utility__empty_range_ii_u64();
20014
0
  }
20015
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20016
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20017
0
    return wuffs_base__utility__empty_range_ii_u64();
20018
0
  }
20019
20020
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20021
0
  int i;
20022
0
  for (i = 0; i < 63; i++) {
20023
0
    if (v->vtable_name == wuffs_base__io_transformer__vtable_name) {
20024
0
      const wuffs_base__io_transformer__func_ptrs* func_ptrs =
20025
0
          (const wuffs_base__io_transformer__func_ptrs*)(v->function_pointers);
20026
0
      return (*func_ptrs->workbuf_len)(self);
20027
0
    } else if (v->vtable_name == NULL) {
20028
0
      break;
20029
0
    }
20030
0
    v++;
20031
0
  }
20032
20033
0
  return wuffs_base__utility__empty_range_ii_u64();
20034
0
}
20035
20036
// --------
20037
20038
WUFFS_BASE__GENERATED_C_CODE
20039
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
20040
wuffs_base__token_decoder__decode_tokens(
20041
    wuffs_base__token_decoder* self,
20042
    wuffs_base__token_buffer* a_dst,
20043
    wuffs_base__io_buffer* a_src,
20044
0
    wuffs_base__slice_u8 a_workbuf) {
20045
0
  if (!self) {
20046
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20047
0
  }
20048
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
20049
0
    return wuffs_base__make_status(
20050
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
20051
0
            ? wuffs_base__error__disabled_by_previous_error
20052
0
            : wuffs_base__error__initialize_not_called);
20053
0
  }
20054
20055
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20056
0
  int i;
20057
0
  for (i = 0; i < 63; i++) {
20058
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20059
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20060
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20061
0
      return (*func_ptrs->decode_tokens)(self, a_dst, a_src, a_workbuf);
20062
0
    } else if (v->vtable_name == NULL) {
20063
0
      break;
20064
0
    }
20065
0
    v++;
20066
0
  }
20067
20068
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20069
0
}
20070
20071
WUFFS_BASE__GENERATED_C_CODE
20072
WUFFS_BASE__MAYBE_STATIC uint64_t
20073
wuffs_base__token_decoder__get_quirk(
20074
    const wuffs_base__token_decoder* self,
20075
0
    uint32_t a_key) {
20076
0
  if (!self) {
20077
0
    return 0;
20078
0
  }
20079
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20080
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20081
0
    return 0;
20082
0
  }
20083
20084
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20085
0
  int i;
20086
0
  for (i = 0; i < 63; i++) {
20087
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20088
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20089
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20090
0
      return (*func_ptrs->get_quirk)(self, a_key);
20091
0
    } else if (v->vtable_name == NULL) {
20092
0
      break;
20093
0
    }
20094
0
    v++;
20095
0
  }
20096
20097
0
  return 0;
20098
0
}
20099
20100
WUFFS_BASE__GENERATED_C_CODE
20101
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
20102
wuffs_base__token_decoder__set_quirk(
20103
    wuffs_base__token_decoder* self,
20104
    uint32_t a_key,
20105
0
    uint64_t a_value) {
20106
0
  if (!self) {
20107
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
20108
0
  }
20109
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
20110
0
    return wuffs_base__make_status(
20111
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
20112
0
            ? wuffs_base__error__disabled_by_previous_error
20113
0
            : wuffs_base__error__initialize_not_called);
20114
0
  }
20115
20116
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20117
0
  int i;
20118
0
  for (i = 0; i < 63; i++) {
20119
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20120
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20121
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20122
0
      return (*func_ptrs->set_quirk)(self, a_key, a_value);
20123
0
    } else if (v->vtable_name == NULL) {
20124
0
      break;
20125
0
    }
20126
0
    v++;
20127
0
  }
20128
20129
0
  return wuffs_base__make_status(wuffs_base__error__bad_vtable);
20130
0
}
20131
20132
WUFFS_BASE__GENERATED_C_CODE
20133
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
20134
wuffs_base__token_decoder__workbuf_len(
20135
0
    const wuffs_base__token_decoder* self) {
20136
0
  if (!self) {
20137
0
    return wuffs_base__utility__empty_range_ii_u64();
20138
0
  }
20139
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
20140
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
20141
0
    return wuffs_base__utility__empty_range_ii_u64();
20142
0
  }
20143
20144
0
  const wuffs_base__vtable* v = &self->private_impl.first_vtable;
20145
0
  int i;
20146
0
  for (i = 0; i < 63; i++) {
20147
0
    if (v->vtable_name == wuffs_base__token_decoder__vtable_name) {
20148
0
      const wuffs_base__token_decoder__func_ptrs* func_ptrs =
20149
0
          (const wuffs_base__token_decoder__func_ptrs*)(v->function_pointers);
20150
0
      return (*func_ptrs->workbuf_len)(self);
20151
0
    } else if (v->vtable_name == NULL) {
20152
0
      break;
20153
0
    }
20154
0
    v++;
20155
0
  }
20156
20157
0
  return wuffs_base__utility__empty_range_ii_u64();
20158
0
}
20159
20160
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
20161
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
20162
        // defined(WUFFS_CONFIG__MODULE__BASE__INTERFACES)
20163
20164
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
20165
    defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
20166
20167
// ---------------- IEEE 754 Floating Point
20168
20169
// The etc__hpd_left_shift and etc__powers_of_5 tables were printed by
20170
// script/print-hpd-left-shift.go. That script has an optional -comments flag,
20171
// whose output is not copied here, which prints further detail.
20172
//
20173
// These tables are used in
20174
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits.
20175
20176
// wuffs_private_impl__hpd_left_shift[i] encodes the number of new digits
20177
// created after multiplying a positive integer by (1 << i): the additional
20178
// length in the decimal representation. For example, shifting "234" by 3
20179
// (equivalent to multiplying by 8) will produce "1872". Going from a 3-length
20180
// string to a 4-length string means that 1 new digit was added (and existing
20181
// digits may have changed).
20182
//
20183
// Shifting by i can add either N or N-1 new digits, depending on whether the
20184
// original positive integer compares >= or < to the i'th power of 5 (as 10
20185
// equals 2 * 5). Comparison is lexicographic, not numerical.
20186
//
20187
// For example, shifting by 4 (i.e. multiplying by 16) can add 1 or 2 new
20188
// digits, depending on a lexicographic comparison to (5 ** 4), i.e. "625":
20189
//  - ("1"      << 4) is "16",       which adds 1 new digit.
20190
//  - ("5678"   << 4) is "90848",    which adds 1 new digit.
20191
//  - ("624"    << 4) is "9984",     which adds 1 new digit.
20192
//  - ("62498"  << 4) is "999968",   which adds 1 new digit.
20193
//  - ("625"    << 4) is "10000",    which adds 2 new digits.
20194
//  - ("625001" << 4) is "10000016", which adds 2 new digits.
20195
//  - ("7008"   << 4) is "112128",   which adds 2 new digits.
20196
//  - ("99"     << 4) is "1584",     which adds 2 new digits.
20197
//
20198
// Thus, when i is 4, N is 2 and (5 ** i) is "625". This etc__hpd_left_shift
20199
// array encodes this as:
20200
//  - etc__hpd_left_shift[4] is 0x1006 = (2 << 11) | 0x0006.
20201
//  - etc__hpd_left_shift[5] is 0x1009 = (? << 11) | 0x0009.
20202
// where the ? isn't relevant for i == 4.
20203
//
20204
// The high 5 bits of etc__hpd_left_shift[i] is N, the higher of the two
20205
// possible number of new digits. The low 11 bits are an offset into the
20206
// etc__powers_of_5 array (of length 0x051C, so offsets fit in 11 bits). When i
20207
// is 4, its offset and the next one is 6 and 9, and etc__powers_of_5[6 .. 9]
20208
// is the string "\x06\x02\x05", so the relevant power of 5 is "625".
20209
//
20210
// Thanks to Ken Thompson for the original idea.
20211
static const uint16_t wuffs_private_impl__hpd_left_shift[65] = {
20212
    0x0000, 0x0800, 0x0801, 0x0803, 0x1006, 0x1009, 0x100D, 0x1812, 0x1817,
20213
    0x181D, 0x2024, 0x202B, 0x2033, 0x203C, 0x2846, 0x2850, 0x285B, 0x3067,
20214
    0x3073, 0x3080, 0x388E, 0x389C, 0x38AB, 0x38BB, 0x40CC, 0x40DD, 0x40EF,
20215
    0x4902, 0x4915, 0x4929, 0x513E, 0x5153, 0x5169, 0x5180, 0x5998, 0x59B0,
20216
    0x59C9, 0x61E3, 0x61FD, 0x6218, 0x6A34, 0x6A50, 0x6A6D, 0x6A8B, 0x72AA,
20217
    0x72C9, 0x72E9, 0x7B0A, 0x7B2B, 0x7B4D, 0x8370, 0x8393, 0x83B7, 0x83DC,
20218
    0x8C02, 0x8C28, 0x8C4F, 0x9477, 0x949F, 0x94C8, 0x9CF2, 0x051C, 0x051C,
20219
    0x051C, 0x051C,
20220
};
20221
20222
// wuffs_private_impl__powers_of_5 contains the powers of 5, concatenated
20223
// together: "5", "25", "125", "625", "3125", etc.
20224
static const uint8_t wuffs_private_impl__powers_of_5[0x051C] = {
20225
    5, 2, 5, 1, 2, 5, 6, 2, 5, 3, 1, 2, 5, 1, 5, 6, 2, 5, 7, 8, 1, 2, 5, 3, 9,
20226
    0, 6, 2, 5, 1, 9, 5, 3, 1, 2, 5, 9, 7, 6, 5, 6, 2, 5, 4, 8, 8, 2, 8, 1, 2,
20227
    5, 2, 4, 4, 1, 4, 0, 6, 2, 5, 1, 2, 2, 0, 7, 0, 3, 1, 2, 5, 6, 1, 0, 3, 5,
20228
    1, 5, 6, 2, 5, 3, 0, 5, 1, 7, 5, 7, 8, 1, 2, 5, 1, 5, 2, 5, 8, 7, 8, 9, 0,
20229
    6, 2, 5, 7, 6, 2, 9, 3, 9, 4, 5, 3, 1, 2, 5, 3, 8, 1, 4, 6, 9, 7, 2, 6, 5,
20230
    6, 2, 5, 1, 9, 0, 7, 3, 4, 8, 6, 3, 2, 8, 1, 2, 5, 9, 5, 3, 6, 7, 4, 3, 1,
20231
    6, 4, 0, 6, 2, 5, 4, 7, 6, 8, 3, 7, 1, 5, 8, 2, 0, 3, 1, 2, 5, 2, 3, 8, 4,
20232
    1, 8, 5, 7, 9, 1, 0, 1, 5, 6, 2, 5, 1, 1, 9, 2, 0, 9, 2, 8, 9, 5, 5, 0, 7,
20233
    8, 1, 2, 5, 5, 9, 6, 0, 4, 6, 4, 4, 7, 7, 5, 3, 9, 0, 6, 2, 5, 2, 9, 8, 0,
20234
    2, 3, 2, 2, 3, 8, 7, 6, 9, 5, 3, 1, 2, 5, 1, 4, 9, 0, 1, 1, 6, 1, 1, 9, 3,
20235
    8, 4, 7, 6, 5, 6, 2, 5, 7, 4, 5, 0, 5, 8, 0, 5, 9, 6, 9, 2, 3, 8, 2, 8, 1,
20236
    2, 5, 3, 7, 2, 5, 2, 9, 0, 2, 9, 8, 4, 6, 1, 9, 1, 4, 0, 6, 2, 5, 1, 8, 6,
20237
    2, 6, 4, 5, 1, 4, 9, 2, 3, 0, 9, 5, 7, 0, 3, 1, 2, 5, 9, 3, 1, 3, 2, 2, 5,
20238
    7, 4, 6, 1, 5, 4, 7, 8, 5, 1, 5, 6, 2, 5, 4, 6, 5, 6, 6, 1, 2, 8, 7, 3, 0,
20239
    7, 7, 3, 9, 2, 5, 7, 8, 1, 2, 5, 2, 3, 2, 8, 3, 0, 6, 4, 3, 6, 5, 3, 8, 6,
20240
    9, 6, 2, 8, 9, 0, 6, 2, 5, 1, 1, 6, 4, 1, 5, 3, 2, 1, 8, 2, 6, 9, 3, 4, 8,
20241
    1, 4, 4, 5, 3, 1, 2, 5, 5, 8, 2, 0, 7, 6, 6, 0, 9, 1, 3, 4, 6, 7, 4, 0, 7,
20242
    2, 2, 6, 5, 6, 2, 5, 2, 9, 1, 0, 3, 8, 3, 0, 4, 5, 6, 7, 3, 3, 7, 0, 3, 6,
20243
    1, 3, 2, 8, 1, 2, 5, 1, 4, 5, 5, 1, 9, 1, 5, 2, 2, 8, 3, 6, 6, 8, 5, 1, 8,
20244
    0, 6, 6, 4, 0, 6, 2, 5, 7, 2, 7, 5, 9, 5, 7, 6, 1, 4, 1, 8, 3, 4, 2, 5, 9,
20245
    0, 3, 3, 2, 0, 3, 1, 2, 5, 3, 6, 3, 7, 9, 7, 8, 8, 0, 7, 0, 9, 1, 7, 1, 2,
20246
    9, 5, 1, 6, 6, 0, 1, 5, 6, 2, 5, 1, 8, 1, 8, 9, 8, 9, 4, 0, 3, 5, 4, 5, 8,
20247
    5, 6, 4, 7, 5, 8, 3, 0, 0, 7, 8, 1, 2, 5, 9, 0, 9, 4, 9, 4, 7, 0, 1, 7, 7,
20248
    2, 9, 2, 8, 2, 3, 7, 9, 1, 5, 0, 3, 9, 0, 6, 2, 5, 4, 5, 4, 7, 4, 7, 3, 5,
20249
    0, 8, 8, 6, 4, 6, 4, 1, 1, 8, 9, 5, 7, 5, 1, 9, 5, 3, 1, 2, 5, 2, 2, 7, 3,
20250
    7, 3, 6, 7, 5, 4, 4, 3, 2, 3, 2, 0, 5, 9, 4, 7, 8, 7, 5, 9, 7, 6, 5, 6, 2,
20251
    5, 1, 1, 3, 6, 8, 6, 8, 3, 7, 7, 2, 1, 6, 1, 6, 0, 2, 9, 7, 3, 9, 3, 7, 9,
20252
    8, 8, 2, 8, 1, 2, 5, 5, 6, 8, 4, 3, 4, 1, 8, 8, 6, 0, 8, 0, 8, 0, 1, 4, 8,
20253
    6, 9, 6, 8, 9, 9, 4, 1, 4, 0, 6, 2, 5, 2, 8, 4, 2, 1, 7, 0, 9, 4, 3, 0, 4,
20254
    0, 4, 0, 0, 7, 4, 3, 4, 8, 4, 4, 9, 7, 0, 7, 0, 3, 1, 2, 5, 1, 4, 2, 1, 0,
20255
    8, 5, 4, 7, 1, 5, 2, 0, 2, 0, 0, 3, 7, 1, 7, 4, 2, 2, 4, 8, 5, 3, 5, 1, 5,
20256
    6, 2, 5, 7, 1, 0, 5, 4, 2, 7, 3, 5, 7, 6, 0, 1, 0, 0, 1, 8, 5, 8, 7, 1, 1,
20257
    2, 4, 2, 6, 7, 5, 7, 8, 1, 2, 5, 3, 5, 5, 2, 7, 1, 3, 6, 7, 8, 8, 0, 0, 5,
20258
    0, 0, 9, 2, 9, 3, 5, 5, 6, 2, 1, 3, 3, 7, 8, 9, 0, 6, 2, 5, 1, 7, 7, 6, 3,
20259
    5, 6, 8, 3, 9, 4, 0, 0, 2, 5, 0, 4, 6, 4, 6, 7, 7, 8, 1, 0, 6, 6, 8, 9, 4,
20260
    5, 3, 1, 2, 5, 8, 8, 8, 1, 7, 8, 4, 1, 9, 7, 0, 0, 1, 2, 5, 2, 3, 2, 3, 3,
20261
    8, 9, 0, 5, 3, 3, 4, 4, 7, 2, 6, 5, 6, 2, 5, 4, 4, 4, 0, 8, 9, 2, 0, 9, 8,
20262
    5, 0, 0, 6, 2, 6, 1, 6, 1, 6, 9, 4, 5, 2, 6, 6, 7, 2, 3, 6, 3, 2, 8, 1, 2,
20263
    5, 2, 2, 2, 0, 4, 4, 6, 0, 4, 9, 2, 5, 0, 3, 1, 3, 0, 8, 0, 8, 4, 7, 2, 6,
20264
    3, 3, 3, 6, 1, 8, 1, 6, 4, 0, 6, 2, 5, 1, 1, 1, 0, 2, 2, 3, 0, 2, 4, 6, 2,
20265
    5, 1, 5, 6, 5, 4, 0, 4, 2, 3, 6, 3, 1, 6, 6, 8, 0, 9, 0, 8, 2, 0, 3, 1, 2,
20266
    5, 5, 5, 5, 1, 1, 1, 5, 1, 2, 3, 1, 2, 5, 7, 8, 2, 7, 0, 2, 1, 1, 8, 1, 5,
20267
    8, 3, 4, 0, 4, 5, 4, 1, 0, 1, 5, 6, 2, 5, 2, 7, 7, 5, 5, 5, 7, 5, 6, 1, 5,
20268
    6, 2, 8, 9, 1, 3, 5, 1, 0, 5, 9, 0, 7, 9, 1, 7, 0, 2, 2, 7, 0, 5, 0, 7, 8,
20269
    1, 2, 5, 1, 3, 8, 7, 7, 7, 8, 7, 8, 0, 7, 8, 1, 4, 4, 5, 6, 7, 5, 5, 2, 9,
20270
    5, 3, 9, 5, 8, 5, 1, 1, 3, 5, 2, 5, 3, 9, 0, 6, 2, 5, 6, 9, 3, 8, 8, 9, 3,
20271
    9, 0, 3, 9, 0, 7, 2, 2, 8, 3, 7, 7, 6, 4, 7, 6, 9, 7, 9, 2, 5, 5, 6, 7, 6,
20272
    2, 6, 9, 5, 3, 1, 2, 5, 3, 4, 6, 9, 4, 4, 6, 9, 5, 1, 9, 5, 3, 6, 1, 4, 1,
20273
    8, 8, 8, 2, 3, 8, 4, 8, 9, 6, 2, 7, 8, 3, 8, 1, 3, 4, 7, 6, 5, 6, 2, 5, 1,
20274
    7, 3, 4, 7, 2, 3, 4, 7, 5, 9, 7, 6, 8, 0, 7, 0, 9, 4, 4, 1, 1, 9, 2, 4, 4,
20275
    8, 1, 3, 9, 1, 9, 0, 6, 7, 3, 8, 2, 8, 1, 2, 5, 8, 6, 7, 3, 6, 1, 7, 3, 7,
20276
    9, 8, 8, 4, 0, 3, 5, 4, 7, 2, 0, 5, 9, 6, 2, 2, 4, 0, 6, 9, 5, 9, 5, 3, 3,
20277
    6, 9, 1, 4, 0, 6, 2, 5,
20278
};
20279
20280
// --------
20281
20282
// wuffs_private_impl__powers_of_10 contains truncated approximations to the
20283
// powers of 10, ranging from 1e-307 to 1e+288 inclusive, as 596 pairs of
20284
// uint64_t values (a 128-bit mantissa).
20285
//
20286
// There's also an implicit third column (implied by a linear formula involving
20287
// the base-10 exponent) that is the base-2 exponent, biased by a magic
20288
// constant. That constant (1214 or 0x04BE) equals 1023 + 191. 1023 is the bias
20289
// for IEEE 754 double-precision floating point. 191 is ((3 * 64) - 1) and
20290
// wuffs_private_impl__parse_number_f64_eisel_lemire works with
20291
// multiples-of-64-bit mantissas.
20292
//
20293
// For example, the third row holds the approximation to 1e-305:
20294
//   0xE0B62E29_29ABA83C_331ACDAB_FE94DE87 * (2 ** (0x0049 - 0x04BE))
20295
//
20296
// Similarly, 1e+4 is approximated by:
20297
//   0x9C400000_00000000_00000000_00000000 * (2 ** (0x044C - 0x04BE))
20298
//
20299
// Similarly, 1e+68 is approximated by:
20300
//   0xED63A231_D4C4FB27_4CA7AAA8_63EE4BDD * (2 ** (0x0520 - 0x04BE))
20301
//
20302
// This table was generated by by script/print-mpb-powers-of-10.go
20303
static const uint64_t wuffs_private_impl__powers_of_10[596][2] = {
20304
    {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB},  // 1e-307
20305
    {0x8F48A4899877186C, 0xB3C4F1BA87BC8696},  // 1e-306
20306
    {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C},  // 1e-305
20307
    {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925},  // 1e-304
20308
    {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F},  // 1e-303
20309
    {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A},  // 1e-302
20310
    {0xBE311C083A225CD2, 0x892731AC9FAF056E},  // 1e-301
20311
    {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA},  // 1e-300
20312
    {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D},  // 1e-299
20313
    {0x25BBF56008C58EA5, 0x85F0468293F0EB4E},  // 1e-298
20314
    {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621},  // 1e-297
20315
    {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA},  // 1e-296
20316
    {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA},  // 1e-295
20317
    {0xE50FF107BAB528A0, 0xA37FCE126597973C},  // 1e-294
20318
    {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C},  // 1e-293
20319
    {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F},  // 1e-292
20320
    {0x77B191618C54E9AC, 0x9FAACF3DF73609B1},  // 1e-291
20321
    {0xD59DF5B9EF6A2417, 0xC795830D75038C1D},  // 1e-290
20322
    {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25},  // 1e-289
20323
    {0x4EE367F9430AEC32, 0x9BECCE62836AC577},  // 1e-288
20324
    {0x229C41F793CDA73F, 0xC2E801FB244576D5},  // 1e-287
20325
    {0x6B43527578C1110F, 0xF3A20279ED56D48A},  // 1e-286
20326
    {0x830A13896B78AAA9, 0x9845418C345644D6},  // 1e-285
20327
    {0x23CC986BC656D553, 0xBE5691EF416BD60C},  // 1e-284
20328
    {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F},  // 1e-283
20329
    {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39},  // 1e-282
20330
    {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07},  // 1e-281
20331
    {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9},  // 1e-280
20332
    {0x23100809B9C21FA1, 0x91376C36D99995BE},  // 1e-279
20333
    {0xABD40A0C2832A78A, 0xB58547448FFFFB2D},  // 1e-278
20334
    {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9},  // 1e-277
20335
    {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B},  // 1e-276
20336
    {0x99CD11CFDF41779C, 0xB1442798F49FFB4A},  // 1e-275
20337
    {0x40405643D711D583, 0xDD95317F31C7FA1D},  // 1e-274
20338
    {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52},  // 1e-273
20339
    {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66},  // 1e-272
20340
    {0x90BED43E40076A82, 0xD863B256369D4A40},  // 1e-271
20341
    {0x5A7744A6E804A291, 0x873E4F75E2224E68},  // 1e-270
20342
    {0x711515D0A205CB36, 0xA90DE3535AAAE202},  // 1e-269
20343
    {0x0D5A5B44CA873E03, 0xD3515C2831559A83},  // 1e-268
20344
    {0xE858790AFE9486C2, 0x8412D9991ED58091},  // 1e-267
20345
    {0x626E974DBE39A872, 0xA5178FFF668AE0B6},  // 1e-266
20346
    {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3},  // 1e-265
20347
    {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E},  // 1e-264
20348
    {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72},  // 1e-263
20349
    {0xA327FFB266B56220, 0xC987434744AC874E},  // 1e-262
20350
    {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922},  // 1e-261
20351
    {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5},  // 1e-260
20352
    {0xCB550FB4384D21D3, 0xC4CE17B399107C22},  // 1e-259
20353
    {0x7E2A53A146606A48, 0xF6019DA07F549B2B},  // 1e-258
20354
    {0x2EDA7444CBFC426D, 0x99C102844F94E0FB},  // 1e-257
20355
    {0xFA911155FEFB5308, 0xC0314325637A1939},  // 1e-256
20356
    {0x793555AB7EBA27CA, 0xF03D93EEBC589F88},  // 1e-255
20357
    {0x4BC1558B2F3458DE, 0x96267C7535B763B5},  // 1e-254
20358
    {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2},  // 1e-253
20359
    {0x465E15A979C1CADC, 0xEA9C227723EE8BCB},  // 1e-252
20360
    {0x0BFACD89EC191EC9, 0x92A1958A7675175F},  // 1e-251
20361
    {0xCEF980EC671F667B, 0xB749FAED14125D36},  // 1e-250
20362
    {0x82B7E12780E7401A, 0xE51C79A85916F484},  // 1e-249
20363
    {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2},  // 1e-248
20364
    {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07},  // 1e-247
20365
    {0x67A791E093E1D49A, 0xDFBDCECE67006AC9},  // 1e-246
20366
    {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD},  // 1e-245
20367
    {0x58FAE9F773886E18, 0xAECC49914078536D},  // 1e-244
20368
    {0xAF39A475506A899E, 0xDA7F5BF590966848},  // 1e-243
20369
    {0x6D8406C952429603, 0x888F99797A5E012D},  // 1e-242
20370
    {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178},  // 1e-241
20371
    {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6},  // 1e-240
20372
    {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26},  // 1e-239
20373
    {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F},  // 1e-238
20374
    {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B},  // 1e-237
20375
    {0x76C53D08D6B70858, 0x823C12795DB6CE57},  // 1e-236
20376
    {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED},  // 1e-235
20377
    {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268},  // 1e-234
20378
    {0xD3F93B35435D7C4C, 0xFE5D54150B090B02},  // 1e-233
20379
    {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1},  // 1e-232
20380
    {0x359AB6419CA1091B, 0xC6B8E9B0709F109A},  // 1e-231
20381
    {0xC30163D203C94B62, 0xF867241C8CC6D4C0},  // 1e-230
20382
    {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8},  // 1e-229
20383
    {0x985915FC12F542E4, 0xC21094364DFB5636},  // 1e-228
20384
    {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4},  // 1e-227
20385
    {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A},  // 1e-226
20386
    {0x50C6FF782A838353, 0xBD8430BD08277231},  // 1e-225
20387
    {0xA4F8BF5635246428, 0xECE53CEC4A314EBD},  // 1e-224
20388
    {0x871B7795E136BE99, 0x940F4613AE5ED136},  // 1e-223
20389
    {0x28E2557B59846E3F, 0xB913179899F68584},  // 1e-222
20390
    {0x331AEADA2FE589CF, 0xE757DD7EC07426E5},  // 1e-221
20391
    {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F},  // 1e-220
20392
    {0x0FED077A756B53A9, 0xB4BCA50B065ABE63},  // 1e-219
20393
    {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB},  // 1e-218
20394
    {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD},  // 1e-217
20395
    {0xBD8D794D96AACFB3, 0xB080392CC4349DEC},  // 1e-216
20396
    {0xECF0D7A0FC5583A0, 0xDCA04777F541C567},  // 1e-215
20397
    {0xF41686C49DB57244, 0x89E42CAAF9491B60},  // 1e-214
20398
    {0x311C2875C522CED5, 0xAC5D37D5B79B6239},  // 1e-213
20399
    {0x7D633293366B828B, 0xD77485CB25823AC7},  // 1e-212
20400
    {0xAE5DFF9C02033197, 0x86A8D39EF77164BC},  // 1e-211
20401
    {0xD9F57F830283FDFC, 0xA8530886B54DBDEB},  // 1e-210
20402
    {0xD072DF63C324FD7B, 0xD267CAA862A12D66},  // 1e-209
20403
    {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60},  // 1e-208
20404
    {0x52D9BE85F074E608, 0xA46116538D0DEB78},  // 1e-207
20405
    {0x67902E276C921F8B, 0xCD795BE870516656},  // 1e-206
20406
    {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6},  // 1e-205
20407
    {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3},  // 1e-204
20408
    {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0},  // 1e-203
20409
    {0x796B805720085F81, 0xFAD2A4B13D1B5D6C},  // 1e-202
20410
    {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63},  // 1e-201
20411
    {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC},  // 1e-200
20412
    {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B},  // 1e-199
20413
    {0x751BDD152D4D1C4A, 0x991711052D8BF3C5},  // 1e-198
20414
    {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6},  // 1e-197
20415
    {0x86FB897116C87C34, 0xEF340A98172AACE4},  // 1e-196
20416
    {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E},  // 1e-195
20417
    {0x8974836059CCA109, 0xBAE0A846D2195712},  // 1e-194
20418
    {0x2BD1A438703FC94B, 0xE998D258869FACD7},  // 1e-193
20419
    {0x7B6306A34627DDCF, 0x91FF83775423CC06},  // 1e-192
20420
    {0x1A3BC84C17B1D542, 0xB67F6455292CBF08},  // 1e-191
20421
    {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA},  // 1e-190
20422
    {0x547EB47B7282EE9C, 0x8E938662882AF53E},  // 1e-189
20423
    {0xE99E619A4F23AA43, 0xB23867FB2A35B28D},  // 1e-188
20424
    {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31},  // 1e-187
20425
    {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E},  // 1e-186
20426
    {0x9624AB50B148D445, 0xAE0B158B4738705E},  // 1e-185
20427
    {0x3BADD624DD9B0957, 0xD98DDAEE19068C76},  // 1e-184
20428
    {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9},  // 1e-183
20429
    {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC},  // 1e-182
20430
    {0x7647C3200069671F, 0xD47487CC8470652B},  // 1e-181
20431
    {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B},  // 1e-180
20432
    {0xF468107100525890, 0xA5FB0A17C777CF09},  // 1e-179
20433
    {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC},  // 1e-178
20434
    {0xC6F14CD848405530, 0x81AC1FE293D599BF},  // 1e-177
20435
    {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F},  // 1e-176
20436
    {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B},  // 1e-175
20437
    {0x908F4A166D1DA663, 0xFD442E4688BD304A},  // 1e-174
20438
    {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E},  // 1e-173
20439
    {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA},  // 1e-172
20440
    {0xD12BEE59E68EF47C, 0xF7549530E188C128},  // 1e-171
20441
    {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9},  // 1e-170
20442
    {0xE36A52363C1FAF01, 0xC13A148E3032D6E7},  // 1e-169
20443
    {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1},  // 1e-168
20444
    {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5},  // 1e-167
20445
    {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE},  // 1e-166
20446
    {0x111B495B3464AD21, 0xEBDF661791D60F56},  // 1e-165
20447
    {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995},  // 1e-164
20448
    {0x3D5D514F40EEA742, 0xB84687C269EF3BFB},  // 1e-163
20449
    {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA},  // 1e-162
20450
    {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC},  // 1e-161
20451
    {0x59ED216765690F56, 0xB3F4E093DB73A093},  // 1e-160
20452
    {0x306869C13EC3532C, 0xE0F218B8D25088B8},  // 1e-159
20453
    {0x1E414218C73A13FB, 0x8C974F7383725573},  // 1e-158
20454
    {0xE5D1929EF90898FA, 0xAFBD2350644EEACF},  // 1e-157
20455
    {0xDF45F746B74ABF39, 0xDBAC6C247D62A583},  // 1e-156
20456
    {0x6B8BBA8C328EB783, 0x894BC396CE5DA772},  // 1e-155
20457
    {0x066EA92F3F326564, 0xAB9EB47C81F5114F},  // 1e-154
20458
    {0xC80A537B0EFEFEBD, 0xD686619BA27255A2},  // 1e-153
20459
    {0xBD06742CE95F5F36, 0x8613FD0145877585},  // 1e-152
20460
    {0x2C48113823B73704, 0xA798FC4196E952E7},  // 1e-151
20461
    {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0},  // 1e-150
20462
    {0x9A984D73DBE722FB, 0x82EF85133DE648C4},  // 1e-149
20463
    {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5},  // 1e-148
20464
    {0x318DF905079926A8, 0xCC963FEE10B7D1B3},  // 1e-147
20465
    {0xFDF17746497F7052, 0xFFBBCFE994E5C61F},  // 1e-146
20466
    {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3},  // 1e-145
20467
    {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8},  // 1e-144
20468
    {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B},  // 1e-143
20469
    {0x06BEA10CA65C084E, 0x9C1661A651213E2D},  // 1e-142
20470
    {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8},  // 1e-141
20471
    {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126},  // 1e-140
20472
    {0xF89629465A75E01C, 0x986DDB5C6B3A76B7},  // 1e-139
20473
    {0xF6BBB397F1135823, 0xBE89523386091465},  // 1e-138
20474
    {0x746AA07DED582E2C, 0xEE2BA6C0678B597F},  // 1e-137
20475
    {0xA8C2A44EB4571CDC, 0x94DB483840B717EF},  // 1e-136
20476
    {0x92F34D62616CE413, 0xBA121A4650E4DDEB},  // 1e-135
20477
    {0x77B020BAF9C81D17, 0xE896A0D7E51E1566},  // 1e-134
20478
    {0x0ACE1474DC1D122E, 0x915E2486EF32CD60},  // 1e-133
20479
    {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8},  // 1e-132
20480
    {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6},  // 1e-131
20481
    {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F},  // 1e-130
20482
    {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3},  // 1e-129
20483
    {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0},  // 1e-128
20484
    {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4},  // 1e-127
20485
    {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D},  // 1e-126
20486
    {0xE871C7BF077BA8B7, 0xD89D64D57A607744},  // 1e-125
20487
    {0x11471CD764AD4972, 0x87625F056C7C4A8B},  // 1e-124
20488
    {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D},  // 1e-123
20489
    {0x4AFF1D108D4EC2C3, 0xD389B47879823479},  // 1e-122
20490
    {0xCEDF722A585139BA, 0x843610CB4BF160CB},  // 1e-121
20491
    {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE},  // 1e-120
20492
    {0x733D226229FEEA32, 0xCE947A3DA6A9273E},  // 1e-119
20493
    {0x0806357D5A3F525F, 0x811CCC668829B887},  // 1e-118
20494
    {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8},  // 1e-117
20495
    {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052},  // 1e-116
20496
    {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67},  // 1e-115
20497
    {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0},  // 1e-114
20498
    {0x0A9E795E65D4DF11, 0xC5029163F384A931},  // 1e-113
20499
    {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D},  // 1e-112
20500
    {0x504BCED1BF8E4E45, 0x99EA0196163FA42E},  // 1e-111
20501
    {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39},  // 1e-110
20502
    {0x5D767327BB4E5A4C, 0xF07DA27A82C37088},  // 1e-109
20503
    {0x3A6A07F8D510F86F, 0x964E858C91BA2655},  // 1e-108
20504
    {0x890489F70A55368B, 0xBBE226EFB628AFEA},  // 1e-107
20505
    {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5},  // 1e-106
20506
    {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F},  // 1e-105
20507
    {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB},  // 1e-104
20508
    {0xCC420A6A101D0515, 0xE55990879DDCAABD},  // 1e-103
20509
    {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6},  // 1e-102
20510
    {0x47939822DC96ABF9, 0xB32DF8E9F3546564},  // 1e-101
20511
    {0x59787E2B93BC56F7, 0xDFF9772470297EBD},  // 1e-100
20512
    {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36},  // 1e-99
20513
    {0xEDE622920B6B23F1, 0xAEFAE51477A06B03},  // 1e-98
20514
    {0xE95FAB368E45ECED, 0xDAB99E59958885C4},  // 1e-97
20515
    {0x11DBCB0218EBB414, 0x88B402F7FD75539B},  // 1e-96
20516
    {0xD652BDC29F26A119, 0xAAE103B5FCD2A881},  // 1e-95
20517
    {0x4BE76D3346F0495F, 0xD59944A37C0752A2},  // 1e-94
20518
    {0x6F70A4400C562DDB, 0x857FCAE62D8493A5},  // 1e-93
20519
    {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E},  // 1e-92
20520
    {0x7E2000A41346A7A7, 0xD097AD07A71F26B2},  // 1e-91
20521
    {0x8ED400668C0C28C8, 0x825ECC24C873782F},  // 1e-90
20522
    {0x728900802F0F32FA, 0xA2F67F2DFA90563B},  // 1e-89
20523
    {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA},  // 1e-88
20524
    {0xE2F610C84987BFA8, 0xFEA126B7D78186BC},  // 1e-87
20525
    {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436},  // 1e-86
20526
    {0x91503D1C79720DBB, 0xC6EDE63FA05D3143},  // 1e-85
20527
    {0x75A44C6397CE912A, 0xF8A95FCF88747D94},  // 1e-84
20528
    {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C},  // 1e-83
20529
    {0xFBE85BADCE996168, 0xC24452DA229B021B},  // 1e-82
20530
    {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2},  // 1e-81
20531
    {0xDCCD879FC967D41A, 0x97C560BA6B0919A5},  // 1e-80
20532
    {0x5400E987BBC1C920, 0xBDB6B8E905CB600F},  // 1e-79
20533
    {0x290123E9AAB23B68, 0xED246723473E3813},  // 1e-78
20534
    {0xF9A0B6720AAF6521, 0x9436C0760C86E30B},  // 1e-77
20535
    {0xF808E40E8D5B3E69, 0xB94470938FA89BCE},  // 1e-76
20536
    {0xB60B1D1230B20E04, 0xE7958CB87392C2C2},  // 1e-75
20537
    {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9},  // 1e-74
20538
    {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828},  // 1e-73
20539
    {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232},  // 1e-72
20540
    {0x579C487E5A38AD0E, 0x8D590723948A535F},  // 1e-71
20541
    {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837},  // 1e-70
20542
    {0xF8E431456CF88E65, 0xDCDB1B2798182244},  // 1e-69
20543
    {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B},  // 1e-68
20544
    {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5},  // 1e-67
20545
    {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177},  // 1e-66
20546
    {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA},  // 1e-65
20547
    {0x3F2398D747B36224, 0xA87FEA27A539E9A5},  // 1e-64
20548
    {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E},  // 1e-63
20549
    {0x1953CF68300424AC, 0x83A3EEEEF9153E89},  // 1e-62
20550
    {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B},  // 1e-61
20551
    {0x3792F412CB06794D, 0xCDB02555653131B6},  // 1e-60
20552
    {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11},  // 1e-59
20553
    {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6},  // 1e-58
20554
    {0xF245825A5A445275, 0xC8DE047564D20A8B},  // 1e-57
20555
    {0xEED6E2F0F0D56712, 0xFB158592BE068D2E},  // 1e-56
20556
    {0x55464DD69685606B, 0x9CED737BB6C4183D},  // 1e-55
20557
    {0xAA97E14C3C26B886, 0xC428D05AA4751E4C},  // 1e-54
20558
    {0xD53DD99F4B3066A8, 0xF53304714D9265DF},  // 1e-53
20559
    {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB},  // 1e-52
20560
    {0xDE98520472BDD033, 0xBF8FDB78849A5F96},  // 1e-51
20561
    {0x963E66858F6D4440, 0xEF73D256A5C0F77C},  // 1e-50
20562
    {0xDDE7001379A44AA8, 0x95A8637627989AAD},  // 1e-49
20563
    {0x5560C018580D5D52, 0xBB127C53B17EC159},  // 1e-48
20564
    {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF},  // 1e-47
20565
    {0xCAB3961304CA70E8, 0x9226712162AB070D},  // 1e-46
20566
    {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1},  // 1e-45
20567
    {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05},  // 1e-44
20568
    {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3},  // 1e-43
20569
    {0x55F038B237591ED3, 0xB267ED1940F1C61C},  // 1e-42
20570
    {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3},  // 1e-41
20571
    {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6},  // 1e-40
20572
    {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77},  // 1e-39
20573
    {0x96E7BD358C904A21, 0xD9C7DCED53C72255},  // 1e-38
20574
    {0x7E50D64177DA2E54, 0x881CEA14545C7575},  // 1e-37
20575
    {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2},  // 1e-36
20576
    {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787},  // 1e-35
20577
    {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4},  // 1e-34
20578
    {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61},  // 1e-33
20579
    {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA},  // 1e-32
20580
    {0x80EACF948770CED7, 0x81CEB32C4B43FCF4},  // 1e-31
20581
    {0xA1258379A94D028D, 0xA2425FF75E14FC31},  // 1e-30
20582
    {0x096EE45813A04330, 0xCAD2F7F5359A3B3E},  // 1e-29
20583
    {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D},  // 1e-28
20584
    {0x775EA264CF55347D, 0x9E74D1B791E07E48},  // 1e-27
20585
    {0x95364AFE032A819D, 0xC612062576589DDA},  // 1e-26
20586
    {0x3A83DDBD83F52204, 0xF79687AED3EEC551},  // 1e-25
20587
    {0xC4926A9672793542, 0x9ABE14CD44753B52},  // 1e-24
20588
    {0x75B7053C0F178293, 0xC16D9A0095928A27},  // 1e-23
20589
    {0x5324C68B12DD6338, 0xF1C90080BAF72CB1},  // 1e-22
20590
    {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE},  // 1e-21
20591
    {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA},  // 1e-20
20592
    {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5},  // 1e-19
20593
    {0x3AFF322E62439FCF, 0x9392EE8E921D5D07},  // 1e-18
20594
    {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449},  // 1e-17
20595
    {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B},  // 1e-16
20596
    {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9},  // 1e-15
20597
    {0x538484C19EF38C94, 0xB424DC35095CD80F},  // 1e-14
20598
    {0x2865A5F206B06FB9, 0xE12E13424BB40E13},  // 1e-13
20599
    {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB},  // 1e-12
20600
    {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE},  // 1e-11
20601
    {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE},  // 1e-10
20602
    {0x31680A88F8953030, 0x89705F4136B4A597},  // 1e-9
20603
    {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC},  // 1e-8
20604
    {0x3D32907604691B4C, 0xD6BF94D5E57A42BC},  // 1e-7
20605
    {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5},  // 1e-6
20606
    {0x0FCF80DC33721D53, 0xA7C5AC471B478423},  // 1e-5
20607
    {0xD3C36113404EA4A8, 0xD1B71758E219652B},  // 1e-4
20608
    {0x645A1CAC083126E9, 0x83126E978D4FDF3B},  // 1e-3
20609
    {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A},  // 1e-2
20610
    {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC},  // 1e-1
20611
    {0x0000000000000000, 0x8000000000000000},  // 1e0
20612
    {0x0000000000000000, 0xA000000000000000},  // 1e1
20613
    {0x0000000000000000, 0xC800000000000000},  // 1e2
20614
    {0x0000000000000000, 0xFA00000000000000},  // 1e3
20615
    {0x0000000000000000, 0x9C40000000000000},  // 1e4
20616
    {0x0000000000000000, 0xC350000000000000},  // 1e5
20617
    {0x0000000000000000, 0xF424000000000000},  // 1e6
20618
    {0x0000000000000000, 0x9896800000000000},  // 1e7
20619
    {0x0000000000000000, 0xBEBC200000000000},  // 1e8
20620
    {0x0000000000000000, 0xEE6B280000000000},  // 1e9
20621
    {0x0000000000000000, 0x9502F90000000000},  // 1e10
20622
    {0x0000000000000000, 0xBA43B74000000000},  // 1e11
20623
    {0x0000000000000000, 0xE8D4A51000000000},  // 1e12
20624
    {0x0000000000000000, 0x9184E72A00000000},  // 1e13
20625
    {0x0000000000000000, 0xB5E620F480000000},  // 1e14
20626
    {0x0000000000000000, 0xE35FA931A0000000},  // 1e15
20627
    {0x0000000000000000, 0x8E1BC9BF04000000},  // 1e16
20628
    {0x0000000000000000, 0xB1A2BC2EC5000000},  // 1e17
20629
    {0x0000000000000000, 0xDE0B6B3A76400000},  // 1e18
20630
    {0x0000000000000000, 0x8AC7230489E80000},  // 1e19
20631
    {0x0000000000000000, 0xAD78EBC5AC620000},  // 1e20
20632
    {0x0000000000000000, 0xD8D726B7177A8000},  // 1e21
20633
    {0x0000000000000000, 0x878678326EAC9000},  // 1e22
20634
    {0x0000000000000000, 0xA968163F0A57B400},  // 1e23
20635
    {0x0000000000000000, 0xD3C21BCECCEDA100},  // 1e24
20636
    {0x0000000000000000, 0x84595161401484A0},  // 1e25
20637
    {0x0000000000000000, 0xA56FA5B99019A5C8},  // 1e26
20638
    {0x0000000000000000, 0xCECB8F27F4200F3A},  // 1e27
20639
    {0x4000000000000000, 0x813F3978F8940984},  // 1e28
20640
    {0x5000000000000000, 0xA18F07D736B90BE5},  // 1e29
20641
    {0xA400000000000000, 0xC9F2C9CD04674EDE},  // 1e30
20642
    {0x4D00000000000000, 0xFC6F7C4045812296},  // 1e31
20643
    {0xF020000000000000, 0x9DC5ADA82B70B59D},  // 1e32
20644
    {0x6C28000000000000, 0xC5371912364CE305},  // 1e33
20645
    {0xC732000000000000, 0xF684DF56C3E01BC6},  // 1e34
20646
    {0x3C7F400000000000, 0x9A130B963A6C115C},  // 1e35
20647
    {0x4B9F100000000000, 0xC097CE7BC90715B3},  // 1e36
20648
    {0x1E86D40000000000, 0xF0BDC21ABB48DB20},  // 1e37
20649
    {0x1314448000000000, 0x96769950B50D88F4},  // 1e38
20650
    {0x17D955A000000000, 0xBC143FA4E250EB31},  // 1e39
20651
    {0x5DCFAB0800000000, 0xEB194F8E1AE525FD},  // 1e40
20652
    {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE},  // 1e41
20653
    {0xF14A3D9E40000000, 0xB7ABC627050305AD},  // 1e42
20654
    {0x6D9CCD05D0000000, 0xE596B7B0C643C719},  // 1e43
20655
    {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F},  // 1e44
20656
    {0xDDA2802C8A800000, 0xB35DBF821AE4F38B},  // 1e45
20657
    {0xD50B2037AD200000, 0xE0352F62A19E306E},  // 1e46
20658
    {0x4526F422CC340000, 0x8C213D9DA502DE45},  // 1e47
20659
    {0x9670B12B7F410000, 0xAF298D050E4395D6},  // 1e48
20660
    {0x3C0CDD765F114000, 0xDAF3F04651D47B4C},  // 1e49
20661
    {0xA5880A69FB6AC800, 0x88D8762BF324CD0F},  // 1e50
20662
    {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053},  // 1e51
20663
    {0x72A4904598D6D880, 0xD5D238A4ABE98068},  // 1e52
20664
    {0x47A6DA2B7F864750, 0x85A36366EB71F041},  // 1e53
20665
    {0x999090B65F67D924, 0xA70C3C40A64E6C51},  // 1e54
20666
    {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765},  // 1e55
20667
    {0xBFF8F10E7A8921A4, 0x82818F1281ED449F},  // 1e56
20668
    {0xAFF72D52192B6A0D, 0xA321F2D7226895C7},  // 1e57
20669
    {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39},  // 1e58
20670
    {0x02F236D04753D5B4, 0xFEE50B7025C36A08},  // 1e59
20671
    {0x01D762422C946590, 0x9F4F2726179A2245},  // 1e60
20672
    {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6},  // 1e61
20673
    {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B},  // 1e62
20674
    {0x63CC55F49F88EB2F, 0x9B934C3B330C8577},  // 1e63
20675
    {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5},  // 1e64
20676
    {0x8BEF464E3945EF7A, 0xF316271C7FC3908A},  // 1e65
20677
    {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56},  // 1e66
20678
    {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC},  // 1e67
20679
    {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27},  // 1e68
20680
    {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8},  // 1e69
20681
    {0xB3E2FD538E122B44, 0xB975D6B6EE39E436},  // 1e70
20682
    {0x60DBBCA87196B616, 0xE7D34C64A9C85D44},  // 1e71
20683
    {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A},  // 1e72
20684
    {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD},  // 1e73
20685
    {0xC696963C7EED2DD1, 0xE264589A4DCDAB14},  // 1e74
20686
    {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC},  // 1e75
20687
    {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8},  // 1e76
20688
    {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912},  // 1e77
20689
    {0x6E3569326C784337, 0x8A2DBF142DFCC7AB},  // 1e78
20690
    {0x49C2C37F07965404, 0xACB92ED9397BF996},  // 1e79
20691
    {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB},  // 1e80
20692
    {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD},  // 1e81
20693
    {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC},  // 1e82
20694
    {0xF50A3FA490C30190, 0xD2D80DB02AABD62B},  // 1e83
20695
    {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB},  // 1e84
20696
    {0x577001B891185938, 0xA4B8CAB1A1563F52},  // 1e85
20697
    {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26},  // 1e86
20698
    {0x544F8158315B05B4, 0x80B05E5AC60B6178},  // 1e87
20699
    {0x696361AE3DB1C721, 0xA0DC75F1778E39D6},  // 1e88
20700
    {0x03BC3A19CD1E38E9, 0xC913936DD571C84C},  // 1e89
20701
    {0x04AB48A04065C723, 0xFB5878494ACE3A5F},  // 1e90
20702
    {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B},  // 1e91
20703
    {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A},  // 1e92
20704
    {0xCA8F44EC7EE36479, 0xF5746577930D6500},  // 1e93
20705
    {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20},  // 1e94
20706
    {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8},  // 1e95
20707
    {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2},  // 1e96
20708
    {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5},  // 1e97
20709
    {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F},  // 1e98
20710
    {0xF52D09D71A3293BD, 0xEA1575143CF97226},  // 1e99
20711
    {0x593C2626705F9C56, 0x924D692CA61BE758},  // 1e100
20712
    {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E},  // 1e101
20713
    {0x0B6DFB9C0F956447, 0xE498F455C38B997A},  // 1e102
20714
    {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC},  // 1e103
20715
    {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7},  // 1e104
20716
    {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1},  // 1e105
20717
    {0xBD79E0D20082EE74, 0x8B865B215899F46C},  // 1e106
20718
    {0xECD8590680A3AA11, 0xAE67F1E9AEC07187},  // 1e107
20719
    {0xE80E6F4820CC9495, 0xDA01EE641A708DE9},  // 1e108
20720
    {0x3109058D147FDCDD, 0x884134FE908658B2},  // 1e109
20721
    {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE},  // 1e110
20722
    {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96},  // 1e111
20723
    {0x03E2CF6BC604DDB0, 0x850FADC09923329E},  // 1e112
20724
    {0x84DB8346B786151C, 0xA6539930BF6BFF45},  // 1e113
20725
    {0xE612641865679A63, 0xCFE87F7CEF46FF16},  // 1e114
20726
    {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E},  // 1e115
20727
    {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749},  // 1e116
20728
    {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C},  // 1e117
20729
    {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63},  // 1e118
20730
    {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E},  // 1e119
20731
    {0xB281E1FD541501B8, 0xC646D63501A1511D},  // 1e120
20732
    {0x1F225A7CA91A4226, 0xF7D88BC24209A565},  // 1e121
20733
    {0x3375788DE9B06958, 0x9AE757596946075F},  // 1e122
20734
    {0x0052D6B1641C83AE, 0xC1A12D2FC3978937},  // 1e123
20735
    {0xC0678C5DBD23A49A, 0xF209787BB47D6B84},  // 1e124
20736
    {0xF840B7BA963646E0, 0x9745EB4D50CE6332},  // 1e125
20737
    {0xB650E5A93BC3D898, 0xBD176620A501FBFF},  // 1e126
20738
    {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF},  // 1e127
20739
    {0xC66F336C36B10137, 0x93BA47C980E98CDF},  // 1e128
20740
    {0xB80B0047445D4184, 0xB8A8D9BBE123F017},  // 1e129
20741
    {0xA60DC059157491E5, 0xE6D3102AD96CEC1D},  // 1e130
20742
    {0x87C89837AD68DB2F, 0x9043EA1AC7E41392},  // 1e131
20743
    {0x29BABE4598C311FB, 0xB454E4A179DD1877},  // 1e132
20744
    {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94},  // 1e133
20745
    {0x1899E4A65F58660C, 0x8CE2529E2734BB1D},  // 1e134
20746
    {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4},  // 1e135
20747
    {0x76707543F4FA1F73, 0xDC21A1171D42645D},  // 1e136
20748
    {0x6A06494A791C53A8, 0x899504AE72497EBA},  // 1e137
20749
    {0x0487DB9D17636892, 0xABFA45DA0EDBDE69},  // 1e138
20750
    {0x45A9D2845D3C42B6, 0xD6F8D7509292D603},  // 1e139
20751
    {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2},  // 1e140
20752
    {0x8E6CAC7768D7141E, 0xA7F26836F282B732},  // 1e141
20753
    {0x3207D795430CD926, 0xD1EF0244AF2364FF},  // 1e142
20754
    {0x7F44E6BD49E807B8, 0x8335616AED761F1F},  // 1e143
20755
    {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7},  // 1e144
20756
    {0x36DBA887C37A8C0F, 0xCD036837130890A1},  // 1e145
20757
    {0xC2494954DA2C9789, 0x802221226BE55A64},  // 1e146
20758
    {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD},  // 1e147
20759
    {0x6F92829494E5ACC7, 0xC83553C5C8965D3D},  // 1e148
20760
    {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C},  // 1e149
20761
    {0xFF2A760414536EFB, 0x9C69A97284B578D7},  // 1e150
20762
    {0xFEF5138519684ABA, 0xC38413CF25E2D70D},  // 1e151
20763
    {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1},  // 1e152
20764
    {0xEF2F773FFBD97A61, 0x98BF2F79D5993802},  // 1e153
20765
    {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603},  // 1e154
20766
    {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784},  // 1e155
20767
    {0xDD945A747BF26183, 0x952AB45CFA97A0B2},  // 1e156
20768
    {0x94F971119AEEF9E4, 0xBA756174393D88DF},  // 1e157
20769
    {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17},  // 1e158
20770
    {0xAC62E055C10AB33A, 0x91ABB422CCB812EE},  // 1e159
20771
    {0x577B986B314D6009, 0xB616A12B7FE617AA},  // 1e160
20772
    {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94},  // 1e161
20773
    {0x14588F13BE847307, 0x8E41ADE9FBEBC27D},  // 1e162
20774
    {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C},  // 1e163
20775
    {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3},  // 1e164
20776
    {0x25DE7BB9480D5854, 0x8AEC23D680043BEE},  // 1e165
20777
    {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9},  // 1e166
20778
    {0x1B2BA1518094DA04, 0xD910F7FF28069DA4},  // 1e167
20779
    {0x90FB44D2F05D0842, 0x87AA9AFF79042286},  // 1e168
20780
    {0x353A1607AC744A53, 0xA99541BF57452B28},  // 1e169
20781
    {0x42889B8997915CE8, 0xD3FA922F2D1675F2},  // 1e170
20782
    {0x69956135FEBADA11, 0x847C9B5D7C2E09B7},  // 1e171
20783
    {0x43FAB9837E699095, 0xA59BC234DB398C25},  // 1e172
20784
    {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E},  // 1e173
20785
    {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D},  // 1e174
20786
    {0x6462D92A69731732, 0xA1BA1BA79E1632DC},  // 1e175
20787
    {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93},  // 1e176
20788
    {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78},  // 1e177
20789
    {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB},  // 1e178
20790
    {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916},  // 1e179
20791
    {0x8AAD549E57273D45, 0xF6C69A72A3989F5B},  // 1e180
20792
    {0x36AC54E2F678864B, 0x9A3C2087A63F6399},  // 1e181
20793
    {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F},  // 1e182
20794
    {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F},  // 1e183
20795
    {0x9F644AE5A4B1B325, 0x969EB7C47859E743},  // 1e184
20796
    {0x873D5D9F0DDE1FEE, 0xBC4665B596706114},  // 1e185
20797
    {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959},  // 1e186
20798
    {0x09A7F12442D588F2, 0x9316FF75DD87CBD8},  // 1e187
20799
    {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE},  // 1e188
20800
    {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81},  // 1e189
20801
    {0xF96E017D694487BC, 0x8FA475791A569D10},  // 1e190
20802
    {0x37C981DCC395A9AC, 0xB38D92D760EC4455},  // 1e191
20803
    {0x85BBE253F47B1417, 0xE070F78D3927556A},  // 1e192
20804
    {0x93956D7478CCEC8E, 0x8C469AB843B89562},  // 1e193
20805
    {0x387AC8D1970027B2, 0xAF58416654A6BABB},  // 1e194
20806
    {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A},  // 1e195
20807
    {0x441FECE3BDF81F03, 0x88FCF317F22241E2},  // 1e196
20808
    {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A},  // 1e197
20809
    {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1},  // 1e198
20810
    {0xF6872D5667844E49, 0x85C7056562757456},  // 1e199
20811
    {0xB428F8AC016561DB, 0xA738C6BEBB12D16C},  // 1e200
20812
    {0xE13336D701BEBA52, 0xD106F86E69D785C7},  // 1e201
20813
    {0xECC0024661173473, 0x82A45B450226B39C},  // 1e202
20814
    {0x27F002D7F95D0190, 0xA34D721642B06084},  // 1e203
20815
    {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5},  // 1e204
20816
    {0x7E67047175A15271, 0xFF290242C83396CE},  // 1e205
20817
    {0x0F0062C6E984D386, 0x9F79A169BD203E41},  // 1e206
20818
    {0x52C07B78A3E60868, 0xC75809C42C684DD1},  // 1e207
20819
    {0xA7709A56CCDF8A82, 0xF92E0C3537826145},  // 1e208
20820
    {0x88A66076400BB691, 0x9BBCC7A142B17CCB},  // 1e209
20821
    {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE},  // 1e210
20822
    {0x0583F6B8C4124D43, 0xF356F7EBF83552FE},  // 1e211
20823
    {0xC3727A337A8B704A, 0x98165AF37B2153DE},  // 1e212
20824
    {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6},  // 1e213
20825
    {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C},  // 1e214
20826
    {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7},  // 1e215
20827
    {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1},  // 1e216
20828
    {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99},  // 1e217
20829
    {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0},  // 1e218
20830
    {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8},  // 1e219
20831
    {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A},  // 1e220
20832
    {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24},  // 1e221
20833
    {0x7425A83E872C5F47, 0xB10D8E1456105DAD},  // 1e222
20834
    {0xD12F124E28F77719, 0xDD50F1996B947518},  // 1e223
20835
    {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F},  // 1e224
20836
    {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B},  // 1e225
20837
    {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A},  // 1e226
20838
    {0x65ACFAEC34810A71, 0x8714A775E3E95C78},  // 1e227
20839
    {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396},  // 1e228
20840
    {0x1EDE48111209A050, 0xD31045A8341CA07C},  // 1e229
20841
    {0x934AED0AAB460432, 0x83EA2B892091E44D},  // 1e230
20842
    {0xF81DA84D5617853F, 0xA4E4B66B68B65D60},  // 1e231
20843
    {0x36251260AB9D668E, 0xCE1DE40642E3F4B9},  // 1e232
20844
    {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3},  // 1e233
20845
    {0xB24CF65B8612F81F, 0xA1075A24E4421730},  // 1e234
20846
    {0xDEE033F26797B627, 0xC94930AE1D529CFC},  // 1e235
20847
    {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C},  // 1e236
20848
    {0x8E1F289560EE864E, 0x9D412E0806E88AA5},  // 1e237
20849
    {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E},  // 1e238
20850
    {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2},  // 1e239
20851
    {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765},  // 1e240
20852
    {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F},  // 1e241
20853
    {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E},  // 1e242
20854
    {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9},  // 1e243
20855
    {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F},  // 1e244
20856
    {0x84C86189216DC5ED, 0xEA53DF5FD18D5513},  // 1e245
20857
    {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C},  // 1e246
20858
    {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77},  // 1e247
20859
    {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515},  // 1e248
20860
    {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D},  // 1e249
20861
    {0x743E20E9EF511012, 0xB2C71D5BCA9023F8},  // 1e250
20862
    {0x914DA9246B255416, 0xDF78E4B2BD342CF6},  // 1e251
20863
    {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A},  // 1e252
20864
    {0xA184AC2473B529B1, 0xAE9672ABA3D0C320},  // 1e253
20865
    {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8},  // 1e254
20866
    {0x7E2FA67C7A658892, 0x8865899617FB1871},  // 1e255
20867
    {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D},  // 1e256
20868
    {0x552A74227F3EA565, 0xD51EA6FA85785631},  // 1e257
20869
    {0xD53A88958F87275F, 0x8533285C936B35DE},  // 1e258
20870
    {0x8A892ABAF368F137, 0xA67FF273B8460356},  // 1e259
20871
    {0x2D2B7569B0432D85, 0xD01FEF10A657842C},  // 1e260
20872
    {0x9C3B29620E29FC73, 0x8213F56A67F6B29B},  // 1e261
20873
    {0x8349F3BA91B47B8F, 0xA298F2C501F45F42},  // 1e262
20874
    {0x241C70A936219A73, 0xCB3F2F7642717713},  // 1e263
20875
    {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7},  // 1e264
20876
    {0xF4363804324A40AA, 0x9EC95D1463E8A506},  // 1e265
20877
    {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48},  // 1e266
20878
    {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA},  // 1e267
20879
    {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128},  // 1e268
20880
    {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72},  // 1e269
20881
    {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF},  // 1e270
20882
    {0xD5BE0503E085D813, 0x976E41088617CA01},  // 1e271
20883
    {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82},  // 1e272
20884
    {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2},  // 1e273
20885
    {0xCABB90E5C942B503, 0x93E1AB8252F33B45},  // 1e274
20886
    {0x3D6A751F3B936243, 0xB8DA1662E7B00A17},  // 1e275
20887
    {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D},  // 1e276
20888
    {0x27FB2B80668B24C5, 0x906A617D450187E2},  // 1e277
20889
    {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA},  // 1e278
20890
    {0x5E7873F8A0396973, 0xE1A63853BBD26451},  // 1e279
20891
    {0xDB0B487B6423E1E8, 0x8D07E33455637EB2},  // 1e280
20892
    {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F},  // 1e281
20893
    {0x7641A140CC7810FB, 0xDC5C5301C56B75F7},  // 1e282
20894
    {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA},  // 1e283
20895
    {0x546345FA9FBDCD44, 0xAC2820D9623BF429},  // 1e284
20896
    {0xA97C177947AD4095, 0xD732290FBACAF133},  // 1e285
20897
    {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0},  // 1e286
20898
    {0x5C68F256BFFF5A74, 0xA81F301449EE8C70},  // 1e287
20899
    {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C},  // 1e288
20900
};
20901
20902
// wuffs_private_impl__f64_powers_of_10 holds powers of 10 that can be exactly
20903
// represented by a float64 (what C calls a double).
20904
static const double wuffs_private_impl__f64_powers_of_10[23] = {
20905
    1e0,  1e1,  1e2,  1e3,  1e4,  1e5,  1e6,  1e7,  1e8,  1e9,  1e10, 1e11,
20906
    1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22,
20907
};
20908
20909
// ---------------- IEEE 754 Floating Point
20910
20911
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u16  //
20912
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u16_truncate(double f) {
20913
0
  uint64_t u = 0;
20914
0
  if (sizeof(uint64_t) == sizeof(double)) {
20915
0
    memcpy(&u, &f, sizeof(uint64_t));
20916
0
  }
20917
0
  uint16_t neg = ((uint16_t)((u >> 63) << 15));
20918
0
  u &= 0x7FFFFFFFFFFFFFFF;
20919
0
  uint64_t exp = u >> 52;
20920
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
20921
20922
0
  if (exp == 0x7FF) {
20923
0
    if (man == 0) {  // Infinity.
20924
0
      wuffs_base__lossy_value_u16 ret;
20925
0
      ret.value = neg | 0x7C00;
20926
0
      ret.lossy = false;
20927
0
      return ret;
20928
0
    }
20929
    // NaN. Shift the 52 mantissa bits to 10 mantissa bits, keeping the most
20930
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 9
20931
    // bits of ret.value so that the 10-bit mantissa is non-zero.
20932
0
    wuffs_base__lossy_value_u16 ret;
20933
0
    ret.value = neg | 0x7DFF | ((uint16_t)(man >> 42));
20934
0
    ret.lossy = false;
20935
0
    return ret;
20936
20937
0
  } else if (exp > 0x40E) {  // Truncate to the largest finite f16.
20938
0
    wuffs_base__lossy_value_u16 ret;
20939
0
    ret.value = neg | 0x7BFF;
20940
0
    ret.lossy = true;
20941
0
    return ret;
20942
20943
0
  } else if (exp <= 0x3E6) {  // Truncate to zero.
20944
0
    wuffs_base__lossy_value_u16 ret;
20945
0
    ret.value = neg;
20946
0
    ret.lossy = (u != 0);
20947
0
    return ret;
20948
20949
0
  } else if (exp <= 0x3F0) {  // Normal f64, subnormal f16.
20950
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
20951
    // 10-bit mantissa and then adjust for the exponent.
20952
0
    man |= 0x0010000000000000;
20953
0
    uint32_t shift = ((uint32_t)(1051 - exp));  // 1051 = 0x3F0 + 53 - 10.
20954
0
    uint64_t shifted_man = man >> shift;
20955
0
    wuffs_base__lossy_value_u16 ret;
20956
0
    ret.value = neg | ((uint16_t)shifted_man);
20957
0
    ret.lossy = (shifted_man << shift) != man;
20958
0
    return ret;
20959
0
  }
20960
20961
  // Normal f64, normal f16.
20962
20963
  // Re-bias from 1023 to 15 and shift above f16's 10 mantissa bits.
20964
0
  exp = (exp - 1008) << 10;  // 1008 = 1023 - 15 = 0x3FF - 0xF.
20965
20966
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 10-bit
20967
  // mantissa (again excluding the implicit bit). We lose some information if
20968
  // any of the bottom 42 bits are non-zero.
20969
0
  wuffs_base__lossy_value_u16 ret;
20970
0
  ret.value = neg | ((uint16_t)exp) | ((uint16_t)(man >> 42));
20971
0
  ret.lossy = (man << 22) != 0;
20972
0
  return ret;
20973
0
}
20974
20975
WUFFS_BASE__MAYBE_STATIC wuffs_base__lossy_value_u32  //
20976
0
wuffs_base__ieee_754_bit_representation__from_f64_to_u32_truncate(double f) {
20977
0
  uint64_t u = 0;
20978
0
  if (sizeof(uint64_t) == sizeof(double)) {
20979
0
    memcpy(&u, &f, sizeof(uint64_t));
20980
0
  }
20981
0
  uint32_t neg = ((uint32_t)(u >> 63)) << 31;
20982
0
  u &= 0x7FFFFFFFFFFFFFFF;
20983
0
  uint64_t exp = u >> 52;
20984
0
  uint64_t man = u & 0x000FFFFFFFFFFFFF;
20985
20986
0
  if (exp == 0x7FF) {
20987
0
    if (man == 0) {  // Infinity.
20988
0
      wuffs_base__lossy_value_u32 ret;
20989
0
      ret.value = neg | 0x7F800000;
20990
0
      ret.lossy = false;
20991
0
      return ret;
20992
0
    }
20993
    // NaN. Shift the 52 mantissa bits to 23 mantissa bits, keeping the most
20994
    // significant mantissa bit (quiet vs signaling NaNs). Also set the low 22
20995
    // bits of ret.value so that the 23-bit mantissa is non-zero.
20996
0
    wuffs_base__lossy_value_u32 ret;
20997
0
    ret.value = neg | 0x7FBFFFFF | ((uint32_t)(man >> 29));
20998
0
    ret.lossy = false;
20999
0
    return ret;
21000
21001
0
  } else if (exp > 0x47E) {  // Truncate to the largest finite f32.
21002
0
    wuffs_base__lossy_value_u32 ret;
21003
0
    ret.value = neg | 0x7F7FFFFF;
21004
0
    ret.lossy = true;
21005
0
    return ret;
21006
21007
0
  } else if (exp <= 0x369) {  // Truncate to zero.
21008
0
    wuffs_base__lossy_value_u32 ret;
21009
0
    ret.value = neg;
21010
0
    ret.lossy = (u != 0);
21011
0
    return ret;
21012
21013
0
  } else if (exp <= 0x380) {  // Normal f64, subnormal f32.
21014
    // Convert from a 53-bit mantissa (after realizing the implicit bit) to a
21015
    // 23-bit mantissa and then adjust for the exponent.
21016
0
    man |= 0x0010000000000000;
21017
0
    uint32_t shift = ((uint32_t)(926 - exp));  // 926 = 0x380 + 53 - 23.
21018
0
    uint64_t shifted_man = man >> shift;
21019
0
    wuffs_base__lossy_value_u32 ret;
21020
0
    ret.value = neg | ((uint32_t)shifted_man);
21021
0
    ret.lossy = (shifted_man << shift) != man;
21022
0
    return ret;
21023
0
  }
21024
21025
  // Normal f64, normal f32.
21026
21027
  // Re-bias from 1023 to 127 and shift above f32's 23 mantissa bits.
21028
0
  exp = (exp - 896) << 23;  // 896 = 1023 - 127 = 0x3FF - 0x7F.
21029
21030
  // Convert from a 52-bit mantissa (excluding the implicit bit) to a 23-bit
21031
  // mantissa (again excluding the implicit bit). We lose some information if
21032
  // any of the bottom 29 bits are non-zero.
21033
0
  wuffs_base__lossy_value_u32 ret;
21034
0
  ret.value = neg | ((uint32_t)exp) | ((uint32_t)(man >> 29));
21035
0
  ret.lossy = (man << 35) != 0;
21036
0
  return ret;
21037
0
}
21038
21039
// --------
21040
21041
0
#define WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE 2047
21042
0
#define WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION 800
21043
21044
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL is the largest N such that
21045
// ((10 << N) < (1 << 64)).
21046
0
#define WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL 60
21047
21048
// wuffs_private_impl__high_prec_dec (abbreviated as HPD) is a fixed precision
21049
// floating point decimal number, augmented with ยฑinfinity values, but it
21050
// cannot represent NaN (Not a Number).
21051
//
21052
// "High precision" means that the mantissa holds 800 decimal digits. 800 is
21053
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION.
21054
//
21055
// An HPD isn't for general purpose arithmetic, only for conversions to and
21056
// from IEEE 754 double-precision floating point, where the largest and
21057
// smallest positive, finite values are approximately 1.8e+308 and 4.9e-324.
21058
// HPD exponents above +2047 mean infinity, below -2047 mean zero. The ยฑ2047
21059
// bounds are further away from zero than ยฑ(324 + 800), where 800 and 2047 is
21060
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION and
21061
// WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21062
//
21063
// digits[.. num_digits] are the number's digits in big-endian order. The
21064
// uint8_t values are in the range [0 ..= 9], not ['0' ..= '9'], where e.g. '7'
21065
// is the ASCII value 0x37.
21066
//
21067
// decimal_point is the index (within digits) of the decimal point. It may be
21068
// negative or be larger than num_digits, in which case the explicit digits are
21069
// padded with implicit zeroes.
21070
//
21071
// For example, if num_digits is 3 and digits is "\x07\x08\x09":
21072
//  - A decimal_point of -2 means ".00789"
21073
//  - A decimal_point of -1 means ".0789"
21074
//  - A decimal_point of +0 means ".789"
21075
//  - A decimal_point of +1 means "7.89"
21076
//  - A decimal_point of +2 means "78.9"
21077
//  - A decimal_point of +3 means "789."
21078
//  - A decimal_point of +4 means "7890."
21079
//  - A decimal_point of +5 means "78900."
21080
//
21081
// As above, a decimal_point higher than +2047 means that the overall value is
21082
// infinity, lower than -2047 means zero.
21083
//
21084
// negative is a sign bit. An HPD can distinguish positive and negative zero.
21085
//
21086
// truncated is whether there are more than
21087
// WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION digits, and at least one of those
21088
// extra digits are non-zero. The existence of long-tail digits can affect
21089
// rounding.
21090
//
21091
// The "all fields are zero" value is valid, and represents the number +0.
21092
typedef struct wuffs_private_impl__high_prec_dec__struct {
21093
  uint32_t num_digits;
21094
  int32_t decimal_point;
21095
  bool negative;
21096
  bool truncated;
21097
  uint8_t digits[WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION];
21098
} wuffs_private_impl__high_prec_dec;
21099
21100
// wuffs_private_impl__high_prec_dec__trim trims trailing zeroes from the
21101
// h->digits[.. h->num_digits] slice. They have no benefit, since we explicitly
21102
// track h->decimal_point.
21103
//
21104
// Preconditions:
21105
//  - h is non-NULL.
21106
static inline void  //
21107
0
wuffs_private_impl__high_prec_dec__trim(wuffs_private_impl__high_prec_dec* h) {
21108
0
  while ((h->num_digits > 0) && (h->digits[h->num_digits - 1] == 0)) {
21109
0
    h->num_digits--;
21110
0
  }
21111
0
}
21112
21113
// wuffs_private_impl__high_prec_dec__assign sets h to represent the number x.
21114
//
21115
// Preconditions:
21116
//  - h is non-NULL.
21117
static void  //
21118
wuffs_private_impl__high_prec_dec__assign(wuffs_private_impl__high_prec_dec* h,
21119
                                          uint64_t x,
21120
0
                                          bool negative) {
21121
0
  uint32_t n = 0;
21122
21123
  // Set h->digits.
21124
0
  if (x > 0) {
21125
    // Calculate the digits, working right-to-left. After we determine n (how
21126
    // many digits there are), copy from buf to h->digits.
21127
    //
21128
    // UINT64_MAX, 18446744073709551615, is 20 digits long. It can be faster to
21129
    // copy a constant number of bytes than a variable number (20 instead of
21130
    // n). Make buf large enough (and start writing to it from the middle) so
21131
    // that can we always copy 20 bytes: the slice buf[(20-n) .. (40-n)].
21132
0
    uint8_t buf[40] = {0};
21133
0
    uint8_t* ptr = &buf[20];
21134
0
    do {
21135
0
      uint64_t remaining = x / 10;
21136
0
      x -= remaining * 10;
21137
0
      ptr--;
21138
0
      *ptr = (uint8_t)x;
21139
0
      n++;
21140
0
      x = remaining;
21141
0
    } while (x > 0);
21142
0
    memcpy(h->digits, ptr, 20);
21143
0
  }
21144
21145
  // Set h's other fields.
21146
0
  h->num_digits = n;
21147
0
  h->decimal_point = (int32_t)n;
21148
0
  h->negative = negative;
21149
0
  h->truncated = false;
21150
0
  wuffs_private_impl__high_prec_dec__trim(h);
21151
0
}
21152
21153
static wuffs_base__status  //
21154
wuffs_private_impl__high_prec_dec__parse(wuffs_private_impl__high_prec_dec* h,
21155
                                         wuffs_base__slice_u8 s,
21156
0
                                         uint32_t options) {
21157
0
  if (!h) {
21158
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
21159
0
  }
21160
0
  h->num_digits = 0;
21161
0
  h->decimal_point = 0;
21162
0
  h->negative = false;
21163
0
  h->truncated = false;
21164
21165
0
  uint8_t* p = s.ptr;
21166
0
  uint8_t* q = s.ptr + s.len;
21167
21168
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21169
0
    for (;; p++) {
21170
0
      if (p >= q) {
21171
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21172
0
      } else if (*p != '_') {
21173
0
        break;
21174
0
      }
21175
0
    }
21176
0
  }
21177
21178
  // Parse sign.
21179
0
  do {
21180
0
    if (*p == '+') {
21181
0
      p++;
21182
0
    } else if (*p == '-') {
21183
0
      h->negative = true;
21184
0
      p++;
21185
0
    } else {
21186
0
      break;
21187
0
    }
21188
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21189
0
      for (;; p++) {
21190
0
        if (p >= q) {
21191
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
21192
0
        } else if (*p != '_') {
21193
0
          break;
21194
0
        }
21195
0
      }
21196
0
    }
21197
0
  } while (0);
21198
21199
  // Parse digits, up to (and including) a '.', 'E' or 'e'. Examples for each
21200
  // limb in this if-else chain:
21201
  //  - "0.789"
21202
  //  - "1002.789"
21203
  //  - ".789"
21204
  //  - Other (invalid input).
21205
0
  uint32_t nd = 0;
21206
0
  int32_t dp = 0;
21207
0
  bool no_digits_before_separator = false;
21208
0
  if (('0' == *p) &&
21209
0
      !(options &
21210
0
        WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES)) {
21211
0
    p++;
21212
0
    for (;; p++) {
21213
0
      if (p >= q) {
21214
0
        goto after_all;
21215
0
      } else if (*p ==
21216
0
                 ((options &
21217
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21218
0
                      ? ','
21219
0
                      : '.')) {
21220
0
        p++;
21221
0
        goto after_sep;
21222
0
      } else if ((*p == 'E') || (*p == 'e')) {
21223
0
        p++;
21224
0
        goto after_exp;
21225
0
      } else if ((*p != '_') ||
21226
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21227
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21228
0
      }
21229
0
    }
21230
21231
0
  } else if (('0' <= *p) && (*p <= '9')) {
21232
0
    if (*p == '0') {
21233
0
      for (; (p < q) && (*p == '0'); p++) {
21234
0
      }
21235
0
    } else {
21236
0
      h->digits[nd++] = (uint8_t)(*p - '0');
21237
0
      dp = (int32_t)nd;
21238
0
      p++;
21239
0
    }
21240
21241
0
    for (;; p++) {
21242
0
      if (p >= q) {
21243
0
        goto after_all;
21244
0
      } else if (('0' <= *p) && (*p <= '9')) {
21245
0
        if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21246
0
          h->digits[nd++] = (uint8_t)(*p - '0');
21247
0
          dp = (int32_t)nd;
21248
0
        } else if ('0' != *p) {
21249
          // Long-tail non-zeroes set the truncated bit.
21250
0
          h->truncated = true;
21251
0
        }
21252
0
      } else if (*p ==
21253
0
                 ((options &
21254
0
                   WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21255
0
                      ? ','
21256
0
                      : '.')) {
21257
0
        p++;
21258
0
        goto after_sep;
21259
0
      } else if ((*p == 'E') || (*p == 'e')) {
21260
0
        p++;
21261
0
        goto after_exp;
21262
0
      } else if ((*p != '_') ||
21263
0
                 !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21264
0
        return wuffs_base__make_status(wuffs_base__error__bad_argument);
21265
0
      }
21266
0
    }
21267
21268
0
  } else if (*p == ((options &
21269
0
                     WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
21270
0
                        ? ','
21271
0
                        : '.')) {
21272
0
    p++;
21273
0
    no_digits_before_separator = true;
21274
21275
0
  } else {
21276
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
21277
0
  }
21278
21279
0
after_sep:
21280
0
  for (;; p++) {
21281
0
    if (p >= q) {
21282
0
      goto after_all;
21283
0
    } else if ('0' == *p) {
21284
0
      if (nd == 0) {
21285
        // Track leading zeroes implicitly.
21286
0
        dp--;
21287
0
      } else if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21288
0
        h->digits[nd++] = (uint8_t)(*p - '0');
21289
0
      }
21290
0
    } else if (('0' < *p) && (*p <= '9')) {
21291
0
      if (nd < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21292
0
        h->digits[nd++] = (uint8_t)(*p - '0');
21293
0
      } else {
21294
        // Long-tail non-zeroes set the truncated bit.
21295
0
        h->truncated = true;
21296
0
      }
21297
0
    } else if ((*p == 'E') || (*p == 'e')) {
21298
0
      p++;
21299
0
      goto after_exp;
21300
0
    } else if ((*p != '_') ||
21301
0
               !(options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21302
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21303
0
    }
21304
0
  }
21305
21306
0
after_exp:
21307
0
  do {
21308
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
21309
0
      for (;; p++) {
21310
0
        if (p >= q) {
21311
0
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
21312
0
        } else if (*p != '_') {
21313
0
          break;
21314
0
        }
21315
0
      }
21316
0
    }
21317
21318
0
    int32_t exp_sign = +1;
21319
0
    if (*p == '+') {
21320
0
      p++;
21321
0
    } else if (*p == '-') {
21322
0
      exp_sign = -1;
21323
0
      p++;
21324
0
    }
21325
21326
0
    int32_t exp = 0;
21327
0
    const int32_t exp_large = WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE +
21328
0
                              WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
21329
0
    bool saw_exp_digits = false;
21330
0
    for (; p < q; p++) {
21331
0
      if ((*p == '_') &&
21332
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
21333
        // No-op.
21334
0
      } else if (('0' <= *p) && (*p <= '9')) {
21335
0
        saw_exp_digits = true;
21336
0
        if (exp < exp_large) {
21337
0
          exp = (10 * exp) + ((int32_t)(*p - '0'));
21338
0
        }
21339
0
      } else {
21340
0
        break;
21341
0
      }
21342
0
    }
21343
0
    if (!saw_exp_digits) {
21344
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21345
0
    }
21346
0
    dp += exp_sign * exp;
21347
0
  } while (0);
21348
21349
0
after_all:
21350
0
  if (p != q) {
21351
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
21352
0
  }
21353
0
  h->num_digits = nd;
21354
0
  if (nd == 0) {
21355
0
    if (no_digits_before_separator) {
21356
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
21357
0
    }
21358
0
    h->decimal_point = 0;
21359
0
  } else if (dp < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21360
0
    h->decimal_point = -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE - 1;
21361
0
  } else if (dp > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21362
0
    h->decimal_point = +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE + 1;
21363
0
  } else {
21364
0
    h->decimal_point = dp;
21365
0
  }
21366
0
  wuffs_private_impl__high_prec_dec__trim(h);
21367
0
  return wuffs_base__make_status(NULL);
21368
0
}
21369
21370
// --------
21371
21372
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits returns the number
21373
// of additional decimal digits when left-shifting by shift.
21374
//
21375
// See below for preconditions.
21376
static uint32_t  //
21377
wuffs_private_impl__high_prec_dec__lshift_num_new_digits(
21378
    wuffs_private_impl__high_prec_dec* h,
21379
0
    uint32_t shift) {
21380
  // Masking with 0x3F should be unnecessary (assuming the preconditions) but
21381
  // it's cheap and ensures that we don't overflow the
21382
  // wuffs_private_impl__hpd_left_shift array.
21383
0
  shift &= 63;
21384
21385
0
  uint32_t x_a = wuffs_private_impl__hpd_left_shift[shift];
21386
0
  uint32_t x_b = wuffs_private_impl__hpd_left_shift[shift + 1];
21387
0
  uint32_t num_new_digits = x_a >> 11;
21388
0
  uint32_t pow5_a = 0x7FF & x_a;
21389
0
  uint32_t pow5_b = 0x7FF & x_b;
21390
21391
0
  const uint8_t* pow5 = &wuffs_private_impl__powers_of_5[pow5_a];
21392
0
  uint32_t i = 0;
21393
0
  uint32_t n = pow5_b - pow5_a;
21394
0
  for (; i < n; i++) {
21395
0
    if (i >= h->num_digits) {
21396
0
      return num_new_digits - 1;
21397
0
    } else if (h->digits[i] == pow5[i]) {
21398
0
      continue;
21399
0
    } else if (h->digits[i] < pow5[i]) {
21400
0
      return num_new_digits - 1;
21401
0
    } else {
21402
0
      return num_new_digits;
21403
0
    }
21404
0
  }
21405
0
  return num_new_digits;
21406
0
}
21407
21408
// --------
21409
21410
// wuffs_private_impl__high_prec_dec__rounded_integer returns the integral
21411
// (non-fractional) part of h, provided that it is 18 or fewer decimal digits.
21412
// For 19 or more digits, it returns UINT64_MAX. Note that:
21413
//  - (1 << 53) is    9007199254740992, which has 16 decimal digits.
21414
//  - (1 << 56) is   72057594037927936, which has 17 decimal digits.
21415
//  - (1 << 59) is  576460752303423488, which has 18 decimal digits.
21416
//  - (1 << 63) is 9223372036854775808, which has 19 decimal digits.
21417
// and that IEEE 754 double precision has 52 mantissa bits.
21418
//
21419
// That integral part is rounded-to-even: rounding 7.5 or 8.5 both give 8.
21420
//
21421
// h's negative bit is ignored: rounding -8.6 returns 9.
21422
//
21423
// See below for preconditions.
21424
static uint64_t  //
21425
wuffs_private_impl__high_prec_dec__rounded_integer(
21426
0
    wuffs_private_impl__high_prec_dec* h) {
21427
0
  if ((h->num_digits == 0) || (h->decimal_point < 0)) {
21428
0
    return 0;
21429
0
  } else if (h->decimal_point > 18) {
21430
0
    return UINT64_MAX;
21431
0
  }
21432
21433
0
  uint32_t dp = (uint32_t)(h->decimal_point);
21434
0
  uint64_t n = 0;
21435
0
  uint32_t i = 0;
21436
0
  for (; i < dp; i++) {
21437
0
    n = (10 * n) + ((i < h->num_digits) ? h->digits[i] : 0);
21438
0
  }
21439
21440
0
  bool round_up = false;
21441
0
  if (dp < h->num_digits) {
21442
0
    round_up = h->digits[dp] >= 5;
21443
0
    if ((h->digits[dp] == 5) && (dp + 1 == h->num_digits)) {
21444
      // We are exactly halfway. If we're truncated, round up, otherwise round
21445
      // to even.
21446
0
      round_up = h->truncated ||  //
21447
0
                 ((dp > 0) && (1 & h->digits[dp - 1]));
21448
0
    }
21449
0
  }
21450
0
  if (round_up) {
21451
0
    n++;
21452
0
  }
21453
21454
0
  return n;
21455
0
}
21456
21457
// wuffs_private_impl__high_prec_dec__small_xshift shifts h's number (where 'x'
21458
// is 'l' or 'r' for left or right) by a small shift value.
21459
//
21460
// Preconditions:
21461
//  - h is non-NULL.
21462
//  - h->decimal_point is "not extreme".
21463
//  - shift is non-zero.
21464
//  - shift is "a small shift".
21465
//
21466
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21467
//
21468
// "A small shift" means not more than
21469
// WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
21470
//
21471
// wuffs_private_impl__high_prec_dec__rounded_integer and
21472
// wuffs_private_impl__high_prec_dec__lshift_num_new_digits have the same
21473
// preconditions.
21474
//
21475
// wuffs_private_impl__high_prec_dec__lshift keeps the first two preconditions
21476
// but not the last two. Its shift argument is signed and does not need to be
21477
// "small": zero is a no-op, positive means left shift and negative means right
21478
// shift.
21479
21480
static void  //
21481
wuffs_private_impl__high_prec_dec__small_lshift(
21482
    wuffs_private_impl__high_prec_dec* h,
21483
0
    uint32_t shift) {
21484
0
  if (h->num_digits == 0) {
21485
0
    return;
21486
0
  }
21487
0
  uint32_t num_new_digits =
21488
0
      wuffs_private_impl__high_prec_dec__lshift_num_new_digits(h, shift);
21489
0
  uint32_t rx = h->num_digits - 1;                   // Read  index.
21490
0
  uint32_t wx = h->num_digits - 1 + num_new_digits;  // Write index.
21491
0
  uint64_t n = 0;
21492
21493
  // Repeat: pick up a digit, put down a digit, right to left.
21494
0
  while (((int32_t)rx) >= 0) {
21495
0
    n += ((uint64_t)(h->digits[rx])) << shift;
21496
0
    uint64_t quo = n / 10;
21497
0
    uint64_t rem = n - (10 * quo);
21498
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21499
0
      h->digits[wx] = (uint8_t)rem;
21500
0
    } else if (rem > 0) {
21501
0
      h->truncated = true;
21502
0
    }
21503
0
    n = quo;
21504
0
    wx--;
21505
0
    rx--;
21506
0
  }
21507
21508
  // Put down leading digits, right to left.
21509
0
  while (n > 0) {
21510
0
    uint64_t quo = n / 10;
21511
0
    uint64_t rem = n - (10 * quo);
21512
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21513
0
      h->digits[wx] = (uint8_t)rem;
21514
0
    } else if (rem > 0) {
21515
0
      h->truncated = true;
21516
0
    }
21517
0
    n = quo;
21518
0
    wx--;
21519
0
  }
21520
21521
  // Finish.
21522
0
  h->num_digits += num_new_digits;
21523
0
  if (h->num_digits > WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21524
0
    h->num_digits = WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION;
21525
0
  }
21526
0
  h->decimal_point += (int32_t)num_new_digits;
21527
0
  wuffs_private_impl__high_prec_dec__trim(h);
21528
0
}
21529
21530
static void  //
21531
wuffs_private_impl__high_prec_dec__small_rshift(
21532
    wuffs_private_impl__high_prec_dec* h,
21533
0
    uint32_t shift) {
21534
0
  uint32_t rx = 0;  // Read  index.
21535
0
  uint32_t wx = 0;  // Write index.
21536
0
  uint64_t n = 0;
21537
21538
  // Pick up enough leading digits to cover the first shift.
21539
0
  while ((n >> shift) == 0) {
21540
0
    if (rx < h->num_digits) {
21541
      // Read a digit.
21542
0
      n = (10 * n) + h->digits[rx++];
21543
0
    } else if (n == 0) {
21544
      // h's number used to be zero and remains zero.
21545
0
      return;
21546
0
    } else {
21547
      // Read sufficient implicit trailing zeroes.
21548
0
      while ((n >> shift) == 0) {
21549
0
        n = 10 * n;
21550
0
        rx++;
21551
0
      }
21552
0
      break;
21553
0
    }
21554
0
  }
21555
0
  h->decimal_point -= ((int32_t)(rx - 1));
21556
0
  if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
21557
    // After the shift, h's number is effectively zero.
21558
0
    h->num_digits = 0;
21559
0
    h->decimal_point = 0;
21560
0
    h->truncated = false;
21561
0
    return;
21562
0
  }
21563
21564
  // Repeat: pick up a digit, put down a digit, left to right.
21565
0
  uint64_t mask = (((uint64_t)(1)) << shift) - 1;
21566
0
  while (rx < h->num_digits) {
21567
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
21568
0
    n = (10 * (n & mask)) + h->digits[rx++];
21569
0
    h->digits[wx++] = new_digit;
21570
0
  }
21571
21572
  // Put down trailing digits, left to right.
21573
0
  while (n > 0) {
21574
0
    uint8_t new_digit = ((uint8_t)(n >> shift));
21575
0
    n = 10 * (n & mask);
21576
0
    if (wx < WUFFS_PRIVATE_IMPL__HPD__DIGITS_PRECISION) {
21577
0
      h->digits[wx++] = new_digit;
21578
0
    } else if (new_digit > 0) {
21579
0
      h->truncated = true;
21580
0
    }
21581
0
  }
21582
21583
  // Finish.
21584
0
  h->num_digits = wx;
21585
0
  wuffs_private_impl__high_prec_dec__trim(h);
21586
0
}
21587
21588
static void  //
21589
wuffs_private_impl__high_prec_dec__lshift(wuffs_private_impl__high_prec_dec* h,
21590
0
                                          int32_t shift) {
21591
0
  if (shift > 0) {
21592
0
    while (shift > +WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
21593
0
      wuffs_private_impl__high_prec_dec__small_lshift(
21594
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
21595
0
      shift -= WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21596
0
    }
21597
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, ((uint32_t)(+shift)));
21598
0
  } else if (shift < 0) {
21599
0
    while (shift < -WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
21600
0
      wuffs_private_impl__high_prec_dec__small_rshift(
21601
0
          h, WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL);
21602
0
      shift += WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
21603
0
    }
21604
0
    wuffs_private_impl__high_prec_dec__small_rshift(h, ((uint32_t)(-shift)));
21605
0
  }
21606
0
}
21607
21608
// --------
21609
21610
// wuffs_private_impl__high_prec_dec__round_etc rounds h's number. For those
21611
// functions that take an n argument, rounding produces at most n digits (which
21612
// is not necessarily at most n decimal places). Negative n values are ignored,
21613
// as well as any n greater than or equal to h's number of digits. The
21614
// etc__round_just_enough function implicitly chooses an n to implement
21615
// WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION.
21616
//
21617
// Preconditions:
21618
//  - h is non-NULL.
21619
//  - h->decimal_point is "not extreme".
21620
//
21621
// "Not extreme" means within ยฑWUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE.
21622
21623
static void  //
21624
wuffs_private_impl__high_prec_dec__round_down(
21625
    wuffs_private_impl__high_prec_dec* h,
21626
0
    int32_t n) {
21627
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21628
0
    return;
21629
0
  }
21630
0
  h->num_digits = (uint32_t)(n);
21631
0
  wuffs_private_impl__high_prec_dec__trim(h);
21632
0
}
21633
21634
static void  //
21635
wuffs_private_impl__high_prec_dec__round_up(
21636
    wuffs_private_impl__high_prec_dec* h,
21637
0
    int32_t n) {
21638
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21639
0
    return;
21640
0
  }
21641
21642
0
  for (n--; n >= 0; n--) {
21643
0
    if (h->digits[n] < 9) {
21644
0
      h->digits[n]++;
21645
0
      h->num_digits = (uint32_t)(n + 1);
21646
0
      return;
21647
0
    }
21648
0
  }
21649
21650
  // The number is all 9s. Change to a single 1 and adjust the decimal point.
21651
0
  h->digits[0] = 1;
21652
0
  h->num_digits = 1;
21653
0
  h->decimal_point++;
21654
0
}
21655
21656
static void  //
21657
wuffs_private_impl__high_prec_dec__round_nearest(
21658
    wuffs_private_impl__high_prec_dec* h,
21659
0
    int32_t n) {
21660
0
  if ((n < 0) || (h->num_digits <= (uint32_t)n)) {
21661
0
    return;
21662
0
  }
21663
0
  bool up = h->digits[n] >= 5;
21664
0
  if ((h->digits[n] == 5) && ((n + 1) == ((int32_t)(h->num_digits)))) {
21665
0
    up = h->truncated ||  //
21666
0
         ((n > 0) && ((h->digits[n - 1] & 1) != 0));
21667
0
  }
21668
21669
0
  if (up) {
21670
0
    wuffs_private_impl__high_prec_dec__round_up(h, n);
21671
0
  } else {
21672
0
    wuffs_private_impl__high_prec_dec__round_down(h, n);
21673
0
  }
21674
0
}
21675
21676
static void  //
21677
wuffs_private_impl__high_prec_dec__round_just_enough(
21678
    wuffs_private_impl__high_prec_dec* h,
21679
    int32_t exp2,
21680
0
    uint64_t mantissa) {
21681
  // The magic numbers 52 and 53 in this function are because IEEE 754 double
21682
  // precision has 52 mantissa bits.
21683
  //
21684
  // Let f be the floating point number represented by exp2 and mantissa (and
21685
  // also the number in h): the number (mantissa * (2 ** (exp2 - 52))).
21686
  //
21687
  // If f is zero or a small integer, we can return early.
21688
0
  if ((mantissa == 0) ||
21689
0
      ((exp2 < 53) && (h->decimal_point >= ((int32_t)(h->num_digits))))) {
21690
0
    return;
21691
0
  }
21692
21693
  // The smallest normal f has an exp2 of -1022 and a mantissa of (1 << 52).
21694
  // Subnormal numbers have the same exp2 but a smaller mantissa.
21695
0
  static const int32_t min_incl_normal_exp2 = -1022;
21696
0
  static const uint64_t min_incl_normal_mantissa = 0x0010000000000000ul;
21697
21698
  // Compute lower and upper bounds such that any number between them (possibly
21699
  // inclusive) will round to f. First, the lower bound. Our number f is:
21700
  //   ((mantissa + 0)         * (2 ** (  exp2 - 52)))
21701
  //
21702
  // The next lowest floating point number is:
21703
  //   ((mantissa - 1)         * (2 ** (  exp2 - 52)))
21704
  // unless (mantissa - 1) drops the (1 << 52) bit and exp2 is not the
21705
  // min_incl_normal_exp2. Either way, call it:
21706
  //   ((l_mantissa)           * (2 ** (l_exp2 - 52)))
21707
  //
21708
  // The lower bound is halfway between them (noting that 52 became 53):
21709
  //   (((2 * l_mantissa) + 1) * (2 ** (l_exp2 - 53)))
21710
0
  int32_t l_exp2 = exp2;
21711
0
  uint64_t l_mantissa = mantissa - 1;
21712
0
  if ((exp2 > min_incl_normal_exp2) && (mantissa <= min_incl_normal_mantissa)) {
21713
0
    l_exp2 = exp2 - 1;
21714
0
    l_mantissa = (2 * mantissa) - 1;
21715
0
  }
21716
0
  wuffs_private_impl__high_prec_dec lower;
21717
0
  wuffs_private_impl__high_prec_dec__assign(&lower, (2 * l_mantissa) + 1,
21718
0
                                            false);
21719
0
  wuffs_private_impl__high_prec_dec__lshift(&lower, l_exp2 - 53);
21720
21721
  // Next, the upper bound. Our number f is:
21722
  //   ((mantissa + 0)       * (2 ** (exp2 - 52)))
21723
  //
21724
  // The next highest floating point number is:
21725
  //   ((mantissa + 1)       * (2 ** (exp2 - 52)))
21726
  //
21727
  // The upper bound is halfway between them (noting that 52 became 53):
21728
  //   (((2 * mantissa) + 1) * (2 ** (exp2 - 53)))
21729
0
  wuffs_private_impl__high_prec_dec upper;
21730
0
  wuffs_private_impl__high_prec_dec__assign(&upper, (2 * mantissa) + 1, false);
21731
0
  wuffs_private_impl__high_prec_dec__lshift(&upper, exp2 - 53);
21732
21733
  // The lower and upper bounds are possible outputs only if the original
21734
  // mantissa is even, so that IEEE round-to-even would round to the original
21735
  // mantissa and not its neighbors.
21736
0
  bool inclusive = (mantissa & 1) == 0;
21737
21738
  // As we walk the digits, we want to know whether rounding up would fall
21739
  // within the upper bound. This is tracked by upper_delta:
21740
  //  - When -1, the digits of h and upper are the same so far.
21741
  //  - When +0, we saw a difference of 1 between h and upper on a previous
21742
  //    digit and subsequently only 9s for h and 0s for upper. Thus, rounding
21743
  //    up may fall outside of the bound if !inclusive.
21744
  //  - When +1, the difference is greater than 1 and we know that rounding up
21745
  //    falls within the bound.
21746
  //
21747
  // This is a state machine with three states. The numerical value for each
21748
  // state (-1, +0 or +1) isn't important, other than their order.
21749
0
  int upper_delta = -1;
21750
21751
  // We can now figure out the shortest number of digits required. Walk the
21752
  // digits until h has distinguished itself from lower or upper.
21753
  //
21754
  // The zi and zd variables are indexes and digits, for z in l (lower), h (the
21755
  // number) and u (upper).
21756
  //
21757
  // The lower, h and upper numbers may have their decimal points at different
21758
  // places. In this case, upper is the longest, so we iterate ui starting from
21759
  // 0 and iterate li and hi starting from either 0 or -1.
21760
0
  int32_t ui = 0;
21761
0
  for (;; ui++) {
21762
    // Calculate hd, the middle number's digit.
21763
0
    int32_t hi = ui - upper.decimal_point + h->decimal_point;
21764
0
    if (hi >= ((int32_t)(h->num_digits))) {
21765
0
      break;
21766
0
    }
21767
0
    uint8_t hd = (((uint32_t)hi) < h->num_digits) ? h->digits[hi] : 0;
21768
21769
    // Calculate ld, the lower bound's digit.
21770
0
    int32_t li = ui - upper.decimal_point + lower.decimal_point;
21771
0
    uint8_t ld = (((uint32_t)li) < lower.num_digits) ? lower.digits[li] : 0;
21772
21773
    // We can round down (truncate) if lower has a different digit than h or if
21774
    // lower is inclusive and is exactly the result of rounding down (i.e. we
21775
    // have reached the final digit of lower).
21776
0
    bool can_round_down =
21777
0
        (ld != hd) ||  //
21778
0
        (inclusive && ((li + 1) == ((int32_t)(lower.num_digits))));
21779
21780
    // Calculate ud, the upper bound's digit, and update upper_delta.
21781
0
    uint8_t ud = (((uint32_t)ui) < upper.num_digits) ? upper.digits[ui] : 0;
21782
0
    if (upper_delta < 0) {
21783
0
      if ((hd + 1) < ud) {
21784
        // For example:
21785
        // h     = 12345???
21786
        // upper = 12347???
21787
0
        upper_delta = +1;
21788
0
      } else if (hd != ud) {
21789
        // For example:
21790
        // h     = 12345???
21791
        // upper = 12346???
21792
0
        upper_delta = +0;
21793
0
      }
21794
0
    } else if (upper_delta == 0) {
21795
0
      if ((hd != 9) || (ud != 0)) {
21796
        // For example:
21797
        // h     = 1234598?
21798
        // upper = 1234600?
21799
0
        upper_delta = +1;
21800
0
      }
21801
0
    }
21802
21803
    // We can round up if upper has a different digit than h and either upper
21804
    // is inclusive or upper is bigger than the result of rounding up.
21805
0
    bool can_round_up =
21806
0
        (upper_delta > 0) ||    //
21807
0
        ((upper_delta == 0) &&  //
21808
0
         (inclusive || ((ui + 1) < ((int32_t)(upper.num_digits)))));
21809
21810
    // If we can round either way, round to nearest. If we can round only one
21811
    // way, do it. If we can't round, continue the loop.
21812
0
    if (can_round_down) {
21813
0
      if (can_round_up) {
21814
0
        wuffs_private_impl__high_prec_dec__round_nearest(h, hi + 1);
21815
0
        return;
21816
0
      } else {
21817
0
        wuffs_private_impl__high_prec_dec__round_down(h, hi + 1);
21818
0
        return;
21819
0
      }
21820
0
    } else {
21821
0
      if (can_round_up) {
21822
0
        wuffs_private_impl__high_prec_dec__round_up(h, hi + 1);
21823
0
        return;
21824
0
      }
21825
0
    }
21826
0
  }
21827
0
}
21828
21829
// --------
21830
21831
// wuffs_private_impl__parse_number_f64_eisel_lemire produces the IEEE 754
21832
// double-precision value for an exact mantissa and base-10 exponent. For
21833
// example:
21834
//  - when parsing "12345.678e+02", man is 12345678 and exp10 is -1.
21835
//  - when parsing "-12", man is 12 and exp10 is 0. Processing the leading
21836
//    minus sign is the responsibility of the caller, not this function.
21837
//
21838
// On success, it returns a non-negative int64_t such that the low 63 bits hold
21839
// the 11-bit exponent and 52-bit mantissa.
21840
//
21841
// On failure, it returns a negative value.
21842
//
21843
// The algorithm is based on an original idea by Michael Eisel that was refined
21844
// by Daniel Lemire. See
21845
// https://lemire.me/blog/2020/03/10/fast-float-parsing-in-practice/
21846
// and
21847
// https://nigeltao.github.io/blog/2020/eisel-lemire.html
21848
//
21849
// Preconditions:
21850
//  - man is non-zero.
21851
//  - exp10 is in the range [-307 ..= 288], the same range of the
21852
//    wuffs_private_impl__powers_of_10 array.
21853
//
21854
// The exp10 range (and the fact that man is in the range [1 ..= UINT64_MAX],
21855
// approximately [1 ..= 1.85e+19]) means that (man * (10 ** exp10)) is in the
21856
// range [1e-307 ..= 1.85e+307]. This is entirely within the range of normal
21857
// (neither subnormal nor non-finite) f64 values: DBL_MIN and DBL_MAX are
21858
// approximately 2.23eโ€“308 and 1.80e+308.
21859
static int64_t  //
21860
0
wuffs_private_impl__parse_number_f64_eisel_lemire(uint64_t man, int32_t exp10) {
21861
  // Look up the (possibly truncated) base-2 representation of (10 ** exp10).
21862
  // The look-up table was constructed so that it is already normalized: the
21863
  // table entry's mantissa's MSB (most significant bit) is on.
21864
0
  const uint64_t* po10 = &wuffs_private_impl__powers_of_10[exp10 + 307][0];
21865
21866
  // Normalize the man argument. The (man != 0) precondition means that a
21867
  // non-zero bit exists.
21868
0
  uint32_t clz = wuffs_base__count_leading_zeroes_u64(man);
21869
0
  man <<= clz;
21870
21871
  // Calculate the return value's base-2 exponent. We might tweak it by ยฑ1
21872
  // later, but its initial value comes from a linear scaling of exp10,
21873
  // converting from power-of-10 to power-of-2, and adjusting by clz.
21874
  //
21875
  // The magic constants are:
21876
  //  - 1087 = 1023 + 64. The 1023 is the f64 exponent bias. The 64 is because
21877
  //    the look-up table uses 64-bit mantissas.
21878
  //  - 217706 is such that the ratio 217706 / 65536 โ‰ˆ 3.321930 is close enough
21879
  //    (over the practical range of exp10) to log(10) / log(2) โ‰ˆ 3.321928.
21880
  //  - 65536 = 1<<16 is arbitrary but a power of 2, so division is a shift.
21881
  //
21882
  // Equality of the linearly-scaled value and the actual power-of-2, over the
21883
  // range of exp10 arguments that this function accepts, is confirmed by
21884
  // script/print-mpb-powers-of-10.go
21885
0
  uint64_t ret_exp2 =
21886
0
      ((uint64_t)(((217706 * exp10) >> 16) + 1087)) - ((uint64_t)clz);
21887
21888
  // Multiply the two mantissas. Normalization means that both mantissas are at
21889
  // least (1<<63), so the 128-bit product must be at least (1<<126). The high
21890
  // 64 bits of the product, x_hi, must therefore be at least (1<<62).
21891
  //
21892
  // As a consequence, x_hi has either 0 or 1 leading zeroes. Shifting x_hi
21893
  // right by either 9 or 10 bits (depending on x_hi's MSB) will therefore
21894
  // leave the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on.
21895
0
  wuffs_base__multiply_u64__output x = wuffs_base__multiply_u64(man, po10[1]);
21896
0
  uint64_t x_hi = x.hi;
21897
0
  uint64_t x_lo = x.lo;
21898
21899
  // Before we shift right by at least 9 bits, recall that the look-up table
21900
  // entry was possibly truncated. We have so far only calculated a lower bound
21901
  // for the product (man * e), where e is (10 ** exp10). The upper bound would
21902
  // add a further (man * 1) to the 128-bit product, which overflows the lower
21903
  // 64-bit limb if ((x_lo + man) < man).
21904
  //
21905
  // If overflow occurs, that adds 1 to x_hi. Since we're about to shift right
21906
  // by at least 9 bits, that carried 1 can be ignored unless the higher 64-bit
21907
  // limb's low 9 bits are all on.
21908
  //
21909
  // For example, parsing "9999999999999999999" will take the if-true branch
21910
  // here, since:
21911
  //  - x_hi = 0x4563918244F3FFFF
21912
  //  - x_lo = 0x8000000000000000
21913
  //  - man  = 0x8AC7230489E7FFFF
21914
0
  if (((x_hi & 0x1FF) == 0x1FF) && ((x_lo + man) < man)) {
21915
    // Refine our calculation of (man * e). Before, our approximation of e used
21916
    // a "low resolution" 64-bit mantissa. Now use a "high resolution" 128-bit
21917
    // mantissa. We've already calculated x = (man * bits_0_to_63_incl_of_e).
21918
    // Now calculate y = (man * bits_64_to_127_incl_of_e).
21919
0
    wuffs_base__multiply_u64__output y = wuffs_base__multiply_u64(man, po10[0]);
21920
0
    uint64_t y_hi = y.hi;
21921
0
    uint64_t y_lo = y.lo;
21922
21923
    // Merge the 128-bit x and 128-bit y, which overlap by 64 bits, to
21924
    // calculate the 192-bit product of the 64-bit man by the 128-bit e.
21925
    // As we exit this if-block, we only care about the high 128 bits
21926
    // (merged_hi and merged_lo) of that 192-bit product.
21927
    //
21928
    // For example, parsing "1.234e-45" will take the if-true branch here,
21929
    // since:
21930
    //  - x_hi = 0x70B7E3696DB29FFF
21931
    //  - x_lo = 0xE040000000000000
21932
    //  - y_hi = 0x33718BBEAB0E0D7A
21933
    //  - y_lo = 0xA880000000000000
21934
0
    uint64_t merged_hi = x_hi;
21935
0
    uint64_t merged_lo = x_lo + y_hi;
21936
0
    if (merged_lo < x_lo) {
21937
0
      merged_hi++;  // Carry the overflow bit.
21938
0
    }
21939
21940
    // The "high resolution" approximation of e is still a lower bound. Once
21941
    // again, see if the upper bound is large enough to produce a different
21942
    // result. This time, if it does, give up instead of reaching for an even
21943
    // more precise approximation to e.
21944
    //
21945
    // This three-part check is similar to the two-part check that guarded the
21946
    // if block that we're now in, but it has an extra term for the middle 64
21947
    // bits (checking that adding 1 to merged_lo would overflow).
21948
    //
21949
    // For example, parsing "5.9604644775390625e-8" will take the if-true
21950
    // branch here, since:
21951
    //  - merged_hi = 0x7FFFFFFFFFFFFFFF
21952
    //  - merged_lo = 0xFFFFFFFFFFFFFFFF
21953
    //  - y_lo      = 0x4DB3FFC120988200
21954
    //  - man       = 0xD3C21BCECCEDA100
21955
0
    if (((merged_hi & 0x1FF) == 0x1FF) && ((merged_lo + 1) == 0) &&
21956
0
        (y_lo + man < man)) {
21957
0
      return -1;
21958
0
    }
21959
21960
    // Replace the 128-bit x with merged.
21961
0
    x_hi = merged_hi;
21962
0
    x_lo = merged_lo;
21963
0
  }
21964
21965
  // As mentioned above, shifting x_hi right by either 9 or 10 bits will leave
21966
  // the top 10 MSBs (bits 54 ..= 63) off and the 11th MSB (bit 53) on. If the
21967
  // MSB (before shifting) was on, adjust ret_exp2 for the larger shift.
21968
  //
21969
  // Having bit 53 on (and higher bits off) means that ret_mantissa is a 54-bit
21970
  // number.
21971
0
  uint64_t msb = x_hi >> 63;
21972
0
  uint64_t ret_mantissa = x_hi >> (msb + 9);
21973
0
  ret_exp2 -= 1 ^ msb;
21974
21975
  // IEEE 754 rounds to-nearest with ties rounded to-even. Rounding to-even can
21976
  // be tricky. If we're half-way between two exactly representable numbers
21977
  // (x's low 73 bits are zero and the next 2 bits that matter are "01"), give
21978
  // up instead of trying to pick the winner.
21979
  //
21980
  // Technically, we could tighten the condition by changing "73" to "73 or 74,
21981
  // depending on msb", but a flat "73" is simpler.
21982
  //
21983
  // For example, parsing "1e+23" will take the if-true branch here, since:
21984
  //  - x_hi          = 0x54B40B1F852BDA00
21985
  //  - ret_mantissa  = 0x002A5A058FC295ED
21986
0
  if ((x_lo == 0) && ((x_hi & 0x1FF) == 0) && ((ret_mantissa & 3) == 1)) {
21987
0
    return -1;
21988
0
  }
21989
21990
  // If we're not halfway then it's rounding to-nearest. Starting with a 54-bit
21991
  // number, carry the lowest bit (bit 0) up if it's on. Regardless of whether
21992
  // it was on or off, shifting right by one then produces a 53-bit number. If
21993
  // carrying up overflowed, shift again.
21994
0
  ret_mantissa += ret_mantissa & 1;
21995
0
  ret_mantissa >>= 1;
21996
  // This if block is equivalent to (but benchmarks slightly faster than) the
21997
  // following branchless form:
21998
  //    uint64_t overflow_adjustment = ret_mantissa >> 53;
21999
  //    ret_mantissa >>= overflow_adjustment;
22000
  //    ret_exp2 += overflow_adjustment;
22001
  //
22002
  // For example, parsing "7.2057594037927933e+16" will take the if-true
22003
  // branch here, since:
22004
  //  - x_hi          = 0x7FFFFFFFFFFFFE80
22005
  //  - ret_mantissa  = 0x0020000000000000
22006
0
  if ((ret_mantissa >> 53) > 0) {
22007
0
    ret_mantissa >>= 1;
22008
0
    ret_exp2++;
22009
0
  }
22010
22011
  // Starting with a 53-bit number, IEEE 754 double-precision normal numbers
22012
  // have an implicit mantissa bit. Mask that away and keep the low 52 bits.
22013
0
  ret_mantissa &= 0x000FFFFFFFFFFFFF;
22014
22015
  // Pack the bits and return.
22016
0
  return ((int64_t)(ret_mantissa | (ret_exp2 << 52)));
22017
0
}
22018
22019
// --------
22020
22021
static wuffs_base__result_f64  //
22022
wuffs_private_impl__parse_number_f64_special(wuffs_base__slice_u8 s,
22023
0
                                             uint32_t options) {
22024
0
  do {
22025
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
22026
0
      goto fail;
22027
0
    }
22028
22029
0
    uint8_t* p = s.ptr;
22030
0
    uint8_t* q = s.ptr + s.len;
22031
22032
0
    for (; (p < q) && (*p == '_'); p++) {
22033
0
    }
22034
0
    if (p >= q) {
22035
0
      goto fail;
22036
0
    }
22037
22038
    // Parse sign.
22039
0
    bool negative = false;
22040
0
    do {
22041
0
      if (*p == '+') {
22042
0
        p++;
22043
0
      } else if (*p == '-') {
22044
0
        negative = true;
22045
0
        p++;
22046
0
      } else {
22047
0
        break;
22048
0
      }
22049
0
      for (; (p < q) && (*p == '_'); p++) {
22050
0
      }
22051
0
    } while (0);
22052
0
    if (p >= q) {
22053
0
      goto fail;
22054
0
    }
22055
22056
0
    bool nan = false;
22057
0
    switch (p[0]) {
22058
0
      case 'I':
22059
0
      case 'i':
22060
0
        if (((q - p) < 3) ||                     //
22061
0
            ((p[1] != 'N') && (p[1] != 'n')) ||  //
22062
0
            ((p[2] != 'F') && (p[2] != 'f'))) {
22063
0
          goto fail;
22064
0
        }
22065
0
        p += 3;
22066
22067
0
        if ((p >= q) || (*p == '_')) {
22068
0
          break;
22069
0
        } else if (((q - p) < 5) ||                     //
22070
0
                   ((p[0] != 'I') && (p[0] != 'i')) ||  //
22071
0
                   ((p[1] != 'N') && (p[1] != 'n')) ||  //
22072
0
                   ((p[2] != 'I') && (p[2] != 'i')) ||  //
22073
0
                   ((p[3] != 'T') && (p[3] != 't')) ||  //
22074
0
                   ((p[4] != 'Y') && (p[4] != 'y'))) {
22075
0
          goto fail;
22076
0
        }
22077
0
        p += 5;
22078
22079
0
        if ((p >= q) || (*p == '_')) {
22080
0
          break;
22081
0
        }
22082
0
        goto fail;
22083
22084
0
      case 'N':
22085
0
      case 'n':
22086
0
        if (((q - p) < 3) ||                     //
22087
0
            ((p[1] != 'A') && (p[1] != 'a')) ||  //
22088
0
            ((p[2] != 'N') && (p[2] != 'n'))) {
22089
0
          goto fail;
22090
0
        }
22091
0
        p += 3;
22092
22093
0
        if ((p >= q) || (*p == '_')) {
22094
0
          nan = true;
22095
0
          break;
22096
0
        }
22097
0
        goto fail;
22098
22099
0
      default:
22100
0
        goto fail;
22101
0
    }
22102
22103
    // Finish.
22104
0
    for (; (p < q) && (*p == '_'); p++) {
22105
0
    }
22106
0
    if (p != q) {
22107
0
      goto fail;
22108
0
    }
22109
0
    wuffs_base__result_f64 ret;
22110
0
    ret.status.repr = NULL;
22111
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22112
0
        (nan ? 0x7FFFFFFFFFFFFFFF : 0x7FF0000000000000) |
22113
0
        (negative ? 0x8000000000000000 : 0));
22114
0
    return ret;
22115
0
  } while (0);
22116
22117
0
fail:
22118
0
  do {
22119
0
    wuffs_base__result_f64 ret;
22120
0
    ret.status.repr = wuffs_base__error__bad_argument;
22121
0
    ret.value = 0;
22122
0
    return ret;
22123
0
  } while (0);
22124
0
}
22125
22126
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
22127
wuffs_private_impl__high_prec_dec__to_f64(wuffs_private_impl__high_prec_dec* h,
22128
0
                                          uint32_t options) {
22129
0
  do {
22130
    // powers converts decimal powers of 10 to binary powers of 2. For example,
22131
    // (10000 >> 13) is 1. It stops before the elements exceed 60, also known
22132
    // as WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
22133
    //
22134
    // This rounds down (1<<13 is a lower bound for 1e4). Adding 1 to the array
22135
    // element value rounds up (1<<14 is an upper bound for 1e4) while staying
22136
    // at or below WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL.
22137
    //
22138
    // When starting in the range [1e+1 .. 1e+2] (i.e. h->decimal_point == +2),
22139
    // powers[2] == 6 and so:
22140
    //  - Right shifting by 6+0 produces the range [10/64 .. 100/64] =
22141
    //    [0.156250 .. 1.56250]. The resultant h->decimal_point is +0 or +1.
22142
    //  - Right shifting by 6+1 produces the range [10/128 .. 100/128] =
22143
    //    [0.078125 .. 0.78125]. The resultant h->decimal_point is -1 or -0.
22144
    //
22145
    // When starting in the range [1e-3 .. 1e-2] (i.e. h->decimal_point == -2),
22146
    // powers[2] == 6 and so:
22147
    //  - Left shifting by 6+0 produces the range [0.001*64 .. 0.01*64] =
22148
    //    [0.064 .. 0.64]. The resultant h->decimal_point is -1 or -0.
22149
    //  - Left shifting by 6+1 produces the range [0.001*128 .. 0.01*128] =
22150
    //    [0.128 .. 1.28]. The resultant h->decimal_point is +0 or +1.
22151
    //
22152
    // Thus, when targeting h->decimal_point being +0 or +1, use (powers[n]+0)
22153
    // when right shifting but (powers[n]+1) when left shifting.
22154
0
    static const uint32_t num_powers = 19;
22155
0
    static const uint8_t powers[19] = {
22156
0
        0,  3,  6,  9,  13, 16, 19, 23, 26, 29,  //
22157
0
        33, 36, 39, 43, 46, 49, 53, 56, 59,      //
22158
0
    };
22159
22160
    // Handle zero and obvious extremes. The largest and smallest positive
22161
    // finite f64 values are approximately 1.8e+308 and 4.9e-324.
22162
0
    if ((h->num_digits == 0) || (h->decimal_point < -326)) {
22163
0
      goto zero;
22164
0
    } else if (h->decimal_point > 310) {
22165
0
      goto infinity;
22166
0
    }
22167
22168
    // Try the fast Eisel-Lemire algorithm again. Calculating the (man, exp10)
22169
    // pair from the high_prec_dec h is more correct but slower than the
22170
    // approach taken in wuffs_base__parse_number_f64. The latter is optimized
22171
    // for the common cases (e.g. assuming no underscores or a leading '+'
22172
    // sign) rather than the full set of cases allowed by the Wuffs API.
22173
    //
22174
    // When we have 19 or fewer mantissa digits, run Eisel-Lemire once (trying
22175
    // for an exact result). When we have more than 19 mantissa digits, run it
22176
    // twice to get a lower and upper bound. We still have an exact result
22177
    // (within f64's rounding margin) if both bounds are equal (and valid).
22178
0
    uint32_t i_max = h->num_digits;
22179
0
    if (i_max > 19) {
22180
0
      i_max = 19;
22181
0
    }
22182
0
    int32_t exp10 = h->decimal_point - ((int32_t)i_max);
22183
0
    if ((-307 <= exp10) && (exp10 <= 288)) {
22184
0
      uint64_t man = 0;
22185
0
      uint32_t i;
22186
0
      for (i = 0; i < i_max; i++) {
22187
0
        man = (10 * man) + h->digits[i];
22188
0
      }
22189
0
      while (man != 0) {  // The 'while' is just an 'if' that we can 'break'.
22190
0
        int64_t r0 =
22191
0
            wuffs_private_impl__parse_number_f64_eisel_lemire(man + 0, exp10);
22192
0
        if (r0 < 0) {
22193
0
          break;
22194
0
        } else if (h->num_digits > 19) {
22195
0
          int64_t r1 =
22196
0
              wuffs_private_impl__parse_number_f64_eisel_lemire(man + 1, exp10);
22197
0
          if (r1 != r0) {
22198
0
            break;
22199
0
          }
22200
0
        }
22201
0
        wuffs_base__result_f64 ret;
22202
0
        ret.status.repr = NULL;
22203
0
        ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22204
0
            ((uint64_t)r0) | (((uint64_t)(h->negative)) << 63));
22205
0
        return ret;
22206
0
      }
22207
0
    }
22208
22209
    // When Eisel-Lemire fails, fall back to Simple Decimal Conversion. See
22210
    // https://nigeltao.github.io/blog/2020/parse-number-f64-simple.html
22211
    //
22212
    // Scale by powers of 2 until we're in the range [0.1 .. 10]. Equivalently,
22213
    // that h->decimal_point is +0 or +1.
22214
    //
22215
    // First we shift right while at or above 10...
22216
0
    const int32_t f64_bias = -1023;
22217
0
    int32_t exp2 = 0;
22218
0
    while (h->decimal_point > 1) {
22219
0
      uint32_t n = (uint32_t)(+h->decimal_point);
22220
0
      uint32_t shift = (n < num_powers)
22221
0
                           ? powers[n]
22222
0
                           : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22223
22224
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, shift);
22225
0
      if (h->decimal_point < -WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
22226
0
        goto zero;
22227
0
      }
22228
0
      exp2 += (int32_t)shift;
22229
0
    }
22230
    // ...then we shift left while below 0.1.
22231
0
    while (h->decimal_point < 0) {
22232
0
      uint32_t shift;
22233
0
      uint32_t n = (uint32_t)(-h->decimal_point);
22234
0
      shift = (n < num_powers)
22235
                  // The +1 is per "when targeting h->decimal_point being +0 or
22236
                  // +1... when left shifting" in the powers comment above.
22237
0
                  ? (powers[n] + 1u)
22238
0
                  : WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22239
22240
0
      wuffs_private_impl__high_prec_dec__small_lshift(h, shift);
22241
0
      if (h->decimal_point > +WUFFS_PRIVATE_IMPL__HPD__DECIMAL_POINT__RANGE) {
22242
0
        goto infinity;
22243
0
      }
22244
0
      exp2 -= (int32_t)shift;
22245
0
    }
22246
22247
    // To get from "in the range [0.1 .. 10]" to "in the range [1 .. 2]" (which
22248
    // will give us our exponent in base-2), the mantissa's first 3 digits will
22249
    // determine the final left shift, equal to 52 (the number of explicit f64
22250
    // bits) plus an additional adjustment.
22251
0
    int man3 = (100 * h->digits[0]) +
22252
0
               ((h->num_digits > 1) ? (10 * h->digits[1]) : 0) +
22253
0
               ((h->num_digits > 2) ? h->digits[2] : 0);
22254
0
    int32_t additional_lshift = 0;
22255
0
    if (h->decimal_point == 0) {  // The value is in [0.1 .. 1].
22256
0
      if (man3 < 125) {
22257
0
        additional_lshift = +4;
22258
0
      } else if (man3 < 250) {
22259
0
        additional_lshift = +3;
22260
0
      } else if (man3 < 500) {
22261
0
        additional_lshift = +2;
22262
0
      } else {
22263
0
        additional_lshift = +1;
22264
0
      }
22265
0
    } else {  // The value is in [1 .. 10].
22266
0
      if (man3 < 200) {
22267
0
        additional_lshift = -0;
22268
0
      } else if (man3 < 400) {
22269
0
        additional_lshift = -1;
22270
0
      } else if (man3 < 800) {
22271
0
        additional_lshift = -2;
22272
0
      } else {
22273
0
        additional_lshift = -3;
22274
0
      }
22275
0
    }
22276
0
    exp2 -= additional_lshift;
22277
0
    uint32_t final_lshift = (uint32_t)(52 + additional_lshift);
22278
22279
    // The minimum normal exponent is (f64_bias + 1).
22280
0
    while ((f64_bias + 1) > exp2) {
22281
0
      uint32_t n = (uint32_t)((f64_bias + 1) - exp2);
22282
0
      if (n > WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL) {
22283
0
        n = WUFFS_PRIVATE_IMPL__HPD__SHIFT__MAX_INCL;
22284
0
      }
22285
0
      wuffs_private_impl__high_prec_dec__small_rshift(h, n);
22286
0
      exp2 += (int32_t)n;
22287
0
    }
22288
22289
    // Check for overflow.
22290
0
    if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
22291
0
      goto infinity;
22292
0
    }
22293
22294
    // Extract 53 bits for the mantissa (in base-2).
22295
0
    wuffs_private_impl__high_prec_dec__small_lshift(h, final_lshift);
22296
0
    uint64_t man2 = wuffs_private_impl__high_prec_dec__rounded_integer(h);
22297
22298
    // Rounding might have added one bit. If so, shift and re-check overflow.
22299
0
    if ((man2 >> 53) != 0) {
22300
0
      man2 >>= 1;
22301
0
      exp2++;
22302
0
      if ((exp2 - f64_bias) >= 0x07FF) {  // (1 << 11) - 1.
22303
0
        goto infinity;
22304
0
      }
22305
0
    }
22306
22307
    // Handle subnormal numbers.
22308
0
    if ((man2 >> 52) == 0) {
22309
0
      exp2 = f64_bias;
22310
0
    }
22311
22312
    // Pack the bits and return.
22313
0
    uint64_t exp2_bits =
22314
0
        (uint64_t)((exp2 - f64_bias) & 0x07FF);              // (1 << 11) - 1.
22315
0
    uint64_t bits = (man2 & 0x000FFFFFFFFFFFFF) |            // (1 << 52) - 1.
22316
0
                    (exp2_bits << 52) |                      //
22317
0
                    (h->negative ? 0x8000000000000000 : 0);  // (1 << 63).
22318
22319
0
    wuffs_base__result_f64 ret;
22320
0
    ret.status.repr = NULL;
22321
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22322
0
    return ret;
22323
0
  } while (0);
22324
22325
0
zero:
22326
0
  do {
22327
0
    uint64_t bits = h->negative ? 0x8000000000000000 : 0;
22328
22329
0
    wuffs_base__result_f64 ret;
22330
0
    ret.status.repr = NULL;
22331
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22332
0
    return ret;
22333
0
  } while (0);
22334
22335
0
infinity:
22336
0
  do {
22337
0
    if (options & WUFFS_BASE__PARSE_NUMBER_FXX__REJECT_INF_AND_NAN) {
22338
0
      wuffs_base__result_f64 ret;
22339
0
      ret.status.repr = wuffs_base__error__bad_argument;
22340
0
      ret.value = 0;
22341
0
      return ret;
22342
0
    }
22343
22344
0
    uint64_t bits = h->negative ? 0xFFF0000000000000 : 0x7FF0000000000000;
22345
22346
0
    wuffs_base__result_f64 ret;
22347
0
    ret.status.repr = NULL;
22348
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(bits);
22349
0
    return ret;
22350
0
  } while (0);
22351
0
}
22352
22353
static inline bool  //
22354
0
wuffs_private_impl__is_decimal_digit(uint8_t c) {
22355
0
  return ('0' <= c) && (c <= '9');
22356
0
}
22357
22358
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_f64  //
22359
0
wuffs_base__parse_number_f64(wuffs_base__slice_u8 s, uint32_t options) {
22360
  // In practice, almost all "dd.ddddEยฑxxx" numbers can be represented
22361
  // losslessly by a uint64_t mantissa "dddddd" and an int32_t base-10
22362
  // exponent, adjusting "xxx" for the position (if present) of the decimal
22363
  // separator '.' or ','.
22364
  //
22365
  // This (u64 man, i32 exp10) data structure is superficially similar to the
22366
  // "Do It Yourself Floating Point" type from Loitsch (โ€ ), but the exponent
22367
  // here is base-10, not base-2.
22368
  //
22369
  // If s's number fits in a (man, exp10), parse that pair with the
22370
  // Eisel-Lemire algorithm. If not, or if Eisel-Lemire fails, parsing s with
22371
  // the fallback algorithm is slower but comprehensive.
22372
  //
22373
  // โ€  "Printing Floating-Point Numbers Quickly and Accurately with Integers"
22374
  // (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf).
22375
  // Florian Loitsch is also the primary contributor to
22376
  // https://github.com/google/double-conversion
22377
0
  do {
22378
    // Calculating that (man, exp10) pair needs to stay within s's bounds.
22379
    // Provided that s isn't extremely long, work on a NUL-terminated copy of
22380
    // s's contents. The NUL byte isn't a valid part of "ยฑdd.ddddEยฑxxx".
22381
    //
22382
    // As the pointer p walks the contents, it's faster to repeatedly check "is
22383
    // *p a valid digit" than "is p within bounds and *p a valid digit".
22384
0
    if (s.len >= 256) {
22385
0
      goto fallback;
22386
0
    }
22387
0
    uint8_t z[256];
22388
0
    memcpy(&z[0], s.ptr, s.len);
22389
0
    z[s.len] = 0;
22390
0
    const uint8_t* p = &z[0];
22391
22392
    // Look for a leading minus sign. Technically, we could also look for an
22393
    // optional plus sign, but the "script/process-json-numbers.c with -p"
22394
    // benchmark is noticably slower if we do. It's optional and, in practice,
22395
    // usually absent. Let the fallback catch it.
22396
0
    bool negative = (*p == '-');
22397
0
    if (negative) {
22398
0
      p++;
22399
0
    }
22400
22401
    // After walking "dd.dddd", comparing p later with p now will produce the
22402
    // number of "d"s and "."s.
22403
0
    const uint8_t* const start_of_digits_ptr = p;
22404
22405
    // Walk the "d"s before a '.', 'E', NUL byte, etc. If it starts with '0',
22406
    // it must be a single '0'. If it starts with a non-zero decimal digit, it
22407
    // can be a sequence of decimal digits.
22408
    //
22409
    // Update the man variable during the walk. It's OK if man overflows now.
22410
    // We'll detect that later.
22411
0
    uint64_t man;
22412
0
    if (*p == '0') {
22413
0
      man = 0;
22414
0
      p++;
22415
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22416
0
        goto fallback;
22417
0
      }
22418
0
    } else if (wuffs_private_impl__is_decimal_digit(*p)) {
22419
0
      man = ((uint8_t)(*p - '0'));
22420
0
      p++;
22421
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
22422
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
22423
0
      }
22424
0
    } else {
22425
0
      goto fallback;
22426
0
    }
22427
22428
    // Walk the "d"s after the optional decimal separator ('.' or ','),
22429
    // updating the man and exp10 variables.
22430
0
    int32_t exp10 = 0;
22431
0
    if (*p ==
22432
0
        ((options & WUFFS_BASE__PARSE_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22433
0
             ? ','
22434
0
             : '.')) {
22435
0
      p++;
22436
0
      const uint8_t* first_after_separator_ptr = p;
22437
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
22438
0
        goto fallback;
22439
0
      }
22440
0
      man = (10 * man) + ((uint8_t)(*p - '0'));
22441
0
      p++;
22442
0
      for (; wuffs_private_impl__is_decimal_digit(*p); p++) {
22443
0
        man = (10 * man) + ((uint8_t)(*p - '0'));
22444
0
      }
22445
0
      exp10 = ((int32_t)(first_after_separator_ptr - p));
22446
0
    }
22447
22448
    // Count the number of digits:
22449
    //  - for an input of "314159",  digit_count is 6.
22450
    //  - for an input of "3.14159", digit_count is 7.
22451
    //
22452
    // This is off-by-one if there is a decimal separator. That's OK for now.
22453
    // We'll correct for that later. The "script/process-json-numbers.c with
22454
    // -p" benchmark is noticably slower if we try to correct for that now.
22455
0
    uint32_t digit_count = (uint32_t)(p - start_of_digits_ptr);
22456
22457
    // Update exp10 for the optional exponent, starting with 'E' or 'e'.
22458
0
    if ((*p | 0x20) == 'e') {
22459
0
      p++;
22460
0
      int32_t exp_sign = +1;
22461
0
      if (*p == '-') {
22462
0
        p++;
22463
0
        exp_sign = -1;
22464
0
      } else if (*p == '+') {
22465
0
        p++;
22466
0
      }
22467
0
      if (!wuffs_private_impl__is_decimal_digit(*p)) {
22468
0
        goto fallback;
22469
0
      }
22470
0
      int32_t exp_num = ((uint8_t)(*p - '0'));
22471
0
      p++;
22472
      // The rest of the exp_num walking has a peculiar control flow but, once
22473
      // again, the "script/process-json-numbers.c with -p" benchmark is
22474
      // sensitive to alternative formulations.
22475
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22476
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22477
0
        p++;
22478
0
      }
22479
0
      if (wuffs_private_impl__is_decimal_digit(*p)) {
22480
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22481
0
        p++;
22482
0
      }
22483
0
      while (wuffs_private_impl__is_decimal_digit(*p)) {
22484
0
        if (exp_num > 0x1000000) {
22485
0
          goto fallback;
22486
0
        }
22487
0
        exp_num = (10 * exp_num) + ((uint8_t)(*p - '0'));
22488
0
        p++;
22489
0
      }
22490
0
      exp10 += exp_sign * exp_num;
22491
0
    }
22492
22493
    // The Wuffs API is that the original slice has no trailing data. It also
22494
    // allows underscores, which we don't catch here but the fallback should.
22495
0
    if (p != &z[s.len]) {
22496
0
      goto fallback;
22497
0
    }
22498
22499
    // Check that the uint64_t typed man variable has not overflowed, based on
22500
    // digit_count.
22501
    //
22502
    // For reference:
22503
    //   - (1 << 63) is  9223372036854775808, which has 19 decimal digits.
22504
    //   - (1 << 64) is 18446744073709551616, which has 20 decimal digits.
22505
    //   - 19 nines,  9999999999999999999, is  0x8AC7230489E7FFFF, which has 64
22506
    //     bits and 16 hexadecimal digits.
22507
    //   - 20 nines, 99999999999999999999, is 0x56BC75E2D630FFFFF, which has 67
22508
    //     bits and 17 hexadecimal digits.
22509
0
    if (digit_count > 19) {
22510
      // Even if we have more than 19 pseudo-digits, it's not yet definitely an
22511
      // overflow. Recall that digit_count might be off-by-one (too large) if
22512
      // there's a decimal separator. It will also over-report the number of
22513
      // meaningful digits if the input looks something like "0.000dddExxx".
22514
      //
22515
      // We adjust by the number of leading '0's and '.'s and re-compare to 19.
22516
      // Once again, technically, we could skip ','s too, but that perturbs the
22517
      // "script/process-json-numbers.c with -p" benchmark.
22518
0
      const uint8_t* q = start_of_digits_ptr;
22519
0
      for (; (*q == '0') || (*q == '.'); q++) {
22520
0
      }
22521
0
      digit_count -= (uint32_t)(q - start_of_digits_ptr);
22522
0
      if (digit_count > 19) {
22523
0
        goto fallback;
22524
0
      }
22525
0
    }
22526
22527
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
22528
    // include that exp10 is in the range [-307 ..= 288].
22529
0
    if ((exp10 < -307) || (288 < exp10)) {
22530
0
      goto fallback;
22531
0
    }
22532
22533
    // If both man and (10 ** exp10) are exactly representable by a double, we
22534
    // don't need to run the Eisel-Lemire algorithm.
22535
0
    if ((-22 <= exp10) && (exp10 <= 22) && ((man >> 53) == 0)) {
22536
0
      double d = (double)man;
22537
0
      if (exp10 >= 0) {
22538
0
        d *= wuffs_private_impl__f64_powers_of_10[+exp10];
22539
0
      } else {
22540
0
        d /= wuffs_private_impl__f64_powers_of_10[-exp10];
22541
0
      }
22542
0
      wuffs_base__result_f64 ret;
22543
0
      ret.status.repr = NULL;
22544
0
      ret.value = negative ? -d : +d;
22545
0
      return ret;
22546
0
    }
22547
22548
    // The wuffs_private_impl__parse_number_f64_eisel_lemire preconditions
22549
    // include that man is non-zero. Parsing "0" should be caught by the "If
22550
    // both man and (10 ** exp10)" above, but "0e99" might not.
22551
0
    if (man == 0) {
22552
0
      goto fallback;
22553
0
    }
22554
22555
    // Our man and exp10 are in range. Run the Eisel-Lemire algorithm.
22556
0
    int64_t r = wuffs_private_impl__parse_number_f64_eisel_lemire(man, exp10);
22557
0
    if (r < 0) {
22558
0
      goto fallback;
22559
0
    }
22560
0
    wuffs_base__result_f64 ret;
22561
0
    ret.status.repr = NULL;
22562
0
    ret.value = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
22563
0
        ((uint64_t)r) | (((uint64_t)negative) << 63));
22564
0
    return ret;
22565
0
  } while (0);
22566
22567
0
fallback:
22568
0
  do {
22569
0
    wuffs_private_impl__high_prec_dec h;
22570
0
    wuffs_base__status status =
22571
0
        wuffs_private_impl__high_prec_dec__parse(&h, s, options);
22572
0
    if (status.repr) {
22573
0
      return wuffs_private_impl__parse_number_f64_special(s, options);
22574
0
    }
22575
0
    return wuffs_private_impl__high_prec_dec__to_f64(&h, options);
22576
0
  } while (0);
22577
0
}
22578
22579
// --------
22580
22581
static inline size_t  //
22582
wuffs_private_impl__render_inf(wuffs_base__slice_u8 dst,
22583
                               bool neg,
22584
0
                               uint32_t options) {
22585
0
  if (neg) {
22586
0
    if (dst.len < 4) {
22587
0
      return 0;
22588
0
    }
22589
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492D);  // '-Inf'le.
22590
0
    return 4;
22591
0
  }
22592
22593
0
  if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22594
0
    if (dst.len < 4) {
22595
0
      return 0;
22596
0
    }
22597
0
    wuffs_base__poke_u32le__no_bounds_check(dst.ptr, 0x666E492B);  // '+Inf'le.
22598
0
    return 4;
22599
0
  }
22600
22601
0
  if (dst.len < 3) {
22602
0
    return 0;
22603
0
  }
22604
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x666E49);  // 'Inf'le.
22605
0
  return 3;
22606
0
}
22607
22608
static inline size_t  //
22609
0
wuffs_private_impl__render_nan(wuffs_base__slice_u8 dst) {
22610
0
  if (dst.len < 3) {
22611
0
    return 0;
22612
0
  }
22613
0
  wuffs_base__poke_u24le__no_bounds_check(dst.ptr, 0x4E614E);  // 'NaN'le.
22614
0
  return 3;
22615
0
}
22616
22617
static size_t  //
22618
wuffs_private_impl__high_prec_dec__render_exponent_absent(
22619
    wuffs_base__slice_u8 dst,
22620
    wuffs_private_impl__high_prec_dec* h,
22621
    uint32_t precision,
22622
0
    uint32_t options) {
22623
0
  size_t n = (h->negative ||
22624
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
22625
0
                 ? 1
22626
0
                 : 0;
22627
0
  if (h->decimal_point <= 0) {
22628
0
    n += 1;
22629
0
  } else {
22630
0
    n += (size_t)(h->decimal_point);
22631
0
  }
22632
0
  if (precision > 0) {
22633
0
    n += precision + 1;  // +1 for the '.'.
22634
0
  }
22635
22636
  // Don't modify dst if the formatted number won't fit.
22637
0
  if (n > dst.len) {
22638
0
    return 0;
22639
0
  }
22640
22641
  // Align-left or align-right.
22642
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22643
0
                     ? &dst.ptr[dst.len - n]
22644
0
                     : &dst.ptr[0];
22645
22646
  // Leading "ยฑ".
22647
0
  if (h->negative) {
22648
0
    *ptr++ = '-';
22649
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22650
0
    *ptr++ = '+';
22651
0
  }
22652
22653
  // Integral digits.
22654
0
  if (h->decimal_point <= 0) {
22655
0
    *ptr++ = '0';
22656
0
  } else {
22657
0
    uint32_t m =
22658
0
        wuffs_base__u32__min(h->num_digits, (uint32_t)(h->decimal_point));
22659
0
    uint32_t i = 0;
22660
0
    for (; i < m; i++) {
22661
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22662
0
    }
22663
0
    for (; i < (uint32_t)(h->decimal_point); i++) {
22664
0
      *ptr++ = '0';
22665
0
    }
22666
0
  }
22667
22668
  // Separator and then fractional digits.
22669
0
  if (precision > 0) {
22670
0
    *ptr++ =
22671
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22672
0
            ? ','
22673
0
            : '.';
22674
0
    uint32_t i = 0;
22675
0
    for (; i < precision; i++) {
22676
0
      uint32_t j = ((uint32_t)(h->decimal_point)) + i;
22677
0
      *ptr++ = (uint8_t)('0' | ((j < h->num_digits) ? h->digits[j] : 0));
22678
0
    }
22679
0
  }
22680
22681
0
  return n;
22682
0
}
22683
22684
static size_t  //
22685
wuffs_private_impl__high_prec_dec__render_exponent_present(
22686
    wuffs_base__slice_u8 dst,
22687
    wuffs_private_impl__high_prec_dec* h,
22688
    uint32_t precision,
22689
0
    uint32_t options) {
22690
0
  int32_t exp = 0;
22691
0
  if (h->num_digits > 0) {
22692
0
    exp = h->decimal_point - 1;
22693
0
  }
22694
0
  bool negative_exp = exp < 0;
22695
0
  if (negative_exp) {
22696
0
    exp = -exp;
22697
0
  }
22698
22699
0
  size_t n = (h->negative ||
22700
0
              (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN))
22701
0
                 ? 4
22702
0
                 : 3;  // Mininum 3 bytes: first digit and then "eยฑ".
22703
0
  if (precision > 0) {
22704
0
    n += precision + 1;  // +1 for the '.'.
22705
0
  }
22706
0
  n += (exp < 100) ? 2 : 3;
22707
22708
  // Don't modify dst if the formatted number won't fit.
22709
0
  if (n > dst.len) {
22710
0
    return 0;
22711
0
  }
22712
22713
  // Align-left or align-right.
22714
0
  uint8_t* ptr = (options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
22715
0
                     ? &dst.ptr[dst.len - n]
22716
0
                     : &dst.ptr[0];
22717
22718
  // Leading "ยฑ".
22719
0
  if (h->negative) {
22720
0
    *ptr++ = '-';
22721
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
22722
0
    *ptr++ = '+';
22723
0
  }
22724
22725
  // Integral digit.
22726
0
  if (h->num_digits > 0) {
22727
0
    *ptr++ = (uint8_t)('0' | h->digits[0]);
22728
0
  } else {
22729
0
    *ptr++ = '0';
22730
0
  }
22731
22732
  // Separator and then fractional digits.
22733
0
  if (precision > 0) {
22734
0
    *ptr++ =
22735
0
        (options & WUFFS_BASE__RENDER_NUMBER_FXX__DECIMAL_SEPARATOR_IS_A_COMMA)
22736
0
            ? ','
22737
0
            : '.';
22738
0
    uint32_t i = 1;
22739
0
    uint32_t j = wuffs_base__u32__min(h->num_digits, precision + 1);
22740
0
    for (; i < j; i++) {
22741
0
      *ptr++ = (uint8_t)('0' | h->digits[i]);
22742
0
    }
22743
0
    for (; i <= precision; i++) {
22744
0
      *ptr++ = '0';
22745
0
    }
22746
0
  }
22747
22748
  // Exponent: "eยฑ" and then 2 or 3 digits.
22749
0
  *ptr++ = 'e';
22750
0
  *ptr++ = negative_exp ? '-' : '+';
22751
0
  if (exp < 10) {
22752
0
    *ptr++ = '0';
22753
0
    *ptr++ = (uint8_t)('0' | exp);
22754
0
  } else if (exp < 100) {
22755
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22756
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22757
0
  } else {
22758
0
    int32_t e = exp / 100;
22759
0
    exp -= e * 100;
22760
0
    *ptr++ = (uint8_t)('0' | e);
22761
0
    *ptr++ = (uint8_t)('0' | (exp / 10));
22762
0
    *ptr++ = (uint8_t)('0' | (exp % 10));
22763
0
  }
22764
22765
0
  return n;
22766
0
}
22767
22768
WUFFS_BASE__MAYBE_STATIC size_t  //
22769
wuffs_base__render_number_f64(wuffs_base__slice_u8 dst,
22770
                              double x,
22771
                              uint32_t precision,
22772
0
                              uint32_t options) {
22773
  // Decompose x (64 bits) into negativity (1 bit), base-2 exponent (11 bits
22774
  // with a -1023 bias) and mantissa (52 bits).
22775
0
  uint64_t bits = wuffs_base__ieee_754_bit_representation__from_f64_to_u64(x);
22776
0
  bool neg = (bits >> 63) != 0;
22777
0
  int32_t exp2 = ((int32_t)(bits >> 52)) & 0x7FF;
22778
0
  uint64_t man = bits & 0x000FFFFFFFFFFFFFul;
22779
22780
  // Apply the exponent bias and set the implicit top bit of the mantissa,
22781
  // unless x is subnormal. Also take care of Inf and NaN.
22782
0
  if (exp2 == 0x7FF) {
22783
0
    if (man != 0) {
22784
0
      return wuffs_private_impl__render_nan(dst);
22785
0
    }
22786
0
    return wuffs_private_impl__render_inf(dst, neg, options);
22787
0
  } else if (exp2 == 0) {
22788
0
    exp2 = -1022;
22789
0
  } else {
22790
0
    exp2 -= 1023;
22791
0
    man |= 0x0010000000000000ul;
22792
0
  }
22793
22794
  // Ensure that precision isn't too large.
22795
0
  if (precision > 4095) {
22796
0
    precision = 4095;
22797
0
  }
22798
22799
  // Convert from the (neg, exp2, man) tuple to an HPD.
22800
0
  wuffs_private_impl__high_prec_dec h;
22801
0
  wuffs_private_impl__high_prec_dec__assign(&h, man, neg);
22802
0
  if (h.num_digits > 0) {
22803
0
    wuffs_private_impl__high_prec_dec__lshift(&h,
22804
0
                                              exp2 - 52);  // 52 mantissa bits.
22805
0
  }
22806
22807
  // Handle the "%e" and "%f" formats.
22808
0
  switch (options & (WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT |
22809
0
                     WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT)) {
22810
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_ABSENT:  // The "%"f" format.
22811
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22812
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22813
0
        int32_t p = ((int32_t)(h.num_digits)) - h.decimal_point;
22814
0
        precision = ((uint32_t)(wuffs_base__i32__max(0, p)));
22815
0
      } else {
22816
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22817
0
            &h, ((int32_t)precision) + h.decimal_point);
22818
0
      }
22819
0
      return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22820
0
          dst, &h, precision, options);
22821
22822
0
    case WUFFS_BASE__RENDER_NUMBER_FXX__EXPONENT_PRESENT:  // The "%e" format.
22823
0
      if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22824
0
        wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22825
0
        precision = (h.num_digits > 0) ? (h.num_digits - 1) : 0;
22826
0
      } else {
22827
0
        wuffs_private_impl__high_prec_dec__round_nearest(
22828
0
            &h, ((int32_t)precision) + 1);
22829
0
      }
22830
0
      return wuffs_private_impl__high_prec_dec__render_exponent_present(
22831
0
          dst, &h, precision, options);
22832
0
  }
22833
22834
  // We have the "%g" format and so precision means the number of significant
22835
  // digits, not the number of digits after the decimal separator. Perform
22836
  // rounding and determine whether to use "%e" or "%f".
22837
0
  int32_t e_threshold = 0;
22838
0
  if (options & WUFFS_BASE__RENDER_NUMBER_FXX__JUST_ENOUGH_PRECISION) {
22839
0
    wuffs_private_impl__high_prec_dec__round_just_enough(&h, exp2, man);
22840
0
    precision = h.num_digits;
22841
0
    e_threshold = 6;
22842
0
  } else {
22843
0
    if (precision == 0) {
22844
0
      precision = 1;
22845
0
    }
22846
0
    wuffs_private_impl__high_prec_dec__round_nearest(&h, ((int32_t)precision));
22847
0
    e_threshold = ((int32_t)precision);
22848
0
    int32_t nd = ((int32_t)(h.num_digits));
22849
0
    if ((e_threshold > nd) && (nd >= h.decimal_point)) {
22850
0
      e_threshold = nd;
22851
0
    }
22852
0
  }
22853
22854
  // Use the "%e" format if the exponent is large.
22855
0
  int32_t e = h.decimal_point - 1;
22856
0
  if ((e < -4) || (e_threshold <= e)) {
22857
0
    uint32_t p = wuffs_base__u32__min(precision, h.num_digits);
22858
0
    return wuffs_private_impl__high_prec_dec__render_exponent_present(
22859
0
        dst, &h, (p > 0) ? (p - 1) : 0, options);
22860
0
  }
22861
22862
  // Use the "%f" format otherwise.
22863
0
  int32_t p = ((int32_t)precision);
22864
0
  if (p > h.decimal_point) {
22865
0
    p = ((int32_t)(h.num_digits));
22866
0
  }
22867
0
  precision = ((uint32_t)(wuffs_base__i32__max(0, p - h.decimal_point)));
22868
0
  return wuffs_private_impl__high_prec_dec__render_exponent_absent(
22869
0
      dst, &h, precision, options);
22870
0
}
22871
22872
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
22873
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
22874
        // defined(WUFFS_CONFIG__MODULE__BASE__FLOATCONV)
22875
22876
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
22877
    defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
22878
22879
// ---------------- Integer
22880
22881
// wuffs_base__parse_number__foo_digits entries are 0x00 for invalid digits,
22882
// and (0x80 | v) for valid digits, where v is the 4 bit value.
22883
22884
static const uint8_t wuffs_base__parse_number__decimal_digits[256] = {
22885
    // 0     1     2     3     4     5     6     7
22886
    // 8     9     A     B     C     D     E     F
22887
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22888
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22889
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22890
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22891
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22892
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22893
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22894
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22895
22896
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
22897
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22898
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22899
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22900
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
22901
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22902
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22903
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22904
22905
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22906
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22907
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22908
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22909
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22910
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22911
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22912
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22913
22914
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22915
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22916
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22917
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22918
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22919
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22920
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22921
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
22922
    // 0     1     2     3     4     5     6     7
22923
    // 8     9     A     B     C     D     E     F
22924
};
22925
22926
static const uint8_t wuffs_base__parse_number__hexadecimal_digits[256] = {
22927
    // 0     1     2     3     4     5     6     7
22928
    // 8     9     A     B     C     D     E     F
22929
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
22930
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
22931
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
22932
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
22933
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
22934
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
22935
    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,  // 0x30 ..= 0x37. '0'-'7'.
22936
    0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F. '8'-'9'.
22937
22938
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x40 ..= 0x47. 'A'-'F'.
22939
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
22940
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
22941
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
22942
    0x00, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x00,  // 0x60 ..= 0x67. 'a'-'f'.
22943
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
22944
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
22945
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
22946
22947
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x80 ..= 0x87.
22948
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x88 ..= 0x8F.
22949
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x90 ..= 0x97.
22950
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x98 ..= 0x9F.
22951
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA0 ..= 0xA7.
22952
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xA8 ..= 0xAF.
22953
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB0 ..= 0xB7.
22954
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xB8 ..= 0xBF.
22955
22956
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC0 ..= 0xC7.
22957
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xC8 ..= 0xCF.
22958
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD0 ..= 0xD7.
22959
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xD8 ..= 0xDF.
22960
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE0 ..= 0xE7.
22961
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xE8 ..= 0xEF.
22962
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF0 ..= 0xF7.
22963
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0xF8 ..= 0xFF.
22964
    // 0     1     2     3     4     5     6     7
22965
    // 8     9     A     B     C     D     E     F
22966
};
22967
22968
static const uint8_t wuffs_private_impl__encode_base16[16] = {
22969
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,  // 0x00 ..= 0x07.
22970
    0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,  // 0x08 ..= 0x0F.
22971
};
22972
22973
// --------
22974
22975
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_i64  //
22976
0
wuffs_base__parse_number_i64(wuffs_base__slice_u8 s, uint32_t options) {
22977
0
  uint8_t* p = s.ptr;
22978
0
  uint8_t* q = s.ptr + s.len;
22979
22980
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
22981
0
    for (; (p < q) && (*p == '_'); p++) {
22982
0
    }
22983
0
  }
22984
22985
0
  bool negative = false;
22986
0
  if (p >= q) {
22987
0
    goto fail_bad_argument;
22988
0
  } else if (*p == '-') {
22989
0
    p++;
22990
0
    negative = true;
22991
0
  } else if (*p == '+') {
22992
0
    p++;
22993
0
  }
22994
22995
0
  do {
22996
0
    wuffs_base__result_u64 r = wuffs_base__parse_number_u64(
22997
0
        wuffs_base__make_slice_u8(p, (size_t)(q - p)), options);
22998
0
    if (r.status.repr != NULL) {
22999
0
      wuffs_base__result_i64 ret;
23000
0
      ret.status.repr = r.status.repr;
23001
0
      ret.value = 0;
23002
0
      return ret;
23003
0
    } else if (negative) {
23004
0
      if (r.value < 0x8000000000000000) {
23005
0
        wuffs_base__result_i64 ret;
23006
0
        ret.status.repr = NULL;
23007
0
        ret.value = -(int64_t)(r.value);
23008
0
        return ret;
23009
0
      } else if (r.value == 0x8000000000000000) {
23010
0
        wuffs_base__result_i64 ret;
23011
0
        ret.status.repr = NULL;
23012
0
        ret.value = INT64_MIN;
23013
0
        return ret;
23014
0
      }
23015
0
      goto fail_out_of_bounds;
23016
0
    } else if (r.value > 0x7FFFFFFFFFFFFFFF) {
23017
0
      goto fail_out_of_bounds;
23018
0
    } else {
23019
0
      wuffs_base__result_i64 ret;
23020
0
      ret.status.repr = NULL;
23021
0
      ret.value = +(int64_t)(r.value);
23022
0
      return ret;
23023
0
    }
23024
0
  } while (0);
23025
23026
0
fail_bad_argument:
23027
0
  do {
23028
0
    wuffs_base__result_i64 ret;
23029
0
    ret.status.repr = wuffs_base__error__bad_argument;
23030
0
    ret.value = 0;
23031
0
    return ret;
23032
0
  } while (0);
23033
23034
0
fail_out_of_bounds:
23035
0
  do {
23036
0
    wuffs_base__result_i64 ret;
23037
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
23038
0
    ret.value = 0;
23039
0
    return ret;
23040
0
  } while (0);
23041
0
}
23042
23043
WUFFS_BASE__MAYBE_STATIC wuffs_base__result_u64  //
23044
0
wuffs_base__parse_number_u64(wuffs_base__slice_u8 s, uint32_t options) {
23045
0
  uint8_t* p = s.ptr;
23046
0
  uint8_t* q = s.ptr + s.len;
23047
23048
0
  if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23049
0
    for (; (p < q) && (*p == '_'); p++) {
23050
0
    }
23051
0
  }
23052
23053
0
  if (p >= q) {
23054
0
    goto fail_bad_argument;
23055
23056
0
  } else if (*p == '0') {
23057
0
    p++;
23058
0
    if (p >= q) {
23059
0
      goto ok_zero;
23060
0
    }
23061
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23062
0
      if (*p == '_') {
23063
0
        p++;
23064
0
        for (; p < q; p++) {
23065
0
          if (*p != '_') {
23066
0
            if (options &
23067
0
                WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
23068
0
              goto decimal;
23069
0
            }
23070
0
            goto fail_bad_argument;
23071
0
          }
23072
0
        }
23073
0
        goto ok_zero;
23074
0
      }
23075
0
    }
23076
23077
0
    if ((*p == 'x') || (*p == 'X')) {
23078
0
      p++;
23079
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23080
0
        for (; (p < q) && (*p == '_'); p++) {
23081
0
        }
23082
0
      }
23083
0
      if (p < q) {
23084
0
        goto hexadecimal;
23085
0
      }
23086
23087
0
    } else if ((*p == 'd') || (*p == 'D')) {
23088
0
      p++;
23089
0
      if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES) {
23090
0
        for (; (p < q) && (*p == '_'); p++) {
23091
0
        }
23092
0
      }
23093
0
      if (p < q) {
23094
0
        goto decimal;
23095
0
      }
23096
0
    }
23097
23098
0
    if (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_MULTIPLE_LEADING_ZEROES) {
23099
0
      goto decimal;
23100
0
    }
23101
0
    goto fail_bad_argument;
23102
0
  }
23103
23104
0
decimal:
23105
0
  do {
23106
0
    uint64_t v = wuffs_base__parse_number__decimal_digits[*p++];
23107
0
    if (v == 0) {
23108
0
      goto fail_bad_argument;
23109
0
    }
23110
0
    v &= 0x0F;
23111
23112
    // UINT64_MAX is 18446744073709551615, which is ((10 * max10) + max1).
23113
0
    const uint64_t max10 = 1844674407370955161u;
23114
0
    const uint8_t max1 = 5;
23115
23116
0
    for (; p < q; p++) {
23117
0
      if ((*p == '_') &&
23118
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
23119
0
        continue;
23120
0
      }
23121
0
      uint8_t digit = wuffs_base__parse_number__decimal_digits[*p];
23122
0
      if (digit == 0) {
23123
0
        goto fail_bad_argument;
23124
0
      }
23125
0
      digit &= 0x0F;
23126
0
      if ((v > max10) || ((v == max10) && (digit > max1))) {
23127
0
        goto fail_out_of_bounds;
23128
0
      }
23129
0
      v = (10 * v) + ((uint64_t)(digit));
23130
0
    }
23131
23132
0
    wuffs_base__result_u64 ret;
23133
0
    ret.status.repr = NULL;
23134
0
    ret.value = v;
23135
0
    return ret;
23136
0
  } while (0);
23137
23138
0
hexadecimal:
23139
0
  do {
23140
0
    uint64_t v = wuffs_base__parse_number__hexadecimal_digits[*p++];
23141
0
    if (v == 0) {
23142
0
      goto fail_bad_argument;
23143
0
    }
23144
0
    v &= 0x0F;
23145
23146
0
    for (; p < q; p++) {
23147
0
      if ((*p == '_') &&
23148
0
          (options & WUFFS_BASE__PARSE_NUMBER_XXX__ALLOW_UNDERSCORES)) {
23149
0
        continue;
23150
0
      }
23151
0
      uint8_t digit = wuffs_base__parse_number__hexadecimal_digits[*p];
23152
0
      if (digit == 0) {
23153
0
        goto fail_bad_argument;
23154
0
      }
23155
0
      digit &= 0x0F;
23156
0
      if ((v >> 60) != 0) {
23157
0
        goto fail_out_of_bounds;
23158
0
      }
23159
0
      v = (v << 4) | ((uint64_t)(digit));
23160
0
    }
23161
23162
0
    wuffs_base__result_u64 ret;
23163
0
    ret.status.repr = NULL;
23164
0
    ret.value = v;
23165
0
    return ret;
23166
0
  } while (0);
23167
23168
0
ok_zero:
23169
0
  do {
23170
0
    wuffs_base__result_u64 ret;
23171
0
    ret.status.repr = NULL;
23172
0
    ret.value = 0;
23173
0
    return ret;
23174
0
  } while (0);
23175
23176
0
fail_bad_argument:
23177
0
  do {
23178
0
    wuffs_base__result_u64 ret;
23179
0
    ret.status.repr = wuffs_base__error__bad_argument;
23180
0
    ret.value = 0;
23181
0
    return ret;
23182
0
  } while (0);
23183
23184
0
fail_out_of_bounds:
23185
0
  do {
23186
0
    wuffs_base__result_u64 ret;
23187
0
    ret.status.repr = wuffs_base__error__out_of_bounds;
23188
0
    ret.value = 0;
23189
0
    return ret;
23190
0
  } while (0);
23191
0
}
23192
23193
// --------
23194
23195
// wuffs_base__render_number__first_hundred contains the decimal encodings of
23196
// the first one hundred numbers [0 ..= 99].
23197
static const uint8_t wuffs_base__render_number__first_hundred[200] = {
23198
    '0', '0', '0', '1', '0', '2', '0', '3', '0', '4',  //
23199
    '0', '5', '0', '6', '0', '7', '0', '8', '0', '9',  //
23200
    '1', '0', '1', '1', '1', '2', '1', '3', '1', '4',  //
23201
    '1', '5', '1', '6', '1', '7', '1', '8', '1', '9',  //
23202
    '2', '0', '2', '1', '2', '2', '2', '3', '2', '4',  //
23203
    '2', '5', '2', '6', '2', '7', '2', '8', '2', '9',  //
23204
    '3', '0', '3', '1', '3', '2', '3', '3', '3', '4',  //
23205
    '3', '5', '3', '6', '3', '7', '3', '8', '3', '9',  //
23206
    '4', '0', '4', '1', '4', '2', '4', '3', '4', '4',  //
23207
    '4', '5', '4', '6', '4', '7', '4', '8', '4', '9',  //
23208
    '5', '0', '5', '1', '5', '2', '5', '3', '5', '4',  //
23209
    '5', '5', '5', '6', '5', '7', '5', '8', '5', '9',  //
23210
    '6', '0', '6', '1', '6', '2', '6', '3', '6', '4',  //
23211
    '6', '5', '6', '6', '6', '7', '6', '8', '6', '9',  //
23212
    '7', '0', '7', '1', '7', '2', '7', '3', '7', '4',  //
23213
    '7', '5', '7', '6', '7', '7', '7', '8', '7', '9',  //
23214
    '8', '0', '8', '1', '8', '2', '8', '3', '8', '4',  //
23215
    '8', '5', '8', '6', '8', '7', '8', '8', '8', '9',  //
23216
    '9', '0', '9', '1', '9', '2', '9', '3', '9', '4',  //
23217
    '9', '5', '9', '6', '9', '7', '9', '8', '9', '9',  //
23218
};
23219
23220
static size_t  //
23221
wuffs_private_impl__render_number_u64(wuffs_base__slice_u8 dst,
23222
                                      uint64_t x,
23223
                                      uint32_t options,
23224
0
                                      bool neg) {
23225
0
  uint8_t buf[WUFFS_BASE__U64__BYTE_LENGTH__MAX_INCL];
23226
0
  uint8_t* ptr = &buf[0] + sizeof(buf);
23227
23228
0
  while (x >= 100) {
23229
0
    size_t index = ((size_t)((x % 100) * 2));
23230
0
    x /= 100;
23231
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
23232
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
23233
0
    ptr -= 2;
23234
0
    ptr[0] = s0;
23235
0
    ptr[1] = s1;
23236
0
  }
23237
23238
0
  if (x < 10) {
23239
0
    ptr -= 1;
23240
0
    ptr[0] = (uint8_t)('0' + x);
23241
0
  } else {
23242
0
    size_t index = ((size_t)(x * 2));
23243
0
    uint8_t s0 = wuffs_base__render_number__first_hundred[index + 0];
23244
0
    uint8_t s1 = wuffs_base__render_number__first_hundred[index + 1];
23245
0
    ptr -= 2;
23246
0
    ptr[0] = s0;
23247
0
    ptr[1] = s1;
23248
0
  }
23249
23250
0
  if (neg) {
23251
0
    ptr -= 1;
23252
0
    ptr[0] = '-';
23253
0
  } else if (options & WUFFS_BASE__RENDER_NUMBER_XXX__LEADING_PLUS_SIGN) {
23254
0
    ptr -= 1;
23255
0
    ptr[0] = '+';
23256
0
  }
23257
23258
0
  size_t n = sizeof(buf) - ((size_t)(ptr - &buf[0]));
23259
0
  if (n > dst.len) {
23260
0
    return 0;
23261
0
  }
23262
0
  memcpy(dst.ptr + ((options & WUFFS_BASE__RENDER_NUMBER_XXX__ALIGN_RIGHT)
23263
0
                        ? (dst.len - n)
23264
0
                        : 0),
23265
0
         ptr, n);
23266
0
  return n;
23267
0
}
23268
23269
WUFFS_BASE__MAYBE_STATIC size_t  //
23270
wuffs_base__render_number_i64(wuffs_base__slice_u8 dst,
23271
                              int64_t x,
23272
0
                              uint32_t options) {
23273
0
  uint64_t u = (uint64_t)x;
23274
0
  bool neg = x < 0;
23275
0
  if (neg) {
23276
0
    u = 1 + ~u;
23277
0
  }
23278
0
  return wuffs_private_impl__render_number_u64(dst, u, options, neg);
23279
0
}
23280
23281
WUFFS_BASE__MAYBE_STATIC size_t  //
23282
wuffs_base__render_number_u64(wuffs_base__slice_u8 dst,
23283
                              uint64_t x,
23284
0
                              uint32_t options) {
23285
0
  return wuffs_private_impl__render_number_u64(dst, x, options, false);
23286
0
}
23287
23288
// ---------------- Base-16
23289
23290
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23291
wuffs_base__base_16__decode2(wuffs_base__slice_u8 dst,
23292
                             wuffs_base__slice_u8 src,
23293
                             bool src_closed,
23294
0
                             uint32_t options) {
23295
0
  wuffs_base__transform__output o;
23296
0
  size_t src_len2 = src.len / 2;
23297
0
  size_t len;
23298
0
  if (dst.len < src_len2) {
23299
0
    len = dst.len;
23300
0
    o.status.repr = wuffs_base__suspension__short_write;
23301
0
  } else {
23302
0
    len = src_len2;
23303
0
    if (!src_closed) {
23304
0
      o.status.repr = wuffs_base__suspension__short_read;
23305
0
    } else if (src.len & 1) {
23306
0
      o.status.repr = wuffs_base__error__bad_data;
23307
0
    } else {
23308
0
      o.status.repr = NULL;
23309
0
    }
23310
0
  }
23311
23312
0
  uint8_t* d = dst.ptr;
23313
0
  uint8_t* s = src.ptr;
23314
0
  size_t n = len;
23315
23316
0
  while (n--) {
23317
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[0]] << 4) |
23318
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[1]] & 0x0F));
23319
0
    d += 1;
23320
0
    s += 2;
23321
0
  }
23322
23323
0
  o.num_dst = len;
23324
0
  o.num_src = len * 2;
23325
0
  return o;
23326
0
}
23327
23328
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23329
wuffs_base__base_16__decode4(wuffs_base__slice_u8 dst,
23330
                             wuffs_base__slice_u8 src,
23331
                             bool src_closed,
23332
0
                             uint32_t options) {
23333
0
  wuffs_base__transform__output o;
23334
0
  size_t src_len4 = src.len / 4;
23335
0
  size_t len = dst.len < src_len4 ? dst.len : src_len4;
23336
0
  if (dst.len < src_len4) {
23337
0
    len = dst.len;
23338
0
    o.status.repr = wuffs_base__suspension__short_write;
23339
0
  } else {
23340
0
    len = src_len4;
23341
0
    if (!src_closed) {
23342
0
      o.status.repr = wuffs_base__suspension__short_read;
23343
0
    } else if (src.len & 1) {
23344
0
      o.status.repr = wuffs_base__error__bad_data;
23345
0
    } else {
23346
0
      o.status.repr = NULL;
23347
0
    }
23348
0
  }
23349
23350
0
  uint8_t* d = dst.ptr;
23351
0
  uint8_t* s = src.ptr;
23352
0
  size_t n = len;
23353
23354
0
  while (n--) {
23355
0
    *d = (uint8_t)((wuffs_base__parse_number__hexadecimal_digits[s[2]] << 4) |
23356
0
                   (wuffs_base__parse_number__hexadecimal_digits[s[3]] & 0x0F));
23357
0
    d += 1;
23358
0
    s += 4;
23359
0
  }
23360
23361
0
  o.num_dst = len;
23362
0
  o.num_src = len * 4;
23363
0
  return o;
23364
0
}
23365
23366
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23367
wuffs_base__base_16__encode2(wuffs_base__slice_u8 dst,
23368
                             wuffs_base__slice_u8 src,
23369
                             bool src_closed,
23370
0
                             uint32_t options) {
23371
0
  wuffs_base__transform__output o;
23372
0
  size_t dst_len2 = dst.len / 2;
23373
0
  size_t len;
23374
0
  if (dst_len2 < src.len) {
23375
0
    len = dst_len2;
23376
0
    o.status.repr = wuffs_base__suspension__short_write;
23377
0
  } else {
23378
0
    len = src.len;
23379
0
    if (!src_closed) {
23380
0
      o.status.repr = wuffs_base__suspension__short_read;
23381
0
    } else {
23382
0
      o.status.repr = NULL;
23383
0
    }
23384
0
  }
23385
23386
0
  uint8_t* d = dst.ptr;
23387
0
  uint8_t* s = src.ptr;
23388
0
  size_t n = len;
23389
23390
0
  while (n--) {
23391
0
    uint8_t c = *s;
23392
0
    d[0] = wuffs_private_impl__encode_base16[c >> 4];
23393
0
    d[1] = wuffs_private_impl__encode_base16[c & 0x0F];
23394
0
    d += 2;
23395
0
    s += 1;
23396
0
  }
23397
23398
0
  o.num_dst = len * 2;
23399
0
  o.num_src = len;
23400
0
  return o;
23401
0
}
23402
23403
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23404
wuffs_base__base_16__encode4(wuffs_base__slice_u8 dst,
23405
                             wuffs_base__slice_u8 src,
23406
                             bool src_closed,
23407
0
                             uint32_t options) {
23408
0
  wuffs_base__transform__output o;
23409
0
  size_t dst_len4 = dst.len / 4;
23410
0
  size_t len;
23411
0
  if (dst_len4 < src.len) {
23412
0
    len = dst_len4;
23413
0
    o.status.repr = wuffs_base__suspension__short_write;
23414
0
  } else {
23415
0
    len = src.len;
23416
0
    if (!src_closed) {
23417
0
      o.status.repr = wuffs_base__suspension__short_read;
23418
0
    } else {
23419
0
      o.status.repr = NULL;
23420
0
    }
23421
0
  }
23422
23423
0
  uint8_t* d = dst.ptr;
23424
0
  uint8_t* s = src.ptr;
23425
0
  size_t n = len;
23426
23427
0
  while (n--) {
23428
0
    uint8_t c = *s;
23429
0
    d[0] = '\\';
23430
0
    d[1] = 'x';
23431
0
    d[2] = wuffs_private_impl__encode_base16[c >> 4];
23432
0
    d[3] = wuffs_private_impl__encode_base16[c & 0x0F];
23433
0
    d += 4;
23434
0
    s += 1;
23435
0
  }
23436
23437
0
  o.num_dst = len * 4;
23438
0
  o.num_src = len;
23439
0
  return o;
23440
0
}
23441
23442
// ---------------- Base-64
23443
23444
// The two base-64 alphabets, std and url, differ only in the last two codes.
23445
//  - std: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
23446
//  - url: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
23447
23448
static const uint8_t wuffs_base__base_64__decode_std[256] = {
23449
    // 0     1     2     3     4     5     6     7
23450
    // 8     9     A     B     C     D     E     F
23451
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
23452
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
23453
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
23454
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
23455
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
23456
    0x80, 0x80, 0x80, 0x3E, 0x80, 0x80, 0x80, 0x3F,  // 0x28 ..= 0x2F.
23457
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
23458
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
23459
23460
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
23461
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
23462
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
23463
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x58 ..= 0x5F.
23464
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
23465
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
23466
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
23467
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
23468
23469
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
23470
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
23471
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
23472
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
23473
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
23474
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
23475
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
23476
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
23477
23478
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
23479
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
23480
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
23481
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
23482
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
23483
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
23484
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
23485
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
23486
    // 0     1     2     3     4     5     6     7
23487
    // 8     9     A     B     C     D     E     F
23488
};
23489
23490
static const uint8_t wuffs_base__base_64__decode_url[256] = {
23491
    // 0     1     2     3     4     5     6     7
23492
    // 8     9     A     B     C     D     E     F
23493
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x00 ..= 0x07.
23494
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x08 ..= 0x0F.
23495
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x10 ..= 0x17.
23496
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x18 ..= 0x1F.
23497
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x20 ..= 0x27.
23498
    0x80, 0x80, 0x80, 0x80, 0x80, 0x3E, 0x80, 0x80,  // 0x28 ..= 0x2F.
23499
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B,  // 0x30 ..= 0x37.
23500
    0x3C, 0x3D, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x38 ..= 0x3F.
23501
23502
    0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,  // 0x40 ..= 0x47.
23503
    0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E,  // 0x48 ..= 0x4F.
23504
    0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,  // 0x50 ..= 0x57.
23505
    0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x3F,  // 0x58 ..= 0x5F.
23506
    0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20,  // 0x60 ..= 0x67.
23507
    0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,  // 0x68 ..= 0x6F.
23508
    0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30,  // 0x70 ..= 0x77.
23509
    0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x78 ..= 0x7F.
23510
23511
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x80 ..= 0x87.
23512
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x88 ..= 0x8F.
23513
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x90 ..= 0x97.
23514
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0x98 ..= 0x9F.
23515
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA0 ..= 0xA7.
23516
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xA8 ..= 0xAF.
23517
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB0 ..= 0xB7.
23518
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xB8 ..= 0xBF.
23519
23520
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC0 ..= 0xC7.
23521
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xC8 ..= 0xCF.
23522
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD0 ..= 0xD7.
23523
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xD8 ..= 0xDF.
23524
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE0 ..= 0xE7.
23525
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xE8 ..= 0xEF.
23526
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
23527
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
23528
    // 0     1     2     3     4     5     6     7
23529
    // 8     9     A     B     C     D     E     F
23530
};
23531
23532
static const uint8_t wuffs_base__base_64__encode_std[64] = {
23533
    // 0     1     2     3     4     5     6     7
23534
    // 8     9     A     B     C     D     E     F
23535
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
23536
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
23537
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
23538
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
23539
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
23540
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
23541
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
23542
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2B, 0x2F,  // 0x38 ..= 0x3F.
23543
};
23544
23545
static const uint8_t wuffs_base__base_64__encode_url[64] = {
23546
    // 0     1     2     3     4     5     6     7
23547
    // 8     9     A     B     C     D     E     F
23548
    0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,  // 0x00 ..= 0x07.
23549
    0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,  // 0x08 ..= 0x0F.
23550
    0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,  // 0x10 ..= 0x17.
23551
    0x59, 0x5A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,  // 0x18 ..= 0x1F.
23552
    0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,  // 0x20 ..= 0x27.
23553
    0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76,  // 0x28 ..= 0x2F.
23554
    0x77, 0x78, 0x79, 0x7A, 0x30, 0x31, 0x32, 0x33,  // 0x30 ..= 0x37.
23555
    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2D, 0x5F,  // 0x38 ..= 0x3F.
23556
};
23557
23558
// --------
23559
23560
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23561
wuffs_base__base_64__decode(wuffs_base__slice_u8 dst,
23562
                            wuffs_base__slice_u8 src,
23563
                            bool src_closed,
23564
0
                            uint32_t options) {
23565
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
23566
0
                                ? wuffs_base__base_64__decode_url
23567
0
                                : wuffs_base__base_64__decode_std;
23568
0
  wuffs_base__transform__output o;
23569
0
  uint8_t* d_ptr = dst.ptr;
23570
0
  size_t d_len = dst.len;
23571
0
  const uint8_t* s_ptr = src.ptr;
23572
0
  size_t s_len = src.len;
23573
0
  bool pad = false;
23574
23575
0
  while (s_len >= 4) {
23576
0
    uint32_t s = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
23577
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23578
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23579
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
23580
0
    uint32_t s3 = alphabet[0xFF & (s >> 24)];
23581
23582
0
    if (((s0 | s1 | s2 | s3) & 0xC0) != 0) {
23583
0
      if (s_len > 4) {
23584
0
        o.status.repr = wuffs_base__error__bad_data;
23585
0
        goto done;
23586
0
      } else if (!src_closed) {
23587
0
        o.status.repr = wuffs_base__suspension__short_read;
23588
0
        goto done;
23589
0
      } else if ((options & WUFFS_BASE__BASE_64__DECODE_ALLOW_PADDING) &&
23590
0
                 (s_ptr[3] == '=')) {
23591
0
        pad = true;
23592
0
        if (s_ptr[2] == '=') {
23593
0
          goto src2;
23594
0
        }
23595
0
        goto src3;
23596
0
      }
23597
0
      o.status.repr = wuffs_base__error__bad_data;
23598
0
      goto done;
23599
0
    }
23600
23601
0
    if (d_len < 3) {
23602
0
      o.status.repr = wuffs_base__suspension__short_write;
23603
0
      goto done;
23604
0
    }
23605
23606
0
    s_ptr += 4;
23607
0
    s_len -= 4;
23608
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6) | (s3 << 0);
23609
0
    *d_ptr++ = (uint8_t)(s >> 16);
23610
0
    *d_ptr++ = (uint8_t)(s >> 8);
23611
0
    *d_ptr++ = (uint8_t)(s >> 0);
23612
0
    d_len -= 3;
23613
0
  }
23614
23615
0
  if (!src_closed) {
23616
0
    o.status.repr = wuffs_base__suspension__short_read;
23617
0
    goto done;
23618
0
  }
23619
23620
0
  if (s_len == 0) {
23621
0
    o.status.repr = NULL;
23622
0
    goto done;
23623
0
  } else if (s_len == 1) {
23624
0
    o.status.repr = wuffs_base__error__bad_data;
23625
0
    goto done;
23626
0
  } else if (s_len == 2) {
23627
0
    goto src2;
23628
0
  }
23629
23630
0
src3:
23631
0
  do {
23632
0
    uint32_t s = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
23633
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23634
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23635
0
    uint32_t s2 = alphabet[0xFF & (s >> 16)];
23636
0
    if ((s0 & 0xC0) || (s1 & 0xC0) || (s2 & 0xC3)) {
23637
0
      o.status.repr = wuffs_base__error__bad_data;
23638
0
      goto done;
23639
0
    }
23640
0
    if (d_len < 2) {
23641
0
      o.status.repr = wuffs_base__suspension__short_write;
23642
0
      goto done;
23643
0
    }
23644
0
    s_ptr += pad ? 4 : 3;
23645
0
    s = (s0 << 18) | (s1 << 12) | (s2 << 6);
23646
0
    *d_ptr++ = (uint8_t)(s >> 16);
23647
0
    *d_ptr++ = (uint8_t)(s >> 8);
23648
0
    o.status.repr = NULL;
23649
0
    goto done;
23650
0
  } while (0);
23651
23652
0
src2:
23653
0
  do {
23654
0
    uint32_t s = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
23655
0
    uint32_t s0 = alphabet[0xFF & (s >> 0)];
23656
0
    uint32_t s1 = alphabet[0xFF & (s >> 8)];
23657
0
    if ((s0 & 0xC0) || (s1 & 0xCF)) {
23658
0
      o.status.repr = wuffs_base__error__bad_data;
23659
0
      goto done;
23660
0
    }
23661
0
    if (d_len < 1) {
23662
0
      o.status.repr = wuffs_base__suspension__short_write;
23663
0
      goto done;
23664
0
    }
23665
0
    s_ptr += pad ? 4 : 2;
23666
0
    s = (s0 << 18) | (s1 << 12);
23667
0
    *d_ptr++ = (uint8_t)(s >> 16);
23668
0
    o.status.repr = NULL;
23669
0
    goto done;
23670
0
  } while (0);
23671
23672
0
done:
23673
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23674
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23675
0
  return o;
23676
0
}
23677
23678
WUFFS_BASE__MAYBE_STATIC wuffs_base__transform__output  //
23679
wuffs_base__base_64__encode(wuffs_base__slice_u8 dst,
23680
                            wuffs_base__slice_u8 src,
23681
                            bool src_closed,
23682
0
                            uint32_t options) {
23683
0
  const uint8_t* alphabet = (options & WUFFS_BASE__BASE_64__URL_ALPHABET)
23684
0
                                ? wuffs_base__base_64__encode_url
23685
0
                                : wuffs_base__base_64__encode_std;
23686
0
  wuffs_base__transform__output o;
23687
0
  uint8_t* d_ptr = dst.ptr;
23688
0
  size_t d_len = dst.len;
23689
0
  const uint8_t* s_ptr = src.ptr;
23690
0
  size_t s_len = src.len;
23691
23692
0
  do {
23693
0
    while (s_len >= 3) {
23694
0
      if (d_len < 4) {
23695
0
        o.status.repr = wuffs_base__suspension__short_write;
23696
0
        goto done;
23697
0
      }
23698
0
      uint32_t s = wuffs_base__peek_u24be__no_bounds_check(s_ptr);
23699
0
      s_ptr += 3;
23700
0
      s_len -= 3;
23701
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23702
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23703
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23704
0
      *d_ptr++ = alphabet[0x3F & (s >> 0)];
23705
0
      d_len -= 4;
23706
0
    }
23707
23708
0
    if (!src_closed) {
23709
0
      o.status.repr = wuffs_base__suspension__short_read;
23710
0
      goto done;
23711
0
    }
23712
23713
0
    if (s_len == 2) {
23714
0
      if (d_len <
23715
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 3)) {
23716
0
        o.status.repr = wuffs_base__suspension__short_write;
23717
0
        goto done;
23718
0
      }
23719
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(s_ptr)))
23720
0
                   << 8;
23721
0
      s_ptr += 2;
23722
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23723
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23724
0
      *d_ptr++ = alphabet[0x3F & (s >> 6)];
23725
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23726
0
        *d_ptr++ = '=';
23727
0
      }
23728
0
      o.status.repr = NULL;
23729
0
      goto done;
23730
23731
0
    } else if (s_len == 1) {
23732
0
      if (d_len <
23733
0
          ((options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) ? 4 : 2)) {
23734
0
        o.status.repr = wuffs_base__suspension__short_write;
23735
0
        goto done;
23736
0
      }
23737
0
      uint32_t s = ((uint32_t)(wuffs_base__peek_u8__no_bounds_check(s_ptr)))
23738
0
                   << 16;
23739
0
      s_ptr += 1;
23740
0
      *d_ptr++ = alphabet[0x3F & (s >> 18)];
23741
0
      *d_ptr++ = alphabet[0x3F & (s >> 12)];
23742
0
      if (options & WUFFS_BASE__BASE_64__ENCODE_EMIT_PADDING) {
23743
0
        *d_ptr++ = '=';
23744
0
        *d_ptr++ = '=';
23745
0
      }
23746
0
      o.status.repr = NULL;
23747
0
      goto done;
23748
23749
0
    } else {
23750
0
      o.status.repr = NULL;
23751
0
      goto done;
23752
0
    }
23753
0
  } while (0);
23754
23755
0
done:
23756
0
  o.num_dst = (size_t)(d_ptr - dst.ptr);
23757
0
  o.num_src = (size_t)(s_ptr - src.ptr);
23758
0
  return o;
23759
0
}
23760
23761
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
23762
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
23763
        // defined(WUFFS_CONFIG__MODULE__BASE__INTCONV)
23764
23765
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
23766
    defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
23767
23768
// ---------------- Magic Numbers
23769
23770
// ICO doesn't start with a magic identifier. Instead, see if the opening bytes
23771
// are plausibly ICO.
23772
//
23773
// Callers should have already verified that (prefix_data.len >= 2) and the
23774
// first two bytes are 0x00.
23775
//
23776
// See:
23777
//  - https://docs.fileformat.com/image/ico/
23778
static int32_t  //
23779
wuffs_base__magic_number_guess_fourcc__maybe_ico(
23780
    wuffs_base__slice_u8 prefix_data,
23781
0
    bool prefix_closed) {
23782
  // Allow-list for the Image Type field.
23783
0
  if (prefix_data.len < 4) {
23784
0
    return prefix_closed ? 0 : -1;
23785
0
  } else if (prefix_data.ptr[3] != 0) {
23786
0
    return 0;
23787
0
  }
23788
0
  switch (prefix_data.ptr[2]) {
23789
0
    case 0x01:  // ICO
23790
0
    case 0x02:  // CUR
23791
0
      break;
23792
0
    default:
23793
0
      return 0;
23794
0
  }
23795
23796
  // The Number Of Images should be positive.
23797
0
  if (prefix_data.len < 6) {
23798
0
    return prefix_closed ? 0 : -1;
23799
0
  } else if ((prefix_data.ptr[4] == 0) && (prefix_data.ptr[5] == 0)) {
23800
0
    return 0;
23801
0
  }
23802
23803
  // The first ICONDIRENTRY's fourth byte should be zero.
23804
0
  if (prefix_data.len < 10) {
23805
0
    return prefix_closed ? 0 : -1;
23806
0
  } else if (prefix_data.ptr[9] != 0) {
23807
0
    return 0;
23808
0
  }
23809
23810
  // TODO: have a separate FourCC for CUR?
23811
0
  return 0x49434F20;  // 'ICO 'be
23812
0
}
23813
23814
// TGA doesn't start with a magic identifier. Instead, see if the opening bytes
23815
// are plausibly TGA.
23816
//
23817
// Callers should have already verified that (prefix_data.len >= 2) and the
23818
// second byte (prefix_data.ptr[1], the Color Map Type byte), is either 0x00 or
23819
// 0x01.
23820
//
23821
// See:
23822
//  - https://docs.fileformat.com/image/tga/
23823
//  - https://www.dca.fee.unicamp.br/~martino/disciplinas/ea978/tgaffs.pdf
23824
static int32_t  //
23825
wuffs_base__magic_number_guess_fourcc__maybe_tga(
23826
    wuffs_base__slice_u8 prefix_data,
23827
0
    bool prefix_closed) {
23828
  // Allow-list for the Image Type field.
23829
0
  if (prefix_data.len < 3) {
23830
0
    return prefix_closed ? 0 : -1;
23831
0
  }
23832
0
  switch (prefix_data.ptr[2]) {
23833
0
    case 0x01:
23834
0
    case 0x02:
23835
0
    case 0x03:
23836
0
    case 0x09:
23837
0
    case 0x0A:
23838
0
    case 0x0B:
23839
0
      break;
23840
0
    default:
23841
      // TODO: 0x20 and 0x21 are invalid, according to the spec, but are
23842
      // apparently unofficial extensions.
23843
0
      return 0;
23844
0
  }
23845
23846
  // Allow-list for the Color Map Entry Size field (if the Color Map Type field
23847
  // is non-zero) or else all the Color Map fields should be zero.
23848
0
  if (prefix_data.len < 8) {
23849
0
    return prefix_closed ? 0 : -1;
23850
0
  } else if (prefix_data.ptr[1] != 0x00) {
23851
0
    switch (prefix_data.ptr[7]) {
23852
0
      case 0x0F:
23853
0
      case 0x10:
23854
0
      case 0x18:
23855
0
      case 0x20:
23856
0
        break;
23857
0
      default:
23858
0
        return 0;
23859
0
    }
23860
0
  } else if ((prefix_data.ptr[3] | prefix_data.ptr[4] | prefix_data.ptr[5] |
23861
0
              prefix_data.ptr[6] | prefix_data.ptr[7]) != 0x00) {
23862
0
    return 0;
23863
0
  }
23864
23865
  // Allow-list for the Pixel Depth field.
23866
0
  if (prefix_data.len < 17) {
23867
0
    return prefix_closed ? 0 : -1;
23868
0
  }
23869
0
  switch (prefix_data.ptr[16]) {
23870
0
    case 0x01:
23871
0
    case 0x08:
23872
0
    case 0x0F:
23873
0
    case 0x10:
23874
0
    case 0x18:
23875
0
    case 0x20:
23876
0
      break;
23877
0
    default:
23878
0
      return 0;
23879
0
  }
23880
23881
0
  return 0x54474120;  // 'TGA 'be
23882
0
}
23883
23884
WUFFS_BASE__MAYBE_STATIC int32_t  //
23885
wuffs_base__magic_number_guess_fourcc(wuffs_base__slice_u8 prefix_data,
23886
0
                                      bool prefix_closed) {
23887
  // This is similar to (but different from):
23888
  //  - the magic/Magdir tables under https://github.com/file/file
23889
  //  - the MIME Sniffing algorithm at https://mimesniff.spec.whatwg.org/
23890
23891
  // table holds the 'magic numbers' (which are actually variable length
23892
  // strings). The strings may contain NUL bytes, so the "const char* magic"
23893
  // value starts with the length-minus-1 of the 'magic number'.
23894
  //
23895
  // Keep it sorted by magic[1], then magic[0] descending (prioritizing longer
23896
  // matches) and finally by magic[2:]. When multiple entries match, the
23897
  // longest one wins.
23898
  //
23899
  // The fourcc field might be negated, in which case there's further
23900
  // specialization (see ยง below).
23901
0
  static struct {
23902
0
    int32_t fourcc;
23903
0
    const char* magic;
23904
0
  } table[] = {
23905
0
      {-0x30302020, "\x01\x00\x00"},                  // '00  'be
23906
0
      {+0x41425852, "\x03\x03\x00\x08\x00"},          // ABXR
23907
0
      {+0x475A2020, "\x02\x1F\x8B\x08"},              // GZ
23908
0
      {+0x5A535444, "\x03\x28\xB5\x2F\xFD"},          // ZSTD
23909
0
      {+0x584D4C20, "\x05\x3C\x3F\x78\x6D\x6C\x20"},  // XML
23910
0
      {+0x41425853, "\x03\x41\x42\x58\x00"},          // ABXS
23911
0
      {+0x425A3220, "\x02\x42\x5A\x68"},              // BZ2
23912
0
      {+0x424D5020, "\x01\x42\x4D"},                  // BMP
23913
0
      {+0x47494620, "\x03\x47\x49\x46\x38"},          // GIF
23914
0
      {+0x54494646, "\x03\x49\x49\x2A\x00"},          // TIFF (little-endian)
23915
0
      {+0x4C5A4950, "\x04\x4C\x5A\x49\x50\x01"},      // LZIP
23916
0
      {+0x54494646, "\x03\x4D\x4D\x00\x2A"},          // TIFF (big-endian)
23917
0
      {+0x45544332, "\x03\x50\x4B\x4D\x20"},          // ETC2 (*.pkm)
23918
0
      {+0x4E50424D, "\x02\x50\x35\x09"},              // NPBM (P5; *.pgm)
23919
0
      {+0x4E50424D, "\x02\x50\x35\x0A"},              // NPBM (P5; *.pgm)
23920
0
      {+0x4E50424D, "\x02\x50\x35\x0D"},              // NPBM (P5; *.pgm)
23921
0
      {+0x4E50424D, "\x02\x50\x35\x20"},              // NPBM (P5; *.pgm)
23922
0
      {+0x4E50424D, "\x02\x50\x36\x09"},              // NPBM (P6; *.ppm)
23923
0
      {+0x4E50424D, "\x02\x50\x36\x0A"},              // NPBM (P6; *.ppm)
23924
0
      {+0x4E50424D, "\x02\x50\x36\x0D"},              // NPBM (P6; *.ppm)
23925
0
      {+0x4E50424D, "\x02\x50\x36\x20"},              // NPBM (P6; *.ppm)
23926
0
      {-0x52494646, "\x03\x52\x49\x46\x46"},          // RIFF
23927
0
      {+0x4C5A4D41, "\x04\x5D\x00\x10\x00\x00"},      // LZMA
23928
0
      {+0x4C5A4D41, "\x02\x5D\x00\x00"},              // LZMA
23929
0
      {+0x4E494520, "\x02\x6E\xC3\xAF"},              // NIE
23930
0
      {+0x514F4920, "\x03\x71\x6F\x69\x66"},          // QOI
23931
0
      {+0x5A4C4942, "\x01\x78\x9C"},                  // ZLIB
23932
0
      {+0x504E4720, "\x03\x89\x50\x4E\x47"},          // PNG
23933
0
      {+0x54482020, "\x02\xC3\xBE\xFE"},              // TH
23934
0
      {+0x585A2020, "\x04\xFD\x37\x7A\x58\x5A"},      // XZ
23935
0
      {+0x484E534D, "\x01\xFE\xD7"},                  // HANDSUM
23936
0
      {+0x4A504547, "\x01\xFF\xD8"},                  // JPEG
23937
0
  };
23938
0
  static const size_t table_len = sizeof(table) / sizeof(table[0]);
23939
23940
0
  if (prefix_data.len == 0) {
23941
0
    return prefix_closed ? 0 : -1;
23942
0
  }
23943
0
  uint8_t pre_first_byte = prefix_data.ptr[0];
23944
23945
0
  int32_t fourcc = 0;
23946
0
  size_t i;
23947
0
  for (i = 0; i < table_len; i++) {
23948
0
    uint8_t mag_first_byte = ((uint8_t)(table[i].magic[1]));
23949
0
    if (pre_first_byte < mag_first_byte) {
23950
0
      break;
23951
0
    } else if (pre_first_byte > mag_first_byte) {
23952
0
      continue;
23953
0
    }
23954
0
    fourcc = table[i].fourcc;
23955
23956
0
    uint8_t mag_remaining_len = ((uint8_t)(table[i].magic[0]));
23957
0
    if (mag_remaining_len == 0) {
23958
0
      goto match;
23959
0
    }
23960
23961
0
    const char* mag_remaining_ptr = table[i].magic + 2;
23962
0
    uint8_t* pre_remaining_ptr = prefix_data.ptr + 1;
23963
0
    size_t pre_remaining_len = prefix_data.len - 1;
23964
0
    if (pre_remaining_len < mag_remaining_len) {
23965
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, pre_remaining_len)) {
23966
0
        return prefix_closed ? 0 : -1;
23967
0
      }
23968
0
    } else {
23969
0
      if (!memcmp(pre_remaining_ptr, mag_remaining_ptr, mag_remaining_len)) {
23970
0
        goto match;
23971
0
      }
23972
0
    }
23973
0
  }
23974
23975
0
  if (prefix_data.len < 2) {
23976
0
    return prefix_closed ? 0 : -1;
23977
0
  } else if ((prefix_data.ptr[1] == 0x00) || (prefix_data.ptr[1] == 0x01)) {
23978
0
    return wuffs_base__magic_number_guess_fourcc__maybe_tga(prefix_data,
23979
0
                                                            prefix_closed);
23980
0
  }
23981
23982
0
  return 0;
23983
23984
0
match:
23985
  // Negative FourCC values (see ยง above) are further specialized.
23986
0
  if (fourcc < 0) {
23987
0
    fourcc = -fourcc;
23988
23989
0
    if (fourcc == 0x52494646) {  // 'RIFF'be
23990
0
      if (prefix_data.len < 12) {
23991
0
        return prefix_closed ? 0 : -1;
23992
0
      }
23993
0
      uint32_t x = wuffs_base__peek_u32be__no_bounds_check(prefix_data.ptr + 8);
23994
0
      if (x == 0x57454250) {  // 'WEBP'be
23995
0
        return 0x57454250;    // 'WEBP'be
23996
0
      }
23997
23998
0
    } else if (fourcc == 0x30302020) {  // '00  'be
23999
      // Binary data starting with multiple 0x00 NUL bytes is quite common.
24000
      // Unfortunately, some file formats also don't start with a magic
24001
      // identifier, so we have to use heuristics (where the order matters, the
24002
      // same as /usr/bin/file's magic/Magdir tables) as best we can. Maybe
24003
      // it's TGA, ICO/CUR, etc. Maybe it's something else.
24004
0
      int32_t tga = wuffs_base__magic_number_guess_fourcc__maybe_tga(
24005
0
          prefix_data, prefix_closed);
24006
0
      if (tga != 0) {
24007
0
        return tga;
24008
0
      }
24009
0
      int32_t ico = wuffs_base__magic_number_guess_fourcc__maybe_ico(
24010
0
          prefix_data, prefix_closed);
24011
0
      if (ico != 0) {
24012
0
        return ico;
24013
0
      }
24014
0
      if (prefix_data.len < 4) {
24015
0
        return prefix_closed ? 0 : -1;
24016
0
      } else if ((prefix_data.ptr[2] != 0x00) &&
24017
0
                 ((prefix_data.ptr[2] >= 0x80) ||
24018
0
                  (prefix_data.ptr[3] != 0x00))) {
24019
        // Roughly speaking, this could be a non-degenerate (non-0-width and
24020
        // non-0-height) WBMP image.
24021
0
        return 0x57424D50;  // 'WBMP'be
24022
0
      }
24023
0
      return 0;
24024
0
    }
24025
0
  }
24026
0
  return fourcc;
24027
0
}
24028
24029
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
24030
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
24031
        // defined(WUFFS_CONFIG__MODULE__BASE__MAGIC)
24032
24033
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
24034
    defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
24035
24036
// ---------------- Pixel Swizzler
24037
24038
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24039
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24040
static uint64_t  //
24041
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
24042
                                                 size_t dst_len,
24043
                                                 uint8_t* dst_palette_ptr,
24044
                                                 size_t dst_palette_len,
24045
                                                 const uint8_t* src_ptr,
24046
                                                 size_t src_len);
24047
24048
static uint64_t  //
24049
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
24050
                                                 size_t dst_len,
24051
                                                 uint8_t* dst_palette_ptr,
24052
                                                 size_t dst_palette_len,
24053
                                                 const uint8_t* src_ptr,
24054
                                                 size_t src_len);
24055
24056
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24057
static uint64_t  //
24058
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
24059
                                                      size_t dst_len,
24060
                                                      uint8_t* dst_palette_ptr,
24061
                                                      size_t dst_palette_len,
24062
                                                      const uint8_t* src_ptr,
24063
                                                      size_t src_len);
24064
24065
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
24066
static uint64_t  //
24067
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
24068
                                               size_t dst_len,
24069
                                               uint8_t* dst_palette_ptr,
24070
                                               size_t dst_palette_len,
24071
                                               const uint8_t* src_ptr,
24072
                                               size_t src_len);
24073
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
24074
24075
// --------
24076
24077
static inline uint32_t  //
24078
108M
wuffs_private_impl__swap_u32_argb_abgr(uint32_t u) {
24079
108M
  uint32_t o = u & 0xFF00FF00ul;
24080
108M
  uint32_t r = u & 0x00FF0000ul;
24081
108M
  uint32_t b = u & 0x000000FFul;
24082
108M
  return o | (r >> 16) | (b << 16);
24083
108M
}
24084
24085
static inline uint64_t  //
24086
0
wuffs_private_impl__swap_u64_argb_abgr(uint64_t u) {
24087
0
  uint64_t o = u & 0xFFFF0000FFFF0000ull;
24088
0
  uint64_t r = u & 0x0000FFFF00000000ull;
24089
0
  uint64_t b = u & 0x000000000000FFFFull;
24090
0
  return o | (r >> 32) | (b << 32);
24091
0
}
24092
24093
static inline uint32_t  //
24094
0
wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(uint64_t c) {
24095
0
  uint32_t a = ((uint32_t)(0xFF & (c >> 56)));
24096
0
  uint32_t r = ((uint32_t)(0xFF & (c >> 40)));
24097
0
  uint32_t g = ((uint32_t)(0xFF & (c >> 24)));
24098
0
  uint32_t b = ((uint32_t)(0xFF & (c >> 8)));
24099
0
  return (a << 24) | (b << 16) | (g << 8) | (r << 0);
24100
0
}
24101
24102
// --------
24103
24104
WUFFS_BASE__MAYBE_STATIC wuffs_base__color_u32_argb_premul  //
24105
wuffs_base__pixel_buffer__color_u32_at(const wuffs_base__pixel_buffer* pb,
24106
                                       uint32_t x,
24107
0
                                       uint32_t y) {
24108
0
  if (!pb || (x >= pb->pixcfg.private_impl.width) ||
24109
0
      (y >= pb->pixcfg.private_impl.height)) {
24110
0
    return 0;
24111
0
  }
24112
24113
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24114
    // TODO: support planar formats.
24115
0
    return 0;
24116
0
  }
24117
24118
0
  size_t stride = pb->private_impl.planes[0].stride;
24119
0
  const uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
24120
24121
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24122
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24123
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24124
0
      return wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
24125
24126
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24127
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
24128
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
24129
0
      return wuffs_base__peek_u32le__no_bounds_check(palette +
24130
0
                                                     (4 * ((size_t)row[x])));
24131
0
    }
24132
24133
      // Common formats above. Rarer formats below.
24134
24135
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
24136
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[x])));
24137
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
24138
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 1])));
24139
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
24140
0
      return 0xFF000000 | (0x00010101 * ((uint32_t)(row[(2 * x) + 0])));
24141
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
24142
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24143
0
          (((uint32_t)(row[(2 * x) + 1])) << 24) |
24144
0
          (((uint32_t)(row[(2 * x) + 0])) * 0x00010101));
24145
24146
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
24147
0
      uint8_t* palette = pb->private_impl.planes[3].ptr;
24148
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24149
0
          wuffs_base__peek_u32le__no_bounds_check(palette +
24150
0
                                                  (4 * ((size_t)row[x]))));
24151
0
    }
24152
24153
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24154
0
      return wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
24155
0
          wuffs_base__peek_u16le__no_bounds_check(row + (2 * ((size_t)x))));
24156
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24157
0
      return 0xFF000000 |
24158
0
             wuffs_base__peek_u24le__no_bounds_check(row + (3 * ((size_t)x)));
24159
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24160
0
      return wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24161
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24162
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24163
0
      return wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
24164
0
          wuffs_base__peek_u64le__no_bounds_check(row + (8 * ((size_t)x))));
24165
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24166
0
      return 0xFF000000 |
24167
0
             wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x)));
24168
24169
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
24170
0
      return 0xFF000000 |
24171
0
             wuffs_base__peek_u24be__no_bounds_check(row + (3 * ((size_t)x)));
24172
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24173
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24174
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
24175
0
              wuffs_base__peek_u32le__no_bounds_check(row +
24176
0
                                                      (4 * ((size_t)x)))));
24177
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24178
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
24179
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24180
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24181
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24182
0
      return wuffs_private_impl__swap_u32_argb_abgr(
24183
0
          0xFF000000 |
24184
0
          wuffs_base__peek_u32le__no_bounds_check(row + (4 * ((size_t)x))));
24185
24186
0
    default:
24187
      // TODO: support more formats.
24188
0
      break;
24189
0
  }
24190
24191
0
  return 0;
24192
0
}
24193
24194
// --------
24195
24196
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
24197
wuffs_base__pixel_buffer__set_color_u32_at(
24198
    wuffs_base__pixel_buffer* pb,
24199
    uint32_t x,
24200
    uint32_t y,
24201
0
    wuffs_base__color_u32_argb_premul color) {
24202
0
  if (!pb) {
24203
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
24204
0
  }
24205
0
  if ((x >= pb->pixcfg.private_impl.width) ||
24206
0
      (y >= pb->pixcfg.private_impl.height)) {
24207
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
24208
0
  }
24209
24210
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24211
    // TODO: support planar formats.
24212
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24213
0
  }
24214
24215
0
  size_t stride = pb->private_impl.planes[0].stride;
24216
0
  uint8_t* row = pb->private_impl.planes[0].ptr + (stride * ((size_t)y));
24217
24218
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24219
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24220
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24221
0
      wuffs_base__poke_u32le__no_bounds_check(row + (4 * ((size_t)x)), color);
24222
0
      break;
24223
24224
      // Common formats above. Rarer formats below.
24225
24226
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
24227
0
      wuffs_base__poke_u8__no_bounds_check(
24228
0
          row + ((size_t)x),
24229
0
          wuffs_base__color_u32_argb_premul__as__color_u8_gray(color));
24230
0
      break;
24231
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
24232
0
      wuffs_base__poke_u16le__no_bounds_check(
24233
0
          row + (2 * ((size_t)x)),
24234
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
24235
0
      break;
24236
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
24237
0
      wuffs_base__poke_u16be__no_bounds_check(
24238
0
          row + (2 * ((size_t)x)),
24239
0
          wuffs_base__color_u32_argb_premul__as__color_u16_gray(color));
24240
0
      break;
24241
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
24242
0
      wuffs_base__poke_u16le__no_bounds_check(
24243
0
          row + (2 * ((size_t)x)),
24244
0
          wuffs_base__color_u32_argb_premul__as__color_u16_alpha_gray_nonpremul(
24245
0
              color));
24246
0
      break;
24247
24248
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
24249
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24250
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
24251
0
      wuffs_base__poke_u8__no_bounds_check(
24252
0
          row + ((size_t)x), wuffs_base__pixel_palette__closest_element(
24253
0
                                 wuffs_base__pixel_buffer__palette(pb),
24254
0
                                 pb->pixcfg.private_impl.pixfmt, color));
24255
0
      break;
24256
24257
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24258
0
      wuffs_base__poke_u16le__no_bounds_check(
24259
0
          row + (2 * ((size_t)x)),
24260
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
24261
0
      break;
24262
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24263
0
      wuffs_base__poke_u24le__no_bounds_check(row + (3 * ((size_t)x)), color);
24264
0
      break;
24265
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24266
0
      wuffs_base__poke_u32le__no_bounds_check(
24267
0
          row + (4 * ((size_t)x)),
24268
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24269
0
              color));
24270
0
      break;
24271
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24272
0
      wuffs_base__poke_u64le__no_bounds_check(
24273
0
          row + (8 * ((size_t)x)),
24274
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
24275
0
              color));
24276
0
      break;
24277
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24278
0
      wuffs_base__poke_u32le__no_bounds_check(
24279
0
          row + (4 * ((size_t)x)), (color >> 31) ? (color | 0xFF000000) : 0);
24280
0
      break;
24281
24282
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
24283
0
      wuffs_base__poke_u24le__no_bounds_check(
24284
0
          row + (3 * ((size_t)x)),
24285
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
24286
0
      break;
24287
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24288
0
      wuffs_base__poke_u32le__no_bounds_check(
24289
0
          row + (4 * ((size_t)x)),
24290
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24291
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
24292
0
      break;
24293
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24294
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24295
0
      wuffs_base__poke_u32le__no_bounds_check(
24296
0
          row + (4 * ((size_t)x)),
24297
0
          wuffs_private_impl__swap_u32_argb_abgr(color));
24298
0
      break;
24299
24300
0
    default:
24301
      // TODO: support more formats.
24302
0
      return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24303
0
  }
24304
24305
0
  return wuffs_base__make_status(NULL);
24306
0
}
24307
24308
// --------
24309
24310
static inline void  //
24311
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
24312
    wuffs_base__pixel_buffer* pb,
24313
    wuffs_base__rect_ie_u32 rect,
24314
0
    uint16_t color) {
24315
0
  size_t stride = pb->private_impl.planes[0].stride;
24316
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24317
0
  if ((stride == (2 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24318
0
    uint8_t* ptr =
24319
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24320
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24321
0
    size_t n;
24322
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24323
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
24324
0
      ptr += 2;
24325
0
    }
24326
0
    return;
24327
0
  }
24328
24329
0
  uint32_t y;
24330
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24331
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24332
0
                   (2 * ((size_t)rect.min_incl_x));
24333
0
    uint32_t n;
24334
0
    for (n = width; n > 0; n--) {
24335
0
      wuffs_base__poke_u16le__no_bounds_check(ptr, color);
24336
0
      ptr += 2;
24337
0
    }
24338
0
  }
24339
0
}
24340
24341
static inline void  //
24342
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(
24343
    wuffs_base__pixel_buffer* pb,
24344
    wuffs_base__rect_ie_u32 rect,
24345
0
    uint32_t color) {
24346
0
  size_t stride = pb->private_impl.planes[0].stride;
24347
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24348
0
  if ((stride == (3 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24349
0
    uint8_t* ptr =
24350
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24351
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24352
0
    size_t n;
24353
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24354
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
24355
0
      ptr += 3;
24356
0
    }
24357
0
    return;
24358
0
  }
24359
24360
0
  uint32_t y;
24361
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24362
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24363
0
                   (3 * ((size_t)rect.min_incl_x));
24364
0
    uint32_t n;
24365
0
    for (n = width; n > 0; n--) {
24366
0
      wuffs_base__poke_u24le__no_bounds_check(ptr, color);
24367
0
      ptr += 3;
24368
0
    }
24369
0
  }
24370
0
}
24371
24372
static inline void  //
24373
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24374
    wuffs_base__pixel_buffer* pb,
24375
    wuffs_base__rect_ie_u32 rect,
24376
0
    uint32_t color) {
24377
0
  size_t stride = pb->private_impl.planes[0].stride;
24378
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24379
0
  if ((stride == (4 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24380
0
    uint8_t* ptr =
24381
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24382
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24383
0
    size_t n;
24384
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24385
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
24386
0
      ptr += 4;
24387
0
    }
24388
0
    return;
24389
0
  }
24390
24391
0
  uint32_t y;
24392
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24393
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24394
0
                   (4 * ((size_t)rect.min_incl_x));
24395
0
    uint32_t n;
24396
0
    for (n = width; n > 0; n--) {
24397
0
      wuffs_base__poke_u32le__no_bounds_check(ptr, color);
24398
0
      ptr += 4;
24399
0
    }
24400
0
  }
24401
0
}
24402
24403
static inline void  //
24404
wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
24405
    wuffs_base__pixel_buffer* pb,
24406
    wuffs_base__rect_ie_u32 rect,
24407
0
    uint64_t color) {
24408
0
  size_t stride = pb->private_impl.planes[0].stride;
24409
0
  uint32_t width = wuffs_base__rect_ie_u32__width(&rect);
24410
0
  if ((stride == (8 * ((uint64_t)width))) && (rect.min_incl_x == 0)) {
24411
0
    uint8_t* ptr =
24412
0
        pb->private_impl.planes[0].ptr + (stride * ((size_t)rect.min_incl_y));
24413
0
    uint32_t height = wuffs_base__rect_ie_u32__height(&rect);
24414
0
    size_t n;
24415
0
    for (n = ((size_t)width) * ((size_t)height); n > 0; n--) {
24416
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
24417
0
      ptr += 8;
24418
0
    }
24419
0
    return;
24420
0
  }
24421
24422
0
  uint32_t y;
24423
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24424
0
    uint8_t* ptr = pb->private_impl.planes[0].ptr + (stride * ((size_t)y)) +
24425
0
                   (8 * ((size_t)rect.min_incl_x));
24426
0
    uint32_t n;
24427
0
    for (n = width; n > 0; n--) {
24428
0
      wuffs_base__poke_u64le__no_bounds_check(ptr, color);
24429
0
      ptr += 8;
24430
0
    }
24431
0
  }
24432
0
}
24433
24434
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
24435
wuffs_base__pixel_buffer__set_color_u32_fill_rect(
24436
    wuffs_base__pixel_buffer* pb,
24437
    wuffs_base__rect_ie_u32 rect,
24438
0
    wuffs_base__color_u32_argb_premul color) {
24439
0
  if (!pb) {
24440
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
24441
0
  } else if (wuffs_base__rect_ie_u32__is_empty(&rect)) {
24442
0
    return wuffs_base__make_status(NULL);
24443
0
  }
24444
0
  wuffs_base__rect_ie_u32 bounds =
24445
0
      wuffs_base__pixel_config__bounds(&pb->pixcfg);
24446
0
  if (!wuffs_base__rect_ie_u32__contains_rect(&bounds, rect)) {
24447
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
24448
0
  }
24449
24450
0
  if (wuffs_base__pixel_format__is_planar(&pb->pixcfg.private_impl.pixfmt)) {
24451
    // TODO: support planar formats.
24452
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
24453
0
  }
24454
24455
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24456
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24457
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
24458
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(pb, rect,
24459
0
                                                                      color);
24460
0
      return wuffs_base__make_status(NULL);
24461
24462
      // Common formats above. Rarer formats below.
24463
24464
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
24465
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xx(
24466
0
          pb, rect,
24467
0
          wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(color));
24468
0
      return wuffs_base__make_status(NULL);
24469
24470
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
24471
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxx(pb, rect,
24472
0
                                                                     color);
24473
0
      return wuffs_base__make_status(NULL);
24474
24475
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24476
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24477
0
          pb, rect,
24478
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24479
0
              color));
24480
0
      return wuffs_base__make_status(NULL);
24481
24482
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
24483
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxxxxxx(
24484
0
          pb, rect,
24485
0
          wuffs_base__color_u32_argb_premul__as__color_u64_argb_nonpremul(
24486
0
              color));
24487
0
      return wuffs_base__make_status(NULL);
24488
24489
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24490
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24491
0
          pb, rect,
24492
0
          wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
24493
0
              wuffs_private_impl__swap_u32_argb_abgr(color)));
24494
0
      return wuffs_base__make_status(NULL);
24495
24496
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24497
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
24498
0
      wuffs_private_impl__pixel_buffer__set_color_u32_fill_rect__xxxx(
24499
0
          pb, rect, wuffs_private_impl__swap_u32_argb_abgr(color));
24500
0
      return wuffs_base__make_status(NULL);
24501
0
  }
24502
24503
0
  uint32_t y;
24504
0
  for (y = rect.min_incl_y; y < rect.max_excl_y; y++) {
24505
0
    uint32_t x;
24506
0
    for (x = rect.min_incl_x; x < rect.max_excl_x; x++) {
24507
0
      wuffs_base__pixel_buffer__set_color_u32_at(pb, x, y, color);
24508
0
    }
24509
0
  }
24510
0
  return wuffs_base__make_status(NULL);
24511
0
}
24512
24513
WUFFS_BASE__MAYBE_STATIC bool  //
24514
0
wuffs_base__pixel_buffer__is_opaque(const wuffs_base__pixel_buffer* pb) {
24515
0
  if (!pb) {
24516
0
    return false;
24517
0
  } else if (wuffs_base__pixel_format__transparency(
24518
0
                 &pb->pixcfg.private_impl.pixfmt) ==
24519
0
             WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE) {
24520
0
    return true;
24521
0
  }
24522
24523
0
  uint32_t w = pb->pixcfg.private_impl.width;
24524
0
  uint32_t h = pb->pixcfg.private_impl.height;
24525
0
  if ((w <= 0) || (h <= 0)) {
24526
0
    return true;
24527
0
  }
24528
0
  const wuffs_base__table_u8* p = &pb->private_impl.planes[0];
24529
24530
0
  switch (pb->pixcfg.private_impl.pixfmt.repr) {
24531
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
24532
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
24533
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
24534
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
24535
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
24536
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY: {
24537
0
      for (uint32_t y = 0; y < h; y++) {
24538
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24539
0
        for (uint32_t x = 0; x < w; x++) {
24540
0
          if (row[(4 * (size_t)x) + 3] != 0xFF) {
24541
0
            return false;
24542
0
          }
24543
0
        }
24544
0
      }
24545
0
      return true;
24546
0
    }
24547
24548
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE: {
24549
0
      for (uint32_t y = 0; y < h; y++) {
24550
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24551
0
        for (uint32_t x = 0; x < w; x++) {
24552
0
          if ((row[(8 * (size_t)x) + 6] != 0xFF) ||
24553
0
              (row[(8 * (size_t)x) + 7] != 0xFF)) {
24554
0
            return false;
24555
0
          }
24556
0
        }
24557
0
      }
24558
0
      return true;
24559
0
    }
24560
24561
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL: {
24562
0
      for (uint32_t y = 0; y < h; y++) {
24563
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24564
0
        for (uint32_t x = 0; x < w; x++) {
24565
0
          if (row[(2 * (size_t)x) + 1] != 0xFF) {
24566
0
            return false;
24567
0
          }
24568
0
        }
24569
0
      }
24570
0
      return true;
24571
0
    }
24572
24573
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24574
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
24575
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL: {
24576
0
      const uint8_t* palette = pb->private_impl.planes[3].ptr;
24577
0
      for (uint32_t i = 0; true; i++) {
24578
0
        if (i >= 256) {
24579
0
          return true;
24580
0
        } else if (palette[(4 * (size_t)i) + 3] != 0xFF) {
24581
0
          break;
24582
0
        }
24583
0
      }
24584
24585
0
      for (uint32_t y = 0; y < h; y++) {
24586
0
        const uint8_t* row = p->ptr + (p->stride * (size_t)y);
24587
0
        for (uint32_t x = 0; x < w; x++) {
24588
0
          if (palette[(4 * (size_t)row[x]) + 3] != 0xFF) {
24589
0
            return false;
24590
0
          }
24591
0
        }
24592
0
      }
24593
24594
0
      return true;
24595
0
    }
24596
24597
0
    default:
24598
0
      break;
24599
0
  }
24600
0
  return false;
24601
0
}
24602
24603
// --------
24604
24605
WUFFS_BASE__MAYBE_STATIC uint8_t  //
24606
wuffs_base__pixel_palette__closest_element(
24607
    wuffs_base__slice_u8 palette_slice,
24608
    wuffs_base__pixel_format palette_format,
24609
0
    wuffs_base__color_u32_argb_premul c) {
24610
0
  size_t n = palette_slice.len / 4;
24611
0
  if (n > (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
24612
0
    n = (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4);
24613
0
  }
24614
0
  size_t best_index = 0;
24615
0
  uint64_t best_score = 0xFFFFFFFFFFFFFFFF;
24616
24617
  // Work in 16-bit color.
24618
0
  uint32_t ca = 0x101 * (0xFF & (c >> 24));
24619
0
  uint32_t cr = 0x101 * (0xFF & (c >> 16));
24620
0
  uint32_t cg = 0x101 * (0xFF & (c >> 8));
24621
0
  uint32_t cb = 0x101 * (0xFF & (c >> 0));
24622
24623
0
  switch (palette_format.repr) {
24624
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
24625
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
24626
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY: {
24627
0
      bool nonpremul = palette_format.repr ==
24628
0
                       WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL;
24629
24630
0
      size_t i;
24631
0
      for (i = 0; i < n; i++) {
24632
        // Work in 16-bit color.
24633
0
        uint32_t pb = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 0]));
24634
0
        uint32_t pg = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 1]));
24635
0
        uint32_t pr = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 2]));
24636
0
        uint32_t pa = 0x101 * ((uint32_t)(palette_slice.ptr[(4 * i) + 3]));
24637
24638
        // Convert to premultiplied alpha.
24639
0
        if (nonpremul && (pa != 0xFFFF)) {
24640
0
          pb = (pb * pa) / 0xFFFF;
24641
0
          pg = (pg * pa) / 0xFFFF;
24642
0
          pr = (pr * pa) / 0xFFFF;
24643
0
        }
24644
24645
        // These deltas are conceptually int32_t (signed) but after squaring,
24646
        // it's equivalent to work in uint32_t (unsigned).
24647
0
        pb -= cb;
24648
0
        pg -= cg;
24649
0
        pr -= cr;
24650
0
        pa -= ca;
24651
0
        uint64_t score = ((uint64_t)(pb * pb)) + ((uint64_t)(pg * pg)) +
24652
0
                         ((uint64_t)(pr * pr)) + ((uint64_t)(pa * pa));
24653
0
        if (best_score > score) {
24654
0
          best_score = score;
24655
0
          best_index = i;
24656
0
        }
24657
0
      }
24658
0
      break;
24659
0
    }
24660
0
  }
24661
24662
0
  return (uint8_t)best_index;
24663
0
}
24664
24665
// --------
24666
24667
static inline uint32_t  //
24668
wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(
24669
    uint32_t dst_nonpremul,
24670
0
    uint32_t src_nonpremul) {
24671
  // Extract 16-bit color components.
24672
  //
24673
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24674
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24675
  // of the function's computation). It also preserves the nonpremul
24676
  // distinction between e.g. transparent red and transparent blue that would
24677
  // otherwise be lost by converting from nonpremul to premul and back.
24678
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24679
0
  if (da == 0) {
24680
0
    return src_nonpremul;
24681
0
  }
24682
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24683
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24684
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24685
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24686
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24687
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24688
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24689
24690
  // Convert dst from nonpremul to premul.
24691
0
  dr = (dr * da) / 0xFFFF;
24692
0
  dg = (dg * da) / 0xFFFF;
24693
0
  db = (db * da) / 0xFFFF;
24694
24695
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24696
0
  uint32_t ia = 0xFFFF - sa;
24697
24698
  // Composite src (nonpremul) over dst (premul).
24699
0
  da = sa + ((da * ia) / 0xFFFF);
24700
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24701
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24702
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24703
24704
  // Convert dst from premul to nonpremul.
24705
0
  if (da != 0) {
24706
0
    dr = (dr * 0xFFFF) / da;
24707
0
    dg = (dg * 0xFFFF) / da;
24708
0
    db = (db * 0xFFFF) / da;
24709
0
  }
24710
24711
  // Convert from 16-bit color to 8-bit color.
24712
0
  da >>= 8;
24713
0
  dr >>= 8;
24714
0
  dg >>= 8;
24715
0
  db >>= 8;
24716
24717
  // Combine components.
24718
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24719
0
}
24720
24721
static inline uint64_t  //
24722
wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(
24723
    uint64_t dst_nonpremul,
24724
0
    uint64_t src_nonpremul) {
24725
  // Extract components.
24726
  //
24727
  // If the destination is transparent then SRC_OVER is equivalent to SRC: just
24728
  // return src_nonpremul. This isn't just an optimization (skipping the rest
24729
  // of the function's computation). It also preserves the nonpremul
24730
  // distinction between e.g. transparent red and transparent blue that would
24731
  // otherwise be lost by converting from nonpremul to premul and back.
24732
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24733
0
  if (da == 0) {
24734
0
    return src_nonpremul;
24735
0
  }
24736
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24737
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24738
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24739
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24740
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24741
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24742
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24743
24744
  // Convert dst from nonpremul to premul.
24745
0
  dr = (dr * da) / 0xFFFF;
24746
0
  dg = (dg * da) / 0xFFFF;
24747
0
  db = (db * da) / 0xFFFF;
24748
24749
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24750
0
  uint64_t ia = 0xFFFF - sa;
24751
24752
  // Composite src (nonpremul) over dst (premul).
24753
0
  da = sa + ((da * ia) / 0xFFFF);
24754
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24755
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24756
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24757
24758
  // Convert dst from premul to nonpremul.
24759
0
  if (da != 0) {
24760
0
    dr = (dr * 0xFFFF) / da;
24761
0
    dg = (dg * 0xFFFF) / da;
24762
0
    db = (db * 0xFFFF) / da;
24763
0
  }
24764
24765
  // Combine components.
24766
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24767
0
}
24768
24769
static inline uint32_t  //
24770
wuffs_private_impl__composite_nonpremul_premul_u32_axxx(uint32_t dst_nonpremul,
24771
0
                                                        uint32_t src_premul) {
24772
  // Extract 16-bit color components.
24773
0
  uint32_t da = 0x101 * (0xFF & (dst_nonpremul >> 24));
24774
0
  uint32_t dr = 0x101 * (0xFF & (dst_nonpremul >> 16));
24775
0
  uint32_t dg = 0x101 * (0xFF & (dst_nonpremul >> 8));
24776
0
  uint32_t db = 0x101 * (0xFF & (dst_nonpremul >> 0));
24777
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24778
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24779
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24780
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24781
24782
  // Convert dst from nonpremul to premul.
24783
0
  dr = (dr * da) / 0xFFFF;
24784
0
  dg = (dg * da) / 0xFFFF;
24785
0
  db = (db * da) / 0xFFFF;
24786
24787
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24788
0
  uint32_t ia = 0xFFFF - sa;
24789
24790
  // Composite src (premul) over dst (premul).
24791
0
  da = sa + ((da * ia) / 0xFFFF);
24792
0
  dr = sr + ((dr * ia) / 0xFFFF);
24793
0
  dg = sg + ((dg * ia) / 0xFFFF);
24794
0
  db = sb + ((db * ia) / 0xFFFF);
24795
24796
  // Convert dst from premul to nonpremul.
24797
0
  if (da != 0) {
24798
0
    dr = (dr * 0xFFFF) / da;
24799
0
    dg = (dg * 0xFFFF) / da;
24800
0
    db = (db * 0xFFFF) / da;
24801
0
  }
24802
24803
  // Convert from 16-bit color to 8-bit color.
24804
0
  da >>= 8;
24805
0
  dr >>= 8;
24806
0
  dg >>= 8;
24807
0
  db >>= 8;
24808
24809
  // Combine components.
24810
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24811
0
}
24812
24813
static inline uint64_t  //
24814
wuffs_private_impl__composite_nonpremul_premul_u64_axxx(uint64_t dst_nonpremul,
24815
0
                                                        uint64_t src_premul) {
24816
  // Extract components.
24817
0
  uint64_t da = 0xFFFF & (dst_nonpremul >> 48);
24818
0
  uint64_t dr = 0xFFFF & (dst_nonpremul >> 32);
24819
0
  uint64_t dg = 0xFFFF & (dst_nonpremul >> 16);
24820
0
  uint64_t db = 0xFFFF & (dst_nonpremul >> 0);
24821
0
  uint64_t sa = 0xFFFF & (src_premul >> 48);
24822
0
  uint64_t sr = 0xFFFF & (src_premul >> 32);
24823
0
  uint64_t sg = 0xFFFF & (src_premul >> 16);
24824
0
  uint64_t sb = 0xFFFF & (src_premul >> 0);
24825
24826
  // Convert dst from nonpremul to premul.
24827
0
  dr = (dr * da) / 0xFFFF;
24828
0
  dg = (dg * da) / 0xFFFF;
24829
0
  db = (db * da) / 0xFFFF;
24830
24831
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24832
0
  uint64_t ia = 0xFFFF - sa;
24833
24834
  // Composite src (premul) over dst (premul).
24835
0
  da = sa + ((da * ia) / 0xFFFF);
24836
0
  dr = sr + ((dr * ia) / 0xFFFF);
24837
0
  dg = sg + ((dg * ia) / 0xFFFF);
24838
0
  db = sb + ((db * ia) / 0xFFFF);
24839
24840
  // Convert dst from premul to nonpremul.
24841
0
  if (da != 0) {
24842
0
    dr = (dr * 0xFFFF) / da;
24843
0
    dg = (dg * 0xFFFF) / da;
24844
0
    db = (db * 0xFFFF) / da;
24845
0
  }
24846
24847
  // Combine components.
24848
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24849
0
}
24850
24851
static inline uint32_t  //
24852
wuffs_private_impl__composite_premul_nonpremul_u32_axxx(
24853
    uint32_t dst_premul,
24854
0
    uint32_t src_nonpremul) {
24855
  // Extract 16-bit color components.
24856
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24857
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24858
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24859
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24860
0
  uint32_t sa = 0x101 * (0xFF & (src_nonpremul >> 24));
24861
0
  uint32_t sr = 0x101 * (0xFF & (src_nonpremul >> 16));
24862
0
  uint32_t sg = 0x101 * (0xFF & (src_nonpremul >> 8));
24863
0
  uint32_t sb = 0x101 * (0xFF & (src_nonpremul >> 0));
24864
24865
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24866
0
  uint32_t ia = 0xFFFF - sa;
24867
24868
  // Composite src (nonpremul) over dst (premul).
24869
0
  da = sa + ((da * ia) / 0xFFFF);
24870
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24871
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24872
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24873
24874
  // Convert from 16-bit color to 8-bit color.
24875
0
  da >>= 8;
24876
0
  dr >>= 8;
24877
0
  dg >>= 8;
24878
0
  db >>= 8;
24879
24880
  // Combine components.
24881
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24882
0
}
24883
24884
static inline uint64_t  //
24885
wuffs_private_impl__composite_premul_nonpremul_u64_axxx(
24886
    uint64_t dst_premul,
24887
0
    uint64_t src_nonpremul) {
24888
  // Extract components.
24889
0
  uint64_t da = 0xFFFF & (dst_premul >> 48);
24890
0
  uint64_t dr = 0xFFFF & (dst_premul >> 32);
24891
0
  uint64_t dg = 0xFFFF & (dst_premul >> 16);
24892
0
  uint64_t db = 0xFFFF & (dst_premul >> 0);
24893
0
  uint64_t sa = 0xFFFF & (src_nonpremul >> 48);
24894
0
  uint64_t sr = 0xFFFF & (src_nonpremul >> 32);
24895
0
  uint64_t sg = 0xFFFF & (src_nonpremul >> 16);
24896
0
  uint64_t sb = 0xFFFF & (src_nonpremul >> 0);
24897
24898
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24899
0
  uint64_t ia = 0xFFFF - sa;
24900
24901
  // Composite src (nonpremul) over dst (premul).
24902
0
  da = sa + ((da * ia) / 0xFFFF);
24903
0
  dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
24904
0
  dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
24905
0
  db = ((sb * sa) + (db * ia)) / 0xFFFF;
24906
24907
  // Combine components.
24908
0
  return (db << 0) | (dg << 16) | (dr << 32) | (da << 48);
24909
0
}
24910
24911
static inline uint32_t  //
24912
wuffs_private_impl__composite_premul_premul_u32_axxx(uint32_t dst_premul,
24913
0
                                                     uint32_t src_premul) {
24914
  // Extract 16-bit color components.
24915
0
  uint32_t da = 0x101 * (0xFF & (dst_premul >> 24));
24916
0
  uint32_t dr = 0x101 * (0xFF & (dst_premul >> 16));
24917
0
  uint32_t dg = 0x101 * (0xFF & (dst_premul >> 8));
24918
0
  uint32_t db = 0x101 * (0xFF & (dst_premul >> 0));
24919
0
  uint32_t sa = 0x101 * (0xFF & (src_premul >> 24));
24920
0
  uint32_t sr = 0x101 * (0xFF & (src_premul >> 16));
24921
0
  uint32_t sg = 0x101 * (0xFF & (src_premul >> 8));
24922
0
  uint32_t sb = 0x101 * (0xFF & (src_premul >> 0));
24923
24924
  // Calculate the inverse of the src-alpha: how much of the dst to keep.
24925
0
  uint32_t ia = 0xFFFF - sa;
24926
24927
  // Composite src (premul) over dst (premul).
24928
0
  da = sa + ((da * ia) / 0xFFFF);
24929
0
  dr = sr + ((dr * ia) / 0xFFFF);
24930
0
  dg = sg + ((dg * ia) / 0xFFFF);
24931
0
  db = sb + ((db * ia) / 0xFFFF);
24932
24933
  // Convert from 16-bit color to 8-bit color.
24934
0
  da >>= 8;
24935
0
  dr >>= 8;
24936
0
  dg >>= 8;
24937
0
  db >>= 8;
24938
24939
  // Combine components.
24940
0
  return (db << 0) | (dg << 8) | (dr << 16) | (da << 24);
24941
0
}
24942
24943
// --------
24944
24945
static uint64_t  //
24946
wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(uint8_t* dst_ptr,
24947
                                                       size_t dst_len,
24948
                                                       const uint8_t* src_ptr,
24949
                                                       size_t src_len,
24950
0
                                                       bool nonpremul) {
24951
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24952
0
  uint8_t* d = dst_ptr;
24953
0
  const uint8_t* s = src_ptr;
24954
24955
0
  size_t n = len;
24956
0
  while (n--) {
24957
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
24958
0
    if (nonpremul) {
24959
0
      argb =
24960
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
24961
0
    }
24962
0
    uint32_t b5 = 0x1F & (argb >> (8 - 5));
24963
0
    uint32_t g6 = 0x3F & (argb >> (16 - 6));
24964
0
    uint32_t r5 = 0x1F & (argb >> (24 - 5));
24965
0
    uint32_t alpha = argb & 0xFF000000;
24966
0
    wuffs_base__poke_u32le__no_bounds_check(
24967
0
        d, alpha | (r5 << 11) | (g6 << 5) | (b5 << 0));
24968
0
    s += 4;
24969
0
    d += 4;
24970
0
  }
24971
0
  return len;
24972
0
}
24973
24974
// --------
24975
24976
static uint64_t  //
24977
wuffs_private_impl__swizzle_squash_align4_y_8888(uint8_t* dst_ptr,
24978
                                                 size_t dst_len,
24979
                                                 const uint8_t* src_ptr,
24980
                                                 size_t src_len,
24981
0
                                                 bool nonpremul) {
24982
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
24983
0
  uint8_t* d = dst_ptr;
24984
0
  const uint8_t* s = src_ptr;
24985
24986
0
  size_t n = len;
24987
0
  while (n--) {
24988
0
    uint32_t argb = wuffs_base__peek_u32le__no_bounds_check(s);
24989
0
    if (nonpremul) {
24990
0
      argb =
24991
0
          wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(argb);
24992
0
    }
24993
0
    uint32_t s0 = wuffs_base__color_u32_argb_premul__as__color_u8_gray(argb);
24994
0
    wuffs_base__poke_u32le__no_bounds_check(
24995
0
        d, (argb & 0xFF000000) | (s0 * 0x010101));
24996
0
    s += 4;
24997
0
    d += 4;
24998
0
  }
24999
0
  return len;
25000
0
}
25001
25002
// --------
25003
25004
static uint64_t  //
25005
wuffs_private_impl__swizzle_swap_rgb_bgr(uint8_t* dst_ptr,
25006
                                         size_t dst_len,
25007
                                         uint8_t* dst_palette_ptr,
25008
                                         size_t dst_palette_len,
25009
                                         const uint8_t* src_ptr,
25010
11.4M
                                         size_t src_len) {
25011
11.4M
  size_t len = (dst_len < src_len ? dst_len : src_len) / 3;
25012
11.4M
  uint8_t* d = dst_ptr;
25013
11.4M
  const uint8_t* s = src_ptr;
25014
25015
11.4M
  size_t n = len;
25016
23.9M
  while (n--) {
25017
12.4M
    uint8_t s0 = s[0];
25018
12.4M
    uint8_t s1 = s[1];
25019
12.4M
    uint8_t s2 = s[2];
25020
12.4M
    d[0] = s2;
25021
12.4M
    d[1] = s1;
25022
12.4M
    d[2] = s0;
25023
12.4M
    s += 3;
25024
12.4M
    d += 3;
25025
12.4M
  }
25026
11.4M
  return len;
25027
11.4M
}
25028
25029
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
25030
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
25031
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
25032
static uint64_t  //
25033
wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42(uint8_t* dst_ptr,
25034
                                                      size_t dst_len,
25035
                                                      uint8_t* dst_palette_ptr,
25036
                                                      size_t dst_palette_len,
25037
                                                      const uint8_t* src_ptr,
25038
15.4M
                                                      size_t src_len) {
25039
15.4M
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25040
15.4M
  uint8_t* d = dst_ptr;
25041
15.4M
  const uint8_t* s = src_ptr;
25042
15.4M
  size_t n = len;
25043
25044
15.4M
  __m128i shuffle = _mm_set_epi8(+0x0F, +0x0C, +0x0D, +0x0E,  //
25045
15.4M
                                 +0x0B, +0x08, +0x09, +0x0A,  //
25046
15.4M
                                 +0x07, +0x04, +0x05, +0x06,  //
25047
15.4M
                                 +0x03, +0x00, +0x01, +0x02);
25048
25049
24.2M
  while (n >= 4) {
25050
8.83M
    __m128i x;
25051
8.83M
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
25052
8.83M
    x = _mm_shuffle_epi8(x, shuffle);
25053
8.83M
    _mm_storeu_si128((__m128i*)(void*)d, x);
25054
25055
8.83M
    s += 4 * 4;
25056
8.83M
    d += 4 * 4;
25057
8.83M
    n -= 4;
25058
8.83M
  }
25059
25060
30.9M
  while (n--) {
25061
15.4M
    uint8_t s0 = s[0];
25062
15.4M
    uint8_t s1 = s[1];
25063
15.4M
    uint8_t s2 = s[2];
25064
15.4M
    uint8_t s3 = s[3];
25065
15.4M
    d[0] = s2;
25066
15.4M
    d[1] = s1;
25067
15.4M
    d[2] = s0;
25068
15.4M
    d[3] = s3;
25069
15.4M
    s += 4;
25070
15.4M
    d += 4;
25071
15.4M
  }
25072
15.4M
  return len;
25073
15.4M
}
25074
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
25075
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
25076
25077
static uint64_t  //
25078
wuffs_private_impl__swizzle_swap_rgbx_bgrx(uint8_t* dst_ptr,
25079
                                           size_t dst_len,
25080
                                           uint8_t* dst_palette_ptr,
25081
                                           size_t dst_palette_len,
25082
                                           const uint8_t* src_ptr,
25083
0
                                           size_t src_len) {
25084
0
  size_t len = (dst_len < src_len ? dst_len : src_len) / 4;
25085
0
  uint8_t* d = dst_ptr;
25086
0
  const uint8_t* s = src_ptr;
25087
25088
0
  size_t n = len;
25089
0
  while (n--) {
25090
0
    uint8_t s0 = s[0];
25091
0
    uint8_t s1 = s[1];
25092
0
    uint8_t s2 = s[2];
25093
0
    uint8_t s3 = s[3];
25094
0
    d[0] = s2;
25095
0
    d[1] = s1;
25096
0
    d[2] = s0;
25097
0
    d[3] = s3;
25098
0
    s += 4;
25099
0
    d += 4;
25100
0
  }
25101
0
  return len;
25102
0
}
25103
25104
// --------
25105
25106
static uint64_t  //
25107
wuffs_private_impl__swizzle_copy_1_1(uint8_t* dst_ptr,
25108
                                     size_t dst_len,
25109
                                     uint8_t* dst_palette_ptr,
25110
                                     size_t dst_palette_len,
25111
                                     const uint8_t* src_ptr,
25112
32.7M
                                     size_t src_len) {
25113
32.7M
  size_t len = (dst_len < src_len) ? dst_len : src_len;
25114
32.7M
  if (len > 0) {
25115
32.7M
    memmove(dst_ptr, src_ptr, len);
25116
32.7M
  }
25117
32.7M
  return len;
25118
32.7M
}
25119
25120
static uint64_t  //
25121
wuffs_private_impl__swizzle_copy_2_2(uint8_t* dst_ptr,
25122
                                     size_t dst_len,
25123
                                     uint8_t* dst_palette_ptr,
25124
                                     size_t dst_palette_len,
25125
                                     const uint8_t* src_ptr,
25126
2.96M
                                     size_t src_len) {
25127
2.96M
  size_t dst_len2 = dst_len / 2;
25128
2.96M
  size_t src_len2 = src_len / 2;
25129
2.96M
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25130
2.96M
  if (len > 0) {
25131
2.96M
    memmove(dst_ptr, src_ptr, len * 2);
25132
2.96M
  }
25133
2.96M
  return len;
25134
2.96M
}
25135
25136
static uint64_t  //
25137
wuffs_private_impl__swizzle_copy_3_3(uint8_t* dst_ptr,
25138
                                     size_t dst_len,
25139
                                     uint8_t* dst_palette_ptr,
25140
                                     size_t dst_palette_len,
25141
                                     const uint8_t* src_ptr,
25142
0
                                     size_t src_len) {
25143
0
  size_t dst_len3 = dst_len / 3;
25144
0
  size_t src_len3 = src_len / 3;
25145
0
  size_t len = (dst_len3 < src_len3) ? dst_len3 : src_len3;
25146
0
  if (len > 0) {
25147
0
    memmove(dst_ptr, src_ptr, len * 3);
25148
0
  }
25149
0
  return len;
25150
0
}
25151
25152
static uint64_t  //
25153
wuffs_private_impl__swizzle_copy_4_4(uint8_t* dst_ptr,
25154
                                     size_t dst_len,
25155
                                     uint8_t* dst_palette_ptr,
25156
                                     size_t dst_palette_len,
25157
                                     const uint8_t* src_ptr,
25158
17.4M
                                     size_t src_len) {
25159
17.4M
  size_t dst_len4 = dst_len / 4;
25160
17.4M
  size_t src_len4 = src_len / 4;
25161
17.4M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
25162
17.4M
  if (len > 0) {
25163
17.4M
    memmove(dst_ptr, src_ptr, len * 4);
25164
17.4M
  }
25165
17.4M
  return len;
25166
17.4M
}
25167
25168
static uint64_t  //
25169
wuffs_private_impl__swizzle_copy_8_8(uint8_t* dst_ptr,
25170
                                     size_t dst_len,
25171
                                     uint8_t* dst_palette_ptr,
25172
                                     size_t dst_palette_len,
25173
                                     const uint8_t* src_ptr,
25174
22.4M
                                     size_t src_len) {
25175
22.4M
  size_t dst_len8 = dst_len / 8;
25176
22.4M
  size_t src_len8 = src_len / 8;
25177
22.4M
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
25178
22.4M
  if (len > 0) {
25179
22.4M
    memmove(dst_ptr, src_ptr, len * 8);
25180
22.4M
  }
25181
22.4M
  return len;
25182
22.4M
}
25183
25184
// --------
25185
25186
static uint64_t  //
25187
wuffs_private_impl__swizzle_bgr_565__bgr(uint8_t* dst_ptr,
25188
                                         size_t dst_len,
25189
                                         uint8_t* dst_palette_ptr,
25190
                                         size_t dst_palette_len,
25191
                                         const uint8_t* src_ptr,
25192
0
                                         size_t src_len) {
25193
0
  size_t dst_len2 = dst_len / 2;
25194
0
  size_t src_len3 = src_len / 3;
25195
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
25196
0
  uint8_t* d = dst_ptr;
25197
0
  const uint8_t* s = src_ptr;
25198
0
  size_t n = len;
25199
25200
  // TODO: unroll.
25201
25202
0
  while (n >= 1) {
25203
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
25204
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25205
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
25206
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25207
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25208
25209
0
    s += 1 * 3;
25210
0
    d += 1 * 2;
25211
0
    n -= 1;
25212
0
  }
25213
25214
0
  return len;
25215
0
}
25216
25217
static uint64_t  //
25218
wuffs_private_impl__swizzle_bgr_565__bgrx(uint8_t* dst_ptr,
25219
                                          size_t dst_len,
25220
                                          uint8_t* dst_palette_ptr,
25221
                                          size_t dst_palette_len,
25222
                                          const uint8_t* src_ptr,
25223
0
                                          size_t src_len) {
25224
0
  size_t dst_len2 = dst_len / 2;
25225
0
  size_t src_len4 = src_len / 4;
25226
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25227
0
  uint8_t* d = dst_ptr;
25228
0
  const uint8_t* s = src_ptr;
25229
0
  size_t n = len;
25230
25231
  // TODO: unroll.
25232
25233
0
  while (n >= 1) {
25234
0
    uint32_t b5 = (uint32_t)(s[0] >> 3);
25235
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25236
0
    uint32_t r5 = (uint32_t)(s[2] >> 3);
25237
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25238
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25239
25240
0
    s += 1 * 4;
25241
0
    d += 1 * 2;
25242
0
    n -= 1;
25243
0
  }
25244
25245
0
  return len;
25246
0
}
25247
25248
static uint64_t  //
25249
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src(
25250
    uint8_t* dst_ptr,
25251
    size_t dst_len,
25252
    uint8_t* dst_palette_ptr,
25253
    size_t dst_palette_len,
25254
    const uint8_t* src_ptr,
25255
0
    size_t src_len) {
25256
0
  size_t dst_len2 = dst_len / 2;
25257
0
  size_t src_len4 = src_len / 4;
25258
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25259
0
  uint8_t* d = dst_ptr;
25260
0
  const uint8_t* s = src_ptr;
25261
0
  size_t n = len;
25262
25263
  // TODO: unroll.
25264
25265
0
  while (n >= 1) {
25266
0
    wuffs_base__poke_u16le__no_bounds_check(
25267
0
        d + (0 * 2),
25268
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25269
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25270
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
25271
25272
0
    s += 1 * 4;
25273
0
    d += 1 * 2;
25274
0
    n -= 1;
25275
0
  }
25276
25277
0
  return len;
25278
0
}
25279
25280
static uint64_t  //
25281
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src(
25282
    uint8_t* dst_ptr,
25283
    size_t dst_len,
25284
    uint8_t* dst_palette_ptr,
25285
    size_t dst_palette_len,
25286
    const uint8_t* src_ptr,
25287
0
    size_t src_len) {
25288
0
  size_t dst_len2 = dst_len / 2;
25289
0
  size_t src_len8 = src_len / 8;
25290
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25291
0
  uint8_t* d = dst_ptr;
25292
0
  const uint8_t* s = src_ptr;
25293
0
  size_t n = len;
25294
25295
  // TODO: unroll.
25296
25297
0
  while (n >= 1) {
25298
0
    wuffs_base__poke_u16le__no_bounds_check(
25299
0
        d + (0 * 2),
25300
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25301
0
            wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
25302
0
                wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)))));
25303
25304
0
    s += 1 * 8;
25305
0
    d += 1 * 2;
25306
0
    n -= 1;
25307
0
  }
25308
25309
0
  return len;
25310
0
}
25311
25312
static uint64_t  //
25313
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over(
25314
    uint8_t* dst_ptr,
25315
    size_t dst_len,
25316
    uint8_t* dst_palette_ptr,
25317
    size_t dst_palette_len,
25318
    const uint8_t* src_ptr,
25319
0
    size_t src_len) {
25320
0
  size_t dst_len2 = dst_len / 2;
25321
0
  size_t src_len4 = src_len / 4;
25322
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25323
0
  uint8_t* d = dst_ptr;
25324
0
  const uint8_t* s = src_ptr;
25325
0
  size_t n = len;
25326
25327
  // TODO: unroll.
25328
25329
0
  while (n >= 1) {
25330
    // Extract 16-bit color components.
25331
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25332
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25333
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25334
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25335
25336
    // Convert from 565 color to 16-bit color.
25337
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25338
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25339
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25340
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25341
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25342
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25343
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25344
25345
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25346
0
    uint32_t ia = 0xFFFF - sa;
25347
25348
    // Composite src (nonpremul) over dst (premul).
25349
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25350
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25351
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25352
25353
    // Convert from 16-bit color to 565 color and combine the components.
25354
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25355
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25356
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25357
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25358
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25359
25360
0
    s += 1 * 4;
25361
0
    d += 1 * 2;
25362
0
    n -= 1;
25363
0
  }
25364
25365
0
  return len;
25366
0
}
25367
25368
static uint64_t  //
25369
wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over(
25370
    uint8_t* dst_ptr,
25371
    size_t dst_len,
25372
    uint8_t* dst_palette_ptr,
25373
    size_t dst_palette_len,
25374
    const uint8_t* src_ptr,
25375
0
    size_t src_len) {
25376
0
  size_t dst_len2 = dst_len / 2;
25377
0
  size_t src_len8 = src_len / 8;
25378
0
  size_t len = (dst_len2 < src_len8) ? dst_len2 : src_len8;
25379
0
  uint8_t* d = dst_ptr;
25380
0
  const uint8_t* s = src_ptr;
25381
0
  size_t n = len;
25382
25383
  // TODO: unroll.
25384
25385
0
  while (n >= 1) {
25386
    // Extract 16-bit color components.
25387
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
25388
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
25389
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
25390
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
25391
25392
    // Convert from 565 color to 16-bit color.
25393
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25394
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25395
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25396
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25397
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25398
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25399
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25400
25401
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25402
0
    uint32_t ia = 0xFFFF - sa;
25403
25404
    // Composite src (nonpremul) over dst (premul).
25405
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25406
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25407
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25408
25409
    // Convert from 16-bit color to 565 color and combine the components.
25410
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25411
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25412
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25413
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25414
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25415
25416
0
    s += 1 * 8;
25417
0
    d += 1 * 2;
25418
0
    n -= 1;
25419
0
  }
25420
25421
0
  return len;
25422
0
}
25423
25424
static uint64_t  //
25425
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src(uint8_t* dst_ptr,
25426
                                                      size_t dst_len,
25427
                                                      uint8_t* dst_palette_ptr,
25428
                                                      size_t dst_palette_len,
25429
                                                      const uint8_t* src_ptr,
25430
0
                                                      size_t src_len) {
25431
0
  size_t dst_len2 = dst_len / 2;
25432
0
  size_t src_len4 = src_len / 4;
25433
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25434
0
  uint8_t* d = dst_ptr;
25435
0
  const uint8_t* s = src_ptr;
25436
0
  size_t n = len;
25437
25438
  // TODO: unroll.
25439
25440
0
  while (n >= 1) {
25441
0
    wuffs_base__poke_u16le__no_bounds_check(
25442
0
        d + (0 * 2), wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25443
0
                         wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
25444
25445
0
    s += 1 * 4;
25446
0
    d += 1 * 2;
25447
0
    n -= 1;
25448
0
  }
25449
25450
0
  return len;
25451
0
}
25452
25453
static uint64_t  //
25454
wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over(
25455
    uint8_t* dst_ptr,
25456
    size_t dst_len,
25457
    uint8_t* dst_palette_ptr,
25458
    size_t dst_palette_len,
25459
    const uint8_t* src_ptr,
25460
0
    size_t src_len) {
25461
0
  size_t dst_len2 = dst_len / 2;
25462
0
  size_t src_len4 = src_len / 4;
25463
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25464
0
  uint8_t* d = dst_ptr;
25465
0
  const uint8_t* s = src_ptr;
25466
0
  size_t n = len;
25467
25468
  // TODO: unroll.
25469
25470
0
  while (n >= 1) {
25471
    // Extract 16-bit color components.
25472
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25473
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
25474
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25475
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
25476
25477
    // Convert from 565 color to 16-bit color.
25478
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25479
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25480
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25481
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25482
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25483
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25484
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25485
25486
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25487
0
    uint32_t ia = 0xFFFF - sa;
25488
25489
    // Composite src (premul) over dst (premul).
25490
0
    dr = sr + ((dr * ia) / 0xFFFF);
25491
0
    dg = sg + ((dg * ia) / 0xFFFF);
25492
0
    db = sb + ((db * ia) / 0xFFFF);
25493
25494
    // Convert from 16-bit color to 565 color and combine the components.
25495
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25496
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25497
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25498
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25499
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25500
25501
0
    s += 1 * 4;
25502
0
    d += 1 * 2;
25503
0
    n -= 1;
25504
0
  }
25505
25506
0
  return len;
25507
0
}
25508
25509
static uint64_t  //
25510
wuffs_private_impl__swizzle_bgr_565__rgb(uint8_t* dst_ptr,
25511
                                         size_t dst_len,
25512
                                         uint8_t* dst_palette_ptr,
25513
                                         size_t dst_palette_len,
25514
                                         const uint8_t* src_ptr,
25515
0
                                         size_t src_len) {
25516
0
  size_t dst_len2 = dst_len / 2;
25517
0
  size_t src_len3 = src_len / 3;
25518
0
  size_t len = (dst_len2 < src_len3) ? dst_len2 : src_len3;
25519
0
  uint8_t* d = dst_ptr;
25520
0
  const uint8_t* s = src_ptr;
25521
0
  size_t n = len;
25522
25523
  // TODO: unroll.
25524
25525
0
  while (n >= 1) {
25526
0
    uint32_t r5 = (uint32_t)(s[0] >> 3);
25527
0
    uint32_t g6 = (uint32_t)(s[1] >> 2);
25528
0
    uint32_t b5 = (uint32_t)(s[2] >> 3);
25529
0
    uint32_t rgb_565 = (r5 << 11) | (g6 << 5) | (b5 << 0);
25530
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25531
25532
0
    s += 1 * 3;
25533
0
    d += 1 * 2;
25534
0
    n -= 1;
25535
0
  }
25536
25537
0
  return len;
25538
0
}
25539
25540
static uint64_t  //
25541
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src(
25542
    uint8_t* dst_ptr,
25543
    size_t dst_len,
25544
    uint8_t* dst_palette_ptr,
25545
    size_t dst_palette_len,
25546
    const uint8_t* src_ptr,
25547
0
    size_t src_len) {
25548
0
  size_t dst_len2 = dst_len / 2;
25549
0
  size_t src_len4 = src_len / 4;
25550
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25551
0
  uint8_t* d = dst_ptr;
25552
0
  const uint8_t* s = src_ptr;
25553
0
  size_t n = len;
25554
25555
  // TODO: unroll.
25556
25557
0
  while (n >= 1) {
25558
0
    wuffs_base__poke_u16le__no_bounds_check(
25559
0
        d + (0 * 2),
25560
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25561
0
            wuffs_private_impl__swap_u32_argb_abgr(
25562
0
                wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25563
0
                    wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))))));
25564
25565
0
    s += 1 * 4;
25566
0
    d += 1 * 2;
25567
0
    n -= 1;
25568
0
  }
25569
25570
0
  return len;
25571
0
}
25572
25573
static uint64_t  //
25574
wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over(
25575
    uint8_t* dst_ptr,
25576
    size_t dst_len,
25577
    uint8_t* dst_palette_ptr,
25578
    size_t dst_palette_len,
25579
    const uint8_t* src_ptr,
25580
0
    size_t src_len) {
25581
0
  size_t dst_len2 = dst_len / 2;
25582
0
  size_t src_len4 = src_len / 4;
25583
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25584
0
  uint8_t* d = dst_ptr;
25585
0
  const uint8_t* s = src_ptr;
25586
0
  size_t n = len;
25587
25588
  // TODO: unroll.
25589
25590
0
  while (n >= 1) {
25591
    // Extract 16-bit color components.
25592
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25593
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25594
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25595
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25596
25597
    // Convert from 565 color to 16-bit color.
25598
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25599
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25600
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25601
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25602
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25603
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25604
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25605
25606
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25607
0
    uint32_t ia = 0xFFFF - sa;
25608
25609
    // Composite src (nonpremul) over dst (premul).
25610
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
25611
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
25612
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
25613
25614
    // Convert from 16-bit color to 565 color and combine the components.
25615
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25616
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25617
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25618
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25619
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25620
25621
0
    s += 1 * 4;
25622
0
    d += 1 * 2;
25623
0
    n -= 1;
25624
0
  }
25625
25626
0
  return len;
25627
0
}
25628
25629
static uint64_t  //
25630
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src(uint8_t* dst_ptr,
25631
                                                      size_t dst_len,
25632
                                                      uint8_t* dst_palette_ptr,
25633
                                                      size_t dst_palette_len,
25634
                                                      const uint8_t* src_ptr,
25635
0
                                                      size_t src_len) {
25636
0
  size_t dst_len2 = dst_len / 2;
25637
0
  size_t src_len4 = src_len / 4;
25638
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25639
0
  uint8_t* d = dst_ptr;
25640
0
  const uint8_t* s = src_ptr;
25641
0
  size_t n = len;
25642
25643
  // TODO: unroll.
25644
25645
0
  while (n >= 1) {
25646
0
    wuffs_base__poke_u16le__no_bounds_check(
25647
0
        d + (0 * 2),
25648
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25649
0
            wuffs_private_impl__swap_u32_argb_abgr(
25650
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
25651
25652
0
    s += 1 * 4;
25653
0
    d += 1 * 2;
25654
0
    n -= 1;
25655
0
  }
25656
25657
0
  return len;
25658
0
}
25659
25660
static uint64_t  //
25661
wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over(
25662
    uint8_t* dst_ptr,
25663
    size_t dst_len,
25664
    uint8_t* dst_palette_ptr,
25665
    size_t dst_palette_len,
25666
    const uint8_t* src_ptr,
25667
0
    size_t src_len) {
25668
0
  size_t dst_len2 = dst_len / 2;
25669
0
  size_t src_len4 = src_len / 4;
25670
0
  size_t len = (dst_len2 < src_len4) ? dst_len2 : src_len4;
25671
0
  uint8_t* d = dst_ptr;
25672
0
  const uint8_t* s = src_ptr;
25673
0
  size_t n = len;
25674
25675
  // TODO: unroll.
25676
25677
0
  while (n >= 1) {
25678
    // Extract 16-bit color components.
25679
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
25680
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
25681
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
25682
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
25683
25684
    // Convert from 565 color to 16-bit color.
25685
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25686
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25687
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25688
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25689
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25690
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25691
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25692
25693
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25694
0
    uint32_t ia = 0xFFFF - sa;
25695
25696
    // Composite src (premul) over dst (premul).
25697
0
    dr = sr + ((dr * ia) / 0xFFFF);
25698
0
    dg = sg + ((dg * ia) / 0xFFFF);
25699
0
    db = sb + ((db * ia) / 0xFFFF);
25700
25701
    // Convert from 16-bit color to 565 color and combine the components.
25702
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25703
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25704
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25705
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25706
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25707
25708
0
    s += 1 * 4;
25709
0
    d += 1 * 2;
25710
0
    n -= 1;
25711
0
  }
25712
25713
0
  return len;
25714
0
}
25715
25716
static uint64_t  //
25717
wuffs_private_impl__swizzle_bgr_565__y(uint8_t* dst_ptr,
25718
                                       size_t dst_len,
25719
                                       uint8_t* dst_palette_ptr,
25720
                                       size_t dst_palette_len,
25721
                                       const uint8_t* src_ptr,
25722
0
                                       size_t src_len) {
25723
0
  size_t dst_len2 = dst_len / 2;
25724
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25725
0
  uint8_t* d = dst_ptr;
25726
0
  const uint8_t* s = src_ptr;
25727
0
  size_t n = len;
25728
25729
  // TODO: unroll.
25730
25731
0
  while (n >= 1) {
25732
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25733
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25734
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25735
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25736
25737
0
    s += 1 * 1;
25738
0
    d += 1 * 2;
25739
0
    n -= 1;
25740
0
  }
25741
25742
0
  return len;
25743
0
}
25744
25745
static uint64_t  //
25746
wuffs_private_impl__swizzle_bgr_565__y_16be(uint8_t* dst_ptr,
25747
                                            size_t dst_len,
25748
                                            uint8_t* dst_palette_ptr,
25749
                                            size_t dst_palette_len,
25750
                                            const uint8_t* src_ptr,
25751
0
                                            size_t src_len) {
25752
0
  size_t dst_len2 = dst_len / 2;
25753
0
  size_t src_len2 = src_len / 2;
25754
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25755
0
  uint8_t* d = dst_ptr;
25756
0
  const uint8_t* s = src_ptr;
25757
0
  size_t n = len;
25758
25759
  // TODO: unroll.
25760
25761
0
  while (n >= 1) {
25762
0
    uint32_t y5 = (uint32_t)(s[0] >> 3);
25763
0
    uint32_t y6 = (uint32_t)(s[0] >> 2);
25764
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25765
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25766
25767
0
    s += 1 * 2;
25768
0
    d += 1 * 2;
25769
0
    n -= 1;
25770
0
  }
25771
25772
0
  return len;
25773
0
}
25774
25775
static uint64_t  //
25776
wuffs_private_impl__swizzle_bgr_565__y_16le(uint8_t* dst_ptr,
25777
                                            size_t dst_len,
25778
                                            uint8_t* dst_palette_ptr,
25779
                                            size_t dst_palette_len,
25780
                                            const uint8_t* src_ptr,
25781
0
                                            size_t src_len) {
25782
0
  size_t dst_len2 = dst_len / 2;
25783
0
  size_t src_len2 = src_len / 2;
25784
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25785
0
  uint8_t* d = dst_ptr;
25786
0
  const uint8_t* s = src_ptr;
25787
0
  size_t n = len;
25788
25789
  // TODO: unroll.
25790
25791
0
  while (n >= 1) {
25792
0
    uint32_t y5 = (uint32_t)(s[1] >> 3);
25793
0
    uint32_t y6 = (uint32_t)(s[1] >> 2);
25794
0
    uint32_t rgb_565 = (y5 << 11) | (y6 << 5) | (y5 << 0);
25795
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)rgb_565);
25796
25797
0
    s += 1 * 2;
25798
0
    d += 1 * 2;
25799
0
    n -= 1;
25800
0
  }
25801
25802
0
  return len;
25803
0
}
25804
25805
static uint64_t  //
25806
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src(uint8_t* dst_ptr,
25807
                                                       size_t dst_len,
25808
                                                       uint8_t* dst_palette_ptr,
25809
                                                       size_t dst_palette_len,
25810
                                                       const uint8_t* src_ptr,
25811
0
                                                       size_t src_len) {
25812
0
  size_t dst_len2 = dst_len / 2;
25813
0
  size_t src_len2 = src_len / 2;
25814
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25815
0
  uint8_t* d = dst_ptr;
25816
0
  const uint8_t* s = src_ptr;
25817
0
  size_t n = len;
25818
25819
  // TODO: unroll.
25820
25821
0
  while (n >= 1) {
25822
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
25823
25824
0
    wuffs_base__poke_u16le__no_bounds_check(
25825
0
        d + (0 * 2),
25826
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25827
0
            wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
25828
0
                s0)));
25829
25830
0
    s += 1 * 2;
25831
0
    d += 1 * 2;
25832
0
    n -= 1;
25833
0
  }
25834
25835
0
  return len;
25836
0
}
25837
25838
static uint64_t  //
25839
wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over(
25840
    uint8_t* dst_ptr,
25841
    size_t dst_len,
25842
    uint8_t* dst_palette_ptr,
25843
    size_t dst_palette_len,
25844
    const uint8_t* src_ptr,
25845
0
    size_t src_len) {
25846
0
  size_t dst_len2 = dst_len / 2;
25847
0
  size_t src_len2 = src_len / 2;
25848
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
25849
0
  uint8_t* d = dst_ptr;
25850
0
  const uint8_t* s = src_ptr;
25851
0
  size_t n = len;
25852
25853
  // TODO: unroll.
25854
25855
0
  while (n >= 1) {
25856
    // Extract 16-bit color components.
25857
0
    uint32_t sa = 0x101 * ((uint32_t)s[1]);
25858
0
    uint32_t sy = 0x101 * ((uint32_t)s[0]);
25859
25860
    // Convert from 565 color to 16-bit color.
25861
0
    uint32_t old_rgb_565 = wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2));
25862
0
    uint32_t old_r5 = 0x1F & (old_rgb_565 >> 11);
25863
0
    uint32_t dr = (0x8421 * old_r5) >> 4;
25864
0
    uint32_t old_g6 = 0x3F & (old_rgb_565 >> 5);
25865
0
    uint32_t dg = (0x1041 * old_g6) >> 2;
25866
0
    uint32_t old_b5 = 0x1F & (old_rgb_565 >> 0);
25867
0
    uint32_t db = (0x8421 * old_b5) >> 4;
25868
25869
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
25870
0
    uint32_t ia = 0xFFFF - sa;
25871
25872
    // Composite src (nonpremul) over dst (premul).
25873
0
    dr = ((sy * sa) + (dr * ia)) / 0xFFFF;
25874
0
    dg = ((sy * sa) + (dg * ia)) / 0xFFFF;
25875
0
    db = ((sy * sa) + (db * ia)) / 0xFFFF;
25876
25877
    // Convert from 16-bit color to 565 color and combine the components.
25878
0
    uint32_t new_r5 = 0x1F & (dr >> 11);
25879
0
    uint32_t new_g6 = 0x3F & (dg >> 10);
25880
0
    uint32_t new_b5 = 0x1F & (db >> 11);
25881
0
    uint32_t new_rgb_565 = (new_r5 << 11) | (new_g6 << 5) | (new_b5 << 0);
25882
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)new_rgb_565);
25883
25884
0
    s += 1 * 2;
25885
0
    d += 1 * 2;
25886
0
    n -= 1;
25887
0
  }
25888
25889
0
  return len;
25890
0
}
25891
25892
static uint64_t  //
25893
wuffs_private_impl__swizzle_bgr_565__index__src(uint8_t* dst_ptr,
25894
                                                size_t dst_len,
25895
                                                uint8_t* dst_palette_ptr,
25896
                                                size_t dst_palette_len,
25897
                                                const uint8_t* src_ptr,
25898
0
                                                size_t src_len) {
25899
0
  if (dst_palette_len !=
25900
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25901
0
    return 0;
25902
0
  }
25903
0
  size_t dst_len2 = dst_len / 2;
25904
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25905
0
  uint8_t* d = dst_ptr;
25906
0
  const uint8_t* s = src_ptr;
25907
0
  size_t n = len;
25908
25909
0
  const size_t loop_unroll_count = 4;
25910
25911
0
  while (n >= loop_unroll_count) {
25912
0
    wuffs_base__poke_u16le__no_bounds_check(
25913
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
25914
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
25915
0
    wuffs_base__poke_u16le__no_bounds_check(
25916
0
        d + (1 * 2), wuffs_base__peek_u16le__no_bounds_check(
25917
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
25918
0
    wuffs_base__poke_u16le__no_bounds_check(
25919
0
        d + (2 * 2), wuffs_base__peek_u16le__no_bounds_check(
25920
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
25921
0
    wuffs_base__poke_u16le__no_bounds_check(
25922
0
        d + (3 * 2), wuffs_base__peek_u16le__no_bounds_check(
25923
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
25924
25925
0
    s += loop_unroll_count * 1;
25926
0
    d += loop_unroll_count * 2;
25927
0
    n -= loop_unroll_count;
25928
0
  }
25929
25930
0
  while (n >= 1) {
25931
0
    wuffs_base__poke_u16le__no_bounds_check(
25932
0
        d + (0 * 2), wuffs_base__peek_u16le__no_bounds_check(
25933
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
25934
25935
0
    s += 1 * 1;
25936
0
    d += 1 * 2;
25937
0
    n -= 1;
25938
0
  }
25939
25940
0
  return len;
25941
0
}
25942
25943
static uint64_t  //
25944
wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over(
25945
    uint8_t* dst_ptr,
25946
    size_t dst_len,
25947
    uint8_t* dst_palette_ptr,
25948
    size_t dst_palette_len,
25949
    const uint8_t* src_ptr,
25950
0
    size_t src_len) {
25951
0
  if (dst_palette_len !=
25952
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25953
0
    return 0;
25954
0
  }
25955
0
  size_t dst_len2 = dst_len / 2;
25956
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25957
0
  uint8_t* d = dst_ptr;
25958
0
  const uint8_t* s = src_ptr;
25959
0
  size_t n = len;
25960
25961
  // TODO: unroll.
25962
25963
0
  while (n >= 1) {
25964
0
    uint32_t d0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
25965
0
        wuffs_base__peek_u16le__no_bounds_check(d + (0 * 2)));
25966
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
25967
0
                                                          ((size_t)s[0] * 4));
25968
0
    wuffs_base__poke_u16le__no_bounds_check(
25969
0
        d + (0 * 2),
25970
0
        wuffs_base__color_u32_argb_premul__as__color_u16_rgb_565(
25971
0
            wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0)));
25972
25973
0
    s += 1 * 1;
25974
0
    d += 1 * 2;
25975
0
    n -= 1;
25976
0
  }
25977
25978
0
  return len;
25979
0
}
25980
25981
static uint64_t  //
25982
wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over(
25983
    uint8_t* dst_ptr,
25984
    size_t dst_len,
25985
    uint8_t* dst_palette_ptr,
25986
    size_t dst_palette_len,
25987
    const uint8_t* src_ptr,
25988
0
    size_t src_len) {
25989
0
  if (dst_palette_len !=
25990
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
25991
0
    return 0;
25992
0
  }
25993
0
  size_t dst_len2 = dst_len / 2;
25994
0
  size_t len = (dst_len2 < src_len) ? dst_len2 : src_len;
25995
0
  uint8_t* d = dst_ptr;
25996
0
  const uint8_t* s = src_ptr;
25997
0
  size_t n = len;
25998
25999
  // TODO: unroll.
26000
26001
0
  while (n >= 1) {
26002
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26003
0
                                                          ((size_t)s[0] * 4));
26004
0
    if (s0) {
26005
0
      wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)s0);
26006
0
    }
26007
26008
0
    s += 1 * 1;
26009
0
    d += 1 * 2;
26010
0
    n -= 1;
26011
0
  }
26012
26013
0
  return len;
26014
0
}
26015
26016
// --------
26017
26018
static uint64_t  //
26019
wuffs_private_impl__swizzle_bgr__bgr_565(uint8_t* dst_ptr,
26020
                                         size_t dst_len,
26021
                                         uint8_t* dst_palette_ptr,
26022
                                         size_t dst_palette_len,
26023
                                         const uint8_t* src_ptr,
26024
0
                                         size_t src_len) {
26025
0
  size_t dst_len3 = dst_len / 3;
26026
0
  size_t src_len2 = src_len / 2;
26027
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
26028
0
  uint8_t* d = dst_ptr;
26029
0
  const uint8_t* s = src_ptr;
26030
0
  size_t n = len;
26031
26032
  // TODO: unroll.
26033
26034
0
  while (n >= 1) {
26035
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
26036
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
26037
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26038
26039
0
    s += 1 * 2;
26040
0
    d += 1 * 3;
26041
0
    n -= 1;
26042
0
  }
26043
26044
0
  return len;
26045
0
}
26046
26047
static uint64_t  //
26048
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src(uint8_t* dst_ptr,
26049
                                                     size_t dst_len,
26050
                                                     uint8_t* dst_palette_ptr,
26051
                                                     size_t dst_palette_len,
26052
                                                     const uint8_t* src_ptr,
26053
0
                                                     size_t src_len) {
26054
0
  size_t dst_len3 = dst_len / 3;
26055
0
  size_t src_len4 = src_len / 4;
26056
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26057
0
  uint8_t* d = dst_ptr;
26058
0
  const uint8_t* s = src_ptr;
26059
0
  size_t n = len;
26060
26061
  // TODO: unroll.
26062
26063
0
  while (n >= 1) {
26064
0
    uint32_t s0 =
26065
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
26066
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26067
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26068
26069
0
    s += 1 * 4;
26070
0
    d += 1 * 3;
26071
0
    n -= 1;
26072
0
  }
26073
26074
0
  return len;
26075
0
}
26076
26077
static uint64_t  //
26078
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src(
26079
    uint8_t* dst_ptr,
26080
    size_t dst_len,
26081
    uint8_t* dst_palette_ptr,
26082
    size_t dst_palette_len,
26083
    const uint8_t* src_ptr,
26084
0
    size_t src_len) {
26085
0
  size_t dst_len3 = dst_len / 3;
26086
0
  size_t src_len8 = src_len / 8;
26087
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26088
0
  uint8_t* d = dst_ptr;
26089
0
  const uint8_t* s = src_ptr;
26090
0
  size_t n = len;
26091
26092
  // TODO: unroll.
26093
26094
0
  while (n >= 1) {
26095
0
    uint32_t s0 =
26096
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
26097
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
26098
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26099
26100
0
    s += 1 * 8;
26101
0
    d += 1 * 3;
26102
0
    n -= 1;
26103
0
  }
26104
26105
0
  return len;
26106
0
}
26107
26108
static uint64_t  //
26109
wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over(
26110
    uint8_t* dst_ptr,
26111
    size_t dst_len,
26112
    uint8_t* dst_palette_ptr,
26113
    size_t dst_palette_len,
26114
    const uint8_t* src_ptr,
26115
0
    size_t src_len) {
26116
0
  size_t dst_len3 = dst_len / 3;
26117
0
  size_t src_len4 = src_len / 4;
26118
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26119
0
  uint8_t* d = dst_ptr;
26120
0
  const uint8_t* s = src_ptr;
26121
0
  size_t n = len;
26122
26123
  // TODO: unroll.
26124
26125
0
  while (n >= 1) {
26126
    // Extract 16-bit color components.
26127
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26128
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26129
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26130
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26131
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
26132
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26133
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
26134
26135
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26136
0
    uint32_t ia = 0xFFFF - sa;
26137
26138
    // Composite src (nonpremul) over dst (premul).
26139
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26140
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26141
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26142
26143
    // Convert from 16-bit color to 8-bit color.
26144
0
    d[0] = (uint8_t)(db >> 8);
26145
0
    d[1] = (uint8_t)(dg >> 8);
26146
0
    d[2] = (uint8_t)(dr >> 8);
26147
26148
0
    s += 1 * 4;
26149
0
    d += 1 * 3;
26150
0
    n -= 1;
26151
0
  }
26152
26153
0
  return len;
26154
0
}
26155
26156
static uint64_t  //
26157
wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over(
26158
    uint8_t* dst_ptr,
26159
    size_t dst_len,
26160
    uint8_t* dst_palette_ptr,
26161
    size_t dst_palette_len,
26162
    const uint8_t* src_ptr,
26163
0
    size_t src_len) {
26164
0
  size_t dst_len3 = dst_len / 3;
26165
0
  size_t src_len8 = src_len / 8;
26166
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26167
0
  uint8_t* d = dst_ptr;
26168
0
  const uint8_t* s = src_ptr;
26169
0
  size_t n = len;
26170
26171
  // TODO: unroll.
26172
26173
0
  while (n >= 1) {
26174
    // Extract 16-bit color components.
26175
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26176
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26177
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26178
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26179
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26180
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26181
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26182
26183
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26184
0
    uint32_t ia = 0xFFFF - sa;
26185
26186
    // Composite src (nonpremul) over dst (premul).
26187
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26188
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26189
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26190
26191
    // Convert from 16-bit color to 8-bit color.
26192
0
    d[0] = (uint8_t)(db >> 8);
26193
0
    d[1] = (uint8_t)(dg >> 8);
26194
0
    d[2] = (uint8_t)(dr >> 8);
26195
26196
0
    s += 1 * 8;
26197
0
    d += 1 * 3;
26198
0
    n -= 1;
26199
0
  }
26200
26201
0
  return len;
26202
0
}
26203
26204
static uint64_t  //
26205
wuffs_private_impl__swizzle_bgr__bgra_premul__src(uint8_t* dst_ptr,
26206
                                                  size_t dst_len,
26207
                                                  uint8_t* dst_palette_ptr,
26208
                                                  size_t dst_palette_len,
26209
                                                  const uint8_t* src_ptr,
26210
0
                                                  size_t src_len) {
26211
0
  size_t dst_len3 = dst_len / 3;
26212
0
  size_t src_len4 = src_len / 4;
26213
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26214
0
  uint8_t* d = dst_ptr;
26215
0
  const uint8_t* s = src_ptr;
26216
0
  size_t n = len;
26217
26218
0
  while (n >= 1) {
26219
0
    uint8_t s0 = s[0];
26220
0
    uint8_t s1 = s[1];
26221
0
    uint8_t s2 = s[2];
26222
0
    d[0] = s0;
26223
0
    d[1] = s1;
26224
0
    d[2] = s2;
26225
26226
0
    s += 1 * 4;
26227
0
    d += 1 * 3;
26228
0
    n -= 1;
26229
0
  }
26230
26231
0
  return len;
26232
0
}
26233
26234
static uint64_t  //
26235
wuffs_private_impl__swizzle_bgr__bgra_premul__src_over(uint8_t* dst_ptr,
26236
                                                       size_t dst_len,
26237
                                                       uint8_t* dst_palette_ptr,
26238
                                                       size_t dst_palette_len,
26239
                                                       const uint8_t* src_ptr,
26240
0
                                                       size_t src_len) {
26241
0
  size_t dst_len3 = dst_len / 3;
26242
0
  size_t src_len4 = src_len / 4;
26243
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26244
0
  uint8_t* d = dst_ptr;
26245
0
  const uint8_t* s = src_ptr;
26246
0
  size_t n = len;
26247
26248
0
  while (n >= 1) {
26249
    // Extract 16-bit color components.
26250
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26251
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26252
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26253
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26254
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
26255
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26256
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
26257
26258
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26259
0
    uint32_t ia = 0xFFFF - sa;
26260
26261
    // Composite src (premul) over dst (premul).
26262
0
    dr = sr + ((dr * ia) / 0xFFFF);
26263
0
    dg = sg + ((dg * ia) / 0xFFFF);
26264
0
    db = sb + ((db * ia) / 0xFFFF);
26265
26266
    // Convert from 16-bit color to 8-bit color.
26267
0
    d[0] = (uint8_t)(db >> 8);
26268
0
    d[1] = (uint8_t)(dg >> 8);
26269
0
    d[2] = (uint8_t)(dr >> 8);
26270
26271
0
    s += 1 * 4;
26272
0
    d += 1 * 3;
26273
0
    n -= 1;
26274
0
  }
26275
26276
0
  return len;
26277
0
}
26278
26279
static uint64_t  //
26280
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src(uint8_t* dst_ptr,
26281
                                                     size_t dst_len,
26282
                                                     uint8_t* dst_palette_ptr,
26283
                                                     size_t dst_palette_len,
26284
                                                     const uint8_t* src_ptr,
26285
0
                                                     size_t src_len) {
26286
0
  size_t dst_len3 = dst_len / 3;
26287
0
  size_t src_len4 = src_len / 4;
26288
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26289
0
  uint8_t* d = dst_ptr;
26290
0
  const uint8_t* s = src_ptr;
26291
0
  size_t n = len;
26292
26293
  // TODO: unroll.
26294
26295
0
  while (n >= 1) {
26296
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26297
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
26298
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26299
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26300
26301
0
    s += 1 * 4;
26302
0
    d += 1 * 3;
26303
0
    n -= 1;
26304
0
  }
26305
26306
0
  return len;
26307
0
}
26308
26309
static uint64_t  //
26310
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src(
26311
    uint8_t* dst_ptr,
26312
    size_t dst_len,
26313
    uint8_t* dst_palette_ptr,
26314
    size_t dst_palette_len,
26315
    const uint8_t* src_ptr,
26316
0
    size_t src_len) {
26317
0
  size_t dst_len3 = dst_len / 3;
26318
0
  size_t src_len8 = src_len / 8;
26319
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26320
0
  uint8_t* d = dst_ptr;
26321
0
  const uint8_t* s = src_ptr;
26322
0
  size_t n = len;
26323
26324
  // TODO: unroll.
26325
26326
0
  while (n >= 1) {
26327
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26328
0
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
26329
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
26330
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
26331
26332
0
    s += 1 * 8;
26333
0
    d += 1 * 3;
26334
0
    n -= 1;
26335
0
  }
26336
26337
0
  return len;
26338
0
}
26339
26340
static uint64_t  //
26341
wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over(
26342
    uint8_t* dst_ptr,
26343
    size_t dst_len,
26344
    uint8_t* dst_palette_ptr,
26345
    size_t dst_palette_len,
26346
    const uint8_t* src_ptr,
26347
0
    size_t src_len) {
26348
0
  size_t dst_len3 = dst_len / 3;
26349
0
  size_t src_len4 = src_len / 4;
26350
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26351
0
  uint8_t* d = dst_ptr;
26352
0
  const uint8_t* s = src_ptr;
26353
0
  size_t n = len;
26354
26355
  // TODO: unroll.
26356
26357
0
  while (n >= 1) {
26358
    // Extract 16-bit color components.
26359
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26360
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26361
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26362
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26363
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
26364
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26365
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
26366
26367
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26368
0
    uint32_t ia = 0xFFFF - sa;
26369
26370
    // Composite src (nonpremul) over dst (premul).
26371
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26372
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26373
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26374
26375
    // Convert from 16-bit color to 8-bit color.
26376
0
    d[0] = (uint8_t)(db >> 8);
26377
0
    d[1] = (uint8_t)(dg >> 8);
26378
0
    d[2] = (uint8_t)(dr >> 8);
26379
26380
0
    s += 1 * 4;
26381
0
    d += 1 * 3;
26382
0
    n -= 1;
26383
0
  }
26384
26385
0
  return len;
26386
0
}
26387
26388
static uint64_t  //
26389
wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over(
26390
    uint8_t* dst_ptr,
26391
    size_t dst_len,
26392
    uint8_t* dst_palette_ptr,
26393
    size_t dst_palette_len,
26394
    const uint8_t* src_ptr,
26395
0
    size_t src_len) {
26396
0
  size_t dst_len3 = dst_len / 3;
26397
0
  size_t src_len8 = src_len / 8;
26398
0
  size_t len = (dst_len3 < src_len8) ? dst_len3 : src_len8;
26399
0
  uint8_t* d = dst_ptr;
26400
0
  const uint8_t* s = src_ptr;
26401
0
  size_t n = len;
26402
26403
  // TODO: unroll.
26404
26405
0
  while (n >= 1) {
26406
    // Extract 16-bit color components.
26407
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26408
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26409
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26410
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
26411
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
26412
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
26413
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
26414
26415
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26416
0
    uint32_t ia = 0xFFFF - sa;
26417
26418
    // Composite src (nonpremul) over dst (premul).
26419
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
26420
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
26421
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
26422
26423
    // Convert from 16-bit color to 8-bit color.
26424
0
    d[0] = (uint8_t)(db >> 8);
26425
0
    d[1] = (uint8_t)(dg >> 8);
26426
0
    d[2] = (uint8_t)(dr >> 8);
26427
26428
0
    s += 1 * 8;
26429
0
    d += 1 * 3;
26430
0
    n -= 1;
26431
0
  }
26432
26433
0
  return len;
26434
0
}
26435
26436
static uint64_t  //
26437
wuffs_private_impl__swizzle_bgr__rgba_premul__src(uint8_t* dst_ptr,
26438
                                                  size_t dst_len,
26439
                                                  uint8_t* dst_palette_ptr,
26440
                                                  size_t dst_palette_len,
26441
                                                  const uint8_t* src_ptr,
26442
0
                                                  size_t src_len) {
26443
0
  size_t dst_len3 = dst_len / 3;
26444
0
  size_t src_len4 = src_len / 4;
26445
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26446
0
  uint8_t* d = dst_ptr;
26447
0
  const uint8_t* s = src_ptr;
26448
0
  size_t n = len;
26449
26450
0
  while (n >= 1) {
26451
0
    uint8_t s0 = s[0];
26452
0
    uint8_t s1 = s[1];
26453
0
    uint8_t s2 = s[2];
26454
0
    d[0] = s2;
26455
0
    d[1] = s1;
26456
0
    d[2] = s0;
26457
26458
0
    s += 1 * 4;
26459
0
    d += 1 * 3;
26460
0
    n -= 1;
26461
0
  }
26462
26463
0
  return len;
26464
0
}
26465
26466
static uint64_t  //
26467
wuffs_private_impl__swizzle_bgr__rgba_premul__src_over(uint8_t* dst_ptr,
26468
                                                       size_t dst_len,
26469
                                                       uint8_t* dst_palette_ptr,
26470
                                                       size_t dst_palette_len,
26471
                                                       const uint8_t* src_ptr,
26472
0
                                                       size_t src_len) {
26473
0
  size_t dst_len3 = dst_len / 3;
26474
0
  size_t src_len4 = src_len / 4;
26475
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26476
0
  uint8_t* d = dst_ptr;
26477
0
  const uint8_t* s = src_ptr;
26478
0
  size_t n = len;
26479
26480
0
  while (n >= 1) {
26481
    // Extract 16-bit color components.
26482
0
    uint32_t dr = 0x101 * ((uint32_t)d[2]);
26483
0
    uint32_t dg = 0x101 * ((uint32_t)d[1]);
26484
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
26485
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
26486
0
    uint32_t sb = 0x101 * ((uint32_t)s[2]);
26487
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
26488
0
    uint32_t sr = 0x101 * ((uint32_t)s[0]);
26489
26490
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
26491
0
    uint32_t ia = 0xFFFF - sa;
26492
26493
    // Composite src (premul) over dst (premul).
26494
0
    dr = sr + ((dr * ia) / 0xFFFF);
26495
0
    dg = sg + ((dg * ia) / 0xFFFF);
26496
0
    db = sb + ((db * ia) / 0xFFFF);
26497
26498
    // Convert from 16-bit color to 8-bit color.
26499
0
    d[0] = (uint8_t)(db >> 8);
26500
0
    d[1] = (uint8_t)(dg >> 8);
26501
0
    d[2] = (uint8_t)(dr >> 8);
26502
26503
0
    s += 1 * 4;
26504
0
    d += 1 * 3;
26505
0
    n -= 1;
26506
0
  }
26507
26508
0
  return len;
26509
0
}
26510
26511
static uint64_t  //
26512
wuffs_private_impl__swizzle_bgr__rgbx(uint8_t* dst_ptr,
26513
                                      size_t dst_len,
26514
                                      uint8_t* dst_palette_ptr,
26515
                                      size_t dst_palette_len,
26516
                                      const uint8_t* src_ptr,
26517
0
                                      size_t src_len) {
26518
0
  size_t dst_len3 = dst_len / 3;
26519
0
  size_t src_len4 = src_len / 4;
26520
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
26521
0
  uint8_t* d = dst_ptr;
26522
0
  const uint8_t* s = src_ptr;
26523
0
  size_t n = len;
26524
26525
  // TODO: unroll.
26526
26527
0
  while (n >= 1) {
26528
0
    uint8_t b0 = s[0];
26529
0
    uint8_t b1 = s[1];
26530
0
    uint8_t b2 = s[2];
26531
0
    d[0] = b2;
26532
0
    d[1] = b1;
26533
0
    d[2] = b0;
26534
26535
0
    s += 1 * 4;
26536
0
    d += 1 * 3;
26537
0
    n -= 1;
26538
0
  }
26539
26540
0
  return len;
26541
0
}
26542
26543
// --------
26544
26545
static uint64_t  //
26546
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over(
26547
    uint8_t* dst_ptr,
26548
    size_t dst_len,
26549
    uint8_t* dst_palette_ptr,
26550
    size_t dst_palette_len,
26551
    const uint8_t* src_ptr,
26552
0
    size_t src_len) {
26553
0
  size_t dst_len4 = dst_len / 4;
26554
0
  size_t src_len4 = src_len / 4;
26555
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26556
0
  uint8_t* d = dst_ptr;
26557
0
  const uint8_t* s = src_ptr;
26558
0
  size_t n = len;
26559
26560
0
  while (n >= 1) {
26561
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26562
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26563
0
    wuffs_base__poke_u32le__no_bounds_check(
26564
0
        d + (0 * 4),
26565
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26566
26567
0
    s += 1 * 4;
26568
0
    d += 1 * 4;
26569
0
    n -= 1;
26570
0
  }
26571
26572
0
  return len;
26573
0
}
26574
26575
static uint64_t  //
26576
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src(
26577
    uint8_t* dst_ptr,
26578
    size_t dst_len,
26579
    uint8_t* dst_palette_ptr,
26580
    size_t dst_palette_len,
26581
    const uint8_t* src_ptr,
26582
0
    size_t src_len) {
26583
0
  size_t dst_len4 = dst_len / 4;
26584
0
  size_t src_len8 = src_len / 8;
26585
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26586
0
  uint8_t* d = dst_ptr;
26587
0
  const uint8_t* s = src_ptr;
26588
26589
0
  size_t n = len;
26590
0
  while (n >= 1) {
26591
0
    wuffs_base__poke_u32le__no_bounds_check(
26592
0
        d + (0 * 4), wuffs_base__color_u64__as__color_u32(
26593
0
                         wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
26594
26595
0
    s += 1 * 8;
26596
0
    d += 1 * 4;
26597
0
    n -= 1;
26598
0
  }
26599
0
  return len;
26600
0
}
26601
26602
static uint64_t  //
26603
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over(
26604
    uint8_t* dst_ptr,
26605
    size_t dst_len,
26606
    uint8_t* dst_palette_ptr,
26607
    size_t dst_palette_len,
26608
    const uint8_t* src_ptr,
26609
0
    size_t src_len) {
26610
0
  size_t dst_len4 = dst_len / 4;
26611
0
  size_t src_len8 = src_len / 8;
26612
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
26613
0
  uint8_t* d = dst_ptr;
26614
0
  const uint8_t* s = src_ptr;
26615
0
  size_t n = len;
26616
26617
0
  while (n >= 1) {
26618
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
26619
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
26620
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26621
0
    wuffs_base__poke_u32le__no_bounds_check(
26622
0
        d + (0 * 4),
26623
0
        wuffs_base__color_u64__as__color_u32(
26624
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
26625
0
                                                                       s0)));
26626
26627
0
    s += 1 * 8;
26628
0
    d += 1 * 4;
26629
0
    n -= 1;
26630
0
  }
26631
26632
0
  return len;
26633
0
}
26634
26635
static uint64_t  //
26636
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src(
26637
    uint8_t* dst_ptr,
26638
    size_t dst_len,
26639
    uint8_t* dst_palette_ptr,
26640
    size_t dst_palette_len,
26641
    const uint8_t* src_ptr,
26642
0
    size_t src_len) {
26643
0
  size_t dst_len4 = dst_len / 4;
26644
0
  size_t src_len4 = src_len / 4;
26645
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26646
0
  uint8_t* d = dst_ptr;
26647
0
  const uint8_t* s = src_ptr;
26648
0
  size_t n = len;
26649
26650
0
  while (n >= 1) {
26651
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26652
0
    wuffs_base__poke_u32le__no_bounds_check(
26653
0
        d + (0 * 4),
26654
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
26655
26656
0
    s += 1 * 4;
26657
0
    d += 1 * 4;
26658
0
    n -= 1;
26659
0
  }
26660
26661
0
  return len;
26662
0
}
26663
26664
static uint64_t  //
26665
wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over(
26666
    uint8_t* dst_ptr,
26667
    size_t dst_len,
26668
    uint8_t* dst_palette_ptr,
26669
    size_t dst_palette_len,
26670
    const uint8_t* src_ptr,
26671
0
    size_t src_len) {
26672
0
  size_t dst_len4 = dst_len / 4;
26673
0
  size_t src_len4 = src_len / 4;
26674
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26675
0
  uint8_t* d = dst_ptr;
26676
0
  const uint8_t* s = src_ptr;
26677
0
  size_t n = len;
26678
26679
0
  while (n >= 1) {
26680
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26681
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
26682
0
    wuffs_base__poke_u32le__no_bounds_check(
26683
0
        d + (0 * 4),
26684
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
26685
26686
0
    s += 1 * 4;
26687
0
    d += 1 * 4;
26688
0
    n -= 1;
26689
0
  }
26690
26691
0
  return len;
26692
0
}
26693
26694
static uint64_t  //
26695
wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over(
26696
    uint8_t* dst_ptr,
26697
    size_t dst_len,
26698
    uint8_t* dst_palette_ptr,
26699
    size_t dst_palette_len,
26700
    const uint8_t* src_ptr,
26701
0
    size_t src_len) {
26702
0
  if (dst_palette_len !=
26703
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
26704
0
    return 0;
26705
0
  }
26706
0
  size_t dst_len4 = dst_len / 4;
26707
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
26708
0
  uint8_t* d = dst_ptr;
26709
0
  const uint8_t* s = src_ptr;
26710
0
  size_t n = len;
26711
26712
  // TODO: unroll.
26713
26714
0
  while (n >= 1) {
26715
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26716
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
26717
0
                                                          ((size_t)s[0] * 4));
26718
0
    wuffs_base__poke_u32le__no_bounds_check(
26719
0
        d + (0 * 4),
26720
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26721
26722
0
    s += 1 * 1;
26723
0
    d += 1 * 4;
26724
0
    n -= 1;
26725
0
  }
26726
26727
0
  return len;
26728
0
}
26729
26730
static uint64_t  //
26731
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over(
26732
    uint8_t* dst_ptr,
26733
    size_t dst_len,
26734
    uint8_t* dst_palette_ptr,
26735
    size_t dst_palette_len,
26736
    const uint8_t* src_ptr,
26737
0
    size_t src_len) {
26738
0
  size_t dst_len4 = dst_len / 4;
26739
0
  size_t src_len4 = src_len / 4;
26740
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26741
0
  uint8_t* d = dst_ptr;
26742
0
  const uint8_t* s = src_ptr;
26743
0
  size_t n = len;
26744
26745
0
  while (n >= 1) {
26746
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26747
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26748
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26749
0
    wuffs_base__poke_u32le__no_bounds_check(
26750
0
        d + (0 * 4),
26751
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26752
26753
0
    s += 1 * 4;
26754
0
    d += 1 * 4;
26755
0
    n -= 1;
26756
0
  }
26757
26758
0
  return len;
26759
0
}
26760
26761
static uint64_t  //
26762
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src(
26763
    uint8_t* dst_ptr,
26764
    size_t dst_len,
26765
    uint8_t* dst_palette_ptr,
26766
    size_t dst_palette_len,
26767
    const uint8_t* src_ptr,
26768
0
    size_t src_len) {
26769
0
  size_t dst_len4 = dst_len / 4;
26770
0
  size_t src_len4 = src_len / 4;
26771
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26772
0
  uint8_t* d = dst_ptr;
26773
0
  const uint8_t* s = src_ptr;
26774
0
  size_t n = len;
26775
26776
0
  while (n >= 1) {
26777
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26778
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26779
0
    wuffs_base__poke_u32le__no_bounds_check(
26780
0
        d + (0 * 4),
26781
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(s0));
26782
26783
0
    s += 1 * 4;
26784
0
    d += 1 * 4;
26785
0
    n -= 1;
26786
0
  }
26787
26788
0
  return len;
26789
0
}
26790
26791
static uint64_t  //
26792
wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over(
26793
    uint8_t* dst_ptr,
26794
    size_t dst_len,
26795
    uint8_t* dst_palette_ptr,
26796
    size_t dst_palette_len,
26797
    const uint8_t* src_ptr,
26798
0
    size_t src_len) {
26799
0
  size_t dst_len4 = dst_len / 4;
26800
0
  size_t src_len4 = src_len / 4;
26801
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
26802
0
  uint8_t* d = dst_ptr;
26803
0
  const uint8_t* s = src_ptr;
26804
0
  size_t n = len;
26805
26806
0
  while (n >= 1) {
26807
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26808
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
26809
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26810
0
    wuffs_base__poke_u32le__no_bounds_check(
26811
0
        d + (0 * 4),
26812
0
        wuffs_private_impl__composite_nonpremul_premul_u32_axxx(d0, s0));
26813
26814
0
    s += 1 * 4;
26815
0
    d += 1 * 4;
26816
0
    n -= 1;
26817
0
  }
26818
26819
0
  return len;
26820
0
}
26821
26822
static uint64_t  //
26823
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src(
26824
    uint8_t* dst_ptr,
26825
    size_t dst_len,
26826
    uint8_t* dst_palette_ptr,
26827
    size_t dst_palette_len,
26828
    const uint8_t* src_ptr,
26829
0
    size_t src_len) {
26830
0
  size_t dst_len4 = dst_len / 4;
26831
0
  size_t src_len2 = src_len / 2;
26832
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26833
0
  uint8_t* d = dst_ptr;
26834
0
  const uint8_t* s = src_ptr;
26835
0
  size_t n = len;
26836
26837
  // TODO: unroll.
26838
26839
0
  while (n >= 1) {
26840
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26841
0
    wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
26842
26843
0
    s += 1 * 2;
26844
0
    d += 1 * 4;
26845
0
    n -= 1;
26846
0
  }
26847
26848
0
  return len;
26849
0
}
26850
26851
static uint64_t  //
26852
wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over(
26853
    uint8_t* dst_ptr,
26854
    size_t dst_len,
26855
    uint8_t* dst_palette_ptr,
26856
    size_t dst_palette_len,
26857
    const uint8_t* src_ptr,
26858
0
    size_t src_len) {
26859
0
  size_t dst_len4 = dst_len / 4;
26860
0
  size_t src_len2 = src_len / 2;
26861
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
26862
0
  uint8_t* d = dst_ptr;
26863
0
  const uint8_t* s = src_ptr;
26864
0
  size_t n = len;
26865
26866
  // TODO: unroll.
26867
26868
0
  while (n >= 1) {
26869
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
26870
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
26871
0
    wuffs_base__poke_u32le__no_bounds_check(
26872
0
        d + (0 * 4),
26873
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0));
26874
26875
0
    s += 1 * 2;
26876
0
    d += 1 * 4;
26877
0
    n -= 1;
26878
0
  }
26879
26880
0
  return len;
26881
0
}
26882
26883
// --------
26884
26885
static uint64_t  //
26886
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src(
26887
    uint8_t* dst_ptr,
26888
    size_t dst_len,
26889
    uint8_t* dst_palette_ptr,
26890
    size_t dst_palette_len,
26891
    const uint8_t* src_ptr,
26892
0
    size_t src_len) {
26893
0
  size_t dst_len8 = dst_len / 8;
26894
0
  size_t src_len4 = src_len / 4;
26895
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26896
0
  uint8_t* d = dst_ptr;
26897
0
  const uint8_t* s = src_ptr;
26898
26899
0
  size_t n = len;
26900
0
  while (n >= 1) {
26901
0
    uint8_t s0 = s[0];
26902
0
    uint8_t s1 = s[1];
26903
0
    uint8_t s2 = s[2];
26904
0
    uint8_t s3 = s[3];
26905
0
    d[0] = s0;
26906
0
    d[1] = s0;
26907
0
    d[2] = s1;
26908
0
    d[3] = s1;
26909
0
    d[4] = s2;
26910
0
    d[5] = s2;
26911
0
    d[6] = s3;
26912
0
    d[7] = s3;
26913
26914
0
    s += 1 * 4;
26915
0
    d += 1 * 8;
26916
0
    n -= 1;
26917
0
  }
26918
0
  return len;
26919
0
}
26920
26921
static uint64_t  //
26922
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over(
26923
    uint8_t* dst_ptr,
26924
    size_t dst_len,
26925
    uint8_t* dst_palette_ptr,
26926
    size_t dst_palette_len,
26927
    const uint8_t* src_ptr,
26928
0
    size_t src_len) {
26929
0
  size_t dst_len8 = dst_len / 8;
26930
0
  size_t src_len4 = src_len / 4;
26931
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26932
0
  uint8_t* d = dst_ptr;
26933
0
  const uint8_t* s = src_ptr;
26934
26935
0
  size_t n = len;
26936
0
  while (n >= 1) {
26937
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26938
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26939
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
26940
0
    wuffs_base__poke_u64le__no_bounds_check(
26941
0
        d + (0 * 8),
26942
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26943
26944
0
    s += 1 * 4;
26945
0
    d += 1 * 8;
26946
0
    n -= 1;
26947
0
  }
26948
0
  return len;
26949
0
}
26950
26951
static uint64_t  //
26952
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over(
26953
    uint8_t* dst_ptr,
26954
    size_t dst_len,
26955
    uint8_t* dst_palette_ptr,
26956
    size_t dst_palette_len,
26957
    const uint8_t* src_ptr,
26958
0
    size_t src_len) {
26959
0
  size_t dst_len8 = dst_len / 8;
26960
0
  size_t src_len8 = src_len / 8;
26961
0
  size_t len = (dst_len8 < src_len8) ? dst_len8 : src_len8;
26962
0
  uint8_t* d = dst_ptr;
26963
0
  const uint8_t* s = src_ptr;
26964
26965
0
  size_t n = len;
26966
0
  while (n >= 1) {
26967
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
26968
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
26969
0
    wuffs_base__poke_u64le__no_bounds_check(
26970
0
        d + (0 * 8),
26971
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
26972
26973
0
    s += 1 * 8;
26974
0
    d += 1 * 8;
26975
0
    n -= 1;
26976
0
  }
26977
0
  return len;
26978
0
}
26979
26980
static uint64_t  //
26981
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src(
26982
    uint8_t* dst_ptr,
26983
    size_t dst_len,
26984
    uint8_t* dst_palette_ptr,
26985
    size_t dst_palette_len,
26986
    const uint8_t* src_ptr,
26987
0
    size_t src_len) {
26988
0
  size_t dst_len8 = dst_len / 8;
26989
0
  size_t src_len4 = src_len / 4;
26990
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
26991
0
  uint8_t* d = dst_ptr;
26992
0
  const uint8_t* s = src_ptr;
26993
26994
0
  size_t n = len;
26995
0
  while (n >= 1) {
26996
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
26997
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
26998
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
26999
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27000
27001
0
    s += 1 * 4;
27002
0
    d += 1 * 8;
27003
0
    n -= 1;
27004
0
  }
27005
0
  return len;
27006
0
}
27007
27008
static uint64_t  //
27009
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over(
27010
    uint8_t* dst_ptr,
27011
    size_t dst_len,
27012
    uint8_t* dst_palette_ptr,
27013
    size_t dst_palette_len,
27014
    const uint8_t* src_ptr,
27015
0
    size_t src_len) {
27016
0
  size_t dst_len8 = dst_len / 8;
27017
0
  size_t src_len4 = src_len / 4;
27018
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27019
0
  uint8_t* d = dst_ptr;
27020
0
  const uint8_t* s = src_ptr;
27021
27022
0
  size_t n = len;
27023
0
  while (n >= 1) {
27024
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27025
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27026
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27027
0
    wuffs_base__poke_u64le__no_bounds_check(
27028
0
        d + (0 * 8),
27029
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
27030
27031
0
    s += 1 * 4;
27032
0
    d += 1 * 8;
27033
0
    n -= 1;
27034
0
  }
27035
0
  return len;
27036
0
}
27037
27038
static uint64_t  //
27039
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over(
27040
    uint8_t* dst_ptr,
27041
    size_t dst_len,
27042
    uint8_t* dst_palette_ptr,
27043
    size_t dst_palette_len,
27044
    const uint8_t* src_ptr,
27045
0
    size_t src_len) {
27046
0
  if (dst_palette_len !=
27047
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27048
0
    return 0;
27049
0
  }
27050
0
  size_t dst_len8 = dst_len / 8;
27051
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
27052
0
  uint8_t* d = dst_ptr;
27053
0
  const uint8_t* s = src_ptr;
27054
0
  size_t n = len;
27055
27056
0
  while (n >= 1) {
27057
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27058
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27059
0
        wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27060
0
                                                ((size_t)s[0] * 4)));
27061
0
    wuffs_base__poke_u64le__no_bounds_check(
27062
0
        d + (0 * 8),
27063
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27064
27065
0
    s += 1 * 1;
27066
0
    d += 1 * 8;
27067
0
    n -= 1;
27068
0
  }
27069
27070
0
  return len;
27071
0
}
27072
27073
static uint64_t  //
27074
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src(
27075
    uint8_t* dst_ptr,
27076
    size_t dst_len,
27077
    uint8_t* dst_palette_ptr,
27078
    size_t dst_palette_len,
27079
    const uint8_t* src_ptr,
27080
0
    size_t src_len) {
27081
0
  size_t dst_len8 = dst_len / 8;
27082
0
  size_t src_len4 = src_len / 4;
27083
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27084
0
  uint8_t* d = dst_ptr;
27085
0
  const uint8_t* s = src_ptr;
27086
27087
0
  size_t n = len;
27088
0
  while (n >= 1) {
27089
0
    uint8_t s0 = s[0];
27090
0
    uint8_t s1 = s[1];
27091
0
    uint8_t s2 = s[2];
27092
0
    uint8_t s3 = s[3];
27093
0
    d[0] = s2;
27094
0
    d[1] = s2;
27095
0
    d[2] = s1;
27096
0
    d[3] = s1;
27097
0
    d[4] = s0;
27098
0
    d[5] = s0;
27099
0
    d[6] = s3;
27100
0
    d[7] = s3;
27101
27102
0
    s += 1 * 4;
27103
0
    d += 1 * 8;
27104
0
    n -= 1;
27105
0
  }
27106
0
  return len;
27107
0
}
27108
27109
static uint64_t  //
27110
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over(
27111
    uint8_t* dst_ptr,
27112
    size_t dst_len,
27113
    uint8_t* dst_palette_ptr,
27114
    size_t dst_palette_len,
27115
    const uint8_t* src_ptr,
27116
0
    size_t src_len) {
27117
0
  size_t dst_len8 = dst_len / 8;
27118
0
  size_t src_len4 = src_len / 4;
27119
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27120
0
  uint8_t* d = dst_ptr;
27121
0
  const uint8_t* s = src_ptr;
27122
27123
0
  size_t n = len;
27124
0
  while (n >= 1) {
27125
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27126
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27127
0
        wuffs_private_impl__swap_u32_argb_abgr(
27128
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
27129
0
    wuffs_base__poke_u64le__no_bounds_check(
27130
0
        d + (0 * 8),
27131
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27132
27133
0
    s += 1 * 4;
27134
0
    d += 1 * 8;
27135
0
    n -= 1;
27136
0
  }
27137
0
  return len;
27138
0
}
27139
27140
static uint64_t  //
27141
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src(
27142
    uint8_t* dst_ptr,
27143
    size_t dst_len,
27144
    uint8_t* dst_palette_ptr,
27145
    size_t dst_palette_len,
27146
    const uint8_t* src_ptr,
27147
0
    size_t src_len) {
27148
0
  size_t dst_len8 = dst_len / 8;
27149
0
  size_t src_len4 = src_len / 4;
27150
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27151
0
  uint8_t* d = dst_ptr;
27152
0
  const uint8_t* s = src_ptr;
27153
27154
0
  size_t n = len;
27155
0
  while (n >= 1) {
27156
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27157
0
        wuffs_base__color_u32_argb_premul__as__color_u32_argb_nonpremul(
27158
0
            wuffs_private_impl__swap_u32_argb_abgr(
27159
0
                wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)))));
27160
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27161
27162
0
    s += 1 * 4;
27163
0
    d += 1 * 8;
27164
0
    n -= 1;
27165
0
  }
27166
0
  return len;
27167
0
}
27168
27169
static uint64_t  //
27170
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over(
27171
    uint8_t* dst_ptr,
27172
    size_t dst_len,
27173
    uint8_t* dst_palette_ptr,
27174
    size_t dst_palette_len,
27175
    const uint8_t* src_ptr,
27176
0
    size_t src_len) {
27177
0
  size_t dst_len8 = dst_len / 8;
27178
0
  size_t src_len4 = src_len / 4;
27179
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
27180
0
  uint8_t* d = dst_ptr;
27181
0
  const uint8_t* s = src_ptr;
27182
27183
0
  size_t n = len;
27184
0
  while (n >= 1) {
27185
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27186
0
    uint64_t s0 = wuffs_base__color_u32__as__color_u64(
27187
0
        wuffs_private_impl__swap_u32_argb_abgr(
27188
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
27189
0
    wuffs_base__poke_u64le__no_bounds_check(
27190
0
        d + (0 * 8),
27191
0
        wuffs_private_impl__composite_nonpremul_premul_u64_axxx(d0, s0));
27192
27193
0
    s += 1 * 4;
27194
0
    d += 1 * 8;
27195
0
    n -= 1;
27196
0
  }
27197
0
  return len;
27198
0
}
27199
27200
static uint64_t  //
27201
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src(
27202
    uint8_t* dst_ptr,
27203
    size_t dst_len,
27204
    uint8_t* dst_palette_ptr,
27205
    size_t dst_palette_len,
27206
    const uint8_t* src_ptr,
27207
0
    size_t src_len) {
27208
0
  size_t dst_len8 = dst_len / 8;
27209
0
  size_t src_len2 = src_len / 2;
27210
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27211
0
  uint8_t* d = dst_ptr;
27212
0
  const uint8_t* s = src_ptr;
27213
27214
0
  size_t n = len;
27215
0
  while (n >= 1) {
27216
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
27217
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
27218
0
    wuffs_base__poke_u64le__no_bounds_check(d + (0 * 8), s0);
27219
27220
0
    s += 1 * 2;
27221
0
    d += 1 * 8;
27222
0
    n -= 1;
27223
0
  }
27224
0
  return len;
27225
0
}
27226
27227
static uint64_t  //
27228
wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over(
27229
    uint8_t* dst_ptr,
27230
    size_t dst_len,
27231
    uint8_t* dst_palette_ptr,
27232
    size_t dst_palette_len,
27233
    const uint8_t* src_ptr,
27234
0
    size_t src_len) {
27235
0
  size_t dst_len8 = dst_len / 8;
27236
0
  size_t src_len2 = src_len / 2;
27237
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27238
0
  uint8_t* d = dst_ptr;
27239
0
  const uint8_t* s = src_ptr;
27240
27241
0
  size_t n = len;
27242
0
  while (n >= 1) {
27243
0
    uint64_t d0 = wuffs_base__peek_u64le__no_bounds_check(d + (0 * 8));
27244
0
    uint64_t s0 = ((uint64_t)(s[1]) * 0x0101000000000000) |
27245
0
                  ((uint64_t)(s[0]) * 0x0000010101010101);
27246
0
    wuffs_base__poke_u64le__no_bounds_check(
27247
0
        d + (0 * 8),
27248
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0, s0));
27249
27250
0
    s += 1 * 2;
27251
0
    d += 1 * 8;
27252
0
    n -= 1;
27253
0
  }
27254
0
  return len;
27255
0
}
27256
27257
// --------
27258
27259
static uint64_t  //
27260
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
27261
    uint8_t* dst_ptr,
27262
    size_t dst_len,
27263
    uint8_t* dst_palette_ptr,
27264
    size_t dst_palette_len,
27265
    const uint8_t* src_ptr,
27266
5.90M
    size_t src_len) {
27267
5.90M
  size_t dst_len4 = dst_len / 4;
27268
5.90M
  size_t src_len4 = src_len / 4;
27269
5.90M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27270
5.90M
  uint8_t* d = dst_ptr;
27271
5.90M
  const uint8_t* s = src_ptr;
27272
5.90M
  size_t n = len;
27273
27274
  // TODO: unroll.
27275
27276
11.8M
  while (n >= 1) {
27277
5.93M
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27278
5.93M
    wuffs_base__poke_u32le__no_bounds_check(
27279
5.93M
        d + (0 * 4),
27280
5.93M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
27281
27282
5.93M
    s += 1 * 4;
27283
5.93M
    d += 1 * 4;
27284
5.93M
    n -= 1;
27285
5.93M
  }
27286
27287
5.90M
  return len;
27288
5.90M
}
27289
27290
static uint64_t  //
27291
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src(
27292
    uint8_t* dst_ptr,
27293
    size_t dst_len,
27294
    uint8_t* dst_palette_ptr,
27295
    size_t dst_palette_len,
27296
    const uint8_t* src_ptr,
27297
15.4M
    size_t src_len) {
27298
15.4M
  size_t dst_len4 = dst_len / 4;
27299
15.4M
  size_t src_len8 = src_len / 8;
27300
15.4M
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27301
15.4M
  uint8_t* d = dst_ptr;
27302
15.4M
  const uint8_t* s = src_ptr;
27303
15.4M
  size_t n = len;
27304
27305
  // TODO: unroll.
27306
27307
30.8M
  while (n >= 1) {
27308
15.4M
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27309
15.4M
    wuffs_base__poke_u32le__no_bounds_check(
27310
15.4M
        d + (0 * 4),
27311
15.4M
        wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(s0));
27312
27313
15.4M
    s += 1 * 8;
27314
15.4M
    d += 1 * 4;
27315
15.4M
    n -= 1;
27316
15.4M
  }
27317
27318
15.4M
  return len;
27319
15.4M
}
27320
27321
static uint64_t  //
27322
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over(
27323
    uint8_t* dst_ptr,
27324
    size_t dst_len,
27325
    uint8_t* dst_palette_ptr,
27326
    size_t dst_palette_len,
27327
    const uint8_t* src_ptr,
27328
0
    size_t src_len) {
27329
0
  size_t dst_len4 = dst_len / 4;
27330
0
  size_t src_len4 = src_len / 4;
27331
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27332
0
  uint8_t* d = dst_ptr;
27333
0
  const uint8_t* s = src_ptr;
27334
0
  size_t n = len;
27335
27336
  // TODO: unroll.
27337
27338
0
  while (n >= 1) {
27339
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27340
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27341
0
    wuffs_base__poke_u32le__no_bounds_check(
27342
0
        d + (0 * 4),
27343
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27344
27345
0
    s += 1 * 4;
27346
0
    d += 1 * 4;
27347
0
    n -= 1;
27348
0
  }
27349
27350
0
  return len;
27351
0
}
27352
27353
static uint64_t  //
27354
wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over(
27355
    uint8_t* dst_ptr,
27356
    size_t dst_len,
27357
    uint8_t* dst_palette_ptr,
27358
    size_t dst_palette_len,
27359
    const uint8_t* src_ptr,
27360
0
    size_t src_len) {
27361
0
  size_t dst_len4 = dst_len / 4;
27362
0
  size_t src_len8 = src_len / 8;
27363
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27364
0
  uint8_t* d = dst_ptr;
27365
0
  const uint8_t* s = src_ptr;
27366
0
  size_t n = len;
27367
27368
  // TODO: unroll.
27369
27370
0
  while (n >= 1) {
27371
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27372
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27373
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27374
0
    wuffs_base__poke_u32le__no_bounds_check(
27375
0
        d + (0 * 4),
27376
0
        wuffs_base__color_u64__as__color_u32(
27377
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
27378
27379
0
    s += 1 * 8;
27380
0
    d += 1 * 4;
27381
0
    n -= 1;
27382
0
  }
27383
27384
0
  return len;
27385
0
}
27386
27387
static uint64_t  //
27388
wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over(
27389
    uint8_t* dst_ptr,
27390
    size_t dst_len,
27391
    uint8_t* dst_palette_ptr,
27392
    size_t dst_palette_len,
27393
    const uint8_t* src_ptr,
27394
0
    size_t src_len) {
27395
0
  size_t dst_len4 = dst_len / 4;
27396
0
  size_t src_len4 = src_len / 4;
27397
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27398
0
  uint8_t* d = dst_ptr;
27399
0
  const uint8_t* s = src_ptr;
27400
0
  size_t n = len;
27401
27402
  // TODO: unroll.
27403
27404
0
  while (n >= 1) {
27405
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27406
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
27407
0
    wuffs_base__poke_u32le__no_bounds_check(
27408
0
        d + (0 * 4),
27409
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
27410
27411
0
    s += 1 * 4;
27412
0
    d += 1 * 4;
27413
0
    n -= 1;
27414
0
  }
27415
27416
0
  return len;
27417
0
}
27418
27419
static uint64_t  //
27420
wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over(
27421
    uint8_t* dst_ptr,
27422
    size_t dst_len,
27423
    uint8_t* dst_palette_ptr,
27424
    size_t dst_palette_len,
27425
    const uint8_t* src_ptr,
27426
0
    size_t src_len) {
27427
0
  if (dst_palette_len !=
27428
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
27429
0
    return 0;
27430
0
  }
27431
0
  size_t dst_len4 = dst_len / 4;
27432
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
27433
0
  uint8_t* d = dst_ptr;
27434
0
  const uint8_t* s = src_ptr;
27435
0
  size_t n = len;
27436
27437
  // TODO: unroll.
27438
27439
0
  while (n >= 1) {
27440
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27441
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
27442
0
                                                          ((size_t)s[0] * 4));
27443
0
    wuffs_base__poke_u32le__no_bounds_check(
27444
0
        d + (0 * 4),
27445
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27446
27447
0
    s += 1 * 1;
27448
0
    d += 1 * 4;
27449
0
    n -= 1;
27450
0
  }
27451
27452
0
  return len;
27453
0
}
27454
27455
static uint64_t  //
27456
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
27457
    uint8_t* dst_ptr,
27458
    size_t dst_len,
27459
    uint8_t* dst_palette_ptr,
27460
    size_t dst_palette_len,
27461
    const uint8_t* src_ptr,
27462
56.0M
    size_t src_len) {
27463
56.0M
  size_t dst_len4 = dst_len / 4;
27464
56.0M
  size_t src_len4 = src_len / 4;
27465
56.0M
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27466
56.0M
  uint8_t* d = dst_ptr;
27467
56.0M
  const uint8_t* s = src_ptr;
27468
56.0M
  size_t n = len;
27469
27470
  // TODO: unroll.
27471
27472
164M
  while (n >= 1) {
27473
108M
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27474
108M
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27475
108M
    wuffs_base__poke_u32le__no_bounds_check(
27476
108M
        d + (0 * 4),
27477
108M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
27478
27479
108M
    s += 1 * 4;
27480
108M
    d += 1 * 4;
27481
108M
    n -= 1;
27482
108M
  }
27483
27484
56.0M
  return len;
27485
56.0M
}
27486
27487
static uint64_t  //
27488
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over(
27489
    uint8_t* dst_ptr,
27490
    size_t dst_len,
27491
    uint8_t* dst_palette_ptr,
27492
    size_t dst_palette_len,
27493
    const uint8_t* src_ptr,
27494
0
    size_t src_len) {
27495
0
  size_t dst_len4 = dst_len / 4;
27496
0
  size_t src_len4 = src_len / 4;
27497
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27498
0
  uint8_t* d = dst_ptr;
27499
0
  const uint8_t* s = src_ptr;
27500
0
  size_t n = len;
27501
27502
  // TODO: unroll.
27503
27504
0
  while (n >= 1) {
27505
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27506
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27507
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27508
0
    wuffs_base__poke_u32le__no_bounds_check(
27509
0
        d + (0 * 4),
27510
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27511
27512
0
    s += 1 * 4;
27513
0
    d += 1 * 4;
27514
0
    n -= 1;
27515
0
  }
27516
27517
0
  return len;
27518
0
}
27519
27520
static uint64_t  //
27521
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src(
27522
    uint8_t* dst_ptr,
27523
    size_t dst_len,
27524
    uint8_t* dst_palette_ptr,
27525
    size_t dst_palette_len,
27526
    const uint8_t* src_ptr,
27527
0
    size_t src_len) {
27528
0
  size_t dst_len4 = dst_len / 4;
27529
0
  size_t src_len8 = src_len / 8;
27530
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27531
0
  uint8_t* d = dst_ptr;
27532
0
  const uint8_t* s = src_ptr;
27533
0
  size_t n = len;
27534
27535
  // TODO: unroll.
27536
27537
0
  while (n >= 1) {
27538
0
    uint64_t s0 = wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8));
27539
0
    wuffs_base__poke_u32le__no_bounds_check(
27540
0
        d + (0 * 4),
27541
0
        wuffs_private_impl__swap_u32_argb_abgr(
27542
0
            wuffs_base__color_u64_argb_nonpremul__as__color_u32_argb_premul(
27543
0
                s0)));
27544
27545
0
    s += 1 * 8;
27546
0
    d += 1 * 4;
27547
0
    n -= 1;
27548
0
  }
27549
27550
0
  return len;
27551
0
}
27552
27553
static uint64_t  //
27554
wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over(
27555
    uint8_t* dst_ptr,
27556
    size_t dst_len,
27557
    uint8_t* dst_palette_ptr,
27558
    size_t dst_palette_len,
27559
    const uint8_t* src_ptr,
27560
0
    size_t src_len) {
27561
0
  size_t dst_len4 = dst_len / 4;
27562
0
  size_t src_len8 = src_len / 8;
27563
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
27564
0
  uint8_t* d = dst_ptr;
27565
0
  const uint8_t* s = src_ptr;
27566
0
  size_t n = len;
27567
27568
  // TODO: unroll.
27569
27570
0
  while (n >= 1) {
27571
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
27572
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
27573
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
27574
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
27575
0
    wuffs_base__poke_u32le__no_bounds_check(
27576
0
        d + (0 * 4),
27577
0
        wuffs_base__color_u64__as__color_u32(
27578
0
            wuffs_private_impl__composite_premul_nonpremul_u64_axxx(d0, s0)));
27579
27580
0
    s += 1 * 8;
27581
0
    d += 1 * 4;
27582
0
    n -= 1;
27583
0
  }
27584
27585
0
  return len;
27586
0
}
27587
27588
static uint64_t  //
27589
wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over(
27590
    uint8_t* dst_ptr,
27591
    size_t dst_len,
27592
    uint8_t* dst_palette_ptr,
27593
    size_t dst_palette_len,
27594
    const uint8_t* src_ptr,
27595
0
    size_t src_len) {
27596
0
  size_t dst_len4 = dst_len / 4;
27597
0
  size_t src_len4 = src_len / 4;
27598
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27599
0
  uint8_t* d = dst_ptr;
27600
0
  const uint8_t* s = src_ptr;
27601
0
  size_t n = len;
27602
27603
0
  while (n >= 1) {
27604
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27605
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
27606
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27607
0
    wuffs_base__poke_u32le__no_bounds_check(
27608
0
        d + (0 * 4),
27609
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
27610
27611
0
    s += 1 * 4;
27612
0
    d += 1 * 4;
27613
0
    n -= 1;
27614
0
  }
27615
27616
0
  return len;
27617
0
}
27618
27619
static uint64_t  //
27620
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src(
27621
    uint8_t* dst_ptr,
27622
    size_t dst_len,
27623
    uint8_t* dst_palette_ptr,
27624
    size_t dst_palette_len,
27625
    const uint8_t* src_ptr,
27626
2.93M
    size_t src_len) {
27627
2.93M
  size_t dst_len4 = dst_len / 4;
27628
2.93M
  size_t src_len2 = src_len / 2;
27629
2.93M
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27630
2.93M
  uint8_t* d = dst_ptr;
27631
2.93M
  const uint8_t* s = src_ptr;
27632
2.93M
  size_t n = len;
27633
27634
  // TODO: unroll.
27635
27636
5.86M
  while (n >= 1) {
27637
2.93M
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27638
2.93M
    wuffs_base__poke_u32le__no_bounds_check(
27639
2.93M
        d + (0 * 4),
27640
2.93M
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
27641
27642
2.93M
    s += 1 * 2;
27643
2.93M
    d += 1 * 4;
27644
2.93M
    n -= 1;
27645
2.93M
  }
27646
27647
2.93M
  return len;
27648
2.93M
}
27649
27650
static uint64_t  //
27651
wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over(
27652
    uint8_t* dst_ptr,
27653
    size_t dst_len,
27654
    uint8_t* dst_palette_ptr,
27655
    size_t dst_palette_len,
27656
    const uint8_t* src_ptr,
27657
0
    size_t src_len) {
27658
0
  size_t dst_len4 = dst_len / 4;
27659
0
  size_t src_len2 = src_len / 2;
27660
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27661
0
  uint8_t* d = dst_ptr;
27662
0
  const uint8_t* s = src_ptr;
27663
0
  size_t n = len;
27664
27665
  // TODO: unroll.
27666
27667
0
  while (n >= 1) {
27668
0
    uint32_t d0 = wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4));
27669
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
27670
0
    wuffs_base__poke_u32le__no_bounds_check(
27671
0
        d + (0 * 4),
27672
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
27673
27674
0
    s += 1 * 2;
27675
0
    d += 1 * 4;
27676
0
    n -= 1;
27677
0
  }
27678
27679
0
  return len;
27680
0
}
27681
27682
// --------
27683
27684
static uint64_t  //
27685
wuffs_private_impl__swizzle_bgrw__bgr(uint8_t* dst_ptr,
27686
                                      size_t dst_len,
27687
                                      uint8_t* dst_palette_ptr,
27688
                                      size_t dst_palette_len,
27689
                                      const uint8_t* src_ptr,
27690
0
                                      size_t src_len) {
27691
0
  size_t dst_len4 = dst_len / 4;
27692
0
  size_t src_len3 = src_len / 3;
27693
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27694
0
  uint8_t* d = dst_ptr;
27695
0
  const uint8_t* s = src_ptr;
27696
0
  size_t n = len;
27697
27698
  // TODO: unroll.
27699
27700
0
  while (n >= 1) {
27701
0
    wuffs_base__poke_u32le__no_bounds_check(
27702
0
        d + (0 * 4),
27703
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3)));
27704
27705
0
    s += 1 * 3;
27706
0
    d += 1 * 4;
27707
0
    n -= 1;
27708
0
  }
27709
27710
0
  return len;
27711
0
}
27712
27713
static uint64_t  //
27714
wuffs_private_impl__swizzle_bgrw__bgr_565(uint8_t* dst_ptr,
27715
                                          size_t dst_len,
27716
                                          uint8_t* dst_palette_ptr,
27717
                                          size_t dst_palette_len,
27718
                                          const uint8_t* src_ptr,
27719
0
                                          size_t src_len) {
27720
0
  size_t dst_len4 = dst_len / 4;
27721
0
  size_t src_len2 = src_len / 2;
27722
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
27723
0
  uint8_t* d = dst_ptr;
27724
0
  const uint8_t* s = src_ptr;
27725
0
  size_t n = len;
27726
27727
  // TODO: unroll.
27728
27729
0
  while (n >= 1) {
27730
0
    wuffs_base__poke_u32le__no_bounds_check(
27731
0
        d + (0 * 4), wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
27732
0
                         wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
27733
27734
0
    s += 1 * 2;
27735
0
    d += 1 * 4;
27736
0
    n -= 1;
27737
0
  }
27738
27739
0
  return len;
27740
0
}
27741
27742
static uint64_t  //
27743
wuffs_private_impl__swizzle_bgrw__bgrx(uint8_t* dst_ptr,
27744
                                       size_t dst_len,
27745
                                       uint8_t* dst_palette_ptr,
27746
                                       size_t dst_palette_len,
27747
                                       const uint8_t* src_ptr,
27748
0
                                       size_t src_len) {
27749
0
  size_t dst_len4 = dst_len / 4;
27750
0
  size_t src_len4 = src_len / 4;
27751
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27752
0
  uint8_t* d = dst_ptr;
27753
0
  const uint8_t* s = src_ptr;
27754
0
  size_t n = len;
27755
27756
  // TODO: unroll.
27757
27758
0
  while (n >= 1) {
27759
0
    wuffs_base__poke_u32le__no_bounds_check(
27760
0
        d + (0 * 4),
27761
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
27762
27763
0
    s += 1 * 4;
27764
0
    d += 1 * 4;
27765
0
    n -= 1;
27766
0
  }
27767
27768
0
  return len;
27769
0
}
27770
27771
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
27772
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27773
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
27774
static uint64_t  //
27775
wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42(uint8_t* dst_ptr,
27776
                                                 size_t dst_len,
27777
                                                 uint8_t* dst_palette_ptr,
27778
                                                 size_t dst_palette_len,
27779
                                                 const uint8_t* src_ptr,
27780
0
                                                 size_t src_len) {
27781
0
  size_t dst_len4 = dst_len / 4;
27782
0
  size_t src_len3 = src_len / 3;
27783
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27784
0
  uint8_t* d = dst_ptr;
27785
0
  const uint8_t* s = src_ptr;
27786
0
  size_t n = len;
27787
27788
0
  __m128i shuffle = _mm_set_epi8(+0x00, +0x0B, +0x0A, +0x09,  //
27789
0
                                 +0x00, +0x08, +0x07, +0x06,  //
27790
0
                                 +0x00, +0x05, +0x04, +0x03,  //
27791
0
                                 +0x00, +0x02, +0x01, +0x00);
27792
0
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
27793
0
                               -0x01, +0x00, +0x00, +0x00,  //
27794
0
                               -0x01, +0x00, +0x00, +0x00,  //
27795
0
                               -0x01, +0x00, +0x00, +0x00);
27796
27797
0
  while (n >= 6) {
27798
0
    __m128i x;
27799
0
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
27800
0
    x = _mm_shuffle_epi8(x, shuffle);
27801
0
    x = _mm_or_si128(x, or_ff);
27802
0
    _mm_storeu_si128((__m128i*)(void*)d, x);
27803
27804
0
    s += 4 * 3;
27805
0
    d += 4 * 4;
27806
0
    n -= 4;
27807
0
  }
27808
27809
0
  while (n >= 1) {
27810
0
    uint8_t b0 = s[0];
27811
0
    uint8_t b1 = s[1];
27812
0
    uint8_t b2 = s[2];
27813
0
    d[0] = b0;
27814
0
    d[1] = b1;
27815
0
    d[2] = b2;
27816
0
    d[3] = 0xFF;
27817
27818
0
    s += 1 * 3;
27819
0
    d += 1 * 4;
27820
0
    n -= 1;
27821
0
  }
27822
27823
0
  return len;
27824
0
}
27825
27826
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
27827
static uint64_t  //
27828
wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42(uint8_t* dst_ptr,
27829
                                                 size_t dst_len,
27830
                                                 uint8_t* dst_palette_ptr,
27831
                                                 size_t dst_palette_len,
27832
                                                 const uint8_t* src_ptr,
27833
5.08M
                                                 size_t src_len) {
27834
5.08M
  size_t dst_len4 = dst_len / 4;
27835
5.08M
  size_t src_len3 = src_len / 3;
27836
5.08M
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27837
5.08M
  uint8_t* d = dst_ptr;
27838
5.08M
  const uint8_t* s = src_ptr;
27839
5.08M
  size_t n = len;
27840
27841
5.08M
  __m128i shuffle = _mm_set_epi8(+0x00, +0x09, +0x0A, +0x0B,  //
27842
5.08M
                                 +0x00, +0x06, +0x07, +0x08,  //
27843
5.08M
                                 +0x00, +0x03, +0x04, +0x05,  //
27844
5.08M
                                 +0x00, +0x00, +0x01, +0x02);
27845
5.08M
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
27846
5.08M
                               -0x01, +0x00, +0x00, +0x00,  //
27847
5.08M
                               -0x01, +0x00, +0x00, +0x00,  //
27848
5.08M
                               -0x01, +0x00, +0x00, +0x00);
27849
27850
5.34M
  while (n >= 6) {
27851
262k
    __m128i x;
27852
262k
    x = _mm_lddqu_si128((const __m128i*)(const void*)s);
27853
262k
    x = _mm_shuffle_epi8(x, shuffle);
27854
262k
    x = _mm_or_si128(x, or_ff);
27855
262k
    _mm_storeu_si128((__m128i*)(void*)d, x);
27856
27857
262k
    s += 4 * 3;
27858
262k
    d += 4 * 4;
27859
262k
    n -= 4;
27860
262k
  }
27861
27862
16.0M
  while (n >= 1) {
27863
10.9M
    uint8_t b0 = s[0];
27864
10.9M
    uint8_t b1 = s[1];
27865
10.9M
    uint8_t b2 = s[2];
27866
10.9M
    d[0] = b2;
27867
10.9M
    d[1] = b1;
27868
10.9M
    d[2] = b0;
27869
10.9M
    d[3] = 0xFF;
27870
27871
10.9M
    s += 1 * 3;
27872
10.9M
    d += 1 * 4;
27873
10.9M
    n -= 1;
27874
10.9M
  }
27875
27876
5.08M
  return len;
27877
5.08M
}
27878
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
27879
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
27880
27881
static uint64_t  //
27882
wuffs_private_impl__swizzle_bgrw__rgb(uint8_t* dst_ptr,
27883
                                      size_t dst_len,
27884
                                      uint8_t* dst_palette_ptr,
27885
                                      size_t dst_palette_len,
27886
                                      const uint8_t* src_ptr,
27887
0
                                      size_t src_len) {
27888
0
  size_t dst_len4 = dst_len / 4;
27889
0
  size_t src_len3 = src_len / 3;
27890
0
  size_t len = (dst_len4 < src_len3) ? dst_len4 : src_len3;
27891
0
  uint8_t* d = dst_ptr;
27892
0
  const uint8_t* s = src_ptr;
27893
0
  size_t n = len;
27894
27895
0
  while (n >= 1) {
27896
0
    uint8_t b0 = s[0];
27897
0
    uint8_t b1 = s[1];
27898
0
    uint8_t b2 = s[2];
27899
0
    d[0] = b2;
27900
0
    d[1] = b1;
27901
0
    d[2] = b0;
27902
0
    d[3] = 0xFF;
27903
27904
0
    s += 1 * 3;
27905
0
    d += 1 * 4;
27906
0
    n -= 1;
27907
0
  }
27908
27909
0
  return len;
27910
0
}
27911
27912
static uint64_t  //
27913
wuffs_private_impl__swizzle_bgrw__rgbx(uint8_t* dst_ptr,
27914
                                       size_t dst_len,
27915
                                       uint8_t* dst_palette_ptr,
27916
                                       size_t dst_palette_len,
27917
                                       const uint8_t* src_ptr,
27918
0
                                       size_t src_len) {
27919
0
  size_t dst_len4 = dst_len / 4;
27920
0
  size_t src_len4 = src_len / 4;
27921
0
  size_t len = (dst_len4 < src_len4) ? dst_len4 : src_len4;
27922
0
  uint8_t* d = dst_ptr;
27923
0
  const uint8_t* s = src_ptr;
27924
0
  size_t n = len;
27925
27926
  // TODO: unroll.
27927
27928
0
  while (n >= 1) {
27929
0
    uint8_t b0 = s[0];
27930
0
    uint8_t b1 = s[1];
27931
0
    uint8_t b2 = s[2];
27932
0
    d[0] = b2;
27933
0
    d[1] = b1;
27934
0
    d[2] = b0;
27935
0
    d[3] = 0xFF;
27936
27937
0
    s += 1 * 4;
27938
0
    d += 1 * 4;
27939
0
    n -= 1;
27940
0
  }
27941
27942
0
  return len;
27943
0
}
27944
27945
// --------
27946
27947
static uint64_t  //
27948
wuffs_private_impl__swizzle_bgrw_4x16le__bgr(uint8_t* dst_ptr,
27949
                                             size_t dst_len,
27950
                                             uint8_t* dst_palette_ptr,
27951
                                             size_t dst_palette_len,
27952
                                             const uint8_t* src_ptr,
27953
0
                                             size_t src_len) {
27954
0
  size_t dst_len8 = dst_len / 8;
27955
0
  size_t src_len3 = src_len / 3;
27956
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
27957
0
  uint8_t* d = dst_ptr;
27958
0
  const uint8_t* s = src_ptr;
27959
0
  size_t n = len;
27960
27961
0
  while (n >= 1) {
27962
0
    uint8_t s0 = s[0];
27963
0
    uint8_t s1 = s[1];
27964
0
    uint8_t s2 = s[2];
27965
0
    d[0] = s0;
27966
0
    d[1] = s0;
27967
0
    d[2] = s1;
27968
0
    d[3] = s1;
27969
0
    d[4] = s2;
27970
0
    d[5] = s2;
27971
0
    d[6] = 0xFF;
27972
0
    d[7] = 0xFF;
27973
27974
0
    s += 1 * 3;
27975
0
    d += 1 * 8;
27976
0
    n -= 1;
27977
0
  }
27978
27979
0
  return len;
27980
0
}
27981
27982
static uint64_t  //
27983
wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565(uint8_t* dst_ptr,
27984
                                                 size_t dst_len,
27985
                                                 uint8_t* dst_palette_ptr,
27986
                                                 size_t dst_palette_len,
27987
                                                 const uint8_t* src_ptr,
27988
0
                                                 size_t src_len) {
27989
0
  size_t dst_len8 = dst_len / 8;
27990
0
  size_t src_len2 = src_len / 2;
27991
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
27992
0
  uint8_t* d = dst_ptr;
27993
0
  const uint8_t* s = src_ptr;
27994
0
  size_t n = len;
27995
27996
0
  while (n >= 1) {
27997
0
    wuffs_base__poke_u64le__no_bounds_check(
27998
0
        d + (0 * 8),
27999
0
        wuffs_base__color_u32__as__color_u64(
28000
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28001
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28002
28003
0
    s += 1 * 2;
28004
0
    d += 1 * 8;
28005
0
    n -= 1;
28006
0
  }
28007
28008
0
  return len;
28009
0
}
28010
28011
static uint64_t  //
28012
wuffs_private_impl__swizzle_bgrw_4x16le__bgrx(uint8_t* dst_ptr,
28013
                                              size_t dst_len,
28014
                                              uint8_t* dst_palette_ptr,
28015
                                              size_t dst_palette_len,
28016
                                              const uint8_t* src_ptr,
28017
0
                                              size_t src_len) {
28018
0
  size_t dst_len8 = dst_len / 8;
28019
0
  size_t src_len4 = src_len / 4;
28020
0
  size_t len = (dst_len8 < src_len4) ? dst_len8 : src_len4;
28021
0
  uint8_t* d = dst_ptr;
28022
0
  const uint8_t* s = src_ptr;
28023
0
  size_t n = len;
28024
28025
0
  while (n >= 1) {
28026
0
    uint8_t s0 = s[0];
28027
0
    uint8_t s1 = s[1];
28028
0
    uint8_t s2 = s[2];
28029
0
    d[0] = s0;
28030
0
    d[1] = s0;
28031
0
    d[2] = s1;
28032
0
    d[3] = s1;
28033
0
    d[4] = s2;
28034
0
    d[5] = s2;
28035
0
    d[6] = 0xFF;
28036
0
    d[7] = 0xFF;
28037
28038
0
    s += 1 * 4;
28039
0
    d += 1 * 8;
28040
0
    n -= 1;
28041
0
  }
28042
28043
0
  return len;
28044
0
}
28045
28046
static uint64_t  //
28047
wuffs_private_impl__swizzle_bgrw_4x16le__rgb(uint8_t* dst_ptr,
28048
                                             size_t dst_len,
28049
                                             uint8_t* dst_palette_ptr,
28050
                                             size_t dst_palette_len,
28051
                                             const uint8_t* src_ptr,
28052
0
                                             size_t src_len) {
28053
0
  size_t dst_len8 = dst_len / 8;
28054
0
  size_t src_len3 = src_len / 3;
28055
0
  size_t len = (dst_len8 < src_len3) ? dst_len8 : src_len3;
28056
0
  uint8_t* d = dst_ptr;
28057
0
  const uint8_t* s = src_ptr;
28058
0
  size_t n = len;
28059
28060
0
  while (n >= 1) {
28061
0
    uint8_t s0 = s[0];
28062
0
    uint8_t s1 = s[1];
28063
0
    uint8_t s2 = s[2];
28064
0
    d[0] = s2;
28065
0
    d[1] = s2;
28066
0
    d[2] = s1;
28067
0
    d[3] = s1;
28068
0
    d[4] = s0;
28069
0
    d[5] = s0;
28070
0
    d[6] = 0xFF;
28071
0
    d[7] = 0xFF;
28072
28073
0
    s += 1 * 3;
28074
0
    d += 1 * 8;
28075
0
    n -= 1;
28076
0
  }
28077
28078
0
  return len;
28079
0
}
28080
28081
// --------
28082
28083
static uint64_t  //
28084
wuffs_private_impl__swizzle_rgb__bgr_565(uint8_t* dst_ptr,
28085
                                         size_t dst_len,
28086
                                         uint8_t* dst_palette_ptr,
28087
                                         size_t dst_palette_len,
28088
                                         const uint8_t* src_ptr,
28089
0
                                         size_t src_len) {
28090
0
  size_t dst_len3 = dst_len / 3;
28091
0
  size_t src_len2 = src_len / 2;
28092
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28093
0
  uint8_t* d = dst_ptr;
28094
0
  const uint8_t* s = src_ptr;
28095
0
  size_t n = len;
28096
28097
  // TODO: unroll.
28098
28099
0
  while (n >= 1) {
28100
0
    wuffs_base__poke_u24le__no_bounds_check(
28101
0
        d + (0 * 3),
28102
0
        wuffs_private_impl__swap_u32_argb_abgr(
28103
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28104
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28105
28106
0
    s += 1 * 2;
28107
0
    d += 1 * 3;
28108
0
    n -= 1;
28109
0
  }
28110
28111
0
  return len;
28112
0
}
28113
28114
// --------
28115
28116
static uint64_t  //
28117
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src(
28118
    uint8_t* dst_ptr,
28119
    size_t dst_len,
28120
    uint8_t* dst_palette_ptr,
28121
    size_t dst_palette_len,
28122
    const uint8_t* src_ptr,
28123
0
    size_t src_len) {
28124
0
  size_t dst_len4 = dst_len / 4;
28125
0
  size_t src_len8 = src_len / 8;
28126
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28127
0
  uint8_t* d = dst_ptr;
28128
0
  const uint8_t* s = src_ptr;
28129
28130
0
  size_t n = len;
28131
0
  while (n >= 1) {
28132
0
    wuffs_base__poke_u32le__no_bounds_check(
28133
0
        d + (0 * 4),
28134
0
        wuffs_private_impl__color_u64__as__color_u32__swap_u32_argb_abgr(
28135
0
            wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8))));
28136
28137
0
    s += 1 * 8;
28138
0
    d += 1 * 4;
28139
0
    n -= 1;
28140
0
  }
28141
0
  return len;
28142
0
}
28143
28144
static uint64_t  //
28145
wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over(
28146
    uint8_t* dst_ptr,
28147
    size_t dst_len,
28148
    uint8_t* dst_palette_ptr,
28149
    size_t dst_palette_len,
28150
    const uint8_t* src_ptr,
28151
0
    size_t src_len) {
28152
0
  size_t dst_len4 = dst_len / 4;
28153
0
  size_t src_len8 = src_len / 8;
28154
0
  size_t len = (dst_len4 < src_len8) ? dst_len4 : src_len8;
28155
0
  uint8_t* d = dst_ptr;
28156
0
  const uint8_t* s = src_ptr;
28157
0
  size_t n = len;
28158
28159
0
  while (n >= 1) {
28160
0
    uint64_t d0 = wuffs_base__color_u32__as__color_u64(
28161
0
        wuffs_base__peek_u32le__no_bounds_check(d + (0 * 4)));
28162
0
    uint64_t s0 = wuffs_private_impl__swap_u64_argb_abgr(
28163
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
28164
0
    wuffs_base__poke_u32le__no_bounds_check(
28165
0
        d + (0 * 4),
28166
0
        wuffs_base__color_u64__as__color_u32(
28167
0
            wuffs_private_impl__composite_nonpremul_nonpremul_u64_axxx(d0,
28168
0
                                                                       s0)));
28169
28170
0
    s += 1 * 8;
28171
0
    d += 1 * 4;
28172
0
    n -= 1;
28173
0
  }
28174
28175
0
  return len;
28176
0
}
28177
28178
// --------
28179
28180
static uint64_t  //
28181
wuffs_private_impl__swizzle_rgbw__bgr_565(uint8_t* dst_ptr,
28182
                                          size_t dst_len,
28183
                                          uint8_t* dst_palette_ptr,
28184
                                          size_t dst_palette_len,
28185
                                          const uint8_t* src_ptr,
28186
0
                                          size_t src_len) {
28187
0
  size_t dst_len4 = dst_len / 4;
28188
0
  size_t src_len2 = src_len / 2;
28189
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28190
0
  uint8_t* d = dst_ptr;
28191
0
  const uint8_t* s = src_ptr;
28192
0
  size_t n = len;
28193
28194
  // TODO: unroll.
28195
28196
0
  while (n >= 1) {
28197
0
    wuffs_base__poke_u32le__no_bounds_check(
28198
0
        d + (0 * 4),
28199
0
        wuffs_private_impl__swap_u32_argb_abgr(
28200
0
            wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28201
0
                wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)))));
28202
28203
0
    s += 1 * 2;
28204
0
    d += 1 * 4;
28205
0
    n -= 1;
28206
0
  }
28207
28208
0
  return len;
28209
0
}
28210
28211
// --------
28212
28213
static uint64_t  //
28214
wuffs_private_impl__swizzle_xxx__index__src(uint8_t* dst_ptr,
28215
                                            size_t dst_len,
28216
                                            uint8_t* dst_palette_ptr,
28217
                                            size_t dst_palette_len,
28218
                                            const uint8_t* src_ptr,
28219
0
                                            size_t src_len) {
28220
0
  if (dst_palette_len !=
28221
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28222
0
    return 0;
28223
0
  }
28224
0
  size_t dst_len3 = dst_len / 3;
28225
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28226
0
  uint8_t* d = dst_ptr;
28227
0
  const uint8_t* s = src_ptr;
28228
0
  size_t n = len;
28229
28230
0
  const size_t loop_unroll_count = 4;
28231
28232
  // The comparison in the while condition is ">", not ">=", because with
28233
  // ">=", the last 4-byte store could write past the end of the dst slice.
28234
  //
28235
  // Each 4-byte store writes one too many bytes, but a subsequent store
28236
  // will overwrite that with the correct byte. There is always another
28237
  // store, whether a 4-byte store in this loop or a 1-byte store in the
28238
  // next loop.
28239
0
  while (n > loop_unroll_count) {
28240
0
    wuffs_base__poke_u32le__no_bounds_check(
28241
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(
28242
0
                         dst_palette_ptr + ((size_t)s[0] * 4)));
28243
0
    wuffs_base__poke_u32le__no_bounds_check(
28244
0
        d + (1 * 3), wuffs_base__peek_u32le__no_bounds_check(
28245
0
                         dst_palette_ptr + ((size_t)s[1] * 4)));
28246
0
    wuffs_base__poke_u32le__no_bounds_check(
28247
0
        d + (2 * 3), wuffs_base__peek_u32le__no_bounds_check(
28248
0
                         dst_palette_ptr + ((size_t)s[2] * 4)));
28249
0
    wuffs_base__poke_u32le__no_bounds_check(
28250
0
        d + (3 * 3), wuffs_base__peek_u32le__no_bounds_check(
28251
0
                         dst_palette_ptr + ((size_t)s[3] * 4)));
28252
28253
0
    s += loop_unroll_count * 1;
28254
0
    d += loop_unroll_count * 3;
28255
0
    n -= loop_unroll_count;
28256
0
  }
28257
28258
0
  while (n >= 1) {
28259
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28260
0
                                                          ((size_t)s[0] * 4));
28261
0
    wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
28262
28263
0
    s += 1 * 1;
28264
0
    d += 1 * 3;
28265
0
    n -= 1;
28266
0
  }
28267
28268
0
  return len;
28269
0
}
28270
28271
static uint64_t  //
28272
wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over(
28273
    uint8_t* dst_ptr,
28274
    size_t dst_len,
28275
    uint8_t* dst_palette_ptr,
28276
    size_t dst_palette_len,
28277
    const uint8_t* src_ptr,
28278
0
    size_t src_len) {
28279
0
  if (dst_palette_len !=
28280
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28281
0
    return 0;
28282
0
  }
28283
0
  size_t dst_len3 = dst_len / 3;
28284
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28285
0
  uint8_t* d = dst_ptr;
28286
0
  const uint8_t* s = src_ptr;
28287
0
  size_t n = len;
28288
28289
  // TODO: unroll.
28290
28291
0
  while (n >= 1) {
28292
0
    uint32_t d0 =
28293
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
28294
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28295
0
                                                          ((size_t)s[0] * 4));
28296
0
    wuffs_base__poke_u24le__no_bounds_check(
28297
0
        d + (0 * 3),
28298
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28299
28300
0
    s += 1 * 1;
28301
0
    d += 1 * 3;
28302
0
    n -= 1;
28303
0
  }
28304
28305
0
  return len;
28306
0
}
28307
28308
static uint64_t  //
28309
wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over(
28310
    uint8_t* dst_ptr,
28311
    size_t dst_len,
28312
    uint8_t* dst_palette_ptr,
28313
    size_t dst_palette_len,
28314
    const uint8_t* src_ptr,
28315
0
    size_t src_len) {
28316
0
  if (dst_palette_len !=
28317
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28318
0
    return 0;
28319
0
  }
28320
0
  size_t dst_len3 = dst_len / 3;
28321
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28322
0
  uint8_t* d = dst_ptr;
28323
0
  const uint8_t* s = src_ptr;
28324
0
  size_t n = len;
28325
28326
0
  const size_t loop_unroll_count = 4;
28327
28328
0
  while (n >= loop_unroll_count) {
28329
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28330
0
                                                          ((size_t)s[0] * 4));
28331
0
    if (s0) {
28332
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
28333
0
    }
28334
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28335
0
                                                          ((size_t)s[1] * 4));
28336
0
    if (s1) {
28337
0
      wuffs_base__poke_u24le__no_bounds_check(d + (1 * 3), s1);
28338
0
    }
28339
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28340
0
                                                          ((size_t)s[2] * 4));
28341
0
    if (s2) {
28342
0
      wuffs_base__poke_u24le__no_bounds_check(d + (2 * 3), s2);
28343
0
    }
28344
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28345
0
                                                          ((size_t)s[3] * 4));
28346
0
    if (s3) {
28347
0
      wuffs_base__poke_u24le__no_bounds_check(d + (3 * 3), s3);
28348
0
    }
28349
28350
0
    s += loop_unroll_count * 1;
28351
0
    d += loop_unroll_count * 3;
28352
0
    n -= loop_unroll_count;
28353
0
  }
28354
28355
0
  while (n >= 1) {
28356
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28357
0
                                                          ((size_t)s[0] * 4));
28358
0
    if (s0) {
28359
0
      wuffs_base__poke_u24le__no_bounds_check(d + (0 * 3), s0);
28360
0
    }
28361
28362
0
    s += 1 * 1;
28363
0
    d += 1 * 3;
28364
0
    n -= 1;
28365
0
  }
28366
28367
0
  return len;
28368
0
}
28369
28370
static uint64_t  //
28371
wuffs_private_impl__swizzle_xxx__xxxx(uint8_t* dst_ptr,
28372
                                      size_t dst_len,
28373
                                      uint8_t* dst_palette_ptr,
28374
                                      size_t dst_palette_len,
28375
                                      const uint8_t* src_ptr,
28376
0
                                      size_t src_len) {
28377
0
  size_t dst_len3 = dst_len / 3;
28378
0
  size_t src_len4 = src_len / 4;
28379
0
  size_t len = (dst_len3 < src_len4) ? dst_len3 : src_len4;
28380
0
  uint8_t* d = dst_ptr;
28381
0
  const uint8_t* s = src_ptr;
28382
0
  size_t n = len;
28383
28384
  // TODO: unroll.
28385
28386
0
  while (n >= 1) {
28387
0
    wuffs_base__poke_u24le__no_bounds_check(
28388
0
        d + (0 * 3), wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
28389
28390
0
    s += 1 * 4;
28391
0
    d += 1 * 3;
28392
0
    n -= 1;
28393
0
  }
28394
28395
0
  return len;
28396
0
}
28397
28398
static uint64_t  //
28399
wuffs_private_impl__swizzle_xxx__y(uint8_t* dst_ptr,
28400
                                   size_t dst_len,
28401
                                   uint8_t* dst_palette_ptr,
28402
                                   size_t dst_palette_len,
28403
                                   const uint8_t* src_ptr,
28404
0
                                   size_t src_len) {
28405
0
  size_t dst_len3 = dst_len / 3;
28406
0
  size_t len = (dst_len3 < src_len) ? dst_len3 : src_len;
28407
0
  uint8_t* d = dst_ptr;
28408
0
  const uint8_t* s = src_ptr;
28409
0
  size_t n = len;
28410
28411
  // TODO: unroll.
28412
28413
0
  while (n >= 1) {
28414
0
    uint8_t s0 = s[0];
28415
0
    d[0] = s0;
28416
0
    d[1] = s0;
28417
0
    d[2] = s0;
28418
28419
0
    s += 1 * 1;
28420
0
    d += 1 * 3;
28421
0
    n -= 1;
28422
0
  }
28423
28424
0
  return len;
28425
0
}
28426
28427
static uint64_t  //
28428
wuffs_private_impl__swizzle_xxx__y_16be(uint8_t* dst_ptr,
28429
                                        size_t dst_len,
28430
                                        uint8_t* dst_palette_ptr,
28431
                                        size_t dst_palette_len,
28432
                                        const uint8_t* src_ptr,
28433
0
                                        size_t src_len) {
28434
0
  size_t dst_len3 = dst_len / 3;
28435
0
  size_t src_len2 = src_len / 2;
28436
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28437
0
  uint8_t* d = dst_ptr;
28438
0
  const uint8_t* s = src_ptr;
28439
0
  size_t n = len;
28440
28441
  // TODO: unroll.
28442
28443
0
  while (n >= 1) {
28444
0
    uint8_t s0 = s[0];
28445
0
    d[0] = s0;
28446
0
    d[1] = s0;
28447
0
    d[2] = s0;
28448
28449
0
    s += 1 * 2;
28450
0
    d += 1 * 3;
28451
0
    n -= 1;
28452
0
  }
28453
28454
0
  return len;
28455
0
}
28456
28457
static uint64_t  //
28458
wuffs_private_impl__swizzle_xxx__y_16le(uint8_t* dst_ptr,
28459
                                        size_t dst_len,
28460
                                        uint8_t* dst_palette_ptr,
28461
                                        size_t dst_palette_len,
28462
                                        const uint8_t* src_ptr,
28463
0
                                        size_t src_len) {
28464
0
  size_t dst_len3 = dst_len / 3;
28465
0
  size_t src_len2 = src_len / 2;
28466
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28467
0
  uint8_t* d = dst_ptr;
28468
0
  const uint8_t* s = src_ptr;
28469
0
  size_t n = len;
28470
28471
  // TODO: unroll.
28472
28473
0
  while (n >= 1) {
28474
0
    uint8_t s0 = s[1];
28475
0
    d[0] = s0;
28476
0
    d[1] = s0;
28477
0
    d[2] = s0;
28478
28479
0
    s += 1 * 2;
28480
0
    d += 1 * 3;
28481
0
    n -= 1;
28482
0
  }
28483
28484
0
  return len;
28485
0
}
28486
28487
static uint64_t  //
28488
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src(uint8_t* dst_ptr,
28489
                                                   size_t dst_len,
28490
                                                   uint8_t* dst_palette_ptr,
28491
                                                   size_t dst_palette_len,
28492
                                                   const uint8_t* src_ptr,
28493
0
                                                   size_t src_len) {
28494
0
  size_t dst_len3 = dst_len / 3;
28495
0
  size_t src_len2 = src_len / 2;
28496
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28497
0
  uint8_t* d = dst_ptr;
28498
0
  const uint8_t* s = src_ptr;
28499
0
  size_t n = len;
28500
28501
  // TODO: unroll.
28502
28503
0
  while (n >= 1) {
28504
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28505
0
    wuffs_base__poke_u24le__no_bounds_check(
28506
0
        d + (0 * 3),
28507
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0));
28508
28509
0
    s += 1 * 2;
28510
0
    d += 1 * 3;
28511
0
    n -= 1;
28512
0
  }
28513
28514
0
  return len;
28515
0
}
28516
28517
static uint64_t  //
28518
wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over(
28519
    uint8_t* dst_ptr,
28520
    size_t dst_len,
28521
    uint8_t* dst_palette_ptr,
28522
    size_t dst_palette_len,
28523
    const uint8_t* src_ptr,
28524
0
    size_t src_len) {
28525
0
  size_t dst_len3 = dst_len / 3;
28526
0
  size_t src_len2 = src_len / 2;
28527
0
  size_t len = (dst_len3 < src_len2) ? dst_len3 : src_len2;
28528
0
  uint8_t* d = dst_ptr;
28529
0
  const uint8_t* s = src_ptr;
28530
0
  size_t n = len;
28531
28532
  // TODO: unroll.
28533
28534
0
  while (n >= 1) {
28535
0
    uint32_t d0 =
28536
0
        wuffs_base__peek_u24le__no_bounds_check(d + (0 * 3)) | 0xFF000000;
28537
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
28538
0
    wuffs_base__poke_u24le__no_bounds_check(
28539
0
        d + (0 * 3),
28540
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
28541
28542
0
    s += 1 * 2;
28543
0
    d += 1 * 3;
28544
0
    n -= 1;
28545
0
  }
28546
28547
0
  return len;
28548
0
}
28549
28550
// --------
28551
28552
static uint64_t  //
28553
wuffs_private_impl__swizzle_xxxx__index__src(uint8_t* dst_ptr,
28554
                                             size_t dst_len,
28555
                                             uint8_t* dst_palette_ptr,
28556
                                             size_t dst_palette_len,
28557
                                             const uint8_t* src_ptr,
28558
705k
                                             size_t src_len) {
28559
705k
  if (dst_palette_len !=
28560
705k
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28561
0
    return 0;
28562
0
  }
28563
705k
  size_t dst_len4 = dst_len / 4;
28564
705k
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
28565
705k
  uint8_t* d = dst_ptr;
28566
705k
  const uint8_t* s = src_ptr;
28567
705k
  size_t n = len;
28568
28569
705k
  const size_t loop_unroll_count = 4;
28570
28571
2.95M
  while (n >= loop_unroll_count) {
28572
2.25M
    wuffs_base__poke_u32le__no_bounds_check(
28573
2.25M
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
28574
2.25M
                         dst_palette_ptr + ((size_t)s[0] * 4)));
28575
2.25M
    wuffs_base__poke_u32le__no_bounds_check(
28576
2.25M
        d + (1 * 4), wuffs_base__peek_u32le__no_bounds_check(
28577
2.25M
                         dst_palette_ptr + ((size_t)s[1] * 4)));
28578
2.25M
    wuffs_base__poke_u32le__no_bounds_check(
28579
2.25M
        d + (2 * 4), wuffs_base__peek_u32le__no_bounds_check(
28580
2.25M
                         dst_palette_ptr + ((size_t)s[2] * 4)));
28581
2.25M
    wuffs_base__poke_u32le__no_bounds_check(
28582
2.25M
        d + (3 * 4), wuffs_base__peek_u32le__no_bounds_check(
28583
2.25M
                         dst_palette_ptr + ((size_t)s[3] * 4)));
28584
28585
2.25M
    s += loop_unroll_count * 1;
28586
2.25M
    d += loop_unroll_count * 4;
28587
2.25M
    n -= loop_unroll_count;
28588
2.25M
  }
28589
28590
1.43M
  while (n >= 1) {
28591
728k
    wuffs_base__poke_u32le__no_bounds_check(
28592
728k
        d + (0 * 4), wuffs_base__peek_u32le__no_bounds_check(
28593
728k
                         dst_palette_ptr + ((size_t)s[0] * 4)));
28594
28595
728k
    s += 1 * 1;
28596
728k
    d += 1 * 4;
28597
728k
    n -= 1;
28598
728k
  }
28599
28600
705k
  return len;
28601
705k
}
28602
28603
static uint64_t  //
28604
wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over(
28605
    uint8_t* dst_ptr,
28606
    size_t dst_len,
28607
    uint8_t* dst_palette_ptr,
28608
    size_t dst_palette_len,
28609
    const uint8_t* src_ptr,
28610
0
    size_t src_len) {
28611
0
  if (dst_palette_len !=
28612
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28613
0
    return 0;
28614
0
  }
28615
0
  size_t dst_len4 = dst_len / 4;
28616
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
28617
0
  uint8_t* d = dst_ptr;
28618
0
  const uint8_t* s = src_ptr;
28619
0
  size_t n = len;
28620
28621
0
  const size_t loop_unroll_count = 4;
28622
28623
0
  while (n >= loop_unroll_count) {
28624
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28625
0
                                                          ((size_t)s[0] * 4));
28626
0
    if (s0) {
28627
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
28628
0
    }
28629
0
    uint32_t s1 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28630
0
                                                          ((size_t)s[1] * 4));
28631
0
    if (s1) {
28632
0
      wuffs_base__poke_u32le__no_bounds_check(d + (1 * 4), s1);
28633
0
    }
28634
0
    uint32_t s2 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28635
0
                                                          ((size_t)s[2] * 4));
28636
0
    if (s2) {
28637
0
      wuffs_base__poke_u32le__no_bounds_check(d + (2 * 4), s2);
28638
0
    }
28639
0
    uint32_t s3 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28640
0
                                                          ((size_t)s[3] * 4));
28641
0
    if (s3) {
28642
0
      wuffs_base__poke_u32le__no_bounds_check(d + (3 * 4), s3);
28643
0
    }
28644
28645
0
    s += loop_unroll_count * 1;
28646
0
    d += loop_unroll_count * 4;
28647
0
    n -= loop_unroll_count;
28648
0
  }
28649
28650
0
  while (n >= 1) {
28651
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28652
0
                                                          ((size_t)s[0] * 4));
28653
0
    if (s0) {
28654
0
      wuffs_base__poke_u32le__no_bounds_check(d + (0 * 4), s0);
28655
0
    }
28656
28657
0
    s += 1 * 1;
28658
0
    d += 1 * 4;
28659
0
    n -= 1;
28660
0
  }
28661
28662
0
  return len;
28663
0
}
28664
28665
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
28666
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
28667
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
28668
static uint64_t  //
28669
wuffs_private_impl__swizzle_xxxx__y__x86_sse42(uint8_t* dst_ptr,
28670
                                               size_t dst_len,
28671
                                               uint8_t* dst_palette_ptr,
28672
                                               size_t dst_palette_len,
28673
                                               const uint8_t* src_ptr,
28674
20.5M
                                               size_t src_len) {
28675
20.5M
  size_t dst_len4 = dst_len / 4;
28676
20.5M
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
28677
20.5M
  uint8_t* d = dst_ptr;
28678
20.5M
  const uint8_t* s = src_ptr;
28679
20.5M
  size_t n = len;
28680
28681
20.5M
  __m128i shuffle = _mm_set_epi8(+0x03, +0x03, +0x03, +0x03,  //
28682
20.5M
                                 +0x02, +0x02, +0x02, +0x02,  //
28683
20.5M
                                 +0x01, +0x01, +0x01, +0x01,  //
28684
20.5M
                                 +0x00, +0x00, +0x00, +0x00);
28685
20.5M
  __m128i or_ff = _mm_set_epi8(-0x01, +0x00, +0x00, +0x00,  //
28686
20.5M
                               -0x01, +0x00, +0x00, +0x00,  //
28687
20.5M
                               -0x01, +0x00, +0x00, +0x00,  //
28688
20.5M
                               -0x01, +0x00, +0x00, +0x00);
28689
28690
21.3M
  while (n >= 4) {
28691
763k
    __m128i x;
28692
763k
    x = _mm_cvtsi32_si128((int)(wuffs_base__peek_u32le__no_bounds_check(s)));
28693
763k
    x = _mm_shuffle_epi8(x, shuffle);
28694
763k
    x = _mm_or_si128(x, or_ff);
28695
763k
    _mm_storeu_si128((__m128i*)(void*)d, x);
28696
28697
763k
    s += 4 * 1;
28698
763k
    d += 4 * 4;
28699
763k
    n -= 4;
28700
763k
  }
28701
28702
41.1M
  while (n >= 1) {
28703
20.5M
    wuffs_base__poke_u32le__no_bounds_check(
28704
20.5M
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
28705
28706
20.5M
    s += 1 * 1;
28707
20.5M
    d += 1 * 4;
28708
20.5M
    n -= 1;
28709
20.5M
  }
28710
28711
20.5M
  return len;
28712
20.5M
}
28713
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
28714
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
28715
28716
static uint64_t  //
28717
wuffs_private_impl__swizzle_xxxx__y(uint8_t* dst_ptr,
28718
                                    size_t dst_len,
28719
                                    uint8_t* dst_palette_ptr,
28720
                                    size_t dst_palette_len,
28721
                                    const uint8_t* src_ptr,
28722
0
                                    size_t src_len) {
28723
0
  size_t dst_len4 = dst_len / 4;
28724
0
  size_t len = (dst_len4 < src_len) ? dst_len4 : src_len;
28725
0
  uint8_t* d = dst_ptr;
28726
0
  const uint8_t* s = src_ptr;
28727
0
  size_t n = len;
28728
28729
0
  while (n >= 1) {
28730
0
    wuffs_base__poke_u32le__no_bounds_check(
28731
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
28732
28733
0
    s += 1 * 1;
28734
0
    d += 1 * 4;
28735
0
    n -= 1;
28736
0
  }
28737
28738
0
  return len;
28739
0
}
28740
28741
static uint64_t  //
28742
wuffs_private_impl__swizzle_xxxx__y_16be(uint8_t* dst_ptr,
28743
                                         size_t dst_len,
28744
                                         uint8_t* dst_palette_ptr,
28745
                                         size_t dst_palette_len,
28746
                                         const uint8_t* src_ptr,
28747
113k
                                         size_t src_len) {
28748
113k
  size_t dst_len4 = dst_len / 4;
28749
113k
  size_t src_len2 = src_len / 2;
28750
113k
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28751
113k
  uint8_t* d = dst_ptr;
28752
113k
  const uint8_t* s = src_ptr;
28753
113k
  size_t n = len;
28754
28755
488k
  while (n >= 1) {
28756
374k
    wuffs_base__poke_u32le__no_bounds_check(
28757
374k
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[0]));
28758
28759
374k
    s += 1 * 2;
28760
374k
    d += 1 * 4;
28761
374k
    n -= 1;
28762
374k
  }
28763
28764
113k
  return len;
28765
113k
}
28766
28767
static uint64_t  //
28768
wuffs_private_impl__swizzle_xxxx__y_16le(uint8_t* dst_ptr,
28769
                                         size_t dst_len,
28770
                                         uint8_t* dst_palette_ptr,
28771
                                         size_t dst_palette_len,
28772
                                         const uint8_t* src_ptr,
28773
0
                                         size_t src_len) {
28774
0
  size_t dst_len4 = dst_len / 4;
28775
0
  size_t src_len2 = src_len / 2;
28776
0
  size_t len = (dst_len4 < src_len2) ? dst_len4 : src_len2;
28777
0
  uint8_t* d = dst_ptr;
28778
0
  const uint8_t* s = src_ptr;
28779
0
  size_t n = len;
28780
28781
0
  while (n >= 1) {
28782
0
    wuffs_base__poke_u32le__no_bounds_check(
28783
0
        d + (0 * 4), 0xFF000000 | (0x010101 * (uint32_t)s[1]));
28784
28785
0
    s += 1 * 2;
28786
0
    d += 1 * 4;
28787
0
    n -= 1;
28788
0
  }
28789
28790
0
  return len;
28791
0
}
28792
28793
// --------
28794
28795
static uint64_t  //
28796
wuffs_private_impl__swizzle_xxxxxxxx__index__src(uint8_t* dst_ptr,
28797
                                                 size_t dst_len,
28798
                                                 uint8_t* dst_palette_ptr,
28799
                                                 size_t dst_palette_len,
28800
                                                 const uint8_t* src_ptr,
28801
0
                                                 size_t src_len) {
28802
0
  if (dst_palette_len !=
28803
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28804
0
    return 0;
28805
0
  }
28806
0
  size_t dst_len8 = dst_len / 8;
28807
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28808
0
  uint8_t* d = dst_ptr;
28809
0
  const uint8_t* s = src_ptr;
28810
0
  size_t n = len;
28811
28812
0
  while (n >= 1) {
28813
0
    wuffs_base__poke_u64le__no_bounds_check(
28814
0
        d + (0 * 8), wuffs_base__color_u32__as__color_u64(
28815
0
                         wuffs_base__peek_u32le__no_bounds_check(
28816
0
                             dst_palette_ptr + ((size_t)s[0] * 4))));
28817
28818
0
    s += 1 * 1;
28819
0
    d += 1 * 8;
28820
0
    n -= 1;
28821
0
  }
28822
28823
0
  return len;
28824
0
}
28825
28826
static uint64_t  //
28827
wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over(
28828
    uint8_t* dst_ptr,
28829
    size_t dst_len,
28830
    uint8_t* dst_palette_ptr,
28831
    size_t dst_palette_len,
28832
    const uint8_t* src_ptr,
28833
0
    size_t src_len) {
28834
0
  if (dst_palette_len !=
28835
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
28836
0
    return 0;
28837
0
  }
28838
0
  size_t dst_len8 = dst_len / 8;
28839
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28840
0
  uint8_t* d = dst_ptr;
28841
0
  const uint8_t* s = src_ptr;
28842
0
  size_t n = len;
28843
28844
0
  while (n >= 1) {
28845
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
28846
0
                                                          ((size_t)s[0] * 4));
28847
0
    if (s0) {
28848
0
      wuffs_base__poke_u64le__no_bounds_check(
28849
0
          d + (0 * 8), wuffs_base__color_u32__as__color_u64(s0));
28850
0
    }
28851
28852
0
    s += 1 * 1;
28853
0
    d += 1 * 8;
28854
0
    n -= 1;
28855
0
  }
28856
28857
0
  return len;
28858
0
}
28859
28860
static uint64_t  //
28861
wuffs_private_impl__swizzle_xxxxxxxx__y(uint8_t* dst_ptr,
28862
                                        size_t dst_len,
28863
                                        uint8_t* dst_palette_ptr,
28864
                                        size_t dst_palette_len,
28865
                                        const uint8_t* src_ptr,
28866
0
                                        size_t src_len) {
28867
0
  size_t dst_len8 = dst_len / 8;
28868
0
  size_t len = (dst_len8 < src_len) ? dst_len8 : src_len;
28869
0
  uint8_t* d = dst_ptr;
28870
0
  const uint8_t* s = src_ptr;
28871
0
  size_t n = len;
28872
28873
0
  while (n >= 1) {
28874
0
    wuffs_base__poke_u64le__no_bounds_check(
28875
0
        d + (0 * 8), 0xFFFF000000000000 | (0x010101010101 * (uint64_t)s[0]));
28876
28877
0
    s += 1 * 1;
28878
0
    d += 1 * 8;
28879
0
    n -= 1;
28880
0
  }
28881
28882
0
  return len;
28883
0
}
28884
28885
static uint64_t  //
28886
wuffs_private_impl__swizzle_xxxxxxxx__y_16be(uint8_t* dst_ptr,
28887
                                             size_t dst_len,
28888
                                             uint8_t* dst_palette_ptr,
28889
                                             size_t dst_palette_len,
28890
                                             const uint8_t* src_ptr,
28891
0
                                             size_t src_len) {
28892
0
  size_t dst_len8 = dst_len / 8;
28893
0
  size_t src_len2 = src_len / 2;
28894
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
28895
0
  uint8_t* d = dst_ptr;
28896
0
  const uint8_t* s = src_ptr;
28897
0
  size_t n = len;
28898
28899
0
  while (n >= 1) {
28900
0
    uint64_t s0 =
28901
0
        ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(s + (0 * 2))));
28902
0
    wuffs_base__poke_u64le__no_bounds_check(
28903
0
        d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
28904
28905
0
    s += 1 * 2;
28906
0
    d += 1 * 8;
28907
0
    n -= 1;
28908
0
  }
28909
28910
0
  return len;
28911
0
}
28912
28913
static uint64_t  //
28914
wuffs_private_impl__swizzle_xxxxxxxx__y_16le(uint8_t* dst_ptr,
28915
                                             size_t dst_len,
28916
                                             uint8_t* dst_palette_ptr,
28917
                                             size_t dst_palette_len,
28918
                                             const uint8_t* src_ptr,
28919
0
                                             size_t src_len) {
28920
0
  size_t dst_len8 = dst_len / 8;
28921
0
  size_t src_len2 = src_len / 2;
28922
0
  size_t len = (dst_len8 < src_len2) ? dst_len8 : src_len2;
28923
0
  uint8_t* d = dst_ptr;
28924
0
  const uint8_t* s = src_ptr;
28925
0
  size_t n = len;
28926
28927
0
  while (n >= 1) {
28928
0
    uint64_t s0 =
28929
0
        ((uint64_t)(wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2))));
28930
0
    wuffs_base__poke_u64le__no_bounds_check(
28931
0
        d + (0 * 8), 0xFFFF000000000000 | (0x000100010001 * s0));
28932
28933
0
    s += 1 * 2;
28934
0
    d += 1 * 8;
28935
0
    n -= 1;
28936
0
  }
28937
28938
0
  return len;
28939
0
}
28940
28941
// --------
28942
28943
static uint64_t  //
28944
wuffs_private_impl__swizzle_y__bgr(uint8_t* dst_ptr,
28945
                                   size_t dst_len,
28946
                                   uint8_t* dst_palette_ptr,
28947
                                   size_t dst_palette_len,
28948
                                   const uint8_t* src_ptr,
28949
0
                                   size_t src_len) {
28950
0
  size_t src_len3 = src_len / 3;
28951
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
28952
0
  uint8_t* d = dst_ptr;
28953
0
  const uint8_t* s = src_ptr;
28954
0
  size_t n = len;
28955
28956
  // TODO: unroll.
28957
28958
0
  while (n >= 1) {
28959
0
    uint32_t s0 =
28960
0
        0xFF000000 | wuffs_base__peek_u24le__no_bounds_check(s + (0 * 3));
28961
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28962
28963
0
    s += 1 * 3;
28964
0
    d += 1 * 1;
28965
0
    n -= 1;
28966
0
  }
28967
28968
0
  return len;
28969
0
}
28970
28971
static uint64_t  //
28972
wuffs_private_impl__swizzle_y__bgr_565(uint8_t* dst_ptr,
28973
                                       size_t dst_len,
28974
                                       uint8_t* dst_palette_ptr,
28975
                                       size_t dst_palette_len,
28976
                                       const uint8_t* src_ptr,
28977
0
                                       size_t src_len) {
28978
0
  size_t src_len2 = src_len / 2;
28979
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
28980
0
  uint8_t* d = dst_ptr;
28981
0
  const uint8_t* s = src_ptr;
28982
0
  size_t n = len;
28983
28984
  // TODO: unroll.
28985
28986
0
  while (n >= 1) {
28987
0
    uint32_t s0 = wuffs_base__color_u16_rgb_565__as__color_u32_argb_premul(
28988
0
        wuffs_base__peek_u16le__no_bounds_check(s + (0 * 2)));
28989
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
28990
28991
0
    s += 1 * 2;
28992
0
    d += 1 * 1;
28993
0
    n -= 1;
28994
0
  }
28995
28996
0
  return len;
28997
0
}
28998
28999
static uint64_t  //
29000
wuffs_private_impl__swizzle_y__bgra_nonpremul__src(uint8_t* dst_ptr,
29001
                                                   size_t dst_len,
29002
                                                   uint8_t* dst_palette_ptr,
29003
                                                   size_t dst_palette_len,
29004
                                                   const uint8_t* src_ptr,
29005
0
                                                   size_t src_len) {
29006
0
  size_t src_len4 = src_len / 4;
29007
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29008
0
  uint8_t* d = dst_ptr;
29009
0
  const uint8_t* s = src_ptr;
29010
0
  size_t n = len;
29011
29012
  // TODO: unroll.
29013
29014
0
  while (n >= 1) {
29015
0
    uint32_t s0 =
29016
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
29017
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29018
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29019
29020
0
    s += 1 * 4;
29021
0
    d += 1 * 1;
29022
0
    n -= 1;
29023
0
  }
29024
29025
0
  return len;
29026
0
}
29027
29028
static uint64_t  //
29029
wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over(
29030
    uint8_t* dst_ptr,
29031
    size_t dst_len,
29032
    uint8_t* dst_palette_ptr,
29033
    size_t dst_palette_len,
29034
    const uint8_t* src_ptr,
29035
0
    size_t src_len) {
29036
0
  size_t src_len4 = src_len / 4;
29037
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29038
0
  uint8_t* d = dst_ptr;
29039
0
  const uint8_t* s = src_ptr;
29040
0
  size_t n = len;
29041
29042
  // TODO: unroll.
29043
29044
0
  while (n >= 1) {
29045
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
29046
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29047
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
29048
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
29049
29050
0
    s += 1 * 4;
29051
0
    d += 1 * 1;
29052
0
    n -= 1;
29053
0
  }
29054
29055
0
  return len;
29056
0
}
29057
29058
static uint64_t  //
29059
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src(
29060
    uint8_t* dst_ptr,
29061
    size_t dst_len,
29062
    uint8_t* dst_palette_ptr,
29063
    size_t dst_palette_len,
29064
    const uint8_t* src_ptr,
29065
0
    size_t src_len) {
29066
0
  size_t src_len8 = src_len / 8;
29067
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29068
0
  uint8_t* d = dst_ptr;
29069
0
  const uint8_t* s = src_ptr;
29070
0
  size_t n = len;
29071
29072
  // TODO: unroll.
29073
29074
0
  while (n >= 1) {
29075
0
    d[0] = wuffs_base__color_u64_argb_nonpremul__as__color_u8_gray(
29076
0
        wuffs_base__peek_u64le__no_bounds_check(s + (0 * 8)));
29077
29078
0
    s += 1 * 8;
29079
0
    d += 1 * 1;
29080
0
    n -= 1;
29081
0
  }
29082
29083
0
  return len;
29084
0
}
29085
29086
static uint64_t  //
29087
wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over(
29088
    uint8_t* dst_ptr,
29089
    size_t dst_len,
29090
    uint8_t* dst_palette_ptr,
29091
    size_t dst_palette_len,
29092
    const uint8_t* src_ptr,
29093
0
    size_t src_len) {
29094
0
  size_t src_len8 = src_len / 8;
29095
0
  size_t len = (dst_len < src_len8) ? dst_len : src_len8;
29096
0
  uint8_t* d = dst_ptr;
29097
0
  const uint8_t* s = src_ptr;
29098
0
  size_t n = len;
29099
29100
  // TODO: unroll.
29101
29102
0
  while (n >= 1) {
29103
    // Extract 16-bit color components.
29104
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
29105
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
29106
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
29107
0
    uint32_t sa = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 6));
29108
0
    uint32_t sr = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 4));
29109
0
    uint32_t sg = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 2));
29110
0
    uint32_t sb = ((uint32_t)wuffs_base__peek_u16le__no_bounds_check(s + 0));
29111
29112
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
29113
0
    uint32_t ia = 0xFFFF - sa;
29114
29115
    // Composite src (nonpremul) over dst (premul).
29116
0
    dr = ((sr * sa) + (dr * ia)) / 0xFFFF;
29117
0
    dg = ((sg * sa) + (dg * ia)) / 0xFFFF;
29118
0
    db = ((sb * sa) + (db * ia)) / 0xFFFF;
29119
29120
    // Convert to 16-bit color to 8-bit gray.
29121
0
    uint32_t weighted_average =
29122
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
29123
0
    d[0] = (uint8_t)(weighted_average >> 24);
29124
29125
0
    s += 1 * 8;
29126
0
    d += 1 * 1;
29127
0
    n -= 1;
29128
0
  }
29129
29130
0
  return len;
29131
0
}
29132
29133
static uint64_t  //
29134
wuffs_private_impl__swizzle_y__bgra_premul__src(uint8_t* dst_ptr,
29135
                                                size_t dst_len,
29136
                                                uint8_t* dst_palette_ptr,
29137
                                                size_t dst_palette_len,
29138
                                                const uint8_t* src_ptr,
29139
0
                                                size_t src_len) {
29140
0
  size_t src_len4 = src_len / 4;
29141
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29142
0
  uint8_t* d = dst_ptr;
29143
0
  const uint8_t* s = src_ptr;
29144
0
  size_t n = len;
29145
29146
  // TODO: unroll.
29147
29148
0
  while (n >= 1) {
29149
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29150
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29151
29152
0
    s += 1 * 4;
29153
0
    d += 1 * 1;
29154
0
    n -= 1;
29155
0
  }
29156
29157
0
  return len;
29158
0
}
29159
29160
static uint64_t  //
29161
wuffs_private_impl__swizzle_y__bgra_premul__src_over(uint8_t* dst_ptr,
29162
                                                     size_t dst_len,
29163
                                                     uint8_t* dst_palette_ptr,
29164
                                                     size_t dst_palette_len,
29165
                                                     const uint8_t* src_ptr,
29166
0
                                                     size_t src_len) {
29167
0
  size_t src_len4 = src_len / 4;
29168
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29169
0
  uint8_t* d = dst_ptr;
29170
0
  const uint8_t* s = src_ptr;
29171
0
  size_t n = len;
29172
29173
  // TODO: unroll.
29174
29175
0
  while (n >= 1) {
29176
    // Extract 16-bit color components.
29177
0
    uint32_t dr = 0x101 * ((uint32_t)d[0]);
29178
0
    uint32_t dg = 0x101 * ((uint32_t)d[0]);
29179
0
    uint32_t db = 0x101 * ((uint32_t)d[0]);
29180
0
    uint32_t sa = 0x101 * ((uint32_t)s[3]);
29181
0
    uint32_t sr = 0x101 * ((uint32_t)s[2]);
29182
0
    uint32_t sg = 0x101 * ((uint32_t)s[1]);
29183
0
    uint32_t sb = 0x101 * ((uint32_t)s[0]);
29184
29185
    // Calculate the inverse of the src-alpha: how much of the dst to keep.
29186
0
    uint32_t ia = 0xFFFF - sa;
29187
29188
    // Composite src (premul) over dst (premul).
29189
0
    dr = sr + ((dr * ia) / 0xFFFF);
29190
0
    dg = sg + ((dg * ia) / 0xFFFF);
29191
0
    db = sb + ((db * ia) / 0xFFFF);
29192
29193
    // Convert to 16-bit color to 8-bit gray.
29194
0
    uint32_t weighted_average =
29195
0
        (19595 * dr) + (38470 * dg) + (7471 * db) + 32768;
29196
0
    d[0] = (uint8_t)(weighted_average >> 24);
29197
29198
0
    s += 1 * 4;
29199
0
    d += 1 * 1;
29200
0
    n -= 1;
29201
0
  }
29202
29203
0
  return len;
29204
0
}
29205
29206
static uint64_t  //
29207
wuffs_private_impl__swizzle_y__bgrx(uint8_t* dst_ptr,
29208
                                    size_t dst_len,
29209
                                    uint8_t* dst_palette_ptr,
29210
                                    size_t dst_palette_len,
29211
                                    const uint8_t* src_ptr,
29212
0
                                    size_t src_len) {
29213
0
  size_t src_len4 = src_len / 4;
29214
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29215
0
  uint8_t* d = dst_ptr;
29216
0
  const uint8_t* s = src_ptr;
29217
0
  size_t n = len;
29218
29219
  // TODO: unroll.
29220
29221
0
  while (n >= 1) {
29222
0
    uint32_t s0 =
29223
0
        0xFF000000 | wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4));
29224
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29225
29226
0
    s += 1 * 4;
29227
0
    d += 1 * 1;
29228
0
    n -= 1;
29229
0
  }
29230
29231
0
  return len;
29232
0
}
29233
29234
static uint64_t  //
29235
wuffs_private_impl__swizzle_y__rgb(uint8_t* dst_ptr,
29236
                                   size_t dst_len,
29237
                                   uint8_t* dst_palette_ptr,
29238
                                   size_t dst_palette_len,
29239
                                   const uint8_t* src_ptr,
29240
0
                                   size_t src_len) {
29241
0
  size_t src_len3 = src_len / 3;
29242
0
  size_t len = (dst_len < src_len3) ? dst_len : src_len3;
29243
0
  uint8_t* d = dst_ptr;
29244
0
  const uint8_t* s = src_ptr;
29245
0
  size_t n = len;
29246
29247
  // TODO: unroll.
29248
29249
0
  while (n >= 1) {
29250
0
    uint32_t s0 =
29251
0
        0xFF000000 | wuffs_base__peek_u24be__no_bounds_check(s + (0 * 3));
29252
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29253
29254
0
    s += 1 * 3;
29255
0
    d += 1 * 1;
29256
0
    n -= 1;
29257
0
  }
29258
29259
0
  return len;
29260
0
}
29261
29262
static uint64_t  //
29263
wuffs_private_impl__swizzle_y__rgba_nonpremul__src(uint8_t* dst_ptr,
29264
                                                   size_t dst_len,
29265
                                                   uint8_t* dst_palette_ptr,
29266
                                                   size_t dst_palette_len,
29267
                                                   const uint8_t* src_ptr,
29268
0
                                                   size_t src_len) {
29269
0
  size_t src_len4 = src_len / 4;
29270
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29271
0
  uint8_t* d = dst_ptr;
29272
0
  const uint8_t* s = src_ptr;
29273
0
  size_t n = len;
29274
29275
  // TODO: unroll.
29276
29277
0
  while (n >= 1) {
29278
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
29279
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(
29280
0
            wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4))));
29281
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29282
29283
0
    s += 1 * 4;
29284
0
    d += 1 * 1;
29285
0
    n -= 1;
29286
0
  }
29287
29288
0
  return len;
29289
0
}
29290
29291
static uint64_t  //
29292
wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over(
29293
    uint8_t* dst_ptr,
29294
    size_t dst_len,
29295
    uint8_t* dst_palette_ptr,
29296
    size_t dst_palette_len,
29297
    const uint8_t* src_ptr,
29298
0
    size_t src_len) {
29299
0
  size_t src_len4 = src_len / 4;
29300
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29301
0
  uint8_t* d = dst_ptr;
29302
0
  const uint8_t* s = src_ptr;
29303
0
  size_t n = len;
29304
29305
  // TODO: unroll.
29306
29307
0
  while (n >= 1) {
29308
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
29309
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
29310
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29311
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
29312
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
29313
29314
0
    s += 1 * 4;
29315
0
    d += 1 * 1;
29316
0
    n -= 1;
29317
0
  }
29318
29319
0
  return len;
29320
0
}
29321
29322
static uint64_t  //
29323
wuffs_private_impl__swizzle_y__rgba_premul__src(uint8_t* dst_ptr,
29324
                                                size_t dst_len,
29325
                                                uint8_t* dst_palette_ptr,
29326
                                                size_t dst_palette_len,
29327
                                                const uint8_t* src_ptr,
29328
0
                                                size_t src_len) {
29329
0
  size_t src_len4 = src_len / 4;
29330
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29331
0
  uint8_t* d = dst_ptr;
29332
0
  const uint8_t* s = src_ptr;
29333
0
  size_t n = len;
29334
29335
  // TODO: unroll.
29336
29337
0
  while (n >= 1) {
29338
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
29339
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29340
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(s0);
29341
29342
0
    s += 1 * 4;
29343
0
    d += 1 * 1;
29344
0
    n -= 1;
29345
0
  }
29346
29347
0
  return len;
29348
0
}
29349
29350
static uint64_t  //
29351
wuffs_private_impl__swizzle_y__rgba_premul__src_over(uint8_t* dst_ptr,
29352
                                                     size_t dst_len,
29353
                                                     uint8_t* dst_palette_ptr,
29354
                                                     size_t dst_palette_len,
29355
                                                     const uint8_t* src_ptr,
29356
0
                                                     size_t src_len) {
29357
0
  size_t src_len4 = src_len / 4;
29358
0
  size_t len = (dst_len < src_len4) ? dst_len : src_len4;
29359
0
  uint8_t* d = dst_ptr;
29360
0
  const uint8_t* s = src_ptr;
29361
0
  size_t n = len;
29362
29363
  // TODO: unroll.
29364
29365
0
  while (n >= 1) {
29366
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
29367
0
    uint32_t s0 = wuffs_private_impl__swap_u32_argb_abgr(
29368
0
        wuffs_base__peek_u32le__no_bounds_check(s + (0 * 4)));
29369
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
29370
0
        wuffs_private_impl__composite_premul_premul_u32_axxx(d0, s0));
29371
29372
0
    s += 1 * 4;
29373
0
    d += 1 * 1;
29374
0
    n -= 1;
29375
0
  }
29376
29377
0
  return len;
29378
0
}
29379
29380
static uint64_t  //
29381
wuffs_private_impl__swizzle_y__y_16be(uint8_t* dst_ptr,
29382
                                      size_t dst_len,
29383
                                      uint8_t* dst_palette_ptr,
29384
                                      size_t dst_palette_len,
29385
                                      const uint8_t* src_ptr,
29386
0
                                      size_t src_len) {
29387
0
  size_t src_len2 = src_len / 2;
29388
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
29389
0
  uint8_t* d = dst_ptr;
29390
0
  const uint8_t* s = src_ptr;
29391
0
  size_t n = len;
29392
29393
  // TODO: unroll.
29394
29395
0
  while (n >= 1) {
29396
0
    d[0] = s[0];
29397
29398
0
    s += 1 * 2;
29399
0
    d += 1 * 1;
29400
0
    n -= 1;
29401
0
  }
29402
29403
0
  return len;
29404
0
}
29405
29406
static uint64_t  //
29407
wuffs_private_impl__swizzle_y__y_16le(uint8_t* dst_ptr,
29408
                                      size_t dst_len,
29409
                                      uint8_t* dst_palette_ptr,
29410
                                      size_t dst_palette_len,
29411
                                      const uint8_t* src_ptr,
29412
0
                                      size_t src_len) {
29413
0
  size_t src_len2 = src_len / 2;
29414
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
29415
0
  uint8_t* d = dst_ptr;
29416
0
  const uint8_t* s = src_ptr;
29417
0
  size_t n = len;
29418
29419
  // TODO: unroll.
29420
29421
0
  while (n >= 1) {
29422
0
    d[0] = s[1];
29423
29424
0
    s += 1 * 2;
29425
0
    d += 1 * 1;
29426
0
    n -= 1;
29427
0
  }
29428
29429
0
  return len;
29430
0
}
29431
29432
static uint64_t  //
29433
wuffs_private_impl__swizzle_y__ya_nonpremul__src(uint8_t* dst_ptr,
29434
                                                 size_t dst_len,
29435
                                                 uint8_t* dst_palette_ptr,
29436
                                                 size_t dst_palette_len,
29437
                                                 const uint8_t* src_ptr,
29438
0
                                                 size_t src_len) {
29439
0
  size_t src_len2 = src_len / 2;
29440
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
29441
0
  uint8_t* d = dst_ptr;
29442
0
  const uint8_t* s = src_ptr;
29443
0
  size_t n = len;
29444
29445
  // TODO: unroll.
29446
29447
0
  while (n >= 1) {
29448
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
29449
0
    d[0] = (uint8_t)
29450
0
        wuffs_base__color_u32_argb_nonpremul__as__color_u32_argb_premul(s0);
29451
29452
0
    s += 1 * 2;
29453
0
    d += 1 * 1;
29454
0
    n -= 1;
29455
0
  }
29456
29457
0
  return len;
29458
0
}
29459
29460
static uint64_t  //
29461
wuffs_private_impl__swizzle_y__ya_nonpremul__src_over(uint8_t* dst_ptr,
29462
                                                      size_t dst_len,
29463
                                                      uint8_t* dst_palette_ptr,
29464
                                                      size_t dst_palette_len,
29465
                                                      const uint8_t* src_ptr,
29466
0
                                                      size_t src_len) {
29467
0
  size_t src_len2 = src_len / 2;
29468
0
  size_t len = (dst_len < src_len2) ? dst_len : src_len2;
29469
0
  uint8_t* d = dst_ptr;
29470
0
  const uint8_t* s = src_ptr;
29471
0
  size_t n = len;
29472
29473
  // TODO: unroll.
29474
29475
0
  while (n >= 1) {
29476
0
    uint32_t d0 = 0xFF000000 | ((uint32_t)(d[0]) * 0x010101);
29477
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
29478
0
    d[0] = (uint8_t)wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0,
29479
0
                                                                            s0);
29480
29481
0
    s += 1 * 2;
29482
0
    d += 1 * 1;
29483
0
    n -= 1;
29484
0
  }
29485
29486
0
  return len;
29487
0
}
29488
29489
static uint64_t  //
29490
wuffs_private_impl__swizzle_y__index__src(uint8_t* dst_ptr,
29491
                                          size_t dst_len,
29492
                                          uint8_t* dst_palette_ptr,
29493
                                          size_t dst_palette_len,
29494
                                          const uint8_t* src_ptr,
29495
0
                                          size_t src_len) {
29496
0
  if (dst_palette_len !=
29497
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29498
0
    return 0;
29499
0
  }
29500
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
29501
0
  uint8_t* d = dst_ptr;
29502
0
  const uint8_t* s = src_ptr;
29503
0
  size_t n = len;
29504
29505
  // TODO: unroll.
29506
29507
0
  while (n >= 1) {
29508
0
    d[0] = dst_palette_ptr[(size_t)s[0] * 4];
29509
29510
0
    s += 1 * 1;
29511
0
    d += 1 * 1;
29512
0
    n -= 1;
29513
0
  }
29514
29515
0
  return len;
29516
0
}
29517
29518
static uint64_t  //
29519
wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over(
29520
    uint8_t* dst_ptr,
29521
    size_t dst_len,
29522
    uint8_t* dst_palette_ptr,
29523
    size_t dst_palette_len,
29524
    const uint8_t* src_ptr,
29525
0
    size_t src_len) {
29526
0
  if (dst_palette_len !=
29527
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29528
0
    return 0;
29529
0
  }
29530
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
29531
0
  uint8_t* d = dst_ptr;
29532
0
  const uint8_t* s = src_ptr;
29533
0
  size_t n = len;
29534
29535
  // TODO: unroll.
29536
29537
0
  while (n >= 1) {
29538
0
    uint32_t d0 = 0xFF000000 | (0x00010101 * ((uint32_t)(d[0])));
29539
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29540
0
                                                          ((size_t)s[0] * 4));
29541
0
    d[0] = wuffs_base__color_u32_argb_premul__as__color_u8_gray(
29542
0
        wuffs_private_impl__composite_premul_nonpremul_u32_axxx(d0, s0));
29543
29544
0
    s += 1 * 1;
29545
0
    d += 1 * 1;
29546
0
    n -= 1;
29547
0
  }
29548
29549
0
  return len;
29550
0
}
29551
29552
static uint64_t  //
29553
wuffs_private_impl__swizzle_y__index_binary_alpha__src_over(
29554
    uint8_t* dst_ptr,
29555
    size_t dst_len,
29556
    uint8_t* dst_palette_ptr,
29557
    size_t dst_palette_len,
29558
    const uint8_t* src_ptr,
29559
0
    size_t src_len) {
29560
0
  if (dst_palette_len !=
29561
0
      WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29562
0
    return 0;
29563
0
  }
29564
0
  size_t len = (dst_len < src_len) ? dst_len : src_len;
29565
0
  uint8_t* d = dst_ptr;
29566
0
  const uint8_t* s = src_ptr;
29567
0
  size_t n = len;
29568
29569
  // TODO: unroll.
29570
29571
0
  while (n >= 1) {
29572
0
    uint32_t s0 = wuffs_base__peek_u32le__no_bounds_check(dst_palette_ptr +
29573
0
                                                          ((size_t)s[0] * 4));
29574
0
    if (s0) {
29575
0
      d[0] = (uint8_t)s0;
29576
0
    }
29577
29578
0
    s += 1 * 1;
29579
0
    d += 1 * 1;
29580
0
    n -= 1;
29581
0
  }
29582
29583
0
  return len;
29584
0
}
29585
29586
// --------
29587
29588
static uint64_t  //
29589
wuffs_private_impl__swizzle_y_16le__y_16be(uint8_t* dst_ptr,
29590
                                           size_t dst_len,
29591
                                           uint8_t* dst_palette_ptr,
29592
                                           size_t dst_palette_len,
29593
                                           const uint8_t* src_ptr,
29594
2.51M
                                           size_t src_len) {
29595
2.51M
  size_t dst_len2 = dst_len / 2;
29596
2.51M
  size_t src_len2 = src_len / 2;
29597
2.51M
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
29598
2.51M
  uint8_t* d = dst_ptr;
29599
2.51M
  const uint8_t* s = src_ptr;
29600
2.51M
  size_t n = len;
29601
29602
10.1M
  while (n >= 1) {
29603
7.61M
    uint8_t s0 = s[0];
29604
7.61M
    uint8_t s1 = s[1];
29605
7.61M
    d[0] = s1;
29606
7.61M
    d[1] = s0;
29607
29608
7.61M
    s += 1 * 2;
29609
7.61M
    d += 1 * 2;
29610
7.61M
    n -= 1;
29611
7.61M
  }
29612
29613
2.51M
  return len;
29614
2.51M
}
29615
29616
// --------
29617
29618
static uint64_t  //
29619
wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over(
29620
    uint8_t* dst_ptr,
29621
    size_t dst_len,
29622
    uint8_t* dst_palette_ptr,
29623
    size_t dst_palette_len,
29624
    const uint8_t* src_ptr,
29625
0
    size_t src_len) {
29626
0
  size_t dst_len2 = dst_len / 2;
29627
0
  size_t src_len2 = src_len / 2;
29628
0
  size_t len = (dst_len2 < src_len2) ? dst_len2 : src_len2;
29629
0
  uint8_t* d = dst_ptr;
29630
0
  const uint8_t* s = src_ptr;
29631
0
  size_t n = len;
29632
29633
0
  while (n >= 1) {
29634
0
    uint32_t d0 = ((uint32_t)(d[1]) << 24) | ((uint32_t)(d[0]) * 0x010101);
29635
0
    uint32_t s0 = ((uint32_t)(s[1]) << 24) | ((uint32_t)(s[0]) * 0x010101);
29636
0
    uint32_t c0 =
29637
0
        wuffs_private_impl__composite_nonpremul_nonpremul_u32_axxx(d0, s0);
29638
0
    wuffs_base__poke_u16le__no_bounds_check(d + (0 * 2), (uint16_t)(c0 >> 16));
29639
29640
0
    s += 1 * 2;
29641
0
    d += 1 * 2;
29642
0
    n -= 1;
29643
0
  }
29644
29645
0
  return len;
29646
0
}
29647
29648
// --------
29649
29650
static uint64_t  //
29651
wuffs_private_impl__swizzle_transparent_black_src(
29652
    uint8_t* dst_ptr,
29653
    size_t dst_len,
29654
    uint8_t* dst_palette_ptr,
29655
    size_t dst_palette_len,
29656
    uint64_t num_pixels,
29657
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
29658
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
29659
0
  if (n > num_pixels) {
29660
0
    n = num_pixels;
29661
0
  }
29662
0
  memset(dst_ptr, 0, ((size_t)(n * dst_pixfmt_bytes_per_pixel)));
29663
0
  return n;
29664
0
}
29665
29666
static uint64_t  //
29667
wuffs_private_impl__swizzle_transparent_black_src_over(
29668
    uint8_t* dst_ptr,
29669
    size_t dst_len,
29670
    uint8_t* dst_palette_ptr,
29671
    size_t dst_palette_len,
29672
    uint64_t num_pixels,
29673
0
    uint32_t dst_pixfmt_bytes_per_pixel) {
29674
0
  uint64_t n = ((uint64_t)dst_len) / dst_pixfmt_bytes_per_pixel;
29675
0
  if (n > num_pixels) {
29676
0
    n = num_pixels;
29677
0
  }
29678
0
  return n;
29679
0
}
29680
29681
// --------
29682
29683
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29684
wuffs_private_impl__pixel_swizzler__prepare__y(
29685
    wuffs_base__pixel_swizzler* p,
29686
    wuffs_base__pixel_format dst_pixfmt,
29687
    wuffs_base__slice_u8 dst_palette,
29688
    wuffs_base__slice_u8 src_palette,
29689
1.32k
    wuffs_base__pixel_blend blend) {
29690
1.32k
  switch (dst_pixfmt.repr) {
29691
652
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29692
652
      return wuffs_private_impl__swizzle_copy_1_1;
29693
29694
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29695
0
      return wuffs_private_impl__swizzle_bgr_565__y;
29696
29697
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29698
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29699
0
      return wuffs_private_impl__swizzle_xxx__y;
29700
29701
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29702
672
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29703
672
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29704
672
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29705
672
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29706
672
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29707
672
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29708
672
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29709
672
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
29710
672
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
29711
672
        return wuffs_private_impl__swizzle_xxxx__y__x86_sse42;
29712
672
      }
29713
0
#endif
29714
0
      return wuffs_private_impl__swizzle_xxxx__y;
29715
29716
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29717
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29718
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
29719
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
29720
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y;
29721
1.32k
  }
29722
0
  return NULL;
29723
1.32k
}
29724
29725
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29726
wuffs_private_impl__pixel_swizzler__prepare__y_16be(
29727
    wuffs_base__pixel_swizzler* p,
29728
    wuffs_base__pixel_format dst_pixfmt,
29729
    wuffs_base__slice_u8 dst_palette,
29730
    wuffs_base__slice_u8 src_palette,
29731
153
    wuffs_base__pixel_blend blend) {
29732
153
  switch (dst_pixfmt.repr) {
29733
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29734
0
      return wuffs_private_impl__swizzle_y__y_16be;
29735
29736
75
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
29737
75
      return wuffs_private_impl__swizzle_y_16le__y_16be;
29738
29739
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
29740
0
      return wuffs_private_impl__swizzle_copy_2_2;
29741
29742
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29743
0
      return wuffs_private_impl__swizzle_bgr_565__y_16be;
29744
29745
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29746
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29747
0
      return wuffs_private_impl__swizzle_xxx__y_16be;
29748
29749
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29750
78
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29751
78
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29752
78
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29753
78
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29754
78
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29755
78
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29756
78
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29757
78
      return wuffs_private_impl__swizzle_xxxx__y_16be;
29758
29759
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29760
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29761
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
29762
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
29763
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y_16be;
29764
153
  }
29765
0
  return NULL;
29766
153
}
29767
29768
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29769
wuffs_private_impl__pixel_swizzler__prepare__y_16le(
29770
    wuffs_base__pixel_swizzler* p,
29771
    wuffs_base__pixel_format dst_pixfmt,
29772
    wuffs_base__slice_u8 dst_palette,
29773
    wuffs_base__slice_u8 src_palette,
29774
0
    wuffs_base__pixel_blend blend) {
29775
0
  switch (dst_pixfmt.repr) {
29776
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29777
0
      return wuffs_private_impl__swizzle_y__y_16le;
29778
29779
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
29780
0
      return wuffs_private_impl__swizzle_copy_2_2;
29781
29782
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
29783
0
      return wuffs_private_impl__swizzle_y_16le__y_16be;
29784
29785
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29786
0
      return wuffs_private_impl__swizzle_bgr_565__y_16le;
29787
29788
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29789
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29790
0
      return wuffs_private_impl__swizzle_xxx__y_16le;
29791
29792
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29793
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29794
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
29795
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
29796
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29797
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29798
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
29799
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
29800
0
      return wuffs_private_impl__swizzle_xxxx__y_16le;
29801
29802
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29803
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
29804
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
29805
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL_4X16LE:
29806
0
      return wuffs_private_impl__swizzle_xxxxxxxx__y_16le;
29807
0
  }
29808
0
  return NULL;
29809
0
}
29810
29811
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29812
wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
29813
    wuffs_base__pixel_swizzler* p,
29814
    wuffs_base__pixel_format dst_pixfmt,
29815
    wuffs_base__slice_u8 dst_palette,
29816
    wuffs_base__slice_u8 src_palette,
29817
96
    wuffs_base__pixel_blend blend) {
29818
96
  switch (dst_pixfmt.repr) {
29819
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29820
0
      switch (blend) {
29821
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29822
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src;
29823
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29824
0
          return wuffs_private_impl__swizzle_y__ya_nonpremul__src_over;
29825
0
      }
29826
0
      return NULL;
29827
29828
44
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
29829
44
      switch (blend) {
29830
44
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29831
44
          return wuffs_private_impl__swizzle_copy_2_2;
29832
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29833
0
          return wuffs_private_impl__swizzle_ya_nonpremul__ya_nonpremul__src_over;
29834
44
      }
29835
0
      return NULL;
29836
29837
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29838
0
      switch (blend) {
29839
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29840
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src;
29841
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29842
0
          return wuffs_private_impl__swizzle_bgr_565__ya_nonpremul__src_over;
29843
0
      }
29844
0
      return NULL;
29845
29846
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29847
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
29848
0
      switch (blend) {
29849
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29850
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src;
29851
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29852
0
          return wuffs_private_impl__swizzle_xxx__ya_nonpremul__src_over;
29853
0
      }
29854
0
      return NULL;
29855
29856
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29857
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
29858
0
      switch (blend) {
29859
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29860
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src;
29861
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29862
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__ya_nonpremul__src_over;
29863
0
      }
29864
0
      return NULL;
29865
29866
52
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29867
52
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
29868
52
      switch (blend) {
29869
52
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29870
52
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src;
29871
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29872
0
          return wuffs_private_impl__swizzle_bgra_premul__ya_nonpremul__src_over;
29873
52
      }
29874
0
      return NULL;
29875
29876
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29877
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL_4X16LE:
29878
0
      switch (blend) {
29879
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29880
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src;
29881
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29882
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__ya_nonpremul__src_over;
29883
0
      }
29884
0
      return NULL;
29885
96
  }
29886
0
  return NULL;
29887
96
}
29888
29889
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
29890
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
29891
    wuffs_base__pixel_swizzler* p,
29892
    wuffs_base__pixel_format dst_pixfmt,
29893
    wuffs_base__slice_u8 dst_palette,
29894
    wuffs_base__slice_u8 src_palette,
29895
246
    wuffs_base__pixel_blend blend) {
29896
246
  switch (dst_pixfmt.repr) {
29897
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
29898
0
      switch (blend) {
29899
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29900
0
          if (wuffs_private_impl__swizzle_squash_align4_y_8888(
29901
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
29902
0
                  src_palette.len, true) !=
29903
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29904
0
            return NULL;
29905
0
          }
29906
0
          return wuffs_private_impl__swizzle_y__index__src;
29907
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29908
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29909
0
                                                            src_palette) !=
29910
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29911
0
            return NULL;
29912
0
          }
29913
0
          return wuffs_private_impl__swizzle_y__index_bgra_nonpremul__src_over;
29914
0
      }
29915
0
      return NULL;
29916
29917
126
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
29918
126
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29919
126
                                                        src_palette) !=
29920
126
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29921
0
        return NULL;
29922
0
      }
29923
126
      switch (blend) {
29924
126
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29925
126
          return wuffs_private_impl__swizzle_copy_1_1;
29926
126
      }
29927
0
      return NULL;
29928
29929
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
29930
0
      switch (blend) {
29931
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29932
0
          if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
29933
0
                  dst_palette.ptr, dst_palette.len, src_palette.ptr,
29934
0
                  src_palette.len, true) !=
29935
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29936
0
            return NULL;
29937
0
          }
29938
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
29939
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29940
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29941
0
                                                            src_palette) !=
29942
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29943
0
            return NULL;
29944
0
          }
29945
0
          return wuffs_private_impl__swizzle_bgr_565__index_bgra_nonpremul__src_over;
29946
0
      }
29947
0
      return NULL;
29948
29949
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
29950
0
      switch (blend) {
29951
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29952
0
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
29953
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
29954
0
                  src_palette.len) !=
29955
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
29956
0
            return NULL;
29957
0
          }
29958
0
          return wuffs_private_impl__swizzle_xxx__index__src;
29959
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29960
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29961
0
                                                            src_palette) !=
29962
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29963
0
            return NULL;
29964
0
          }
29965
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
29966
0
      }
29967
0
      return NULL;
29968
29969
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
29970
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29971
0
                                                        src_palette) !=
29972
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29973
0
        return NULL;
29974
0
      }
29975
0
      switch (blend) {
29976
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29977
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
29978
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29979
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
29980
0
      }
29981
0
      return NULL;
29982
29983
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
29984
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
29985
0
                                                        src_palette) !=
29986
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
29987
0
        return NULL;
29988
0
      }
29989
0
      switch (blend) {
29990
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
29991
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
29992
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
29993
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__index_bgra_nonpremul__src_over;
29994
0
      }
29995
0
      return NULL;
29996
29997
120
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
29998
120
      switch (blend) {
29999
120
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30000
120
          if (wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src(
30001
120
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30002
120
                  src_palette.len) !=
30003
120
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30004
0
            return NULL;
30005
0
          }
30006
120
          return wuffs_private_impl__swizzle_xxxx__index__src;
30007
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30008
0
          if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30009
0
                                                            src_palette) !=
30010
0
              WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30011
0
            return NULL;
30012
0
          }
30013
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
30014
120
      }
30015
0
      return NULL;
30016
30017
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30018
0
      switch (blend) {
30019
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30020
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
30021
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30022
0
                  src_palette.len) !=
30023
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30024
0
            return NULL;
30025
0
          }
30026
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30027
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30028
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30029
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30030
0
                  src_palette.len) !=
30031
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30032
0
            return NULL;
30033
0
          }
30034
0
          return wuffs_private_impl__swizzle_xxx__index_bgra_nonpremul__src_over;
30035
0
      }
30036
0
      return NULL;
30037
30038
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30039
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30040
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30041
0
              src_palette.len) !=
30042
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30043
0
        return NULL;
30044
0
      }
30045
0
      switch (blend) {
30046
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30047
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30048
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30049
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__index_bgra_nonpremul__src_over;
30050
0
      }
30051
0
      return NULL;
30052
30053
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30054
0
      switch (blend) {
30055
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30056
0
          if (wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src(
30057
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30058
0
                  src_palette.len) !=
30059
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30060
0
            return NULL;
30061
0
          }
30062
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30063
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30064
0
          if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30065
0
                  dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30066
0
                  src_palette.len) !=
30067
0
              (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30068
0
            return NULL;
30069
0
          }
30070
0
          return wuffs_private_impl__swizzle_bgra_premul__index_bgra_nonpremul__src_over;
30071
0
      }
30072
0
      return NULL;
30073
30074
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30075
      // TODO.
30076
0
      break;
30077
246
  }
30078
0
  return NULL;
30079
246
}
30080
30081
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30082
wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
30083
    wuffs_base__pixel_swizzler* p,
30084
    wuffs_base__pixel_format dst_pixfmt,
30085
    wuffs_base__slice_u8 dst_palette,
30086
    wuffs_base__slice_u8 src_palette,
30087
899
    wuffs_base__pixel_blend blend) {
30088
899
  switch (dst_pixfmt.repr) {
30089
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30090
0
      if (wuffs_private_impl__swizzle_squash_align4_y_8888(
30091
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
30092
0
              src_palette.len, false) !=
30093
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30094
0
        return NULL;
30095
0
      }
30096
0
      switch (blend) {
30097
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30098
0
          return wuffs_private_impl__swizzle_y__index__src;
30099
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30100
0
          return wuffs_private_impl__swizzle_y__index_binary_alpha__src_over;
30101
0
      }
30102
0
      return NULL;
30103
30104
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
30105
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
30106
429
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
30107
429
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30108
429
                                                        src_palette) !=
30109
429
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30110
0
        return NULL;
30111
0
      }
30112
429
      switch (blend) {
30113
429
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30114
429
          return wuffs_private_impl__swizzle_copy_1_1;
30115
429
      }
30116
0
      return NULL;
30117
30118
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30119
0
      if (wuffs_private_impl__swizzle_squash_align4_bgr_565_8888(
30120
0
              dst_palette.ptr, dst_palette.len, src_palette.ptr,
30121
0
              src_palette.len, false) !=
30122
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30123
0
        return NULL;
30124
0
      }
30125
0
      switch (blend) {
30126
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30127
0
          return wuffs_private_impl__swizzle_bgr_565__index__src;
30128
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30129
0
          return wuffs_private_impl__swizzle_bgr_565__index_binary_alpha__src_over;
30130
0
      }
30131
0
      return NULL;
30132
30133
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30134
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30135
0
                                                        src_palette) !=
30136
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30137
0
        return NULL;
30138
0
      }
30139
0
      switch (blend) {
30140
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30141
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30142
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30143
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
30144
0
      }
30145
0
      return NULL;
30146
30147
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30148
470
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30149
470
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30150
470
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30151
470
                                                        src_palette) !=
30152
470
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30153
0
        return NULL;
30154
0
      }
30155
470
      switch (blend) {
30156
470
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30157
470
          return wuffs_private_impl__swizzle_xxxx__index__src;
30158
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30159
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
30160
470
      }
30161
0
      return NULL;
30162
30163
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30164
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30165
0
      if (wuffs_private_impl__slice_u8__copy_from_slice(dst_palette,
30166
0
                                                        src_palette) !=
30167
0
          WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH) {
30168
0
        return NULL;
30169
0
      }
30170
0
      switch (blend) {
30171
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30172
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index__src;
30173
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30174
0
          return wuffs_private_impl__swizzle_xxxxxxxx__index_binary_alpha__src_over;
30175
0
      }
30176
0
      return NULL;
30177
30178
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30179
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30180
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30181
0
              src_palette.len) !=
30182
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30183
0
        return NULL;
30184
0
      }
30185
0
      switch (blend) {
30186
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30187
0
          return wuffs_private_impl__swizzle_xxx__index__src;
30188
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30189
0
          return wuffs_private_impl__swizzle_xxx__index_binary_alpha__src_over;
30190
0
      }
30191
0
      return NULL;
30192
30193
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30194
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30195
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30196
0
      if (wuffs_private_impl__swizzle_swap_rgbx_bgrx(
30197
0
              dst_palette.ptr, dst_palette.len, NULL, 0, src_palette.ptr,
30198
0
              src_palette.len) !=
30199
0
          (WUFFS_BASE__PIXEL_FORMAT__INDEXED__PALETTE_BYTE_LENGTH / 4)) {
30200
0
        return NULL;
30201
0
      }
30202
0
      switch (blend) {
30203
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30204
0
          return wuffs_private_impl__swizzle_xxxx__index__src;
30205
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30206
0
          return wuffs_private_impl__swizzle_xxxx__index_binary_alpha__src_over;
30207
0
      }
30208
0
      return NULL;
30209
899
  }
30210
0
  return NULL;
30211
899
}
30212
30213
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30214
wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
30215
    wuffs_base__pixel_swizzler* p,
30216
    wuffs_base__pixel_format dst_pixfmt,
30217
    wuffs_base__slice_u8 dst_palette,
30218
    wuffs_base__slice_u8 src_palette,
30219
0
    wuffs_base__pixel_blend blend) {
30220
0
  switch (dst_pixfmt.repr) {
30221
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30222
0
      return wuffs_private_impl__swizzle_y__bgr_565;
30223
30224
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30225
0
      return wuffs_private_impl__swizzle_copy_2_2;
30226
30227
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30228
0
      return wuffs_private_impl__swizzle_bgr__bgr_565;
30229
30230
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30231
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30232
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30233
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30234
0
      return wuffs_private_impl__swizzle_bgrw__bgr_565;
30235
30236
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30237
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30238
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr_565;
30239
30240
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30241
0
      return wuffs_private_impl__swizzle_rgb__bgr_565;
30242
30243
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30244
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30245
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30246
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30247
0
      return wuffs_private_impl__swizzle_rgbw__bgr_565;
30248
0
  }
30249
0
  return NULL;
30250
0
}
30251
30252
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30253
wuffs_private_impl__pixel_swizzler__prepare__bgr(
30254
    wuffs_base__pixel_swizzler* p,
30255
    wuffs_base__pixel_format dst_pixfmt,
30256
    wuffs_base__slice_u8 dst_palette,
30257
    wuffs_base__slice_u8 src_palette,
30258
0
    wuffs_base__pixel_blend blend) {
30259
0
  switch (dst_pixfmt.repr) {
30260
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30261
0
      return wuffs_private_impl__swizzle_y__bgr;
30262
30263
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30264
0
      return wuffs_private_impl__swizzle_bgr_565__bgr;
30265
30266
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30267
0
      return wuffs_private_impl__swizzle_copy_3_3;
30268
30269
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30270
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30271
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30272
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30273
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30274
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
30275
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
30276
0
      }
30277
0
#endif
30278
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
30279
30280
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30281
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL_4X16LE:
30282
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgr;
30283
30284
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30285
0
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
30286
30287
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30288
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30289
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30290
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30291
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30292
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
30293
0
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
30294
0
      }
30295
0
#endif
30296
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
30297
0
  }
30298
0
  return NULL;
30299
0
}
30300
30301
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30302
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
30303
    wuffs_base__pixel_swizzler* p,
30304
    wuffs_base__pixel_format dst_pixfmt,
30305
    wuffs_base__slice_u8 dst_palette,
30306
    wuffs_base__slice_u8 src_palette,
30307
162
    wuffs_base__pixel_blend blend) {
30308
162
  switch (dst_pixfmt.repr) {
30309
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30310
0
      switch (blend) {
30311
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30312
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src;
30313
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30314
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul__src_over;
30315
0
      }
30316
0
      return NULL;
30317
30318
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30319
0
      switch (blend) {
30320
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30321
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src;
30322
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30323
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul__src_over;
30324
0
      }
30325
0
      return NULL;
30326
30327
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30328
0
      switch (blend) {
30329
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30330
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
30331
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30332
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
30333
0
      }
30334
0
      return NULL;
30335
30336
76
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30337
76
      switch (blend) {
30338
76
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30339
76
          return wuffs_private_impl__swizzle_copy_4_4;
30340
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30341
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
30342
76
      }
30343
0
      return NULL;
30344
30345
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30346
0
      switch (blend) {
30347
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30348
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src;
30349
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30350
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul__src_over;
30351
0
      }
30352
0
      return NULL;
30353
30354
86
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30355
86
      switch (blend) {
30356
86
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30357
86
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
30358
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30359
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
30360
86
      }
30361
0
      return NULL;
30362
30363
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30364
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30365
      // TODO.
30366
0
      break;
30367
30368
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30369
0
      switch (blend) {
30370
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30371
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
30372
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30373
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
30374
0
      }
30375
0
      return NULL;
30376
30377
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30378
0
      switch (blend) {
30379
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30380
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30381
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30382
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30383
0
          }
30384
0
#endif
30385
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30386
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30387
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
30388
0
      }
30389
0
      return NULL;
30390
30391
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30392
0
      switch (blend) {
30393
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30394
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
30395
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30396
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
30397
0
      }
30398
0
      return NULL;
30399
30400
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30401
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30402
      // TODO.
30403
0
      break;
30404
162
  }
30405
0
  return NULL;
30406
162
}
30407
30408
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30409
wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
30410
    wuffs_base__pixel_swizzler* p,
30411
    wuffs_base__pixel_format dst_pixfmt,
30412
    wuffs_base__slice_u8 dst_palette,
30413
    wuffs_base__slice_u8 src_palette,
30414
493
    wuffs_base__pixel_blend blend) {
30415
493
  switch (dst_pixfmt.repr) {
30416
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30417
0
      switch (blend) {
30418
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30419
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src;
30420
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30421
0
          return wuffs_private_impl__swizzle_y__bgra_nonpremul_4x16le__src_over;
30422
0
      }
30423
0
      return NULL;
30424
30425
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30426
0
      switch (blend) {
30427
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30428
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src;
30429
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30430
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_nonpremul_4x16le__src_over;
30431
0
      }
30432
0
      return NULL;
30433
30434
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30435
0
      switch (blend) {
30436
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30437
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src;
30438
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30439
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul_4x16le__src_over;
30440
0
      }
30441
0
      return NULL;
30442
30443
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30444
0
      switch (blend) {
30445
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30446
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src;
30447
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30448
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul_4x16le__src_over;
30449
0
      }
30450
0
      return NULL;
30451
30452
243
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30453
243
      switch (blend) {
30454
243
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30455
243
          return wuffs_private_impl__swizzle_copy_8_8;
30456
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30457
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_nonpremul_4x16le__src_over;
30458
243
      }
30459
0
      return NULL;
30460
30461
250
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30462
250
      switch (blend) {
30463
250
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30464
250
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src;
30465
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30466
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul_4x16le__src_over;
30467
250
      }
30468
0
      return NULL;
30469
30470
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30471
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30472
      // TODO.
30473
0
      break;
30474
30475
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30476
0
      switch (blend) {
30477
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30478
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src;
30479
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30480
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul_4x16le__src_over;
30481
0
      }
30482
0
      return NULL;
30483
30484
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30485
0
      switch (blend) {
30486
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30487
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src;
30488
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30489
0
          return wuffs_private_impl__swizzle_rgba_nonpremul__bgra_nonpremul_4x16le__src_over;
30490
0
      }
30491
0
      break;
30492
30493
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30494
0
      switch (blend) {
30495
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30496
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src;
30497
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30498
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul_4x16le__src_over;
30499
0
      }
30500
0
      return NULL;
30501
30502
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30503
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30504
      // TODO.
30505
0
      break;
30506
493
  }
30507
0
  return NULL;
30508
493
}
30509
30510
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30511
wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
30512
    wuffs_base__pixel_swizzler* p,
30513
    wuffs_base__pixel_format dst_pixfmt,
30514
    wuffs_base__slice_u8 dst_palette,
30515
    wuffs_base__slice_u8 src_palette,
30516
0
    wuffs_base__pixel_blend blend) {
30517
0
  switch (dst_pixfmt.repr) {
30518
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30519
0
      switch (blend) {
30520
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30521
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
30522
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30523
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
30524
0
      }
30525
0
      return NULL;
30526
30527
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30528
0
      switch (blend) {
30529
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30530
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
30531
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30532
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
30533
0
      }
30534
0
      return NULL;
30535
30536
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30537
0
      switch (blend) {
30538
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30539
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
30540
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30541
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
30542
0
      }
30543
0
      return NULL;
30544
30545
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30546
0
      switch (blend) {
30547
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30548
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
30549
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30550
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
30551
0
      }
30552
0
      return NULL;
30553
30554
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30555
0
      switch (blend) {
30556
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30557
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
30558
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30559
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
30560
0
      }
30561
0
      return NULL;
30562
30563
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30564
0
      switch (blend) {
30565
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30566
0
          return wuffs_private_impl__swizzle_copy_4_4;
30567
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30568
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
30569
0
      }
30570
0
      return NULL;
30571
30572
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30573
0
      switch (blend) {
30574
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30575
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
30576
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30577
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
30578
0
      }
30579
0
      return NULL;
30580
30581
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30582
0
      switch (blend) {
30583
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30584
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
30585
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30586
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
30587
0
      }
30588
0
      return NULL;
30589
30590
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30591
0
      switch (blend) {
30592
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30593
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30594
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30595
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30596
0
          }
30597
0
#endif
30598
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30599
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30600
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
30601
0
      }
30602
0
      return NULL;
30603
0
  }
30604
0
  return NULL;
30605
0
}
30606
30607
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30608
wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
30609
    wuffs_base__pixel_swizzler* p,
30610
    wuffs_base__pixel_format dst_pixfmt,
30611
    wuffs_base__slice_u8 dst_palette,
30612
    wuffs_base__slice_u8 src_palette,
30613
0
    wuffs_base__pixel_blend blend) {
30614
0
  switch (dst_pixfmt.repr) {
30615
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30616
0
      switch (blend) {
30617
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30618
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src;
30619
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30620
0
          return wuffs_private_impl__swizzle_y__bgra_premul__src_over;
30621
0
      }
30622
0
      return NULL;
30623
30624
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30625
0
      switch (blend) {
30626
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30627
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src;
30628
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30629
0
          return wuffs_private_impl__swizzle_bgr_565__bgra_premul__src_over;
30630
0
      }
30631
0
      return NULL;
30632
30633
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30634
0
      switch (blend) {
30635
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30636
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
30637
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30638
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
30639
0
      }
30640
0
      return NULL;
30641
30642
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30643
0
      switch (blend) {
30644
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30645
0
          return wuffs_private_impl__swizzle_copy_4_4;
30646
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30647
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
30648
0
      }
30649
0
      return NULL;
30650
30651
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30652
0
      switch (blend) {
30653
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30654
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src;
30655
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30656
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__bgra_premul__src_over;
30657
0
      }
30658
0
      return NULL;
30659
30660
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30661
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30662
0
      switch (blend) {
30663
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30664
0
          return wuffs_private_impl__swizzle_copy_4_4;
30665
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30666
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
30667
0
      }
30668
0
      return NULL;
30669
30670
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30671
0
      switch (blend) {
30672
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30673
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
30674
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30675
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
30676
0
      }
30677
0
      return NULL;
30678
30679
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30680
0
      switch (blend) {
30681
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30682
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30683
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30684
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30685
0
          }
30686
0
#endif
30687
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30688
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30689
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
30690
0
      }
30691
0
      return NULL;
30692
30693
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30694
0
      switch (blend) {
30695
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30696
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30697
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30698
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30699
0
          }
30700
0
#endif
30701
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30702
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30703
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
30704
0
      }
30705
0
      return NULL;
30706
0
  }
30707
0
  return NULL;
30708
0
}
30709
30710
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30711
wuffs_private_impl__pixel_swizzler__prepare__bgrx(
30712
    wuffs_base__pixel_swizzler* p,
30713
    wuffs_base__pixel_format dst_pixfmt,
30714
    wuffs_base__slice_u8 dst_palette,
30715
    wuffs_base__slice_u8 src_palette,
30716
0
    wuffs_base__pixel_blend blend) {
30717
0
  switch (dst_pixfmt.repr) {
30718
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30719
0
      return wuffs_private_impl__swizzle_y__bgrx;
30720
30721
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30722
0
      return wuffs_private_impl__swizzle_bgr_565__bgrx;
30723
30724
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30725
0
      return wuffs_private_impl__swizzle_xxx__xxxx;
30726
30727
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30728
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30729
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30730
0
      return wuffs_private_impl__swizzle_bgrw__bgrx;
30731
30732
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30733
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__bgrx;
30734
30735
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30736
0
      return wuffs_private_impl__swizzle_copy_4_4;
30737
30738
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30739
0
      return wuffs_private_impl__swizzle_bgr__rgbx;
30740
30741
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30742
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30743
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30744
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30745
0
      return wuffs_private_impl__swizzle_bgrw__rgbx;
30746
0
  }
30747
0
  return NULL;
30748
0
}
30749
30750
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30751
wuffs_private_impl__pixel_swizzler__prepare__rgb(
30752
    wuffs_base__pixel_swizzler* p,
30753
    wuffs_base__pixel_format dst_pixfmt,
30754
    wuffs_base__slice_u8 dst_palette,
30755
    wuffs_base__slice_u8 src_palette,
30756
1.04k
    wuffs_base__pixel_blend blend) {
30757
1.04k
  switch (dst_pixfmt.repr) {
30758
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30759
0
      return wuffs_private_impl__swizzle_y__rgb;
30760
30761
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30762
0
      return wuffs_private_impl__swizzle_bgr_565__rgb;
30763
30764
519
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30765
519
      return wuffs_private_impl__swizzle_swap_rgb_bgr;
30766
30767
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30768
527
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30769
527
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30770
527
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30771
527
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30772
527
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
30773
527
        return wuffs_private_impl__swizzle_bgrw__rgb__x86_sse42;
30774
527
      }
30775
0
#endif
30776
0
      return wuffs_private_impl__swizzle_bgrw__rgb;
30777
30778
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30779
0
      return wuffs_private_impl__swizzle_bgrw_4x16le__rgb;
30780
30781
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30782
0
      return wuffs_private_impl__swizzle_copy_3_3;
30783
30784
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30785
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30786
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30787
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30788
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30789
0
      if (wuffs_base__cpu_arch__have_x86_sse42()) {
30790
0
        return wuffs_private_impl__swizzle_bgrw__bgr__x86_sse42;
30791
0
      }
30792
0
#endif
30793
0
      return wuffs_private_impl__swizzle_bgrw__bgr;
30794
1.04k
  }
30795
0
  return NULL;
30796
1.04k
}
30797
30798
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30799
wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
30800
    wuffs_base__pixel_swizzler* p,
30801
    wuffs_base__pixel_format dst_pixfmt,
30802
    wuffs_base__slice_u8 dst_palette,
30803
    wuffs_base__slice_u8 src_palette,
30804
1.22k
    wuffs_base__pixel_blend blend) {
30805
1.22k
  switch (dst_pixfmt.repr) {
30806
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30807
0
      switch (blend) {
30808
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30809
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src;
30810
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30811
0
          return wuffs_private_impl__swizzle_y__rgba_nonpremul__src_over;
30812
0
      }
30813
0
      return NULL;
30814
30815
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30816
0
      switch (blend) {
30817
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30818
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src;
30819
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30820
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_nonpremul__src_over;
30821
0
      }
30822
0
      return NULL;
30823
30824
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30825
0
      switch (blend) {
30826
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30827
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src;
30828
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30829
0
          return wuffs_private_impl__swizzle_bgr__rgba_nonpremul__src_over;
30830
0
      }
30831
0
      return NULL;
30832
30833
630
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30834
630
      switch (blend) {
30835
630
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30836
630
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30837
630
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30838
630
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30839
630
          }
30840
0
#endif
30841
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30842
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30843
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_nonpremul__src_over;
30844
630
      }
30845
0
      return NULL;
30846
30847
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30848
0
      switch (blend) {
30849
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30850
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src;
30851
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30852
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_nonpremul__src_over;
30853
0
      }
30854
0
      return NULL;
30855
30856
595
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30857
595
      switch (blend) {
30858
595
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30859
595
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src;
30860
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30861
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_nonpremul__src_over;
30862
595
      }
30863
0
      return NULL;
30864
30865
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
30866
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
30867
      // TODO.
30868
0
      break;
30869
30870
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30871
0
      switch (blend) {
30872
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30873
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src;
30874
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30875
0
          return wuffs_private_impl__swizzle_bgr__bgra_nonpremul__src_over;
30876
0
      }
30877
0
      return NULL;
30878
30879
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30880
0
      switch (blend) {
30881
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30882
0
          return wuffs_private_impl__swizzle_copy_4_4;
30883
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30884
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_nonpremul__src_over;
30885
0
      }
30886
0
      return NULL;
30887
30888
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30889
0
      switch (blend) {
30890
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30891
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src;
30892
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30893
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_nonpremul__src_over;
30894
0
      }
30895
0
      return NULL;
30896
30897
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_BINARY:
30898
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
30899
      // TODO.
30900
0
      break;
30901
1.22k
  }
30902
0
  return NULL;
30903
1.22k
}
30904
30905
static inline WUFFS_BASE__FORCE_INLINE wuffs_base__pixel_swizzler__func  //
30906
wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
30907
    wuffs_base__pixel_swizzler* p,
30908
    wuffs_base__pixel_format dst_pixfmt,
30909
    wuffs_base__slice_u8 dst_palette,
30910
    wuffs_base__slice_u8 src_palette,
30911
0
    wuffs_base__pixel_blend blend) {
30912
0
  switch (dst_pixfmt.repr) {
30913
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
30914
0
      switch (blend) {
30915
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30916
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src;
30917
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30918
0
          return wuffs_private_impl__swizzle_y__rgba_premul__src_over;
30919
0
      }
30920
0
      return NULL;
30921
30922
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
30923
0
      switch (blend) {
30924
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30925
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src;
30926
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30927
0
          return wuffs_private_impl__swizzle_bgr_565__rgba_premul__src_over;
30928
0
      }
30929
0
      return NULL;
30930
30931
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
30932
0
      switch (blend) {
30933
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30934
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src;
30935
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30936
0
          return wuffs_private_impl__swizzle_bgr__rgba_premul__src_over;
30937
0
      }
30938
0
      return NULL;
30939
30940
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
30941
0
      switch (blend) {
30942
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30943
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src;
30944
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30945
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__rgba_premul__src_over;
30946
0
      }
30947
0
      return NULL;
30948
30949
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
30950
0
      switch (blend) {
30951
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30952
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src;
30953
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30954
0
          return wuffs_private_impl__swizzle_bgra_nonpremul_4x16le__rgba_premul__src_over;
30955
0
      }
30956
0
      return NULL;
30957
30958
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
30959
0
      switch (blend) {
30960
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30961
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
30962
0
          if (wuffs_base__cpu_arch__have_x86_sse42()) {
30963
0
            return wuffs_private_impl__swizzle_swap_rgbx_bgrx__x86_sse42;
30964
0
          }
30965
0
#endif
30966
0
          return wuffs_private_impl__swizzle_swap_rgbx_bgrx;
30967
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30968
0
          return wuffs_private_impl__swizzle_bgra_premul__rgba_premul__src_over;
30969
0
      }
30970
0
      return NULL;
30971
30972
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
30973
0
      switch (blend) {
30974
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30975
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src;
30976
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30977
0
          return wuffs_private_impl__swizzle_bgr__bgra_premul__src_over;
30978
0
      }
30979
0
      return NULL;
30980
30981
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
30982
0
      switch (blend) {
30983
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30984
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src;
30985
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30986
0
          return wuffs_private_impl__swizzle_bgra_nonpremul__bgra_premul__src_over;
30987
0
      }
30988
0
      return NULL;
30989
30990
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
30991
0
      switch (blend) {
30992
0
        case WUFFS_BASE__PIXEL_BLEND__SRC:
30993
0
          return wuffs_private_impl__swizzle_copy_4_4;
30994
0
        case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
30995
0
          return wuffs_private_impl__swizzle_bgra_premul__bgra_premul__src_over;
30996
0
      }
30997
0
      return NULL;
30998
0
  }
30999
0
  return NULL;
31000
0
}
31001
31002
// --------
31003
31004
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
31005
wuffs_base__pixel_swizzler__prepare(wuffs_base__pixel_swizzler* p,
31006
                                    wuffs_base__pixel_format dst_pixfmt,
31007
                                    wuffs_base__slice_u8 dst_palette,
31008
                                    wuffs_base__pixel_format src_pixfmt,
31009
                                    wuffs_base__slice_u8 src_palette,
31010
5.64k
                                    wuffs_base__pixel_blend blend) {
31011
5.64k
  if (!p) {
31012
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
31013
0
  }
31014
5.64k
  p->private_impl.func = NULL;
31015
5.64k
  p->private_impl.transparent_black_func = NULL;
31016
5.64k
  p->private_impl.dst_pixfmt_bytes_per_pixel = 0;
31017
5.64k
  p->private_impl.src_pixfmt_bytes_per_pixel = 0;
31018
31019
  // ----
31020
31021
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31022
  switch (dst_pixfmt.repr) {
31023
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
31024
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31025
      break;
31026
#endif
31027
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
31028
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31029
      break;
31030
#endif
31031
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
31032
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31033
      break;
31034
#endif
31035
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
31036
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31037
      break;
31038
#endif
31039
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
31040
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31041
      break;
31042
#endif
31043
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
31044
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31045
      break;
31046
#endif
31047
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
31048
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31049
      break;
31050
#endif
31051
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
31052
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31053
      break;
31054
#endif
31055
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
31056
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31057
      break;
31058
#endif
31059
    default:
31060
      return wuffs_base__make_status(
31061
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
31062
  }
31063
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
31064
31065
  // ----
31066
31067
5.64k
  wuffs_base__pixel_swizzler__func func = NULL;
31068
5.64k
  wuffs_base__pixel_swizzler__transparent_black_func transparent_black_func =
31069
5.64k
      NULL;
31070
31071
5.64k
  uint32_t dst_pixfmt_bits_per_pixel =
31072
5.64k
      wuffs_base__pixel_format__bits_per_pixel(&dst_pixfmt);
31073
5.64k
  if ((dst_pixfmt_bits_per_pixel == 0) ||
31074
5.64k
      ((dst_pixfmt_bits_per_pixel & 7) != 0)) {
31075
0
    return wuffs_base__make_status(
31076
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
31077
0
  }
31078
31079
5.64k
  uint32_t src_pixfmt_bits_per_pixel =
31080
5.64k
      wuffs_base__pixel_format__bits_per_pixel(&src_pixfmt);
31081
5.64k
  if ((src_pixfmt_bits_per_pixel == 0) ||
31082
5.64k
      ((src_pixfmt_bits_per_pixel & 7) != 0)) {
31083
0
    return wuffs_base__make_status(
31084
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
31085
0
  }
31086
31087
  // TODO: support many more formats.
31088
31089
5.64k
  switch (blend) {
31090
5.64k
    case WUFFS_BASE__PIXEL_BLEND__SRC:
31091
5.64k
      transparent_black_func =
31092
5.64k
          wuffs_private_impl__swizzle_transparent_black_src;
31093
5.64k
      break;
31094
31095
0
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
31096
0
      transparent_black_func =
31097
0
          wuffs_private_impl__swizzle_transparent_black_src_over;
31098
0
      break;
31099
5.64k
  }
31100
31101
5.64k
  switch (src_pixfmt.repr) {
31102
1.32k
    case WUFFS_BASE__PIXEL_FORMAT__Y:
31103
1.32k
      func = wuffs_private_impl__pixel_swizzler__prepare__y(
31104
1.32k
          p, dst_pixfmt, dst_palette, src_palette, blend);
31105
1.32k
      break;
31106
31107
153
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
31108
153
      func = wuffs_private_impl__pixel_swizzler__prepare__y_16be(
31109
153
          p, dst_pixfmt, dst_palette, src_palette, blend);
31110
153
      break;
31111
31112
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
31113
0
      func = wuffs_private_impl__pixel_swizzler__prepare__y_16le(
31114
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31115
0
      break;
31116
31117
96
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
31118
96
      func = wuffs_private_impl__pixel_swizzler__prepare__ya_nonpremul(
31119
96
          p, dst_pixfmt, dst_palette, src_palette, blend);
31120
96
      break;
31121
31122
246
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
31123
246
      func =
31124
246
          wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_nonpremul(
31125
246
              p, dst_pixfmt, dst_palette, src_palette, blend);
31126
246
      break;
31127
31128
899
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
31129
899
      func = wuffs_private_impl__pixel_swizzler__prepare__indexed__bgra_binary(
31130
899
          p, dst_pixfmt, dst_palette, src_palette, blend);
31131
899
      break;
31132
31133
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
31134
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr_565(
31135
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31136
0
      break;
31137
31138
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
31139
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgr(
31140
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31141
0
      break;
31142
31143
162
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
31144
162
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul(
31145
162
          p, dst_pixfmt, dst_palette, src_palette, blend);
31146
162
      break;
31147
31148
493
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
31149
493
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_nonpremul_4x16le(
31150
493
          p, dst_pixfmt, dst_palette, src_palette, blend);
31151
493
      break;
31152
31153
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
31154
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_premul(
31155
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31156
0
      break;
31157
31158
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_BINARY:
31159
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgra_binary(
31160
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31161
0
      break;
31162
31163
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
31164
0
      func = wuffs_private_impl__pixel_swizzler__prepare__bgrx(
31165
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31166
0
      break;
31167
31168
1.04k
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
31169
1.04k
      func = wuffs_private_impl__pixel_swizzler__prepare__rgb(
31170
1.04k
          p, dst_pixfmt, dst_palette, src_palette, blend);
31171
1.04k
      break;
31172
31173
1.22k
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
31174
1.22k
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_nonpremul(
31175
1.22k
          p, dst_pixfmt, dst_palette, src_palette, blend);
31176
1.22k
      break;
31177
31178
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
31179
0
      func = wuffs_private_impl__pixel_swizzler__prepare__rgba_premul(
31180
0
          p, dst_pixfmt, dst_palette, src_palette, blend);
31181
0
      break;
31182
5.64k
  }
31183
31184
5.64k
  p->private_impl.func = func;
31185
5.64k
  p->private_impl.transparent_black_func = transparent_black_func;
31186
5.64k
  p->private_impl.dst_pixfmt_bytes_per_pixel = dst_pixfmt_bits_per_pixel / 8;
31187
5.64k
  p->private_impl.src_pixfmt_bytes_per_pixel = src_pixfmt_bits_per_pixel / 8;
31188
5.64k
  return wuffs_base__make_status(
31189
5.64k
      func ? NULL : wuffs_base__error__unsupported_pixel_swizzler_option);
31190
5.64k
}
31191
31192
WUFFS_BASE__MAYBE_STATIC uint64_t  //
31193
wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
31194
    const wuffs_base__pixel_swizzler* p,
31195
    uint32_t up_to_num_pixels,
31196
    wuffs_base__slice_u8 dst,
31197
    wuffs_base__slice_u8 dst_palette,
31198
    const uint8_t** ptr_iop_r,
31199
0
    const uint8_t* io2_r) {
31200
0
  if (p && p->private_impl.func) {
31201
0
    const uint8_t* iop_r = *ptr_iop_r;
31202
0
    uint64_t src_len = wuffs_base__u64__min(
31203
0
        ((uint64_t)up_to_num_pixels) *
31204
0
            ((uint64_t)p->private_impl.src_pixfmt_bytes_per_pixel),
31205
0
        ((uint64_t)(io2_r - iop_r)));
31206
0
    uint64_t n =
31207
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
31208
0
                                dst_palette.len, iop_r, (size_t)src_len);
31209
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
31210
0
    return n;
31211
0
  }
31212
0
  return 0;
31213
0
}
31214
31215
WUFFS_BASE__MAYBE_STATIC uint64_t  //
31216
wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
31217
    const wuffs_base__pixel_swizzler* p,
31218
    wuffs_base__slice_u8 dst,
31219
    wuffs_base__slice_u8 dst_palette,
31220
    const uint8_t** ptr_iop_r,
31221
0
    const uint8_t* io2_r) {
31222
0
  if (p && p->private_impl.func) {
31223
0
    const uint8_t* iop_r = *ptr_iop_r;
31224
0
    uint64_t src_len = ((uint64_t)(io2_r - iop_r));
31225
0
    uint64_t n =
31226
0
        (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
31227
0
                                dst_palette.len, iop_r, (size_t)src_len);
31228
0
    *ptr_iop_r += n * p->private_impl.src_pixfmt_bytes_per_pixel;
31229
0
    return n;
31230
0
  }
31231
0
  return 0;
31232
0
}
31233
31234
WUFFS_BASE__MAYBE_STATIC uint64_t  //
31235
wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(
31236
    const wuffs_base__pixel_swizzler* p,
31237
    wuffs_base__slice_u8 dst,
31238
    wuffs_base__slice_u8 dst_palette,
31239
211M
    wuffs_base__slice_u8 src) {
31240
211M
  if (p && p->private_impl.func) {
31241
211M
    return (*p->private_impl.func)(dst.ptr, dst.len, dst_palette.ptr,
31242
211M
                                   dst_palette.len, src.ptr, src.len);
31243
211M
  }
31244
0
  return 0;
31245
211M
}
31246
31247
WUFFS_BASE__MAYBE_STATIC uint64_t  //
31248
wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(
31249
    const wuffs_base__pixel_swizzler* p,
31250
    wuffs_base__slice_u8 dst,
31251
    wuffs_base__slice_u8 dst_palette,
31252
0
    uint64_t num_pixels) {
31253
0
  if (p && p->private_impl.transparent_black_func) {
31254
0
    return (*p->private_impl.transparent_black_func)(
31255
0
        dst.ptr, dst.len, dst_palette.ptr, dst_palette.len, num_pixels,
31256
0
        p->private_impl.dst_pixfmt_bytes_per_pixel);
31257
0
  }
31258
0
  return 0;
31259
0
}
31260
31261
// --------
31262
31263
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31264
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
31265
static void  //
31266
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
31267
    wuffs_base__pixel_buffer* dst,
31268
    uint32_t x,
31269
    uint32_t x_end,
31270
    uint32_t y,
31271
    const uint8_t* up0,
31272
    const uint8_t* up1,
31273
    const uint8_t* up2);
31274
31275
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
31276
static void  //
31277
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
31278
    wuffs_base__pixel_buffer* dst,
31279
    uint32_t x,
31280
    uint32_t x_end,
31281
    uint32_t y,
31282
    const uint8_t* up0,
31283
    const uint8_t* up1,
31284
    const uint8_t* up2);
31285
31286
#if defined(__GNUC__) && !defined(__clang__)
31287
// No-op.
31288
#else
31289
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
31290
static const uint8_t*  //
31291
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
31292
    uint8_t* dst_ptr,
31293
    const uint8_t* src_ptr_major,
31294
    const uint8_t* src_ptr_minor,
31295
    size_t src_len,
31296
    uint32_t h1v2_bias_ignored,
31297
    bool first_column,
31298
    bool last_column);
31299
#endif
31300
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
31301
31302
// --------
31303
31304
static inline uint32_t  //
31305
wuffs_private_impl__u32__max_of_4(uint32_t a,
31306
                                  uint32_t b,
31307
                                  uint32_t c,
31308
0
                                  uint32_t d) {
31309
0
  return wuffs_base__u32__max(     //
31310
0
      wuffs_base__u32__max(a, b),  //
31311
0
      wuffs_base__u32__max(c, d));
31312
0
}
31313
31314
static inline uint32_t  //
31315
wuffs_private_impl__u32__min_of_5(uint32_t a,
31316
                                  uint32_t b,
31317
                                  uint32_t c,
31318
                                  uint32_t d,
31319
0
                                  uint32_t e) {
31320
0
  return wuffs_base__u32__min(          //
31321
0
      wuffs_base__u32__min(             //
31322
0
          wuffs_base__u32__min(a, b),   //
31323
0
          wuffs_base__u32__min(c, d)),  //
31324
0
      e);
31325
0
}
31326
31327
// --------
31328
31329
typedef void (*wuffs_private_impl__swizzle_ycc__convert_4_func)(
31330
    wuffs_base__pixel_buffer* dst,
31331
    uint32_t x,
31332
    uint32_t x_end,
31333
    uint32_t y,
31334
    const uint8_t* up0,
31335
    const uint8_t* up1,
31336
    const uint8_t* up2,
31337
    const uint8_t* up3);
31338
31339
static void  //
31340
wuffs_private_impl__swizzle_cmyk__convert_4_general(
31341
    wuffs_base__pixel_buffer* dst,
31342
    uint32_t x,
31343
    uint32_t x_end,
31344
    uint32_t y,
31345
    const uint8_t* up0,
31346
    const uint8_t* up1,
31347
    const uint8_t* up2,
31348
0
    const uint8_t* up3) {
31349
0
  for (; x < x_end; x++) {
31350
    // It's called CMYK but, but for Adobe CMYK JPEG images in practice, it's
31351
    // RGBW: 0xFFu means no ink instead of full ink. Note that a double
31352
    // inversion is a no-op, so inversions might be implicit in the code below.
31353
0
    uint32_t r = ((uint32_t)(*up0++));
31354
0
    uint32_t g = ((uint32_t)(*up1++));
31355
0
    uint32_t b = ((uint32_t)(*up2++));
31356
0
    uint32_t w = ((uint32_t)(*up3++));
31357
0
    r = ((r * w) + 0x7Fu) / 0xFFu;
31358
0
    g = ((g * w) + 0x7Fu) / 0xFFu;
31359
0
    b = ((b * w) + 0x7Fu) / 0xFFu;
31360
0
    wuffs_base__pixel_buffer__set_color_u32_at(
31361
0
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
31362
0
  }
31363
0
}
31364
31365
static void  //
31366
wuffs_private_impl__swizzle_ycck__convert_4_general(
31367
    wuffs_base__pixel_buffer* dst,
31368
    uint32_t x,
31369
    uint32_t x_end,
31370
    uint32_t y,
31371
    const uint8_t* up0,
31372
    const uint8_t* up1,
31373
    const uint8_t* up2,
31374
0
    const uint8_t* up3) {
31375
0
  for (; x < x_end; x++) {
31376
    // We invert once again: 0xFFu means no ink instead of full ink.
31377
0
    uint32_t color =                           //
31378
0
        wuffs_base__color_ycc__as__color_u32(  //
31379
0
            *up0++, *up1++, *up2++);
31380
0
    uint32_t r = 0xFFu - (0xFFu & (color >> 16u));
31381
0
    uint32_t g = 0xFFu - (0xFFu & (color >> 8u));
31382
0
    uint32_t b = 0xFFu - (0xFFu & (color >> 0u));
31383
0
    uint32_t w = ((uint32_t)(*up3++));
31384
0
    r = ((r * w) + 0x7Fu) / 0xFFu;
31385
0
    g = ((g * w) + 0x7Fu) / 0xFFu;
31386
0
    b = ((b * w) + 0x7Fu) / 0xFFu;
31387
0
    wuffs_base__pixel_buffer__set_color_u32_at(
31388
0
        dst, x, y, 0xFF000000u | (r << 16u) | (g << 8u) | (b << 0u));
31389
0
  }
31390
0
}
31391
31392
// --------
31393
31394
typedef void (*wuffs_private_impl__swizzle_ycc__convert_3_func)(
31395
    wuffs_base__pixel_buffer* dst,
31396
    uint32_t x,
31397
    uint32_t x_end,
31398
    uint32_t y,
31399
    const uint8_t* up0,
31400
    const uint8_t* up1,
31401
    const uint8_t* up2);
31402
31403
static void  //
31404
wuffs_private_impl__swizzle_rgb__convert_3_general(
31405
    wuffs_base__pixel_buffer* dst,
31406
    uint32_t x,
31407
    uint32_t x_end,
31408
    uint32_t y,
31409
    const uint8_t* up0,
31410
    const uint8_t* up1,
31411
0
    const uint8_t* up2) {
31412
0
  for (; x < x_end; x++) {
31413
0
    uint32_t color = 0xFF000000u |                    //
31414
0
                     (((uint32_t)(*up0++)) << 16u) |  //
31415
0
                     (((uint32_t)(*up1++)) << 8u) |   //
31416
0
                     (((uint32_t)(*up2++)) << 0u);
31417
0
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
31418
0
  }
31419
0
}
31420
31421
static void  //
31422
wuffs_private_impl__swizzle_ycc__convert_3_general(
31423
    wuffs_base__pixel_buffer* dst,
31424
    uint32_t x,
31425
    uint32_t x_end,
31426
    uint32_t y,
31427
    const uint8_t* up0,
31428
    const uint8_t* up1,
31429
0
    const uint8_t* up2) {
31430
0
  for (; x < x_end; x++) {
31431
0
    uint32_t color =                           //
31432
0
        wuffs_base__color_ycc__as__color_u32(  //
31433
0
            *up0++, *up1++, *up2++);
31434
0
    wuffs_base__pixel_buffer__set_color_u32_at(dst, x, y, color);
31435
0
  }
31436
0
}
31437
31438
static void  //
31439
wuffs_private_impl__swizzle_ycc__convert_3_bgrx(wuffs_base__pixel_buffer* dst,
31440
                                                uint32_t x,
31441
                                                uint32_t x_end,
31442
                                                uint32_t y,
31443
                                                const uint8_t* up0,
31444
                                                const uint8_t* up1,
31445
0
                                                const uint8_t* up2) {
31446
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
31447
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
31448
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
31449
31450
0
  for (; x < x_end; x++) {
31451
0
    uint32_t color =                           //
31452
0
        wuffs_base__color_ycc__as__color_u32(  //
31453
0
            *up0++, *up1++, *up2++);
31454
0
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
31455
0
    dst_iter += 4u;
31456
0
  }
31457
0
}
31458
31459
static void  //
31460
wuffs_private_impl__swizzle_ycc__convert_3_rgbx(wuffs_base__pixel_buffer* dst,
31461
                                                uint32_t x,
31462
                                                uint32_t x_end,
31463
                                                uint32_t y,
31464
                                                const uint8_t* up0,
31465
                                                const uint8_t* up1,
31466
0
                                                const uint8_t* up2) {
31467
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
31468
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
31469
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
31470
31471
0
  for (; x < x_end; x++) {
31472
0
    uint32_t color =                                //
31473
0
        wuffs_base__color_ycc__as__color_u32_abgr(  //
31474
0
            *up0++, *up1++, *up2++);
31475
0
    wuffs_base__poke_u32le__no_bounds_check(dst_iter, color);
31476
0
    dst_iter += 4u;
31477
0
  }
31478
0
}
31479
31480
// --------
31481
31482
// wuffs_private_impl__swizzle_ycc__upsample_func upsamples to a destination
31483
// slice at least 480 (YCCK) or 672 (YCC) bytes long and whose src_len
31484
// (multiplied by 1, 2, 3 or 4) is positive but no more than that. This 480 or
31485
// 672 length is just under 1/4 or 1/3 of the scratch_buffer_2k slice length.
31486
// Both (480 * 4) = 1920 and (672 * 3) = 2016 are less than 2048.
31487
//
31488
// 480 and 672 are nice round numbers because a JPEG MCU is 1, 2, 3 or 4 blocks
31489
// wide and each block is 8 pixels wide. We have:
31490
//   480 = 1 * 8 * 60,   672 = 1 * 8 * 84
31491
//   480 = 2 * 8 * 30,   672 = 2 * 8 * 42
31492
//   480 = 3 * 8 * 20,   672 = 3 * 8 * 28
31493
//   480 = 4 * 8 * 15,   672 = 4 * 8 * 21
31494
//
31495
// Box filters are equivalent to nearest neighbor upsampling. These ignore the
31496
// src_ptr_minor, h1v2_bias, first_column and last_column arguments.
31497
//
31498
// Triangle filters use a 3:1 ratio (in 1 dimension), or 9:3:3:1 (in 2
31499
// dimensions), which is higher quality (less blocky) but also higher
31500
// computational effort.
31501
//
31502
// In theory, we could use triangle filters for any (inv_h, inv_v) combination.
31503
// In practice, matching libjpeg-turbo, we only implement it for the common
31504
// chroma subsampling ratios (YCC420, YCC422 or YCC440), corresponding to an
31505
// (inv_h, inv_v) pair of (2, 2), (2, 1) or (1, 2).
31506
typedef const uint8_t* (*wuffs_private_impl__swizzle_ycc__upsample_func)(
31507
    uint8_t* dst_ptr,
31508
    const uint8_t* src_ptr_major,  // Nearest row.
31509
    const uint8_t* src_ptr_minor,  // Adjacent row, alternating above or below.
31510
    size_t src_len,
31511
    uint32_t h1v2_bias,
31512
    bool first_column,
31513
    bool last_column);
31514
31515
static const uint8_t*  //
31516
wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box(
31517
    uint8_t* dst_ptr,
31518
    const uint8_t* src_ptr_major,
31519
    const uint8_t* src_ptr_minor_ignored,
31520
    size_t src_len,
31521
    uint32_t h1v2_bias_ignored,
31522
    bool first_column_ignored,
31523
0
    bool last_column_ignored) {
31524
0
  return src_ptr_major;
31525
0
}
31526
31527
static const uint8_t*  //
31528
wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box(
31529
    uint8_t* dst_ptr,
31530
    const uint8_t* src_ptr_major,
31531
    const uint8_t* src_ptr_minor_ignored,
31532
    size_t src_len,
31533
    uint32_t h1v2_bias_ignored,
31534
    bool first_column_ignored,
31535
0
    bool last_column_ignored) {
31536
0
  uint8_t* dp = dst_ptr;
31537
0
  const uint8_t* sp = src_ptr_major;
31538
0
  while (src_len--) {
31539
0
    uint8_t sv = *sp++;
31540
0
    *dp++ = sv;
31541
0
    *dp++ = sv;
31542
0
  }
31543
0
  return dst_ptr;
31544
0
}
31545
31546
static const uint8_t*  //
31547
wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box(
31548
    uint8_t* dst_ptr,
31549
    const uint8_t* src_ptr_major,
31550
    const uint8_t* src_ptr_minor_ignored,
31551
    size_t src_len,
31552
    uint32_t h1v2_bias_ignored,
31553
    bool first_column_ignored,
31554
0
    bool last_column_ignored) {
31555
0
  uint8_t* dp = dst_ptr;
31556
0
  const uint8_t* sp = src_ptr_major;
31557
0
  while (src_len--) {
31558
0
    uint8_t sv = *sp++;
31559
0
    *dp++ = sv;
31560
0
    *dp++ = sv;
31561
0
    *dp++ = sv;
31562
0
  }
31563
0
  return dst_ptr;
31564
0
}
31565
31566
static const uint8_t*  //
31567
wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box(
31568
    uint8_t* dst_ptr,
31569
    const uint8_t* src_ptr_major,
31570
    const uint8_t* src_ptr_minor_ignored,
31571
    size_t src_len,
31572
    uint32_t h1v2_bias_ignored,
31573
    bool first_column_ignored,
31574
0
    bool last_column_ignored) {
31575
0
  uint8_t* dp = dst_ptr;
31576
0
  const uint8_t* sp = src_ptr_major;
31577
0
  while (src_len--) {
31578
0
    uint8_t sv = *sp++;
31579
0
    *dp++ = sv;
31580
0
    *dp++ = sv;
31581
0
    *dp++ = sv;
31582
0
    *dp++ = sv;
31583
0
  }
31584
0
  return dst_ptr;
31585
0
}
31586
31587
static const uint8_t*  //
31588
wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle(
31589
    uint8_t* dst_ptr,
31590
    const uint8_t* src_ptr_major,
31591
    const uint8_t* src_ptr_minor,
31592
    size_t src_len,
31593
    uint32_t h1v2_bias,
31594
    bool first_column,
31595
0
    bool last_column) {
31596
0
  uint8_t* dp = dst_ptr;
31597
0
  const uint8_t* sp_major = src_ptr_major;
31598
0
  const uint8_t* sp_minor = src_ptr_minor;
31599
0
  while (src_len--) {
31600
0
    *dp++ = (uint8_t)(((3u * ((uint32_t)(*sp_major++))) +  //
31601
0
                       (1u * ((uint32_t)(*sp_minor++))) +  //
31602
0
                       h1v2_bias) >>
31603
0
                      2u);
31604
0
  }
31605
0
  return dst_ptr;
31606
0
}
31607
31608
static const uint8_t*  //
31609
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle(
31610
    uint8_t* dst_ptr,
31611
    const uint8_t* src_ptr_major,
31612
    const uint8_t* src_ptr_minor,
31613
    size_t src_len,
31614
    uint32_t h1v2_bias_ignored,
31615
    bool first_column,
31616
0
    bool last_column) {
31617
0
  uint8_t* dp = dst_ptr;
31618
0
  const uint8_t* sp = src_ptr_major;
31619
31620
0
  if (first_column) {
31621
0
    src_len--;
31622
0
    if ((src_len <= 0u) && last_column) {
31623
0
      uint8_t sv = *sp++;
31624
0
      *dp++ = sv;
31625
0
      *dp++ = sv;
31626
0
      return dst_ptr;
31627
0
    }
31628
0
    uint32_t svp1 = sp[+1];
31629
0
    uint8_t sv = *sp++;
31630
0
    *dp++ = sv;
31631
0
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svp1 + 2u) >> 2u);
31632
0
    if (src_len <= 0u) {
31633
0
      return dst_ptr;
31634
0
    }
31635
0
  }
31636
31637
0
  if (last_column) {
31638
0
    src_len--;
31639
0
  }
31640
31641
0
  for (; src_len > 0u; src_len--) {
31642
0
    uint32_t svm1 = sp[-1];
31643
0
    uint32_t svp1 = sp[+1];
31644
0
    uint32_t sv3 = 3u * (uint32_t)(*sp++);
31645
0
    *dp++ = (uint8_t)((sv3 + svm1 + 1u) >> 2u);
31646
0
    *dp++ = (uint8_t)((sv3 + svp1 + 2u) >> 2u);
31647
0
  }
31648
31649
0
  if (last_column) {
31650
0
    uint32_t svm1 = sp[-1];
31651
0
    uint8_t sv = *sp++;
31652
0
    *dp++ = (uint8_t)(((3u * (uint32_t)sv) + svm1 + 1u) >> 2u);
31653
0
    *dp++ = sv;
31654
0
  }
31655
31656
0
  return dst_ptr;
31657
0
}
31658
31659
static const uint8_t*  //
31660
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle(
31661
    uint8_t* dst_ptr,
31662
    const uint8_t* src_ptr_major,
31663
    const uint8_t* src_ptr_minor,
31664
    size_t src_len,
31665
    uint32_t h1v2_bias_ignored,
31666
    bool first_column,
31667
0
    bool last_column) {
31668
0
  uint8_t* dp = dst_ptr;
31669
0
  const uint8_t* sp_major = src_ptr_major;
31670
0
  const uint8_t* sp_minor = src_ptr_minor;
31671
31672
0
  if (first_column) {
31673
0
    src_len--;
31674
0
    if ((src_len <= 0u) && last_column) {
31675
0
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
31676
0
                    (4u * ((uint32_t)(*sp_minor++)));
31677
0
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
31678
0
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
31679
0
      return dst_ptr;
31680
0
    }
31681
31682
0
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
31683
0
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
31684
0
    uint32_t sv_major_p1 = sp_major[+1];
31685
0
    uint32_t sv_minor_p1 = sp_minor[+1];
31686
31687
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
31688
0
                  (3u * ((uint32_t)(*sp_minor++)));
31689
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
31690
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
31691
0
    if (src_len <= 0u) {
31692
0
      return dst_ptr;
31693
0
    }
31694
0
  }
31695
31696
0
  if (last_column) {
31697
0
    src_len--;
31698
0
  }
31699
31700
0
  for (; src_len > 0u; src_len--) {
31701
0
    uint32_t sv_major_m1 = sp_major[-1];
31702
0
    uint32_t sv_minor_m1 = sp_minor[-1];
31703
0
    uint32_t sv_major_p1 = sp_major[+1];
31704
0
    uint32_t sv_minor_p1 = sp_minor[+1];
31705
31706
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
31707
0
                  (3u * ((uint32_t)(*sp_minor++)));
31708
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
31709
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
31710
0
  }
31711
31712
0
  if (last_column) {
31713
0
    uint32_t sv_major_m1 = sp_major[-1];
31714
0
    uint32_t sv_minor_m1 = sp_minor[-1];
31715
0
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
31716
0
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
31717
31718
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
31719
0
                  (3u * ((uint32_t)(*sp_minor++)));
31720
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
31721
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
31722
0
  }
31723
31724
0
  return dst_ptr;
31725
0
}
31726
31727
// wuffs_private_impl__swizzle_ycc__upsample_funcs is indexed by inv_h and then
31728
// inv_v.
31729
static const wuffs_private_impl__swizzle_ycc__upsample_func
31730
    wuffs_private_impl__swizzle_ycc__upsample_funcs[4][4] = {
31731
        {
31732
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
31733
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
31734
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
31735
            wuffs_private_impl__swizzle_ycc__upsample_inv_h1vn_box,
31736
        },
31737
        {
31738
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
31739
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
31740
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
31741
            wuffs_private_impl__swizzle_ycc__upsample_inv_h2vn_box,
31742
        },
31743
        {
31744
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
31745
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
31746
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
31747
            wuffs_private_impl__swizzle_ycc__upsample_inv_h3vn_box,
31748
        },
31749
        {
31750
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
31751
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
31752
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
31753
            wuffs_private_impl__swizzle_ycc__upsample_inv_h4vn_box,
31754
        },
31755
};
31756
31757
static inline uint32_t  //
31758
wuffs_private_impl__swizzle_has_triangle_upsampler(uint32_t inv_h,
31759
0
                                                   uint32_t inv_v) {
31760
0
  if (inv_h == 1u) {
31761
0
    return inv_v == 2u;
31762
0
  } else if (inv_h == 2u) {
31763
0
    return (inv_v == 1u) || (inv_v == 2u);
31764
0
  }
31765
0
  return false;
31766
0
}
31767
31768
// --------
31769
31770
// All of the wuffs_private_impl__swizzle_ycc__etc functions have
31771
// preconditions. See all of the checks made in
31772
// wuffs_base__pixel_swizzler__swizzle_ycck before calling these functions. For
31773
// example, (width > 0) is a precondition, but there are many more.
31774
31775
static void  //
31776
wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
31777
    wuffs_base__pixel_buffer* dst,
31778
    uint32_t width,
31779
    uint32_t y,
31780
    const uint8_t* src_ptr0,
31781
    const uint8_t* src_ptr1,
31782
    const uint8_t* src_ptr2,
31783
    const uint8_t* src_ptr3,
31784
    uint32_t stride0,
31785
    uint32_t stride1,
31786
    uint32_t stride2,
31787
    uint32_t stride3,
31788
    uint32_t inv_h0,
31789
    uint32_t inv_h1,
31790
    uint32_t inv_h2,
31791
    uint32_t inv_h3,
31792
    uint32_t inv_v0,
31793
    uint32_t inv_v1,
31794
    uint32_t inv_v2,
31795
    uint32_t inv_v3,
31796
    uint32_t half_width_for_2to1,
31797
    uint32_t h1v2_bias,
31798
    uint8_t* scratch_buffer_2k_ptr,
31799
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
31800
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
31801
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
31802
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc3,
31803
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
31804
0
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
31805
0
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
31806
0
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
31807
0
  const uint8_t* src3 = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
31808
0
  uint32_t total_src_len0 = 0u;
31809
0
  uint32_t total_src_len1 = 0u;
31810
0
  uint32_t total_src_len2 = 0u;
31811
0
  uint32_t total_src_len3 = 0u;
31812
31813
0
  uint32_t x = 0u;
31814
0
  while (x < width) {
31815
0
    bool first_column = x == 0u;
31816
0
    uint32_t end = x + 480u;
31817
0
    if (end > width) {
31818
0
      end = width;
31819
0
    }
31820
31821
0
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31822
0
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31823
0
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31824
0
    uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
31825
0
    total_src_len0 += src_len0;
31826
0
    total_src_len1 += src_len1;
31827
0
    total_src_len2 += src_len2;
31828
0
    total_src_len3 += src_len3;
31829
31830
0
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
31831
0
    const uint8_t* up0 = (*upfunc0)(          //
31832
0
        scratch_buffer_2k_ptr + (0u * 480u),  //
31833
0
        src_ptr_x0,                           //
31834
0
        src_ptr_x0,                           //
31835
0
        src_len0,                             //
31836
0
        h1v2_bias,                            //
31837
0
        first_column,                         //
31838
0
        (total_src_len0 >= half_width_for_2to1));
31839
31840
0
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
31841
0
    const uint8_t* up1 = (*upfunc1)(          //
31842
0
        scratch_buffer_2k_ptr + (1u * 480u),  //
31843
0
        src_ptr_x1,                           //
31844
0
        src_ptr_x1,                           //
31845
0
        src_len1,                             //
31846
0
        h1v2_bias,                            //
31847
0
        first_column,                         //
31848
0
        (total_src_len1 >= half_width_for_2to1));
31849
31850
0
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
31851
0
    const uint8_t* up2 = (*upfunc2)(          //
31852
0
        scratch_buffer_2k_ptr + (2u * 480u),  //
31853
0
        src_ptr_x2,                           //
31854
0
        src_ptr_x2,                           //
31855
0
        src_len2,                             //
31856
0
        h1v2_bias,                            //
31857
0
        first_column,                         //
31858
0
        (total_src_len2 >= half_width_for_2to1));
31859
31860
0
    const uint8_t* src_ptr_x3 = src3 + (x / inv_h3);
31861
0
    const uint8_t* up3 = (*upfunc3)(          //
31862
0
        scratch_buffer_2k_ptr + (3u * 480u),  //
31863
0
        src_ptr_x3,                           //
31864
0
        src_ptr_x3,                           //
31865
0
        src_len3,                             //
31866
0
        h1v2_bias,                            //
31867
0
        first_column,                         //
31868
0
        (total_src_len3 >= half_width_for_2to1));
31869
31870
0
    (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
31871
0
    x = end;
31872
0
  }
31873
0
}
31874
31875
static void  //
31876
wuffs_private_impl__swizzle_ycck__general__triangle_filter(
31877
    wuffs_base__pixel_buffer* dst,
31878
    uint32_t x_min_incl,
31879
    uint32_t x_max_excl,
31880
    uint32_t y_min_incl,
31881
    uint32_t y_max_excl,
31882
    const uint8_t* src_ptr0,
31883
    const uint8_t* src_ptr1,
31884
    const uint8_t* src_ptr2,
31885
    const uint8_t* src_ptr3,
31886
    uint32_t stride0,
31887
    uint32_t stride1,
31888
    uint32_t stride2,
31889
    uint32_t stride3,
31890
    uint32_t inv_h0,
31891
    uint32_t inv_h1,
31892
    uint32_t inv_h2,
31893
    uint32_t inv_h3,
31894
    uint32_t inv_v0,
31895
    uint32_t inv_v1,
31896
    uint32_t inv_v2,
31897
    uint32_t inv_v3,
31898
    uint32_t half_width_for_2to1,
31899
    uint32_t half_height_for_2to1,
31900
    uint8_t* scratch_buffer_2k_ptr,
31901
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
31902
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
31903
0
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
31904
0
    return;
31905
0
  }
31906
31907
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
31908
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
31909
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
31910
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
31911
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
31912
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
31913
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
31914
0
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
31915
31916
  // First row.
31917
0
  uint32_t h1v2_bias = 1u;
31918
0
  wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
31919
0
      dst, x_max_excl, 0u,                     //
31920
0
      src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
31921
0
      stride0, stride1, stride2, stride3,      //
31922
0
      inv_h0, inv_h1, inv_h2, inv_h3,          //
31923
0
      inv_v0, inv_v1, inv_v2, inv_v3,          //
31924
0
      half_width_for_2to1,                     //
31925
0
      h1v2_bias,                               //
31926
0
      scratch_buffer_2k_ptr,                   //
31927
0
      upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
31928
0
  h1v2_bias = 2u;
31929
31930
  // Middle rows.
31931
0
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
31932
0
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
31933
0
  uint32_t y;
31934
0
  for (y = 1u; y < middle_y_max_excl; y++) {
31935
0
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
31936
0
    const uint8_t* src0_minor =
31937
0
        (inv_v0 != 2u)
31938
0
            ? src0_major
31939
0
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
31940
0
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
31941
0
    const uint8_t* src1_minor =
31942
0
        (inv_v1 != 2u)
31943
0
            ? src1_major
31944
0
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
31945
0
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
31946
0
    const uint8_t* src2_minor =
31947
0
        (inv_v2 != 2u)
31948
0
            ? src2_major
31949
0
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
31950
0
    const uint8_t* src3_major = src_ptr3 + ((y / inv_v3) * (size_t)stride3);
31951
0
    const uint8_t* src3_minor =
31952
0
        (inv_v3 != 2u)
31953
0
            ? src3_major
31954
0
            : ((y & 1u) ? (src3_major + stride3) : (src3_major - stride3));
31955
0
    uint32_t total_src_len0 = 0u;
31956
0
    uint32_t total_src_len1 = 0u;
31957
0
    uint32_t total_src_len2 = 0u;
31958
0
    uint32_t total_src_len3 = 0u;
31959
31960
0
    uint32_t x = 0u;
31961
0
    while (x < x_max_excl) {
31962
0
      bool first_column = x == 0u;
31963
0
      uint32_t end = x + 480u;
31964
0
      if (end > x_max_excl) {
31965
0
        end = x_max_excl;
31966
0
      }
31967
31968
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
31969
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
31970
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
31971
0
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
31972
0
      total_src_len0 += src_len0;
31973
0
      total_src_len1 += src_len1;
31974
0
      total_src_len2 += src_len2;
31975
0
      total_src_len3 += src_len3;
31976
31977
0
      const uint8_t* up0 = (*upfunc0)(          //
31978
0
          scratch_buffer_2k_ptr + (0u * 480u),  //
31979
0
          src0_major + (x / inv_h0),            //
31980
0
          src0_minor + (x / inv_h0),            //
31981
0
          src_len0,                             //
31982
0
          h1v2_bias,                            //
31983
0
          first_column,                         //
31984
0
          (total_src_len0 >= half_width_for_2to1));
31985
31986
0
      const uint8_t* up1 = (*upfunc1)(          //
31987
0
          scratch_buffer_2k_ptr + (1u * 480u),  //
31988
0
          src1_major + (x / inv_h1),            //
31989
0
          src1_minor + (x / inv_h1),            //
31990
0
          src_len1,                             //
31991
0
          h1v2_bias,                            //
31992
0
          first_column,                         //
31993
0
          (total_src_len1 >= half_width_for_2to1));
31994
31995
0
      const uint8_t* up2 = (*upfunc2)(          //
31996
0
          scratch_buffer_2k_ptr + (2u * 480u),  //
31997
0
          src2_major + (x / inv_h2),            //
31998
0
          src2_minor + (x / inv_h2),            //
31999
0
          src_len2,                             //
32000
0
          h1v2_bias,                            //
32001
0
          first_column,                         //
32002
0
          (total_src_len2 >= half_width_for_2to1));
32003
32004
0
      const uint8_t* up3 = (*upfunc3)(          //
32005
0
          scratch_buffer_2k_ptr + (3u * 480u),  //
32006
0
          src3_major + (x / inv_h3),            //
32007
0
          src3_minor + (x / inv_h3),            //
32008
0
          src_len3,                             //
32009
0
          h1v2_bias,                            //
32010
0
          first_column,                         //
32011
0
          (total_src_len3 >= half_width_for_2to1));
32012
32013
0
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
32014
0
      x = end;
32015
0
    }
32016
32017
0
    h1v2_bias ^= 3u;
32018
0
  }
32019
32020
  // Last row.
32021
0
  if (middle_y_max_excl != y_max_excl) {
32022
0
    wuffs_private_impl__swizzle_ycck__general__triangle_filter_edge_row(
32023
0
        dst, x_max_excl, middle_y_max_excl,      //
32024
0
        src_ptr0, src_ptr1, src_ptr2, src_ptr3,  //
32025
0
        stride0, stride1, stride2, stride3,      //
32026
0
        inv_h0, inv_h1, inv_h2, inv_h3,          //
32027
0
        inv_v0, inv_v1, inv_v2, inv_v3,          //
32028
0
        half_width_for_2to1,                     //
32029
0
        h1v2_bias,                               //
32030
0
        scratch_buffer_2k_ptr,                   //
32031
0
        upfunc0, upfunc1, upfunc2, upfunc3, conv4func);
32032
0
  }
32033
0
}
32034
32035
static void  //
32036
wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
32037
    wuffs_base__pixel_buffer* dst,
32038
    uint32_t width,
32039
    uint32_t y,
32040
    const uint8_t* src_ptr0,
32041
    const uint8_t* src_ptr1,
32042
    const uint8_t* src_ptr2,
32043
    uint32_t stride0,
32044
    uint32_t stride1,
32045
    uint32_t stride2,
32046
    uint32_t inv_h0,
32047
    uint32_t inv_h1,
32048
    uint32_t inv_h2,
32049
    uint32_t inv_v0,
32050
    uint32_t inv_v1,
32051
    uint32_t inv_v2,
32052
    uint32_t half_width_for_2to1,
32053
    uint32_t h1v2_bias,
32054
    uint8_t* scratch_buffer_2k_ptr,
32055
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc0,
32056
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc1,
32057
    wuffs_private_impl__swizzle_ycc__upsample_func upfunc2,
32058
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
32059
0
  const uint8_t* src0 = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
32060
0
  const uint8_t* src1 = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
32061
0
  const uint8_t* src2 = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
32062
0
  uint32_t total_src_len0 = 0u;
32063
0
  uint32_t total_src_len1 = 0u;
32064
0
  uint32_t total_src_len2 = 0u;
32065
32066
0
  uint32_t x = 0u;
32067
0
  while (x < width) {
32068
0
    bool first_column = x == 0u;
32069
0
    uint32_t end = x + 672u;
32070
0
    if (end > width) {
32071
0
      end = width;
32072
0
    }
32073
32074
0
    uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32075
0
    uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32076
0
    uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32077
0
    total_src_len0 += src_len0;
32078
0
    total_src_len1 += src_len1;
32079
0
    total_src_len2 += src_len2;
32080
32081
0
    const uint8_t* src_ptr_x0 = src0 + (x / inv_h0);
32082
0
    const uint8_t* up0 = (*upfunc0)(          //
32083
0
        scratch_buffer_2k_ptr + (0u * 672u),  //
32084
0
        src_ptr_x0,                           //
32085
0
        src_ptr_x0,                           //
32086
0
        src_len0,                             //
32087
0
        h1v2_bias,                            //
32088
0
        first_column,                         //
32089
0
        (total_src_len0 >= half_width_for_2to1));
32090
32091
0
    const uint8_t* src_ptr_x1 = src1 + (x / inv_h1);
32092
0
    const uint8_t* up1 = (*upfunc1)(          //
32093
0
        scratch_buffer_2k_ptr + (1u * 672u),  //
32094
0
        src_ptr_x1,                           //
32095
0
        src_ptr_x1,                           //
32096
0
        src_len1,                             //
32097
0
        h1v2_bias,                            //
32098
0
        first_column,                         //
32099
0
        (total_src_len1 >= half_width_for_2to1));
32100
32101
0
    const uint8_t* src_ptr_x2 = src2 + (x / inv_h2);
32102
0
    const uint8_t* up2 = (*upfunc2)(          //
32103
0
        scratch_buffer_2k_ptr + (2u * 672u),  //
32104
0
        src_ptr_x2,                           //
32105
0
        src_ptr_x2,                           //
32106
0
        src_len2,                             //
32107
0
        h1v2_bias,                            //
32108
0
        first_column,                         //
32109
0
        (total_src_len2 >= half_width_for_2to1));
32110
32111
0
    (*conv3func)(dst, x, end, y, up0, up1, up2);
32112
0
    x = end;
32113
0
  }
32114
0
}
32115
32116
static void  //
32117
wuffs_private_impl__swizzle_ycc__general__triangle_filter(
32118
    wuffs_base__pixel_buffer* dst,
32119
    uint32_t x_min_incl,
32120
    uint32_t x_max_excl,
32121
    uint32_t y_min_incl,
32122
    uint32_t y_max_excl,
32123
    const uint8_t* src_ptr0,
32124
    const uint8_t* src_ptr1,
32125
    const uint8_t* src_ptr2,
32126
    uint32_t stride0,
32127
    uint32_t stride1,
32128
    uint32_t stride2,
32129
    uint32_t inv_h0,
32130
    uint32_t inv_h1,
32131
    uint32_t inv_h2,
32132
    uint32_t inv_v0,
32133
    uint32_t inv_v1,
32134
    uint32_t inv_v2,
32135
    uint32_t half_width_for_2to1,
32136
    uint32_t half_height_for_2to1,
32137
    uint8_t* scratch_buffer_2k_ptr,
32138
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
32139
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
32140
0
  if ((x_min_incl != 0) || (y_min_incl != 0)) {
32141
0
    return;
32142
0
  }
32143
32144
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
32145
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
32146
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
32147
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
32148
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
32149
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
32150
32151
  // First row.
32152
0
  uint32_t h1v2_bias = 1u;
32153
0
  wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
32154
0
      dst, x_max_excl, 0u,           //
32155
0
      src_ptr0, src_ptr1, src_ptr2,  //
32156
0
      stride0, stride1, stride2,     //
32157
0
      inv_h0, inv_h1, inv_h2,        //
32158
0
      inv_v0, inv_v1, inv_v2,        //
32159
0
      half_width_for_2to1,           //
32160
0
      h1v2_bias,                     //
32161
0
      scratch_buffer_2k_ptr,         //
32162
0
      upfunc0, upfunc1, upfunc2, conv3func);
32163
0
  h1v2_bias = 2u;
32164
32165
  // Middle rows.
32166
0
  bool last_row = y_max_excl == 2u * half_height_for_2to1;
32167
0
  uint32_t middle_y_max_excl = last_row ? (y_max_excl - 1u) : y_max_excl;
32168
0
  uint32_t y;
32169
0
  for (y = 1u; y < middle_y_max_excl; y++) {
32170
0
    const uint8_t* src0_major = src_ptr0 + ((y / inv_v0) * (size_t)stride0);
32171
0
    const uint8_t* src0_minor =
32172
0
        (inv_v0 != 2u)
32173
0
            ? src0_major
32174
0
            : ((y & 1u) ? (src0_major + stride0) : (src0_major - stride0));
32175
0
    const uint8_t* src1_major = src_ptr1 + ((y / inv_v1) * (size_t)stride1);
32176
0
    const uint8_t* src1_minor =
32177
0
        (inv_v1 != 2u)
32178
0
            ? src1_major
32179
0
            : ((y & 1u) ? (src1_major + stride1) : (src1_major - stride1));
32180
0
    const uint8_t* src2_major = src_ptr2 + ((y / inv_v2) * (size_t)stride2);
32181
0
    const uint8_t* src2_minor =
32182
0
        (inv_v2 != 2u)
32183
0
            ? src2_major
32184
0
            : ((y & 1u) ? (src2_major + stride2) : (src2_major - stride2));
32185
0
    uint32_t total_src_len0 = 0u;
32186
0
    uint32_t total_src_len1 = 0u;
32187
0
    uint32_t total_src_len2 = 0u;
32188
32189
0
    uint32_t x = 0u;
32190
0
    while (x < x_max_excl) {
32191
0
      bool first_column = x == 0u;
32192
0
      uint32_t end = x + 672u;
32193
0
      if (end > x_max_excl) {
32194
0
        end = x_max_excl;
32195
0
      }
32196
32197
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32198
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32199
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32200
0
      total_src_len0 += src_len0;
32201
0
      total_src_len1 += src_len1;
32202
0
      total_src_len2 += src_len2;
32203
32204
0
      const uint8_t* up0 = (*upfunc0)(          //
32205
0
          scratch_buffer_2k_ptr + (0u * 672u),  //
32206
0
          src0_major + (x / inv_h0),            //
32207
0
          src0_minor + (x / inv_h0),            //
32208
0
          src_len0,                             //
32209
0
          h1v2_bias,                            //
32210
0
          first_column,                         //
32211
0
          (total_src_len0 >= half_width_for_2to1));
32212
32213
0
      const uint8_t* up1 = (*upfunc1)(          //
32214
0
          scratch_buffer_2k_ptr + (1u * 672u),  //
32215
0
          src1_major + (x / inv_h1),            //
32216
0
          src1_minor + (x / inv_h1),            //
32217
0
          src_len1,                             //
32218
0
          h1v2_bias,                            //
32219
0
          first_column,                         //
32220
0
          (total_src_len1 >= half_width_for_2to1));
32221
32222
0
      const uint8_t* up2 = (*upfunc2)(          //
32223
0
          scratch_buffer_2k_ptr + (2u * 672u),  //
32224
0
          src2_major + (x / inv_h2),            //
32225
0
          src2_minor + (x / inv_h2),            //
32226
0
          src_len2,                             //
32227
0
          h1v2_bias,                            //
32228
0
          first_column,                         //
32229
0
          (total_src_len2 >= half_width_for_2to1));
32230
32231
0
      (*conv3func)(dst, x, end, y, up0, up1, up2);
32232
0
      x = end;
32233
0
    }
32234
32235
0
    h1v2_bias ^= 3u;
32236
0
  }
32237
32238
  // Last row.
32239
0
  if (middle_y_max_excl != y_max_excl) {
32240
0
    wuffs_private_impl__swizzle_ycc__general__triangle_filter_edge_row(
32241
0
        dst, x_max_excl, middle_y_max_excl,  //
32242
0
        src_ptr0, src_ptr1, src_ptr2,        //
32243
0
        stride0, stride1, stride2,           //
32244
0
        inv_h0, inv_h1, inv_h2,              //
32245
0
        inv_v0, inv_v1, inv_v2,              //
32246
0
        half_width_for_2to1,                 //
32247
0
        h1v2_bias,                           //
32248
0
        scratch_buffer_2k_ptr,               //
32249
0
        upfunc0, upfunc1, upfunc2, conv3func);
32250
0
  }
32251
0
}
32252
32253
static void  //
32254
wuffs_private_impl__swizzle_ycc__general__box_filter(
32255
    wuffs_base__pixel_buffer* dst,
32256
    uint32_t x_min_incl,
32257
    uint32_t x_max_excl,
32258
    uint32_t y_min_incl,
32259
    uint32_t y_max_excl,
32260
    const uint8_t* src_ptr0,
32261
    const uint8_t* src_ptr1,
32262
    const uint8_t* src_ptr2,
32263
    uint32_t stride0,
32264
    uint32_t stride1,
32265
    uint32_t stride2,
32266
    uint32_t inv_h0,
32267
    uint32_t inv_h1,
32268
    uint32_t inv_h2,
32269
    uint32_t inv_v0,
32270
    uint32_t inv_v1,
32271
    uint32_t inv_v2,
32272
    uint32_t half_width_for_2to1,
32273
    uint32_t half_height_for_2to1,
32274
    uint8_t* scratch_buffer_2k_ptr,
32275
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
32276
0
    wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) {
32277
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
32278
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
32279
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
32280
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
32281
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
32282
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
32283
32284
0
  uint32_t y;
32285
0
  for (y = y_min_incl; y < y_max_excl; y++) {
32286
0
    const uint8_t* src0_major =
32287
0
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
32288
0
    const uint8_t* src1_major =
32289
0
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
32290
0
    const uint8_t* src2_major =
32291
0
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
32292
32293
0
    uint32_t x = x_min_incl;
32294
0
    while (x < x_max_excl) {
32295
0
      uint32_t end = x + 672u;
32296
0
      if (end > x_max_excl) {
32297
0
        end = x_max_excl;
32298
0
      }
32299
32300
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32301
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32302
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32303
32304
0
      const uint8_t* up0 = (*upfunc0)(               //
32305
0
          scratch_buffer_2k_ptr + (0u * 672u),       //
32306
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
32307
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
32308
0
          src_len0,                                  //
32309
0
          0u, false, false);
32310
32311
0
      const uint8_t* up1 = (*upfunc1)(               //
32312
0
          scratch_buffer_2k_ptr + (1u * 672u),       //
32313
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
32314
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
32315
0
          src_len1,                                  //
32316
0
          0u, false, false);
32317
32318
0
      const uint8_t* up2 = (*upfunc2)(               //
32319
0
          scratch_buffer_2k_ptr + (2u * 672u),       //
32320
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
32321
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
32322
0
          src_len2,                                  //
32323
0
          0u, false, false);
32324
32325
0
      (*conv3func)(dst, x, end, y, up0, up1, up2);
32326
0
      x = end;
32327
0
    }
32328
0
  }
32329
0
}
32330
32331
static void  //
32332
wuffs_private_impl__swizzle_ycck__general__box_filter(
32333
    wuffs_base__pixel_buffer* dst,
32334
    uint32_t x_min_incl,
32335
    uint32_t x_max_excl,
32336
    uint32_t y_min_incl,
32337
    uint32_t y_max_excl,
32338
    const uint8_t* src_ptr0,
32339
    const uint8_t* src_ptr1,
32340
    const uint8_t* src_ptr2,
32341
    const uint8_t* src_ptr3,
32342
    uint32_t stride0,
32343
    uint32_t stride1,
32344
    uint32_t stride2,
32345
    uint32_t stride3,
32346
    uint32_t inv_h0,
32347
    uint32_t inv_h1,
32348
    uint32_t inv_h2,
32349
    uint32_t inv_h3,
32350
    uint32_t inv_v0,
32351
    uint32_t inv_v1,
32352
    uint32_t inv_v2,
32353
    uint32_t inv_v3,
32354
    uint32_t half_width_for_2to1,
32355
    uint32_t half_height_for_2to1,
32356
    uint8_t* scratch_buffer_2k_ptr,
32357
    wuffs_private_impl__swizzle_ycc__upsample_func (*upfuncs)[4][4],
32358
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) {
32359
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc0 =
32360
0
      (*upfuncs)[(inv_h0 - 1u) & 3u][(inv_v0 - 1u) & 3u];
32361
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc1 =
32362
0
      (*upfuncs)[(inv_h1 - 1u) & 3u][(inv_v1 - 1u) & 3u];
32363
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc2 =
32364
0
      (*upfuncs)[(inv_h2 - 1u) & 3u][(inv_v2 - 1u) & 3u];
32365
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfunc3 =
32366
0
      (*upfuncs)[(inv_h3 - 1u) & 3u][(inv_v3 - 1u) & 3u];
32367
32368
0
  uint32_t y;
32369
0
  for (y = y_min_incl; y < y_max_excl; y++) {
32370
0
    const uint8_t* src0_major =
32371
0
        src_ptr0 + (((y - y_min_incl) / inv_v0) * (size_t)stride0);
32372
0
    const uint8_t* src1_major =
32373
0
        src_ptr1 + (((y - y_min_incl) / inv_v1) * (size_t)stride1);
32374
0
    const uint8_t* src2_major =
32375
0
        src_ptr2 + (((y - y_min_incl) / inv_v2) * (size_t)stride2);
32376
0
    const uint8_t* src3_major =
32377
0
        src_ptr3 + (((y - y_min_incl) / inv_v3) * (size_t)stride3);
32378
32379
0
    uint32_t x = x_min_incl;
32380
0
    while (x < x_max_excl) {
32381
0
      uint32_t end = x + 480u;
32382
0
      if (end > x_max_excl) {
32383
0
        end = x_max_excl;
32384
0
      }
32385
32386
0
      uint32_t src_len0 = ((end - x) + inv_h0 - 1u) / inv_h0;
32387
0
      uint32_t src_len1 = ((end - x) + inv_h1 - 1u) / inv_h1;
32388
0
      uint32_t src_len2 = ((end - x) + inv_h2 - 1u) / inv_h2;
32389
0
      uint32_t src_len3 = ((end - x) + inv_h3 - 1u) / inv_h3;
32390
32391
0
      const uint8_t* up0 = (*upfunc0)(               //
32392
0
          scratch_buffer_2k_ptr + (0u * 480u),       //
32393
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
32394
0
          src0_major + ((x - x_min_incl) / inv_h0),  //
32395
0
          src_len0,                                  //
32396
0
          0u, false, false);
32397
32398
0
      const uint8_t* up1 = (*upfunc1)(               //
32399
0
          scratch_buffer_2k_ptr + (1u * 480u),       //
32400
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
32401
0
          src1_major + ((x - x_min_incl) / inv_h1),  //
32402
0
          src_len1,                                  //
32403
0
          0u, false, false);
32404
32405
0
      const uint8_t* up2 = (*upfunc2)(               //
32406
0
          scratch_buffer_2k_ptr + (2u * 480u),       //
32407
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
32408
0
          src2_major + ((x - x_min_incl) / inv_h2),  //
32409
0
          src_len2,                                  //
32410
0
          0u, false, false);
32411
32412
0
      const uint8_t* up3 = (*upfunc3)(               //
32413
0
          scratch_buffer_2k_ptr + (3u * 480u),       //
32414
0
          src3_major + ((x - x_min_incl) / inv_h3),  //
32415
0
          src3_major + ((x - x_min_incl) / inv_h3),  //
32416
0
          src_len3,                                  //
32417
0
          0u, false, false);
32418
32419
0
      (*conv4func)(dst, x, end, y, up0, up1, up2, up3);
32420
0
      x = end;
32421
0
    }
32422
0
  }
32423
0
}
32424
32425
// --------
32426
32427
// wuffs_private_impl__swizzle_flattened_length is like
32428
// wuffs_base__table__flattened_length but returns uint64_t (not size_t) and
32429
// also accounts for subsampling.
32430
static uint64_t  //
32431
wuffs_private_impl__swizzle_flattened_length(uint32_t width,
32432
                                             uint32_t height,
32433
                                             uint32_t stride,
32434
                                             uint32_t inv_h,
32435
0
                                             uint32_t inv_v) {
32436
0
  uint64_t scaled_width = (((uint64_t)width) + (inv_h - 1u)) / inv_h;
32437
0
  uint64_t scaled_height = (((uint64_t)height) + (inv_v - 1u)) / inv_v;
32438
0
  if (scaled_height <= 0u) {
32439
0
    return 0u;
32440
0
  }
32441
0
  return ((scaled_height - 1u) * stride) + scaled_width;
32442
0
}
32443
32444
WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
32445
wuffs_base__pixel_swizzler__swizzle_ycck(
32446
    const wuffs_base__pixel_swizzler* p,
32447
    wuffs_base__pixel_buffer* dst,
32448
    wuffs_base__slice_u8 dst_palette,
32449
    uint32_t x_min_incl,
32450
    uint32_t x_max_excl,
32451
    uint32_t y_min_incl,
32452
    uint32_t y_max_excl,
32453
    wuffs_base__slice_u8 src0,
32454
    wuffs_base__slice_u8 src1,
32455
    wuffs_base__slice_u8 src2,
32456
    wuffs_base__slice_u8 src3,
32457
    uint32_t width0,
32458
    uint32_t width1,
32459
    uint32_t width2,
32460
    uint32_t width3,
32461
    uint32_t height0,
32462
    uint32_t height1,
32463
    uint32_t height2,
32464
    uint32_t height3,
32465
    uint32_t stride0,
32466
    uint32_t stride1,
32467
    uint32_t stride2,
32468
    uint32_t stride3,
32469
    uint8_t h0,
32470
    uint8_t h1,
32471
    uint8_t h2,
32472
    uint8_t h3,
32473
    uint8_t v0,
32474
    uint8_t v1,
32475
    uint8_t v2,
32476
    uint8_t v3,
32477
    bool is_rgb_or_cmyk,
32478
    bool triangle_filter_for_2to1,
32479
0
    wuffs_base__slice_u8 scratch_buffer_2k) {
32480
0
  if (!p) {
32481
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
32482
0
  } else if (!dst ||                             //
32483
0
             (x_min_incl > x_max_excl) ||        //
32484
0
             (x_max_excl > 0xFFFFu) ||           //
32485
0
             (y_min_incl > y_max_excl) ||        //
32486
0
             (y_max_excl > 0xFFFFu) ||           //
32487
0
             (4u <= ((unsigned int)h0 - 1u)) ||  //
32488
0
             (4u <= ((unsigned int)h1 - 1u)) ||  //
32489
0
             (4u <= ((unsigned int)h2 - 1u)) ||  //
32490
0
             (4u <= ((unsigned int)v0 - 1u)) ||  //
32491
0
             (4u <= ((unsigned int)v1 - 1u)) ||  //
32492
0
             (4u <= ((unsigned int)v2 - 1u)) ||  //
32493
0
             (triangle_filter_for_2to1 && ((x_min_incl | y_min_incl) > 0u)) ||
32494
0
             (scratch_buffer_2k.len < 2048u)) {
32495
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
32496
0
  }
32497
0
  if ((h3 != 0u) || (v3 != 0u)) {
32498
0
    if ((4u <= ((unsigned int)h3 - 1u)) ||  //
32499
0
        (4u <= ((unsigned int)v3 - 1u))) {
32500
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
32501
0
    }
32502
0
  }
32503
32504
0
  uint32_t max_incl_h = wuffs_private_impl__u32__max_of_4(h0, h1, h2, h3);
32505
0
  uint32_t max_incl_v = wuffs_private_impl__u32__max_of_4(v0, v1, v2, v3);
32506
32507
  // Calculate the inverse h and v ratios.
32508
  //
32509
  // It also canonicalizes (h=2 and max_incl_h=4) as equivalent to (h=1 and
32510
  // max_incl_h=2). In both cases, the inv_h value is 2.
32511
0
  uint32_t inv_h0 = max_incl_h / h0;
32512
0
  uint32_t inv_h1 = max_incl_h / h1;
32513
0
  uint32_t inv_h2 = max_incl_h / h2;
32514
0
  uint32_t inv_h3 = h3 ? (max_incl_h / h3) : 0u;
32515
0
  uint32_t inv_v0 = max_incl_v / v0;
32516
0
  uint32_t inv_v1 = max_incl_v / v1;
32517
0
  uint32_t inv_v2 = max_incl_v / v2;
32518
0
  uint32_t inv_v3 = v3 ? (max_incl_v / v3) : 0u;
32519
32520
0
  if (x_min_incl != 0) {
32521
0
    if ((x_min_incl % inv_h0) || (x_min_incl % inv_h1) ||
32522
0
        (x_min_incl % inv_h2) || (inv_h3 && (x_min_incl % inv_h3))) {
32523
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
32524
0
    }
32525
0
  }
32526
0
  if (y_min_incl != 0) {
32527
0
    if ((y_min_incl % inv_v0) || (y_min_incl % inv_v1) ||
32528
0
        (y_min_incl % inv_v2) || (inv_v3 && (y_min_incl % inv_v3))) {
32529
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
32530
0
    }
32531
0
  }
32532
32533
0
  uint32_t half_width_for_2to1 = ((x_max_excl - x_min_incl) + 1u) / 2u;
32534
0
  if (inv_h0 == 2) {
32535
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width0);
32536
0
  }
32537
0
  if (inv_h1 == 2) {
32538
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width1);
32539
0
  }
32540
0
  if (inv_h2 == 2) {
32541
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width2);
32542
0
  }
32543
0
  if (inv_h3 == 2) {
32544
0
    half_width_for_2to1 = wuffs_base__u32__min(half_width_for_2to1, width3);
32545
0
  }
32546
32547
0
  uint32_t half_height_for_2to1 = ((y_max_excl - y_min_incl) + 1u) / 2u;
32548
0
  if (inv_v0 == 2) {
32549
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height0);
32550
0
  }
32551
0
  if (inv_v1 == 2) {
32552
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height1);
32553
0
  }
32554
0
  if (inv_v2 == 2) {
32555
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height2);
32556
0
  }
32557
0
  if (inv_v3 == 2) {
32558
0
    half_height_for_2to1 = wuffs_base__u32__min(half_height_for_2to1, height3);
32559
0
  }
32560
32561
0
  x_max_excl = wuffs_base__u32__min(                   //
32562
0
      wuffs_base__pixel_config__width(&dst->pixcfg),   //
32563
0
      x_min_incl + wuffs_private_impl__u32__min_of_5(  //
32564
0
                       x_max_excl - x_min_incl,        //
32565
0
                       width0 * inv_h0,                //
32566
0
                       width1 * inv_h1,                //
32567
0
                       width2 * inv_h2,                //
32568
0
                       inv_h3 ? (width3 * inv_h3) : 0xFFFFFFFF));
32569
0
  y_max_excl = wuffs_base__u32__min(                   //
32570
0
      wuffs_base__pixel_config__height(&dst->pixcfg),  //
32571
0
      y_min_incl + wuffs_private_impl__u32__min_of_5(  //
32572
0
                       y_max_excl - y_min_incl,        //
32573
0
                       height0 * inv_v0,               //
32574
0
                       height1 * inv_v1,               //
32575
0
                       height2 * inv_v2,               //
32576
0
                       inv_v3 ? (height3 * inv_v3) : 0xFFFFFFFF));
32577
32578
0
  if ((x_min_incl >= x_max_excl) || (y_min_incl >= y_max_excl)) {
32579
0
    return wuffs_base__make_status(NULL);
32580
0
  }
32581
0
  uint32_t width = x_max_excl - x_min_incl;
32582
0
  uint32_t height = y_max_excl - y_min_incl;
32583
32584
0
  if (((h0 * inv_h0) != max_incl_h) ||  //
32585
0
      ((h1 * inv_h1) != max_incl_h) ||  //
32586
0
      ((h2 * inv_h2) != max_incl_h) ||  //
32587
0
      ((v0 * inv_v0) != max_incl_v) ||  //
32588
0
      ((v1 * inv_v1) != max_incl_v) ||  //
32589
0
      ((v2 * inv_v2) != max_incl_v) ||  //
32590
0
      (src0.len < wuffs_private_impl__swizzle_flattened_length(
32591
0
                      width, height, stride0, inv_h0, inv_v0)) ||
32592
0
      (src1.len < wuffs_private_impl__swizzle_flattened_length(
32593
0
                      width, height, stride1, inv_h1, inv_v1)) ||
32594
0
      (src2.len < wuffs_private_impl__swizzle_flattened_length(
32595
0
                      width, height, stride2, inv_h2, inv_v2))) {
32596
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
32597
0
  }
32598
0
  if ((h3 != 0u) || (v3 != 0u)) {
32599
0
    if (((h3 * inv_h3) != max_incl_h) ||  //
32600
0
        ((v3 * inv_v3) != max_incl_v) ||  //
32601
0
        (src3.len < wuffs_private_impl__swizzle_flattened_length(
32602
0
                        width, height, stride3, inv_h3, inv_v3))) {
32603
0
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
32604
0
    }
32605
0
  }
32606
32607
0
  if (wuffs_base__pixel_format__is_planar(&dst->pixcfg.private_impl.pixfmt)) {
32608
    // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
32609
0
    return wuffs_base__make_status(
32610
0
        wuffs_base__error__unsupported_pixel_swizzler_option);
32611
0
  }
32612
32613
  // ----
32614
32615
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
32616
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
32617
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_Y)
32618
    case WUFFS_BASE__PIXEL_FORMAT__Y:
32619
      break;
32620
#endif
32621
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR_565)
32622
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
32623
      break;
32624
#endif
32625
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGR)
32626
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
32627
      break;
32628
#endif
32629
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL)
32630
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
32631
      break;
32632
#endif
32633
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_NONPREMUL_4X16LE)
32634
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
32635
      break;
32636
#endif
32637
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_BGRA_PREMUL)
32638
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
32639
      break;
32640
#endif
32641
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGB)
32642
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
32643
      break;
32644
#endif
32645
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_NONPREMUL)
32646
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
32647
      break;
32648
#endif
32649
#if defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ALLOW_RGBA_PREMUL)
32650
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
32651
      break;
32652
#endif
32653
    default:
32654
      return wuffs_base__make_status(
32655
          wuffs_base__error__disabled_by_wuffs_config_dst_pixel_format_enable_allowlist);
32656
  }
32657
#else   // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
32658
0
  switch (dst->pixcfg.private_impl.pixfmt.repr) {
32659
0
    case WUFFS_BASE__PIXEL_FORMAT__Y:
32660
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16LE:
32661
0
    case WUFFS_BASE__PIXEL_FORMAT__Y_16BE:
32662
0
    case WUFFS_BASE__PIXEL_FORMAT__YA_NONPREMUL:
32663
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_NONPREMUL:
32664
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_PREMUL:
32665
0
    case WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY:
32666
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
32667
0
    case WUFFS_BASE__PIXEL_FORMAT__BGR:
32668
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
32669
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
32670
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
32671
0
    case WUFFS_BASE__PIXEL_FORMAT__BGRX:
32672
0
    case WUFFS_BASE__PIXEL_FORMAT__RGB:
32673
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
32674
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
32675
0
    case WUFFS_BASE__PIXEL_FORMAT__RGBX:
32676
0
      break;
32677
32678
0
    default:
32679
      // TODO: see wuffs_base__pixel_buffer__set_color_u32_at's TODO.
32680
0
      return wuffs_base__make_status(
32681
0
          wuffs_base__error__unsupported_pixel_swizzler_option);
32682
0
  }
32683
0
#endif  // defined(WUFFS_CONFIG__DST_PIXEL_FORMAT__ENABLE_ALLOWLIST)
32684
32685
  // ----
32686
32687
0
  wuffs_private_impl__swizzle_ycc__convert_3_func conv3func = NULL;
32688
32689
0
  if (is_rgb_or_cmyk) {
32690
0
    conv3func = &wuffs_private_impl__swizzle_rgb__convert_3_general;
32691
0
  } else {
32692
0
    switch (dst->pixcfg.private_impl.pixfmt.repr) {
32693
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
32694
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
32695
0
      case WUFFS_BASE__PIXEL_FORMAT__BGRX:
32696
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32697
0
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
32698
0
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2;
32699
0
          break;
32700
0
        }
32701
0
#endif
32702
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_bgrx;
32703
0
        break;
32704
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
32705
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
32706
0
      case WUFFS_BASE__PIXEL_FORMAT__RGBX:
32707
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32708
0
        if (wuffs_base__cpu_arch__have_x86_avx2()) {
32709
0
          conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2;
32710
0
          break;
32711
0
        }
32712
0
#endif
32713
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_rgbx;
32714
0
        break;
32715
0
      default:
32716
0
        conv3func = &wuffs_private_impl__swizzle_ycc__convert_3_general;
32717
0
        break;
32718
0
    }
32719
0
  }
32720
32721
0
  void (*func3)(wuffs_base__pixel_buffer * dst,  //
32722
0
                uint32_t x_min_incl,             //
32723
0
                uint32_t x_max_excl,             //
32724
0
                uint32_t y_min_incl,             //
32725
0
                uint32_t y_max_excl,             //
32726
0
                const uint8_t* src_ptr0,         //
32727
0
                const uint8_t* src_ptr1,         //
32728
0
                const uint8_t* src_ptr2,         //
32729
0
                uint32_t stride0,                //
32730
0
                uint32_t stride1,                //
32731
0
                uint32_t stride2,                //
32732
0
                uint32_t inv_h0,                 //
32733
0
                uint32_t inv_h1,                 //
32734
0
                uint32_t inv_h2,                 //
32735
0
                uint32_t inv_v0,                 //
32736
0
                uint32_t inv_v1,                 //
32737
0
                uint32_t inv_v2,                 //
32738
0
                uint32_t half_width_for_2to1,    //
32739
0
                uint32_t half_height_for_2to1,   //
32740
0
                uint8_t* scratch_buffer_2k_ptr,  //
32741
0
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
32742
0
                wuffs_private_impl__swizzle_ycc__convert_3_func conv3func) =
32743
0
      &wuffs_private_impl__swizzle_ycc__general__box_filter;
32744
32745
0
  void (*func4)(wuffs_base__pixel_buffer * dst,  //
32746
0
                uint32_t x_min_incl,             //
32747
0
                uint32_t x_max_excl,             //
32748
0
                uint32_t y_min_incl,             //
32749
0
                uint32_t y_max_excl,             //
32750
0
                const uint8_t* src_ptr0,         //
32751
0
                const uint8_t* src_ptr1,         //
32752
0
                const uint8_t* src_ptr2,         //
32753
0
                const uint8_t* src_ptr3,         //
32754
0
                uint32_t stride0,                //
32755
0
                uint32_t stride1,                //
32756
0
                uint32_t stride2,                //
32757
0
                uint32_t stride3,                //
32758
0
                uint32_t inv_h0,                 //
32759
0
                uint32_t inv_h1,                 //
32760
0
                uint32_t inv_h2,                 //
32761
0
                uint32_t inv_h3,                 //
32762
0
                uint32_t inv_v0,                 //
32763
0
                uint32_t inv_v1,                 //
32764
0
                uint32_t inv_v2,                 //
32765
0
                uint32_t inv_v3,                 //
32766
0
                uint32_t half_width_for_2to1,    //
32767
0
                uint32_t half_height_for_2to1,   //
32768
0
                uint8_t* scratch_buffer_2k_ptr,  //
32769
0
                wuffs_private_impl__swizzle_ycc__upsample_func(*upfuncs)[4][4],
32770
0
                wuffs_private_impl__swizzle_ycc__convert_4_func conv4func) =
32771
0
      &wuffs_private_impl__swizzle_ycck__general__box_filter;
32772
32773
0
  wuffs_private_impl__swizzle_ycc__upsample_func upfuncs[4][4];
32774
0
  memcpy(&upfuncs, &wuffs_private_impl__swizzle_ycc__upsample_funcs,
32775
0
         sizeof upfuncs);
32776
32777
0
  if (triangle_filter_for_2to1 &&
32778
0
      (wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h0, inv_v0) ||
32779
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h1, inv_v1) ||
32780
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h2, inv_v2) ||
32781
0
       wuffs_private_impl__swizzle_has_triangle_upsampler(inv_h3, inv_v3))) {
32782
0
    func3 = &wuffs_private_impl__swizzle_ycc__general__triangle_filter;
32783
0
    func4 = &wuffs_private_impl__swizzle_ycck__general__triangle_filter;
32784
32785
0
    upfuncs[0][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h1v2_triangle;
32786
0
    upfuncs[1][0] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v1_triangle;
32787
0
    upfuncs[1][1] = wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle;
32788
32789
0
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32790
#if defined(__GNUC__) && !defined(__clang__)
32791
    // Don't use our AVX2 implementation for GCC (but do use it for clang). For
32792
    // some unknown reason, GCC performs noticably better on the non-SIMD
32793
    // version. Possibly because GCC's auto-vectorizer is smarter (just with
32794
    // SSE2, not AVX2) than our hand-written code, but that's just a guess.
32795
    //
32796
    // See commits 51bc60ef9298cb2efc1b29a9681191f66d49820d and
32797
    // cd769a0cdf1b5affee13f6089b995f3d39569cb4 for benchmark numbers.
32798
    //
32799
    // See also https://godbolt.org/z/MbhbPGEz4 for Debian Bullseye's clang 11
32800
    // versus gcc 10, where only gcc auto-vectorizes, although later clang
32801
    // versions will also auto-vectorize.
32802
#else
32803
0
    if (wuffs_base__cpu_arch__have_x86_avx2()) {
32804
0
      upfuncs[1][1] =
32805
0
          wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2;
32806
0
    }
32807
0
#endif
32808
0
#endif
32809
0
  }
32810
32811
0
  if ((h3 != 0u) || (v3 != 0u)) {
32812
0
    wuffs_private_impl__swizzle_ycc__convert_4_func conv4func =
32813
0
        is_rgb_or_cmyk ? &wuffs_private_impl__swizzle_cmyk__convert_4_general
32814
0
                       : &wuffs_private_impl__swizzle_ycck__convert_4_general;
32815
0
    (*func4)(                                                 //
32816
0
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
32817
0
        src0.ptr, src1.ptr, src2.ptr, src3.ptr,               //
32818
0
        stride0, stride1, stride2, stride3,                   //
32819
0
        inv_h0, inv_h1, inv_h2, inv_h3,                       //
32820
0
        inv_v0, inv_v1, inv_v2, inv_v3,                       //
32821
0
        half_width_for_2to1, half_height_for_2to1,            //
32822
0
        scratch_buffer_2k.ptr, &upfuncs, conv4func);
32823
32824
0
  } else {
32825
0
    (*func3)(                                                 //
32826
0
        dst, x_min_incl, x_max_excl, y_min_incl, y_max_excl,  //
32827
0
        src0.ptr, src1.ptr, src2.ptr,                         //
32828
0
        stride0, stride1, stride2,                            //
32829
0
        inv_h0, inv_h1, inv_h2,                               //
32830
0
        inv_v0, inv_v1, inv_v2,                               //
32831
0
        half_width_for_2to1, half_height_for_2to1,            //
32832
0
        scratch_buffer_2k.ptr, &upfuncs, conv3func);
32833
0
  }
32834
32835
0
  return wuffs_base__make_status(NULL);
32836
0
}
32837
32838
// --------
32839
32840
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
32841
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
32842
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
32843
static void  //
32844
wuffs_private_impl__swizzle_ycc__convert_3_bgrx_x86_avx2(
32845
    wuffs_base__pixel_buffer* dst,
32846
    uint32_t x,
32847
    uint32_t x_end,
32848
    uint32_t y,
32849
    const uint8_t* up0,
32850
    const uint8_t* up1,
32851
0
    const uint8_t* up2) {
32852
0
  if ((x + 32u) > x_end) {
32853
0
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
32854
0
        dst, x, x_end, y, up0, up1, up2);
32855
0
    return;
32856
0
  }
32857
32858
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
32859
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
32860
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
32861
32862
  // u0001 = u16x16 [0x0001 .. 0x0001]
32863
  // u00FF = u16x16 [0x00FF .. 0x00FF]
32864
  // uFF80 = u16x16 [0xFF80 .. 0xFF80]
32865
  // uFFFF = u16x16 [0xFFFF .. 0xFFFF]
32866
0
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
32867
0
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
32868
0
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
32869
0
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
32870
32871
  // p8000_p0000 = u16x16 [0x8000 0x0000 .. 0x8000 0x0000]
32872
0
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
32873
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32874
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32875
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
32876
0
      +0x0000, -0x8000, +0x0000, -0x8000);
32877
32878
  // Per wuffs_base__color_ycc__as__color_u32, the formulae:
32879
  //
32880
  //  R = Y                + 1.40200 * Cr
32881
  //  G = Y - 0.34414 * Cb - 0.71414 * Cr
32882
  //  B = Y + 1.77200 * Cb
32883
  //
32884
  // When scaled by 1<<16:
32885
  //
32886
  //  0.34414 becomes 0x0581A =  22554.
32887
  //  0.71414 becomes 0x0B6D2 =  46802.
32888
  //  1.40200 becomes 0x166E9 =  91881.
32889
  //  1.77200 becomes 0x1C5A2 = 116130.
32890
  //
32891
  // Separate the integer and fractional parts, since we work with signed
32892
  // 16-bit SIMD lanes. The fractional parts range from -0.5 .. +0.5 (as
32893
  // floating-point) which is from -0x8000 .. +0x8000 (as fixed-point).
32894
  //
32895
  //  -0x3A5E = -0x20000 + 0x1C5A2     The B:Cb factor.
32896
  //  +0x66E9 = -0x10000 + 0x166E9     The R:Cr factor.
32897
  //  -0x581A = +0x00000 - 0x0581A     The G:Cb factor.
32898
  //  +0x492E = +0x10000 - 0x0B6D2     The G:Cr factor.
32899
0
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
32900
0
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
32901
0
  const __m256i m581A_p492E = _mm256_set_epi16(  //
32902
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32903
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32904
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
32905
0
      +0x492E, -0x581A, +0x492E, -0x581A);
32906
32907
0
  while (x < x_end) {
32908
    // Load chroma values in even and odd columns (the high 8 bits of each
32909
    // u16x16 element are zero) and then subtract 0x0080.
32910
    //
32911
    // cb_all = u8x32  [cb.00 cb.01 cb.02 cb.03 .. cb.1C cb.1D cb.1E cb.1F]
32912
    // cb_eve = i16x16 [cb.00-0x80  cb.02-0x80  .. cb.1C-0x80  cb.1E-0x80 ]
32913
    // cb_odd = i16x16 [cb.01-0x80  cb.03-0x80  .. cb.1D-0x80  cb.1F-0x80 ]
32914
    //
32915
    // Ditto for the cr_xxx Chroma-Red values.
32916
0
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
32917
0
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
32918
0
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
32919
0
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
32920
0
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
32921
0
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
32922
32923
    // ----
32924
32925
    // Calculate:
32926
    //
32927
    //  B-Y = (+1.77200 * Cb)                 as floating-point
32928
    //  R-Y = (+1.40200 * Cr)                 as floating-point
32929
    //
32930
    //  B-Y = ((0x2_0000 - 0x3A5E) * Cb)      as fixed-point
32931
    //  R-Y = ((0x1_0000 + 0x66E9) * Cr)      as fixed-point
32932
    //
32933
    //  B-Y = ((-0x3A5E * Cb) + ("2.0" * Cb))
32934
    //  R-Y = ((+0x66E9 * Cr) + ("1.0" * Cr))
32935
32936
    // Multiply by m3A5E or p66E9, taking the high 16 bits. There's also a
32937
    // doubling (add x to itself), adding-of-1 and halving (shift right by 1).
32938
    // That makes multiply-and-take-high round to nearest (instead of down).
32939
0
    __m256i tmp_by_eve = _mm256_srai_epi16(
32940
0
        _mm256_add_epi16(
32941
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
32942
0
        1);
32943
0
    __m256i tmp_by_odd = _mm256_srai_epi16(
32944
0
        _mm256_add_epi16(
32945
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
32946
0
        1);
32947
0
    __m256i tmp_ry_eve = _mm256_srai_epi16(
32948
0
        _mm256_add_epi16(
32949
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
32950
0
        1);
32951
0
    __m256i tmp_ry_odd = _mm256_srai_epi16(
32952
0
        _mm256_add_epi16(
32953
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
32954
0
        1);
32955
32956
    // Add (2 * Cb) and (1 * Cr).
32957
0
    __m256i by_eve =
32958
0
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
32959
0
    __m256i by_odd =
32960
0
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
32961
0
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
32962
0
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
32963
32964
    // ----
32965
32966
    // Calculate:
32967
    //
32968
    //  G-Y = (-0.34414 * Cb) +
32969
    //        (-0.71414 * Cr)                 as floating-point
32970
    //
32971
    //  G-Y = ((+0x0_0000 - 0x581A) * Cb) +
32972
    //        ((-0x1_0000 + 0x492E) * Cr)     as fixed-point
32973
    //
32974
    //  G-Y =  (-0x581A * Cb) +
32975
    //         (+0x492E * Cr) - ("1.0" * Cr)
32976
32977
    // Multiply-add to get ((-0x581A * Cb) + (+0x492E * Cr)).
32978
0
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
32979
0
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
32980
0
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
32981
0
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
32982
0
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
32983
0
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
32984
0
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
32985
0
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
32986
32987
    // Divide the i32x8 vectors by (1 << 16), rounding to nearest.
32988
0
    __m256i tmp1_gy_eve_lo =
32989
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
32990
0
    __m256i tmp1_gy_eve_hi =
32991
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
32992
0
    __m256i tmp1_gy_odd_lo =
32993
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
32994
0
    __m256i tmp1_gy_odd_hi =
32995
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
32996
32997
    // Pack the ((-0x581A * Cb) + (+0x492E * Cr)) as i16x16 and subtract Cr.
32998
0
    __m256i gy_eve = _mm256_sub_epi16(
32999
0
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
33000
0
    __m256i gy_odd = _mm256_sub_epi16(
33001
0
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
33002
33003
    // ----
33004
33005
    // Add Y to (B-Y), (G-Y) and (R-Y) to produce B, G and R.
33006
    //
33007
    // For the resultant packed_x_xxx vectors, only elements 0 ..= 7 and 16 ..=
33008
    // 23 of the 32-element vectors matter (since we'll unpacklo but not
33009
    // unpackhi them). Let โ€ฆ denote 8 ignored consecutive u8 values and let %
33010
    // denote 0xFF. We'll end this section with:
33011
    //
33012
    // packed_b_eve = u8x32 [b00 b02 .. b0C b0E  โ€ฆ  b10 b12 .. b1C b1E  โ€ฆ]
33013
    // packed_b_odd = u8x32 [b01 b03 .. b0D b0F  โ€ฆ  b11 b13 .. b1D b1F  โ€ฆ]
33014
    // packed_g_eve = u8x32 [g00 g02 .. g0C g0E  โ€ฆ  g10 g12 .. g1C g1E  โ€ฆ]
33015
    // packed_g_odd = u8x32 [g01 g03 .. g0D g0F  โ€ฆ  g11 g13 .. g1D g1F  โ€ฆ]
33016
    // packed_r_eve = u8x32 [r00 r02 .. r0C r0E  โ€ฆ  r10 r12 .. r1C r1E  โ€ฆ]
33017
    // packed_r_odd = u8x32 [r01 r03 .. r0D r0F  โ€ฆ  r11 r13 .. r1D r1F  โ€ฆ]
33018
    // uFFFF        = u8x32 [  %   % ..   %   %  โ€ฆ    %   % ..   %   %  โ€ฆ]
33019
33020
0
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
33021
0
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
33022
0
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
33023
33024
0
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
33025
0
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
33026
0
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
33027
0
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
33028
33029
0
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
33030
0
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
33031
0
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
33032
0
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
33033
33034
0
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
33035
0
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
33036
0
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
33037
0
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
33038
33039
    // ----
33040
33041
    // Mix those values (unpacking in 8, 16 and then 32 bit units) to get the
33042
    // desired BGRX/RGBX order.
33043
    //
33044
    // From here onwards, all of our __m256i registers are u8x32.
33045
33046
    // mix00 = [b00 g00 b02 g02 .. b0E g0E b10 g10 .. b1C g1C b1E g1E]
33047
    // mix01 = [b01 g01 b03 g03 .. b0F g0F b11 g11 .. b1D g1D b1F g1F]
33048
    // mix02 = [r00   % r02   % .. r0E   % r10   % .. r1C   % r1E   %]
33049
    // mix03 = [r01   % r03   % .. r0F   % r11   % .. r1D   % r1F   %]
33050
    //
33051
    // See also ยง below.
33052
0
    __m256i mix00 = _mm256_unpacklo_epi8(packed_b_eve, packed_g_eve);
33053
0
    __m256i mix01 = _mm256_unpacklo_epi8(packed_b_odd, packed_g_odd);
33054
0
    __m256i mix02 = _mm256_unpacklo_epi8(packed_r_eve, uFFFF);
33055
0
    __m256i mix03 = _mm256_unpacklo_epi8(packed_r_odd, uFFFF);
33056
33057
    // mix10 = [b00 g00 r00 %  b02 g02 r02 %  b04 g04 r04 %  b06 g06 r06 %
33058
    //          b10 g10 r10 %  b12 g12 r12 %  b14 g14 r14 %  b16 g16 r16 %]
33059
    // mix11 = [b01 g01 r01 %  b03 g03 r03 %  b05 g05 r05 %  b07 g07 r07 %
33060
    //          b11 g11 r11 %  b13 g13 r13 %  b15 g15 r15 %  b17 g17 r17 %]
33061
    // mix12 = [b08 g08 r08 %  b0A g0A r0A %  b0C g0C r0C %  b0E g0E r0E %
33062
    //          b18 g18 r18 %  b1A g1A r1A %  b1C g1C r1C %  b1E g1E r1E %]
33063
    // mix13 = [b09 g09 r09 %  b0B g0B r0B %  b0D g0D r0D %  b0F g0F r0F %
33064
    //          b19 g19 r19 %  b1B g1B r1B %  b1D g1D r1D %  b1F g1F r1F %]
33065
0
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
33066
0
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
33067
0
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
33068
0
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
33069
33070
    // mix20 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
33071
    //          b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %]
33072
    // mix21 = [b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %
33073
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
33074
    // mix22 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
33075
    //          b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %]
33076
    // mix23 = [b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %
33077
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
33078
0
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
33079
0
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
33080
0
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
33081
0
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
33082
33083
    // mix30 = [b00 g00 r00 %  b01 g01 r01 %  b02 g02 r02 %  b03 g03 r03 %
33084
    //          b04 g04 r04 %  b05 g05 r05 %  b06 g06 r06 %  b07 g07 r07 %]
33085
    // mix31 = [b08 g08 r08 %  b09 g09 r09 %  b0A g0A r0A %  b0B g0B r0B %
33086
    //          b0C g0C r0C %  b0D g0D r0D %  b0E g0E r0E %  b0F g0F r0F %]
33087
    // mix32 = [b10 g10 r10 %  b11 g11 r11 %  b12 g12 r12 %  b13 g13 r13 %
33088
    //          b14 g14 r14 %  b15 g15 r15 %  b16 g16 r16 %  b17 g17 r17 %]
33089
    // mix33 = [b18 g18 r18 %  b19 g19 r19 %  b1A g1A r1A %  b1B g1B r1B %
33090
    //          b1C g1C r1C %  b1D g1D r1D %  b1E g1E r1E %  b1F g1F r1F %]
33091
0
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
33092
0
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
33093
0
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
33094
0
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
33095
33096
    // Write out four u8x32 SIMD registers (128 bytes, 32 BGRX/RGBX pixels).
33097
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
33098
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
33099
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
33100
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
33101
33102
    // Advance by up to 32 pixels. The first iteration might be smaller than 32
33103
    // so that all of the remaining steps are exactly 32.
33104
0
    uint32_t n = 32u - (31u & (x - x_end));
33105
0
    dst_iter += 4u * n;
33106
0
    up0 += n;
33107
0
    up1 += n;
33108
0
    up2 += n;
33109
0
    x += n;
33110
0
  }
33111
0
}
33112
33113
// The rgbx flavor (below) is exactly the same as the bgrx flavor (above)
33114
// except for the lines marked with a ยง and that comments were stripped.
33115
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
33116
static void  //
33117
wuffs_private_impl__swizzle_ycc__convert_3_rgbx_x86_avx2(
33118
    wuffs_base__pixel_buffer* dst,
33119
    uint32_t x,
33120
    uint32_t x_end,
33121
    uint32_t y,
33122
    const uint8_t* up0,
33123
    const uint8_t* up1,
33124
0
    const uint8_t* up2) {
33125
0
  if ((x + 32u) > x_end) {
33126
0
    wuffs_private_impl__swizzle_ycc__convert_3_bgrx(  //
33127
0
        dst, x, x_end, y, up0, up1, up2);
33128
0
    return;
33129
0
  }
33130
33131
0
  size_t dst_stride = dst->private_impl.planes[0].stride;
33132
0
  uint8_t* dst_iter = dst->private_impl.planes[0].ptr +
33133
0
                      (dst_stride * ((size_t)y)) + (4u * ((size_t)x));
33134
33135
0
  const __m256i u0001 = _mm256_set1_epi16(+0x0001);
33136
0
  const __m256i u00FF = _mm256_set1_epi16(+0x00FF);
33137
0
  const __m256i uFF80 = _mm256_set1_epi16(-0x0080);
33138
0
  const __m256i uFFFF = _mm256_set1_epi16(-0x0001);
33139
33140
0
  const __m256i p8000_p0000 = _mm256_set_epi16(  //
33141
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33142
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33143
0
      +0x0000, -0x8000, +0x0000, -0x8000,        //
33144
0
      +0x0000, -0x8000, +0x0000, -0x8000);
33145
33146
0
  const __m256i m3A5E = _mm256_set1_epi16(-0x3A5E);
33147
0
  const __m256i p66E9 = _mm256_set1_epi16(+0x66E9);
33148
0
  const __m256i m581A_p492E = _mm256_set_epi16(  //
33149
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33150
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33151
0
      +0x492E, -0x581A, +0x492E, -0x581A,        //
33152
0
      +0x492E, -0x581A, +0x492E, -0x581A);
33153
33154
0
  while (x < x_end) {
33155
0
    __m256i cb_all = _mm256_lddqu_si256((const __m256i*)(const void*)up1);
33156
0
    __m256i cr_all = _mm256_lddqu_si256((const __m256i*)(const void*)up2);
33157
0
    __m256i cb_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cb_all, u00FF));
33158
0
    __m256i cr_eve = _mm256_add_epi16(uFF80, _mm256_and_si256(cr_all, u00FF));
33159
0
    __m256i cb_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cb_all, 8));
33160
0
    __m256i cr_odd = _mm256_add_epi16(uFF80, _mm256_srli_epi16(cr_all, 8));
33161
33162
0
    __m256i tmp_by_eve = _mm256_srai_epi16(
33163
0
        _mm256_add_epi16(
33164
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_eve, cb_eve), m3A5E), u0001),
33165
0
        1);
33166
0
    __m256i tmp_by_odd = _mm256_srai_epi16(
33167
0
        _mm256_add_epi16(
33168
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cb_odd, cb_odd), m3A5E), u0001),
33169
0
        1);
33170
0
    __m256i tmp_ry_eve = _mm256_srai_epi16(
33171
0
        _mm256_add_epi16(
33172
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_eve, cr_eve), p66E9), u0001),
33173
0
        1);
33174
0
    __m256i tmp_ry_odd = _mm256_srai_epi16(
33175
0
        _mm256_add_epi16(
33176
0
            _mm256_mulhi_epi16(_mm256_add_epi16(cr_odd, cr_odd), p66E9), u0001),
33177
0
        1);
33178
33179
0
    __m256i by_eve =
33180
0
        _mm256_add_epi16(tmp_by_eve, _mm256_add_epi16(cb_eve, cb_eve));
33181
0
    __m256i by_odd =
33182
0
        _mm256_add_epi16(tmp_by_odd, _mm256_add_epi16(cb_odd, cb_odd));
33183
0
    __m256i ry_eve = _mm256_add_epi16(tmp_ry_eve, cr_eve);
33184
0
    __m256i ry_odd = _mm256_add_epi16(tmp_ry_odd, cr_odd);
33185
33186
0
    __m256i tmp0_gy_eve_lo = _mm256_madd_epi16(  //
33187
0
        _mm256_unpacklo_epi16(cb_eve, cr_eve), m581A_p492E);
33188
0
    __m256i tmp0_gy_eve_hi = _mm256_madd_epi16(  //
33189
0
        _mm256_unpackhi_epi16(cb_eve, cr_eve), m581A_p492E);
33190
0
    __m256i tmp0_gy_odd_lo = _mm256_madd_epi16(  //
33191
0
        _mm256_unpacklo_epi16(cb_odd, cr_odd), m581A_p492E);
33192
0
    __m256i tmp0_gy_odd_hi = _mm256_madd_epi16(  //
33193
0
        _mm256_unpackhi_epi16(cb_odd, cr_odd), m581A_p492E);
33194
33195
0
    __m256i tmp1_gy_eve_lo =
33196
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_lo, p8000_p0000), 16);
33197
0
    __m256i tmp1_gy_eve_hi =
33198
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_eve_hi, p8000_p0000), 16);
33199
0
    __m256i tmp1_gy_odd_lo =
33200
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_lo, p8000_p0000), 16);
33201
0
    __m256i tmp1_gy_odd_hi =
33202
0
        _mm256_srai_epi32(_mm256_add_epi32(tmp0_gy_odd_hi, p8000_p0000), 16);
33203
33204
0
    __m256i gy_eve = _mm256_sub_epi16(
33205
0
        _mm256_packs_epi32(tmp1_gy_eve_lo, tmp1_gy_eve_hi), cr_eve);
33206
0
    __m256i gy_odd = _mm256_sub_epi16(
33207
0
        _mm256_packs_epi32(tmp1_gy_odd_lo, tmp1_gy_odd_hi), cr_odd);
33208
33209
0
    __m256i yy_all = _mm256_lddqu_si256((const __m256i*)(const void*)up0);
33210
0
    __m256i yy_eve = _mm256_and_si256(yy_all, u00FF);
33211
0
    __m256i yy_odd = _mm256_srli_epi16(yy_all, 8);
33212
33213
0
    __m256i loose_b_eve = _mm256_add_epi16(by_eve, yy_eve);
33214
0
    __m256i loose_b_odd = _mm256_add_epi16(by_odd, yy_odd);
33215
0
    __m256i packed_b_eve = _mm256_packus_epi16(loose_b_eve, loose_b_eve);
33216
0
    __m256i packed_b_odd = _mm256_packus_epi16(loose_b_odd, loose_b_odd);
33217
33218
0
    __m256i loose_g_eve = _mm256_add_epi16(gy_eve, yy_eve);
33219
0
    __m256i loose_g_odd = _mm256_add_epi16(gy_odd, yy_odd);
33220
0
    __m256i packed_g_eve = _mm256_packus_epi16(loose_g_eve, loose_g_eve);
33221
0
    __m256i packed_g_odd = _mm256_packus_epi16(loose_g_odd, loose_g_odd);
33222
33223
0
    __m256i loose_r_eve = _mm256_add_epi16(ry_eve, yy_eve);
33224
0
    __m256i loose_r_odd = _mm256_add_epi16(ry_odd, yy_odd);
33225
0
    __m256i packed_r_eve = _mm256_packus_epi16(loose_r_eve, loose_r_eve);
33226
0
    __m256i packed_r_odd = _mm256_packus_epi16(loose_r_odd, loose_r_odd);
33227
33228
    // ยง Note the swapped B and R channels.
33229
0
    __m256i mix00 = _mm256_unpacklo_epi8(packed_r_eve, packed_g_eve);
33230
0
    __m256i mix01 = _mm256_unpacklo_epi8(packed_r_odd, packed_g_odd);
33231
0
    __m256i mix02 = _mm256_unpacklo_epi8(packed_b_eve, uFFFF);
33232
0
    __m256i mix03 = _mm256_unpacklo_epi8(packed_b_odd, uFFFF);
33233
33234
0
    __m256i mix10 = _mm256_unpacklo_epi16(mix00, mix02);
33235
0
    __m256i mix11 = _mm256_unpacklo_epi16(mix01, mix03);
33236
0
    __m256i mix12 = _mm256_unpackhi_epi16(mix00, mix02);
33237
0
    __m256i mix13 = _mm256_unpackhi_epi16(mix01, mix03);
33238
33239
0
    __m256i mix20 = _mm256_unpacklo_epi32(mix10, mix11);
33240
0
    __m256i mix21 = _mm256_unpackhi_epi32(mix10, mix11);
33241
0
    __m256i mix22 = _mm256_unpacklo_epi32(mix12, mix13);
33242
0
    __m256i mix23 = _mm256_unpackhi_epi32(mix12, mix13);
33243
33244
0
    __m256i mix30 = _mm256_permute2x128_si256(mix20, mix21, 0x20);
33245
0
    __m256i mix31 = _mm256_permute2x128_si256(mix22, mix23, 0x20);
33246
0
    __m256i mix32 = _mm256_permute2x128_si256(mix20, mix21, 0x31);
33247
0
    __m256i mix33 = _mm256_permute2x128_si256(mix22, mix23, 0x31);
33248
33249
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x00), mix30);
33250
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x20), mix31);
33251
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x40), mix32);
33252
0
    _mm256_storeu_si256((__m256i*)(void*)(dst_iter + 0x60), mix33);
33253
33254
0
    uint32_t n = 32u - (31u & (x - x_end));
33255
0
    dst_iter += 4u * n;
33256
0
    up0 += n;
33257
0
    up1 += n;
33258
0
    up2 += n;
33259
0
    x += n;
33260
0
  }
33261
0
}
33262
33263
#if defined(__GNUC__) && !defined(__clang__)
33264
// No-op.
33265
#else
33266
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
33267
static const uint8_t*  //
33268
wuffs_private_impl__swizzle_ycc__upsample_inv_h2v2_triangle_x86_avx2(
33269
    uint8_t* dst_ptr,
33270
    const uint8_t* src_ptr_major,
33271
    const uint8_t* src_ptr_minor,
33272
    size_t src_len,
33273
    uint32_t h1v2_bias_ignored,
33274
    bool first_column,
33275
0
    bool last_column) {
33276
0
  uint8_t* dp = dst_ptr;
33277
0
  const uint8_t* sp_major = src_ptr_major;
33278
0
  const uint8_t* sp_minor = src_ptr_minor;
33279
33280
0
  if (first_column) {
33281
0
    src_len--;
33282
0
    if ((src_len <= 0u) && last_column) {
33283
0
      uint32_t sv = (12u * ((uint32_t)(*sp_major++))) +  //
33284
0
                    (4u * ((uint32_t)(*sp_minor++)));
33285
0
      *dp++ = (uint8_t)((sv + 8u) >> 4u);
33286
0
      *dp++ = (uint8_t)((sv + 7u) >> 4u);
33287
0
      return dst_ptr;
33288
0
    }
33289
33290
0
    uint32_t sv_major_m1 = sp_major[-0];  // Clamp offset to zero.
33291
0
    uint32_t sv_minor_m1 = sp_minor[-0];  // Clamp offset to zero.
33292
0
    uint32_t sv_major_p1 = sp_major[+1];
33293
0
    uint32_t sv_minor_p1 = sp_minor[+1];
33294
33295
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
33296
0
                  (3u * ((uint32_t)(*sp_minor++)));
33297
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
33298
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
33299
0
    if (src_len <= 0u) {
33300
0
      return dst_ptr;
33301
0
    }
33302
0
  }
33303
33304
0
  if (last_column) {
33305
0
    src_len--;
33306
0
  }
33307
33308
0
  if (src_len < 32) {
33309
    // This fallback is the same as the non-SIMD-capable code path.
33310
0
    for (; src_len > 0u; src_len--) {
33311
0
      uint32_t sv_major_m1 = sp_major[-1];
33312
0
      uint32_t sv_minor_m1 = sp_minor[-1];
33313
0
      uint32_t sv_major_p1 = sp_major[+1];
33314
0
      uint32_t sv_minor_p1 = sp_minor[+1];
33315
33316
0
      uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
33317
0
                    (3u * ((uint32_t)(*sp_minor++)));
33318
0
      *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
33319
0
      *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
33320
0
    }
33321
33322
0
  } else {
33323
0
    while (src_len > 0u) {
33324
      // Load 1+32+1 samples (six u8x32 vectors) from the major (jxx) and minor
33325
      // (nxx) rows.
33326
      //
33327
      // major_p0 = [j00 j01 j02 j03 .. j28 j29 j30 j31]   // p0 = "plus  0"
33328
      // minor_p0 = [n00 n01 n02 n03 .. n28 n29 n30 n31]   // p0 = "plus  0"
33329
      // major_m1 = [jm1 j00 j01 j02 .. j27 j28 j29 j30]   // m1 = "minus 1"
33330
      // minor_m1 = [nm1 n00 n01 n02 .. n27 n28 n29 n30]   // m1 = "minus 1"
33331
      // major_p1 = [j01 j02 j03 j04 .. j29 j30 j31 j32]   // p1 = "plus  1"
33332
      // minor_p1 = [n01 n02 n03 n04 .. n29 n30 n31 n32]   // p1 = "plus  1"
33333
0
      __m256i major_p0 =
33334
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 0));
33335
0
      __m256i minor_p0 =
33336
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 0));
33337
0
      __m256i major_m1 =
33338
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major - 1));
33339
0
      __m256i minor_m1 =
33340
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor - 1));
33341
0
      __m256i major_p1 =
33342
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_major + 1));
33343
0
      __m256i minor_p1 =
33344
0
          _mm256_lddqu_si256((const __m256i*)(const void*)(sp_minor + 1));
33345
33346
      // Unpack, staying with u8x32 vectors.
33347
      //
33348
      // step1_p0_lo = [j00 n00 j01 n01 .. j07 n07  j16 n16 j17 n17 .. j23 n23]
33349
      // step1_p0_hi = [j08 n08 j09 n09 .. j15 n15  j24 n24 j25 n25 .. j31 n31]
33350
      // step1_m1_lo = [jm1 nm1 j00 n00 .. j06 n06  j15 n15 j16 n16 .. j22 n22]
33351
      // step1_m1_hi = [j07 n07 j08 n08 .. j14 n14  j23 n23 j24 n24 .. j30 n30]
33352
      // step1_p1_lo = [j01 n01 j02 n02 .. j08 n08  j17 n17 j18 n18 .. j24 n24]
33353
      // step1_p1_hi = [j09 n09 j10 n10 .. j16 n16  j25 n25 j26 n26 .. j32 n32]
33354
0
      __m256i step1_p0_lo = _mm256_unpacklo_epi8(major_p0, minor_p0);
33355
0
      __m256i step1_p0_hi = _mm256_unpackhi_epi8(major_p0, minor_p0);
33356
0
      __m256i step1_m1_lo = _mm256_unpacklo_epi8(major_m1, minor_m1);
33357
0
      __m256i step1_m1_hi = _mm256_unpackhi_epi8(major_m1, minor_m1);
33358
0
      __m256i step1_p1_lo = _mm256_unpacklo_epi8(major_p1, minor_p1);
33359
0
      __m256i step1_p1_hi = _mm256_unpackhi_epi8(major_p1, minor_p1);
33360
33361
      // Multiply-add to get u16x16 vectors.
33362
      //
33363
      // step2_p0_lo = [9*j00+3*n00 9*j01+3*n01 .. 9*j23+3*n23]
33364
      // step2_p0_hi = [9*j08+3*n08 9*j09+3*n09 .. 9*j31+3*n31]
33365
      // step2_m1_lo = [3*jm1+1*nm1 3*j00+1*n00 .. 3*j22+1*n22]
33366
      // step2_m1_hi = [3*j07+1*n07 3*j08+1*n08 .. 3*j30+1*n30]
33367
      // step2_p1_lo = [3*j01+1*n01 3*j02+1*n02 .. 3*j24+1*n24]
33368
      // step2_p1_hi = [3*j09+1*n09 3*j10+1*n10 .. 3*j32+1*n32]
33369
0
      const __m256i k0309 = _mm256_set1_epi16(0x0309);
33370
0
      const __m256i k0103 = _mm256_set1_epi16(0x0103);
33371
0
      __m256i step2_p0_lo = _mm256_maddubs_epi16(step1_p0_lo, k0309);
33372
0
      __m256i step2_p0_hi = _mm256_maddubs_epi16(step1_p0_hi, k0309);
33373
0
      __m256i step2_m1_lo = _mm256_maddubs_epi16(step1_m1_lo, k0103);
33374
0
      __m256i step2_m1_hi = _mm256_maddubs_epi16(step1_m1_hi, k0103);
33375
0
      __m256i step2_p1_lo = _mm256_maddubs_epi16(step1_p1_lo, k0103);
33376
0
      __m256i step2_p1_hi = _mm256_maddubs_epi16(step1_p1_hi, k0103);
33377
33378
      // Compute the weighted sums of (p0, m1) and (p0, p1). For example:
33379
      //
33380
      // step3_m1_lo[00] = ((9*j00) + (3*n00) + (3*jm1) + (1*nm1)) as u16
33381
      // step3_p1_hi[15] = ((9*j31) + (3*n31) + (3*j32) + (1*n32)) as u16
33382
0
      __m256i step3_m1_lo = _mm256_add_epi16(step2_p0_lo, step2_m1_lo);
33383
0
      __m256i step3_m1_hi = _mm256_add_epi16(step2_p0_hi, step2_m1_hi);
33384
0
      __m256i step3_p1_lo = _mm256_add_epi16(step2_p0_lo, step2_p1_lo);
33385
0
      __m256i step3_p1_hi = _mm256_add_epi16(step2_p0_hi, step2_p1_hi);
33386
33387
      // Bias by 8 (on the left) or 7 (on the right) and then divide by 16
33388
      // (which is 9+3+3+1) to get a weighted average. On the left (m1), shift
33389
      // the u16 right value by 4. On the right (p1), shift right by 4 and then
33390
      // shift left by 8 so that, when still in the u16x16 little-endian
33391
      // interpretation, we have:
33392
      //  - m1_element =  (etcetera + 8) >> 4
33393
      //  - p1_element = ((etcetera + 7) >> 4) << 8
33394
      //
33395
      // step4_m1_lo = [0x00?? 0x00?? ... 0x00?? 0x00??]
33396
      // step4_p1_lo = [0x??00 0x??00 ... 0x??00 0x??00]
33397
      // step4_m1_hi = [0x00?? 0x00?? ... 0x00?? 0x00??]
33398
      // step4_p1_hi = [0x??00 0x??00 ... 0x??00 0x??00]
33399
0
      __m256i step4_m1_lo = _mm256_srli_epi16(
33400
0
          _mm256_add_epi16(step3_m1_lo, _mm256_set1_epi16(8)), 4);
33401
0
      __m256i step4_p1_lo = _mm256_slli_epi16(
33402
0
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_lo, _mm256_set1_epi16(7)),
33403
0
                            4),
33404
0
          8);
33405
0
      __m256i step4_m1_hi = _mm256_srli_epi16(
33406
0
          _mm256_add_epi16(step3_m1_hi, _mm256_set1_epi16(8)), 4);
33407
0
      __m256i step4_p1_hi = _mm256_slli_epi16(
33408
0
          _mm256_srli_epi16(_mm256_add_epi16(step3_p1_hi, _mm256_set1_epi16(7)),
33409
0
                            4),
33410
0
          8);
33411
33412
      // Bitwise-or two "0x00"-rich u16x16 vectors to get a u8x32 vector. Do
33413
      // that twice. Once for the low columns and once for the high columns.
33414
      //
33415
      // In terms of jxx (major row) or nxx (minor row) source samples:
33416
      //  - low  columns means ( 0 ..  8; 16 .. 24).
33417
      //  - high columns means ( 8 .. 16; 24 .. 32).
33418
      //
33419
      // In terms of dxx destination samples (there are twice as many):
33420
      //  - low  columns means ( 0 .. 16; 32 .. 48).
33421
      //  - high columns means (16 .. 32; 48 .. 64).
33422
      //
33423
      // step5_lo = [d00 d01 .. d14 d15  d32 d33 .. d46 d47]
33424
      // step5_hi = [d16 d17 .. d30 d31  d48 d49 .. d62 d63]
33425
      //
33426
      // The d00, d02 ... d62 even elements come from (p0, m1) weighted sums.
33427
      // The d01, d03 ... d63 odd  elements come from (p0, p1) weighted sums.
33428
0
      __m256i step5_lo = _mm256_or_si256(step4_m1_lo, step4_p1_lo);
33429
0
      __m256i step5_hi = _mm256_or_si256(step4_m1_hi, step4_p1_hi);
33430
33431
      // Permute and store.
33432
      //
33433
      // step6_00_31 = [d00 d01 .. d14 d15  d16 d17 .. d30 d31]
33434
      // step6_32_63 = [d32 d33 .. d46 d47  d48 d49 .. d62 d63]
33435
0
      __m256i step6_00_31 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x20);
33436
0
      __m256i step6_32_63 = _mm256_permute2x128_si256(step5_lo, step5_hi, 0x31);
33437
0
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x00), step6_00_31);
33438
0
      _mm256_storeu_si256((__m256i*)(void*)(dp + 0x20), step6_32_63);
33439
33440
      // Advance by up to 32 source samples (64 destination samples). The first
33441
      // iteration might be smaller than 32 so that all of the remaining steps
33442
      // are exactly 32.
33443
0
      size_t n = 32u - (31u & (0u - src_len));
33444
0
      dp += 2u * n;
33445
0
      sp_major += n;
33446
0
      sp_minor += n;
33447
0
      src_len -= n;
33448
0
    }
33449
0
  }
33450
33451
0
  if (last_column) {
33452
0
    uint32_t sv_major_m1 = sp_major[-1];
33453
0
    uint32_t sv_minor_m1 = sp_minor[-1];
33454
0
    uint32_t sv_major_p1 = sp_major[+0];  // Clamp offset to zero.
33455
0
    uint32_t sv_minor_p1 = sp_minor[+0];  // Clamp offset to zero.
33456
33457
0
    uint32_t sv = (9u * ((uint32_t)(*sp_major++))) +  //
33458
0
                  (3u * ((uint32_t)(*sp_minor++)));
33459
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_m1) + (sv_minor_m1) + 8u) >> 4u);
33460
0
    *dp++ = (uint8_t)((sv + (3u * sv_major_p1) + (sv_minor_p1) + 7u) >> 4u);
33461
0
  }
33462
33463
0
  return dst_ptr;
33464
0
}
33465
#endif
33466
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
33467
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
33468
33469
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
33470
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
33471
        // defined(WUFFS_CONFIG__MODULE__BASE__PIXCONV)
33472
33473
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BASE) || \
33474
    defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
33475
33476
// ---------------- Unicode and UTF-8
33477
33478
WUFFS_BASE__MAYBE_STATIC size_t  //
33479
0
wuffs_base__utf_8__encode(wuffs_base__slice_u8 dst, uint32_t code_point) {
33480
0
  if (code_point <= 0x7F) {
33481
0
    if (dst.len >= 1) {
33482
0
      dst.ptr[0] = (uint8_t)(code_point);
33483
0
      return 1;
33484
0
    }
33485
33486
0
  } else if (code_point <= 0x07FF) {
33487
0
    if (dst.len >= 2) {
33488
0
      dst.ptr[0] = (uint8_t)(0xC0 | ((code_point >> 6)));
33489
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
33490
0
      return 2;
33491
0
    }
33492
33493
0
  } else if (code_point <= 0xFFFF) {
33494
0
    if ((dst.len >= 3) && ((code_point < 0xD800) || (0xDFFF < code_point))) {
33495
0
      dst.ptr[0] = (uint8_t)(0xE0 | ((code_point >> 12)));
33496
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
33497
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
33498
0
      return 3;
33499
0
    }
33500
33501
0
  } else if (code_point <= 0x10FFFF) {
33502
0
    if (dst.len >= 4) {
33503
0
      dst.ptr[0] = (uint8_t)(0xF0 | ((code_point >> 18)));
33504
0
      dst.ptr[1] = (uint8_t)(0x80 | ((code_point >> 12) & 0x3F));
33505
0
      dst.ptr[2] = (uint8_t)(0x80 | ((code_point >> 6) & 0x3F));
33506
0
      dst.ptr[3] = (uint8_t)(0x80 | ((code_point >> 0) & 0x3F));
33507
0
      return 4;
33508
0
    }
33509
0
  }
33510
33511
0
  return 0;
33512
0
}
33513
33514
// wuffs_base__utf_8__byte_length_minus_1 is the byte length (minus 1) of a
33515
// UTF-8 encoded code point, based on the encoding's initial byte.
33516
//  - 0x00 is 1-byte UTF-8 (ASCII).
33517
//  - 0x01 is the start of 2-byte UTF-8.
33518
//  - 0x02 is the start of 3-byte UTF-8.
33519
//  - 0x03 is the start of 4-byte UTF-8.
33520
//  - 0x40 is a UTF-8 tail byte.
33521
//  - 0x80 is invalid UTF-8.
33522
//
33523
// RFC 3629 (UTF-8) gives this grammar for valid UTF-8:
33524
//    UTF8-1      = %x00-7F
33525
//    UTF8-2      = %xC2-DF UTF8-tail
33526
//    UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
33527
//                  %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
33528
//    UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
33529
//                  %xF4 %x80-8F 2( UTF8-tail )
33530
//    UTF8-tail   = %x80-BF
33531
static const uint8_t wuffs_base__utf_8__byte_length_minus_1[256] = {
33532
    // 0     1     2     3     4     5     6     7
33533
    // 8     9     A     B     C     D     E     F
33534
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x00 ..= 0x07.
33535
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x08 ..= 0x0F.
33536
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x10 ..= 0x17.
33537
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x18 ..= 0x1F.
33538
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x20 ..= 0x27.
33539
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x28 ..= 0x2F.
33540
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x30 ..= 0x37.
33541
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x38 ..= 0x3F.
33542
33543
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x40 ..= 0x47.
33544
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x48 ..= 0x4F.
33545
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x50 ..= 0x57.
33546
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x58 ..= 0x5F.
33547
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x60 ..= 0x67.
33548
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x68 ..= 0x6F.
33549
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x70 ..= 0x77.
33550
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // 0x78 ..= 0x7F.
33551
33552
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x80 ..= 0x87.
33553
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x88 ..= 0x8F.
33554
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x90 ..= 0x97.
33555
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0x98 ..= 0x9F.
33556
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA0 ..= 0xA7.
33557
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xA8 ..= 0xAF.
33558
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB0 ..= 0xB7.
33559
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,  // 0xB8 ..= 0xBF.
33560
33561
    0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC0 ..= 0xC7.
33562
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xC8 ..= 0xCF.
33563
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD0 ..= 0xD7.
33564
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,  // 0xD8 ..= 0xDF.
33565
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE0 ..= 0xE7.
33566
    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,  // 0xE8 ..= 0xEF.
33567
    0x03, 0x03, 0x03, 0x03, 0x03, 0x80, 0x80, 0x80,  // 0xF0 ..= 0xF7.
33568
    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,  // 0xF8 ..= 0xFF.
33569
    // 0     1     2     3     4     5     6     7
33570
    // 8     9     A     B     C     D     E     F
33571
};
33572
33573
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
33574
0
wuffs_base__utf_8__next(const uint8_t* s_ptr, size_t s_len) {
33575
0
  if (s_len == 0) {
33576
0
    return wuffs_base__make_utf_8__next__output(0, 0);
33577
0
  }
33578
0
  uint32_t c = s_ptr[0];
33579
0
  switch (wuffs_base__utf_8__byte_length_minus_1[c & 0xFF]) {
33580
0
    case 0:
33581
0
      return wuffs_base__make_utf_8__next__output(c, 1);
33582
33583
0
    case 1:
33584
0
      if (s_len < 2) {
33585
0
        break;
33586
0
      }
33587
0
      c = wuffs_base__peek_u16le__no_bounds_check(s_ptr);
33588
0
      if ((c & 0xC000) != 0x8000) {
33589
0
        break;
33590
0
      }
33591
0
      c = (0x0007C0 & (c << 6)) | (0x00003F & (c >> 8));
33592
0
      return wuffs_base__make_utf_8__next__output(c, 2);
33593
33594
0
    case 2:
33595
0
      if (s_len < 3) {
33596
0
        break;
33597
0
      }
33598
0
      c = wuffs_base__peek_u24le__no_bounds_check(s_ptr);
33599
0
      if ((c & 0xC0C000) != 0x808000) {
33600
0
        break;
33601
0
      }
33602
0
      c = (0x00F000 & (c << 12)) | (0x000FC0 & (c >> 2)) |
33603
0
          (0x00003F & (c >> 16));
33604
0
      if ((c <= 0x07FF) || ((0xD800 <= c) && (c <= 0xDFFF))) {
33605
0
        break;
33606
0
      }
33607
0
      return wuffs_base__make_utf_8__next__output(c, 3);
33608
33609
0
    case 3:
33610
0
      if (s_len < 4) {
33611
0
        break;
33612
0
      }
33613
0
      c = wuffs_base__peek_u32le__no_bounds_check(s_ptr);
33614
0
      if ((c & 0xC0C0C000) != 0x80808000) {
33615
0
        break;
33616
0
      }
33617
0
      c = (0x1C0000 & (c << 18)) | (0x03F000 & (c << 4)) |
33618
0
          (0x000FC0 & (c >> 10)) | (0x00003F & (c >> 24));
33619
0
      if ((c <= 0xFFFF) || (0x110000 <= c)) {
33620
0
        break;
33621
0
      }
33622
0
      return wuffs_base__make_utf_8__next__output(c, 4);
33623
0
  }
33624
33625
0
  return wuffs_base__make_utf_8__next__output(
33626
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
33627
0
}
33628
33629
WUFFS_BASE__MAYBE_STATIC wuffs_base__utf_8__next__output  //
33630
0
wuffs_base__utf_8__next_from_end(const uint8_t* s_ptr, size_t s_len) {
33631
0
  if (s_len == 0) {
33632
0
    return wuffs_base__make_utf_8__next__output(0, 0);
33633
0
  }
33634
0
  const uint8_t* ptr = &s_ptr[s_len - 1];
33635
0
  if (*ptr < 0x80) {
33636
0
    return wuffs_base__make_utf_8__next__output(*ptr, 1);
33637
33638
0
  } else if (*ptr < 0xC0) {
33639
0
    const uint8_t* too_far = &s_ptr[(s_len > 4) ? (s_len - 4) : 0];
33640
0
    uint32_t n = 1;
33641
0
    while (ptr != too_far) {
33642
0
      ptr--;
33643
0
      n++;
33644
0
      if (*ptr < 0x80) {
33645
0
        break;
33646
0
      } else if (*ptr < 0xC0) {
33647
0
        continue;
33648
0
      }
33649
0
      wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(ptr, n);
33650
0
      if (o.byte_length != n) {
33651
0
        break;
33652
0
      }
33653
0
      return o;
33654
0
    }
33655
0
  }
33656
33657
0
  return wuffs_base__make_utf_8__next__output(
33658
0
      WUFFS_BASE__UNICODE_REPLACEMENT_CHARACTER, 1);
33659
0
}
33660
33661
WUFFS_BASE__MAYBE_STATIC size_t  //
33662
0
wuffs_base__utf_8__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
33663
  // TODO: possibly optimize the all-ASCII case (4 or 8 bytes at a time).
33664
  //
33665
  // TODO: possibly optimize this by manually inlining the
33666
  // wuffs_base__utf_8__next calls.
33667
0
  size_t original_len = s_len;
33668
0
  while (s_len > 0) {
33669
0
    wuffs_base__utf_8__next__output o = wuffs_base__utf_8__next(s_ptr, s_len);
33670
0
    if ((o.code_point > 0x7F) && (o.byte_length == 1)) {
33671
0
      break;
33672
0
    }
33673
0
    s_ptr += o.byte_length;
33674
0
    s_len -= o.byte_length;
33675
0
  }
33676
0
  return original_len - s_len;
33677
0
}
33678
33679
WUFFS_BASE__MAYBE_STATIC size_t  //
33680
0
wuffs_base__ascii__longest_valid_prefix(const uint8_t* s_ptr, size_t s_len) {
33681
  // TODO: possibly optimize this by checking 4 or 8 bytes at a time.
33682
0
  const uint8_t* original_ptr = s_ptr;
33683
0
  const uint8_t* p = s_ptr;
33684
0
  const uint8_t* q = s_ptr + s_len;
33685
0
  for (; (p != q) && ((*p & 0x80) == 0); p++) {
33686
0
  }
33687
0
  return (size_t)(p - original_ptr);
33688
0
}
33689
33690
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
33691
        // defined(WUFFS_CONFIG__MODULE__BASE) ||
33692
        // defined(WUFFS_CONFIG__MODULE__BASE__UTF8)
33693
33694
#ifdef __cplusplus
33695
}  // extern "C"
33696
#endif
33697
33698
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
33699
33700
// ---------------- Status Codes Implementations
33701
33702
// ---------------- Private Consts
33703
33704
// ---------------- Private Initializer Prototypes
33705
33706
// ---------------- Private Function Prototypes
33707
33708
WUFFS_BASE__GENERATED_C_CODE
33709
static wuffs_base__empty_struct
33710
wuffs_adler32__hasher__up(
33711
    wuffs_adler32__hasher* self,
33712
    wuffs_base__slice_u8 a_x);
33713
33714
WUFFS_BASE__GENERATED_C_CODE
33715
static wuffs_base__empty_struct
33716
wuffs_adler32__hasher__up__choosy_default(
33717
    wuffs_adler32__hasher* self,
33718
    wuffs_base__slice_u8 a_x);
33719
33720
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33721
WUFFS_BASE__GENERATED_C_CODE
33722
static wuffs_base__empty_struct
33723
wuffs_adler32__hasher__up_arm_neon(
33724
    wuffs_adler32__hasher* self,
33725
    wuffs_base__slice_u8 a_x);
33726
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33727
33728
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33729
WUFFS_BASE__GENERATED_C_CODE
33730
static wuffs_base__empty_struct
33731
wuffs_adler32__hasher__up_x86_sse42(
33732
    wuffs_adler32__hasher* self,
33733
    wuffs_base__slice_u8 a_x);
33734
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33735
33736
// ---------------- VTables
33737
33738
const wuffs_base__hasher_u32__func_ptrs
33739
wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
33740
  (uint32_t(*)(const void*))(&wuffs_adler32__hasher__checksum_u32),
33741
  (uint64_t(*)(const void*,
33742
      uint32_t))(&wuffs_adler32__hasher__get_quirk),
33743
  (wuffs_base__status(*)(void*,
33744
      uint32_t,
33745
      uint64_t))(&wuffs_adler32__hasher__set_quirk),
33746
  (wuffs_base__empty_struct(*)(void*,
33747
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update),
33748
  (uint32_t(*)(void*,
33749
      wuffs_base__slice_u8))(&wuffs_adler32__hasher__update_u32),
33750
};
33751
33752
// ---------------- Initializer Implementations
33753
33754
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
33755
wuffs_adler32__hasher__initialize(
33756
    wuffs_adler32__hasher* self,
33757
    size_t sizeof_star_self,
33758
    uint64_t wuffs_version,
33759
14.6k
    uint32_t options){
33760
14.6k
  if (!self) {
33761
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33762
0
  }
33763
14.6k
  if (sizeof(*self) != sizeof_star_self) {
33764
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
33765
0
  }
33766
14.6k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
33767
14.6k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
33768
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
33769
0
  }
33770
33771
14.6k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
33772
    // The whole point of this if-check is to detect an uninitialized *self.
33773
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
33774
#if !defined(__clang__) && defined(__GNUC__)
33775
#pragma GCC diagnostic push
33776
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
33777
#endif
33778
5.65k
    if (self->private_impl.magic != 0) {
33779
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
33780
0
    }
33781
#if !defined(__clang__) && defined(__GNUC__)
33782
#pragma GCC diagnostic pop
33783
#endif
33784
8.98k
  } else {
33785
8.98k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
33786
0
      memset(self, 0, sizeof(*self));
33787
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
33788
8.98k
    } else {
33789
8.98k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
33790
8.98k
    }
33791
8.98k
  }
33792
33793
14.6k
  self->private_impl.choosy_up = &wuffs_adler32__hasher__up__choosy_default;
33794
33795
14.6k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
33796
14.6k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
33797
14.6k
      wuffs_base__hasher_u32__vtable_name;
33798
14.6k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
33799
14.6k
      (const void*)(&wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
33800
14.6k
  return wuffs_base__make_status(NULL);
33801
14.6k
}
33802
33803
wuffs_adler32__hasher*
33804
0
wuffs_adler32__hasher__alloc(void) {
33805
0
  wuffs_adler32__hasher* x =
33806
0
      (wuffs_adler32__hasher*)(calloc(1, sizeof(wuffs_adler32__hasher)));
33807
0
  if (!x) {
33808
0
    return NULL;
33809
0
  }
33810
0
  if (wuffs_adler32__hasher__initialize(
33811
0
      x, sizeof(wuffs_adler32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
33812
0
    free(x);
33813
0
    return NULL;
33814
0
  }
33815
0
  return x;
33816
0
}
33817
33818
size_t
33819
0
sizeof__wuffs_adler32__hasher(void) {
33820
0
  return sizeof(wuffs_adler32__hasher);
33821
0
}
33822
33823
// ---------------- Function Implementations
33824
33825
// -------- func adler32.hasher.get_quirk
33826
33827
WUFFS_BASE__GENERATED_C_CODE
33828
WUFFS_BASE__MAYBE_STATIC uint64_t
33829
wuffs_adler32__hasher__get_quirk(
33830
    const wuffs_adler32__hasher* self,
33831
0
    uint32_t a_key) {
33832
0
  if (!self) {
33833
0
    return 0;
33834
0
  }
33835
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
33836
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
33837
0
    return 0;
33838
0
  }
33839
33840
0
  return 0u;
33841
0
}
33842
33843
// -------- func adler32.hasher.set_quirk
33844
33845
WUFFS_BASE__GENERATED_C_CODE
33846
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
33847
wuffs_adler32__hasher__set_quirk(
33848
    wuffs_adler32__hasher* self,
33849
    uint32_t a_key,
33850
0
    uint64_t a_value) {
33851
0
  if (!self) {
33852
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
33853
0
  }
33854
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33855
0
    return wuffs_base__make_status(
33856
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
33857
0
        ? wuffs_base__error__disabled_by_previous_error
33858
0
        : wuffs_base__error__initialize_not_called);
33859
0
  }
33860
33861
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
33862
0
}
33863
33864
// -------- func adler32.hasher.update
33865
33866
WUFFS_BASE__GENERATED_C_CODE
33867
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
33868
wuffs_adler32__hasher__update(
33869
    wuffs_adler32__hasher* self,
33870
17.6k
    wuffs_base__slice_u8 a_x) {
33871
17.6k
  if (!self) {
33872
0
    return wuffs_base__make_empty_struct();
33873
0
  }
33874
17.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33875
0
    return wuffs_base__make_empty_struct();
33876
0
  }
33877
33878
17.6k
  if ( ! self->private_impl.f_started) {
33879
4.99k
    self->private_impl.f_started = true;
33880
4.99k
    self->private_impl.f_state = 1u;
33881
4.99k
    self->private_impl.choosy_up = (
33882
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
33883
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_adler32__hasher__up_arm_neon :
33884
#endif
33885
4.99k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
33886
4.99k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_adler32__hasher__up_x86_sse42 :
33887
4.99k
#endif
33888
4.99k
        self->private_impl.choosy_up);
33889
4.99k
  }
33890
17.6k
  wuffs_adler32__hasher__up(self, a_x);
33891
17.6k
  return wuffs_base__make_empty_struct();
33892
17.6k
}
33893
33894
// -------- func adler32.hasher.update_u32
33895
33896
WUFFS_BASE__GENERATED_C_CODE
33897
WUFFS_BASE__MAYBE_STATIC uint32_t
33898
wuffs_adler32__hasher__update_u32(
33899
    wuffs_adler32__hasher* self,
33900
17.6k
    wuffs_base__slice_u8 a_x) {
33901
17.6k
  if (!self) {
33902
0
    return 0;
33903
0
  }
33904
17.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
33905
0
    return 0;
33906
0
  }
33907
33908
17.6k
  wuffs_adler32__hasher__update(self, a_x);
33909
17.6k
  return self->private_impl.f_state;
33910
17.6k
}
33911
33912
// -------- func adler32.hasher.up
33913
33914
WUFFS_BASE__GENERATED_C_CODE
33915
static wuffs_base__empty_struct
33916
wuffs_adler32__hasher__up(
33917
    wuffs_adler32__hasher* self,
33918
17.6k
    wuffs_base__slice_u8 a_x) {
33919
17.6k
  return (*self->private_impl.choosy_up)(self, a_x);
33920
17.6k
}
33921
33922
WUFFS_BASE__GENERATED_C_CODE
33923
static wuffs_base__empty_struct
33924
wuffs_adler32__hasher__up__choosy_default(
33925
    wuffs_adler32__hasher* self,
33926
0
    wuffs_base__slice_u8 a_x) {
33927
0
  uint32_t v_s1 = 0;
33928
0
  uint32_t v_s2 = 0;
33929
0
  wuffs_base__slice_u8 v_remaining = {0};
33930
0
  wuffs_base__slice_u8 v_p = {0};
33931
33932
0
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
33933
0
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
33934
0
  while (((uint64_t)(a_x.len)) > 0u) {
33935
0
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
33936
0
    if (((uint64_t)(a_x.len)) > 5552u) {
33937
0
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5552u);
33938
0
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5552u);
33939
0
    }
33940
0
    {
33941
0
      wuffs_base__slice_u8 i_slice_p = a_x;
33942
0
      v_p.ptr = i_slice_p.ptr;
33943
0
      v_p.len = 1;
33944
0
      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)) / 8) * 8));
33945
0
      while (v_p.ptr < i_end0_p) {
33946
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33947
0
        v_s2 += v_s1;
33948
0
        v_p.ptr += 1;
33949
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33950
0
        v_s2 += v_s1;
33951
0
        v_p.ptr += 1;
33952
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33953
0
        v_s2 += v_s1;
33954
0
        v_p.ptr += 1;
33955
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33956
0
        v_s2 += v_s1;
33957
0
        v_p.ptr += 1;
33958
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33959
0
        v_s2 += v_s1;
33960
0
        v_p.ptr += 1;
33961
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33962
0
        v_s2 += v_s1;
33963
0
        v_p.ptr += 1;
33964
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33965
0
        v_s2 += v_s1;
33966
0
        v_p.ptr += 1;
33967
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33968
0
        v_s2 += v_s1;
33969
0
        v_p.ptr += 1;
33970
0
      }
33971
0
      v_p.len = 1;
33972
0
      const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
33973
0
      while (v_p.ptr < i_end1_p) {
33974
0
        v_s1 += ((uint32_t)(v_p.ptr[0u]));
33975
0
        v_s2 += v_s1;
33976
0
        v_p.ptr += 1;
33977
0
      }
33978
0
      v_p.len = 0;
33979
0
    }
33980
0
    v_s1 %= 65521u;
33981
0
    v_s2 %= 65521u;
33982
0
    a_x = v_remaining;
33983
0
  }
33984
0
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
33985
0
  return wuffs_base__make_empty_struct();
33986
0
}
33987
33988
// -------- func adler32.hasher.checksum_u32
33989
33990
WUFFS_BASE__GENERATED_C_CODE
33991
WUFFS_BASE__MAYBE_STATIC uint32_t
33992
wuffs_adler32__hasher__checksum_u32(
33993
0
    const wuffs_adler32__hasher* self) {
33994
0
  if (!self) {
33995
0
    return 0;
33996
0
  }
33997
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
33998
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
33999
0
    return 0;
34000
0
  }
34001
34002
0
  return self->private_impl.f_state;
34003
0
}
34004
34005
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
34006
// -------- func adler32.hasher.up_arm_neon
34007
34008
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34009
WUFFS_BASE__GENERATED_C_CODE
34010
static wuffs_base__empty_struct
34011
wuffs_adler32__hasher__up_arm_neon(
34012
    wuffs_adler32__hasher* self,
34013
    wuffs_base__slice_u8 a_x) {
34014
  uint32_t v_s1 = 0;
34015
  uint32_t v_s2 = 0;
34016
  wuffs_base__slice_u8 v_remaining = {0};
34017
  wuffs_base__slice_u8 v_p = {0};
34018
  uint8x16_t v_p__left = {0};
34019
  uint8x16_t v_p_right = {0};
34020
  uint32x4_t v_v1 = {0};
34021
  uint32x4_t v_v2 = {0};
34022
  uint16x8_t v_col0 = {0};
34023
  uint16x8_t v_col1 = {0};
34024
  uint16x8_t v_col2 = {0};
34025
  uint16x8_t v_col3 = {0};
34026
  uint32x2_t v_sum1 = {0};
34027
  uint32x2_t v_sum2 = {0};
34028
  uint32x2_t v_sum12 = {0};
34029
  uint32_t v_num_iterate_bytes = 0;
34030
  uint64_t v_tail_index = 0;
34031
34032
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
34033
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
34034
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
34035
    v_s1 += ((uint32_t)(a_x.ptr[0u]));
34036
    v_s2 += v_s1;
34037
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
34038
  }
34039
  v_s1 %= 65521u;
34040
  v_s2 %= 65521u;
34041
  while (((uint64_t)(a_x.len)) > 0u) {
34042
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
34043
    if (((uint64_t)(a_x.len)) > 5536u) {
34044
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
34045
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
34046
    }
34047
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
34048
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
34049
    v_v1 = vdupq_n_u32(0u);
34050
    v_v2 = vdupq_n_u32(0u);
34051
    v_col0 = vdupq_n_u16(0u);
34052
    v_col1 = vdupq_n_u16(0u);
34053
    v_col2 = vdupq_n_u16(0u);
34054
    v_col3 = vdupq_n_u16(0u);
34055
    {
34056
      wuffs_base__slice_u8 i_slice_p = a_x;
34057
      v_p.ptr = i_slice_p.ptr;
34058
      v_p.len = 32;
34059
      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)) / 32) * 32));
34060
      while (v_p.ptr < i_end0_p) {
34061
        v_p__left = vld1q_u8(v_p.ptr);
34062
        v_p_right = vld1q_u8(v_p.ptr + 16u);
34063
        v_v2 = vaddq_u32(v_v2, v_v1);
34064
        v_v1 = vpadalq_u16(v_v1, vpadalq_u8(vpaddlq_u8(v_p__left), v_p_right));
34065
        v_col0 = vaddw_u8(v_col0, vget_low_u8(v_p__left));
34066
        v_col1 = vaddw_u8(v_col1, vget_high_u8(v_p__left));
34067
        v_col2 = vaddw_u8(v_col2, vget_low_u8(v_p_right));
34068
        v_col3 = vaddw_u8(v_col3, vget_high_u8(v_p_right));
34069
        v_p.ptr += 32;
34070
      }
34071
      v_p.len = 0;
34072
    }
34073
    v_v2 = vshlq_n_u32(v_v2, 5u);
34074
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col0), ((uint16x4_t){32u, 31u, 30u, 29u}));
34075
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col0), ((uint16x4_t){28u, 27u, 26u, 25u}));
34076
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col1), ((uint16x4_t){24u, 23u, 22u, 21u}));
34077
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col1), ((uint16x4_t){20u, 19u, 18u, 17u}));
34078
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col2), ((uint16x4_t){16u, 15u, 14u, 13u}));
34079
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col2), ((uint16x4_t){12u, 11u, 10u, 9u}));
34080
    v_v2 = vmlal_u16(v_v2, vget_low_u16(v_col3), ((uint16x4_t){8u, 7u, 6u, 5u}));
34081
    v_v2 = vmlal_u16(v_v2, vget_high_u16(v_col3), ((uint16x4_t){4u, 3u, 2u, 1u}));
34082
    v_sum1 = vpadd_u32(vget_low_u32(v_v1), vget_high_u32(v_v1));
34083
    v_sum2 = vpadd_u32(vget_low_u32(v_v2), vget_high_u32(v_v2));
34084
    v_sum12 = vpadd_u32(v_sum1, v_sum2);
34085
    v_s1 += vget_lane_u32(v_sum12, 0u);
34086
    v_s2 += vget_lane_u32(v_sum12, 1u);
34087
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
34088
    if (v_tail_index < ((uint64_t)(a_x.len))) {
34089
      {
34090
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
34091
        v_p.ptr = i_slice_p.ptr;
34092
        v_p.len = 1;
34093
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
34094
        while (v_p.ptr < i_end0_p) {
34095
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
34096
          v_s2 += v_s1;
34097
          v_p.ptr += 1;
34098
        }
34099
        v_p.len = 0;
34100
      }
34101
    }
34102
    v_s1 %= 65521u;
34103
    v_s2 %= 65521u;
34104
    a_x = v_remaining;
34105
  }
34106
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
34107
  return wuffs_base__make_empty_struct();
34108
}
34109
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
34110
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
34111
34112
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
34113
// -------- func adler32.hasher.up_x86_sse42
34114
34115
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34116
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
34117
WUFFS_BASE__GENERATED_C_CODE
34118
static wuffs_base__empty_struct
34119
wuffs_adler32__hasher__up_x86_sse42(
34120
    wuffs_adler32__hasher* self,
34121
17.6k
    wuffs_base__slice_u8 a_x) {
34122
17.6k
  uint32_t v_s1 = 0;
34123
17.6k
  uint32_t v_s2 = 0;
34124
17.6k
  wuffs_base__slice_u8 v_remaining = {0};
34125
17.6k
  wuffs_base__slice_u8 v_p = {0};
34126
17.6k
  __m128i v_zeroes = {0};
34127
17.6k
  __m128i v_ones = {0};
34128
17.6k
  __m128i v_weights__left = {0};
34129
17.6k
  __m128i v_weights_right = {0};
34130
17.6k
  __m128i v_q__left = {0};
34131
17.6k
  __m128i v_q_right = {0};
34132
17.6k
  __m128i v_v1 = {0};
34133
17.6k
  __m128i v_v2 = {0};
34134
17.6k
  __m128i v_v2j = {0};
34135
17.6k
  __m128i v_v2k = {0};
34136
17.6k
  uint32_t v_num_iterate_bytes = 0;
34137
17.6k
  uint64_t v_tail_index = 0;
34138
34139
17.6k
  v_zeroes = _mm_set1_epi16((int16_t)(0u));
34140
17.6k
  v_ones = _mm_set1_epi16((int16_t)(1u));
34141
17.6k
  v_weights__left = _mm_set_epi8((int8_t)(17u), (int8_t)(18u), (int8_t)(19u), (int8_t)(20u), (int8_t)(21u), (int8_t)(22u), (int8_t)(23u), (int8_t)(24u), (int8_t)(25u), (int8_t)(26u), (int8_t)(27u), (int8_t)(28u), (int8_t)(29u), (int8_t)(30u), (int8_t)(31u), (int8_t)(32u));
34142
17.6k
  v_weights_right = _mm_set_epi8((int8_t)(1u), (int8_t)(2u), (int8_t)(3u), (int8_t)(4u), (int8_t)(5u), (int8_t)(6u), (int8_t)(7u), (int8_t)(8u), (int8_t)(9u), (int8_t)(10u), (int8_t)(11u), (int8_t)(12u), (int8_t)(13u), (int8_t)(14u), (int8_t)(15u), (int8_t)(16u));
34143
17.6k
  v_s1 = ((self->private_impl.f_state) & 0xFFFFu);
34144
17.6k
  v_s2 = ((self->private_impl.f_state) >> (32u - 16u));
34145
364k
  while (((uint64_t)(a_x.len)) > 0u) {
34146
346k
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
34147
346k
    if (((uint64_t)(a_x.len)) > 5536u) {
34148
335k
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 5536u);
34149
335k
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 5536u);
34150
335k
    }
34151
346k
    v_num_iterate_bytes = ((uint32_t)((((uint64_t)(a_x.len)) & 4294967264u)));
34152
346k
    v_s2 += ((uint32_t)(v_s1 * v_num_iterate_bytes));
34153
346k
    v_v1 = _mm_setzero_si128();
34154
346k
    v_v2j = _mm_setzero_si128();
34155
346k
    v_v2k = _mm_setzero_si128();
34156
346k
    {
34157
346k
      wuffs_base__slice_u8 i_slice_p = a_x;
34158
346k
      v_p.ptr = i_slice_p.ptr;
34159
346k
      v_p.len = 32;
34160
346k
      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)) / 32) * 32));
34161
58.7M
      while (v_p.ptr < i_end0_p) {
34162
58.3M
        v_q__left = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr));
34163
58.3M
        v_q_right = _mm_lddqu_si128((const __m128i*)(const void*)(v_p.ptr + 16u));
34164
58.3M
        v_v2j = _mm_add_epi32(v_v2j, v_v1);
34165
58.3M
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q__left, v_zeroes));
34166
58.3M
        v_v1 = _mm_add_epi32(v_v1, _mm_sad_epu8(v_q_right, v_zeroes));
34167
58.3M
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q__left, v_weights__left)));
34168
58.3M
        v_v2k = _mm_add_epi32(v_v2k, _mm_madd_epi16(v_ones, _mm_maddubs_epi16(v_q_right, v_weights_right)));
34169
58.3M
        v_p.ptr += 32;
34170
58.3M
      }
34171
346k
      v_p.len = 0;
34172
346k
    }
34173
346k
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(177u)));
34174
346k
    v_v1 = _mm_add_epi32(v_v1, _mm_shuffle_epi32(v_v1, (int32_t)(78u)));
34175
346k
    v_s1 += ((uint32_t)(_mm_cvtsi128_si32(v_v1)));
34176
346k
    v_v2 = _mm_add_epi32(v_v2k, _mm_slli_epi32(v_v2j, (int32_t)(5u)));
34177
346k
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(177u)));
34178
346k
    v_v2 = _mm_add_epi32(v_v2, _mm_shuffle_epi32(v_v2, (int32_t)(78u)));
34179
346k
    v_s2 += ((uint32_t)(_mm_cvtsi128_si32(v_v2)));
34180
346k
    v_tail_index = (((uint64_t)(a_x.len)) & 18446744073709551584u);
34181
346k
    if (v_tail_index < ((uint64_t)(a_x.len))) {
34182
11.2k
      {
34183
11.2k
        wuffs_base__slice_u8 i_slice_p = wuffs_base__slice_u8__subslice_i(a_x, v_tail_index);
34184
11.2k
        v_p.ptr = i_slice_p.ptr;
34185
11.2k
        v_p.len = 1;
34186
11.2k
        const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
34187
127k
        while (v_p.ptr < i_end0_p) {
34188
116k
          v_s1 += ((uint32_t)(v_p.ptr[0u]));
34189
116k
          v_s2 += v_s1;
34190
116k
          v_p.ptr += 1;
34191
116k
        }
34192
11.2k
        v_p.len = 0;
34193
11.2k
      }
34194
11.2k
    }
34195
346k
    v_s1 %= 65521u;
34196
346k
    v_s2 %= 65521u;
34197
346k
    a_x = v_remaining;
34198
346k
  }
34199
17.6k
  self->private_impl.f_state = (((v_s2 & 65535u) << 16u) | (v_s1 & 65535u));
34200
17.6k
  return wuffs_base__make_empty_struct();
34201
17.6k
}
34202
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
34203
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
34204
34205
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ADLER32)
34206
34207
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
34208
34209
// ---------------- Status Codes Implementations
34210
34211
const char wuffs_bmp__error__bad_header[] = "#bmp: bad header";
34212
const char wuffs_bmp__error__bad_rle_compression[] = "#bmp: bad RLE compression";
34213
const char wuffs_bmp__error__truncated_input[] = "#bmp: truncated input";
34214
const char wuffs_bmp__error__unsupported_bmp_file[] = "#bmp: unsupported BMP file";
34215
const char wuffs_bmp__note__internal_note_short_read[] = "@bmp: internal note: short read";
34216
34217
// ---------------- Private Consts
34218
34219
#define WUFFS_BMP__COMPRESSION_NONE 0u
34220
34221
#define WUFFS_BMP__COMPRESSION_RLE8 1u
34222
34223
#define WUFFS_BMP__COMPRESSION_RLE4 2u
34224
34225
#define WUFFS_BMP__COMPRESSION_BITFIELDS 3u
34226
34227
#define WUFFS_BMP__COMPRESSION_JPEG 4u
34228
34229
#define WUFFS_BMP__COMPRESSION_PNG 5u
34230
34231
#define WUFFS_BMP__COMPRESSION_ALPHABITFIELDS 6u
34232
34233
#define WUFFS_BMP__COMPRESSION_LOW_BIT_DEPTH 256u
34234
34235
#define WUFFS_BMP__RLE_STATE_NEUTRAL 0u
34236
34237
#define WUFFS_BMP__RLE_STATE_RUN 1u
34238
34239
#define WUFFS_BMP__RLE_STATE_ESCAPE 2u
34240
34241
#define WUFFS_BMP__RLE_STATE_LITERAL 3u
34242
34243
#define WUFFS_BMP__RLE_STATE_DELTA_X 4u
34244
34245
#define WUFFS_BMP__RLE_STATE_DELTA_Y 5u
34246
34247
// ---------------- Private Initializer Prototypes
34248
34249
// ---------------- Private Function Prototypes
34250
34251
WUFFS_BASE__GENERATED_C_CODE
34252
static wuffs_base__status
34253
wuffs_bmp__decoder__do_decode_image_config(
34254
    wuffs_bmp__decoder* self,
34255
    wuffs_base__image_config* a_dst,
34256
    wuffs_base__io_buffer* a_src);
34257
34258
WUFFS_BASE__GENERATED_C_CODE
34259
static wuffs_base__status
34260
wuffs_bmp__decoder__do_decode_frame_config(
34261
    wuffs_bmp__decoder* self,
34262
    wuffs_base__frame_config* a_dst,
34263
    wuffs_base__io_buffer* a_src);
34264
34265
WUFFS_BASE__GENERATED_C_CODE
34266
static wuffs_base__status
34267
wuffs_bmp__decoder__do_decode_frame(
34268
    wuffs_bmp__decoder* self,
34269
    wuffs_base__pixel_buffer* a_dst,
34270
    wuffs_base__io_buffer* a_src,
34271
    wuffs_base__pixel_blend a_blend,
34272
    wuffs_base__slice_u8 a_workbuf,
34273
    wuffs_base__decode_frame_options* a_opts);
34274
34275
WUFFS_BASE__GENERATED_C_CODE
34276
static wuffs_base__status
34277
wuffs_bmp__decoder__swizzle_none(
34278
    wuffs_bmp__decoder* self,
34279
    wuffs_base__pixel_buffer* a_dst,
34280
    wuffs_base__io_buffer* a_src);
34281
34282
WUFFS_BASE__GENERATED_C_CODE
34283
static wuffs_base__status
34284
wuffs_bmp__decoder__swizzle_rle(
34285
    wuffs_bmp__decoder* self,
34286
    wuffs_base__pixel_buffer* a_dst,
34287
    wuffs_base__io_buffer* a_src);
34288
34289
WUFFS_BASE__GENERATED_C_CODE
34290
static wuffs_base__status
34291
wuffs_bmp__decoder__swizzle_bitfields(
34292
    wuffs_bmp__decoder* self,
34293
    wuffs_base__pixel_buffer* a_dst,
34294
    wuffs_base__io_buffer* a_src);
34295
34296
WUFFS_BASE__GENERATED_C_CODE
34297
static wuffs_base__status
34298
wuffs_bmp__decoder__swizzle_low_bit_depth(
34299
    wuffs_bmp__decoder* self,
34300
    wuffs_base__pixel_buffer* a_dst,
34301
    wuffs_base__io_buffer* a_src);
34302
34303
WUFFS_BASE__GENERATED_C_CODE
34304
static wuffs_base__status
34305
wuffs_bmp__decoder__do_tell_me_more(
34306
    wuffs_bmp__decoder* self,
34307
    wuffs_base__io_buffer* a_dst,
34308
    wuffs_base__more_information* a_minfo,
34309
    wuffs_base__io_buffer* a_src);
34310
34311
WUFFS_BASE__GENERATED_C_CODE
34312
static wuffs_base__status
34313
wuffs_bmp__decoder__read_palette(
34314
    wuffs_bmp__decoder* self,
34315
    wuffs_base__io_buffer* a_src);
34316
34317
WUFFS_BASE__GENERATED_C_CODE
34318
static wuffs_base__status
34319
wuffs_bmp__decoder__process_masks(
34320
    wuffs_bmp__decoder* self);
34321
34322
// ---------------- VTables
34323
34324
const wuffs_base__image_decoder__func_ptrs
34325
wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
34326
  (wuffs_base__status(*)(void*,
34327
      wuffs_base__pixel_buffer*,
34328
      wuffs_base__io_buffer*,
34329
      wuffs_base__pixel_blend,
34330
      wuffs_base__slice_u8,
34331
      wuffs_base__decode_frame_options*))(&wuffs_bmp__decoder__decode_frame),
34332
  (wuffs_base__status(*)(void*,
34333
      wuffs_base__frame_config*,
34334
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_frame_config),
34335
  (wuffs_base__status(*)(void*,
34336
      wuffs_base__image_config*,
34337
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__decode_image_config),
34338
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_bmp__decoder__frame_dirty_rect),
34339
  (uint64_t(*)(const void*,
34340
      uint32_t))(&wuffs_bmp__decoder__get_quirk),
34341
  (uint32_t(*)(const void*))(&wuffs_bmp__decoder__num_animation_loops),
34342
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frame_configs),
34343
  (uint64_t(*)(const void*))(&wuffs_bmp__decoder__num_decoded_frames),
34344
  (wuffs_base__status(*)(void*,
34345
      uint64_t,
34346
      uint64_t))(&wuffs_bmp__decoder__restart_frame),
34347
  (wuffs_base__status(*)(void*,
34348
      uint32_t,
34349
      uint64_t))(&wuffs_bmp__decoder__set_quirk),
34350
  (wuffs_base__empty_struct(*)(void*,
34351
      uint32_t,
34352
      bool))(&wuffs_bmp__decoder__set_report_metadata),
34353
  (wuffs_base__status(*)(void*,
34354
      wuffs_base__io_buffer*,
34355
      wuffs_base__more_information*,
34356
      wuffs_base__io_buffer*))(&wuffs_bmp__decoder__tell_me_more),
34357
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bmp__decoder__workbuf_len),
34358
};
34359
34360
// ---------------- Initializer Implementations
34361
34362
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
34363
wuffs_bmp__decoder__initialize(
34364
    wuffs_bmp__decoder* self,
34365
    size_t sizeof_star_self,
34366
    uint64_t wuffs_version,
34367
    uint32_t options){
34368
  if (!self) {
34369
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34370
  }
34371
  if (sizeof(*self) != sizeof_star_self) {
34372
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
34373
  }
34374
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
34375
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
34376
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
34377
  }
34378
34379
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
34380
    // The whole point of this if-check is to detect an uninitialized *self.
34381
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
34382
#if !defined(__clang__) && defined(__GNUC__)
34383
#pragma GCC diagnostic push
34384
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
34385
#endif
34386
    if (self->private_impl.magic != 0) {
34387
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
34388
    }
34389
#if !defined(__clang__) && defined(__GNUC__)
34390
#pragma GCC diagnostic pop
34391
#endif
34392
  } else {
34393
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
34394
      memset(self, 0, sizeof(*self));
34395
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
34396
    } else {
34397
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
34398
    }
34399
  }
34400
34401
  self->private_impl.magic = WUFFS_BASE__MAGIC;
34402
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
34403
      wuffs_base__image_decoder__vtable_name;
34404
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
34405
      (const void*)(&wuffs_bmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
34406
  return wuffs_base__make_status(NULL);
34407
}
34408
34409
wuffs_bmp__decoder*
34410
wuffs_bmp__decoder__alloc(void) {
34411
  wuffs_bmp__decoder* x =
34412
      (wuffs_bmp__decoder*)(calloc(1, sizeof(wuffs_bmp__decoder)));
34413
  if (!x) {
34414
    return NULL;
34415
  }
34416
  if (wuffs_bmp__decoder__initialize(
34417
      x, sizeof(wuffs_bmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
34418
    free(x);
34419
    return NULL;
34420
  }
34421
  return x;
34422
}
34423
34424
size_t
34425
sizeof__wuffs_bmp__decoder(void) {
34426
  return sizeof(wuffs_bmp__decoder);
34427
}
34428
34429
// ---------------- Function Implementations
34430
34431
// -------- func bmp.decoder.get_quirk
34432
34433
WUFFS_BASE__GENERATED_C_CODE
34434
WUFFS_BASE__MAYBE_STATIC uint64_t
34435
wuffs_bmp__decoder__get_quirk(
34436
    const wuffs_bmp__decoder* self,
34437
    uint32_t a_key) {
34438
  if (!self) {
34439
    return 0;
34440
  }
34441
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
34442
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
34443
    return 0;
34444
  }
34445
34446
  return 0u;
34447
}
34448
34449
// -------- func bmp.decoder.set_quirk
34450
34451
WUFFS_BASE__GENERATED_C_CODE
34452
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
34453
wuffs_bmp__decoder__set_quirk(
34454
    wuffs_bmp__decoder* self,
34455
    uint32_t a_key,
34456
    uint64_t a_value) {
34457
  if (!self) {
34458
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34459
  }
34460
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34461
    return wuffs_base__make_status(
34462
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
34463
        ? wuffs_base__error__disabled_by_previous_error
34464
        : wuffs_base__error__initialize_not_called);
34465
  }
34466
34467
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
34468
}
34469
34470
// -------- func bmp.decoder.decode_image_config
34471
34472
WUFFS_BASE__GENERATED_C_CODE
34473
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
34474
wuffs_bmp__decoder__decode_image_config(
34475
    wuffs_bmp__decoder* self,
34476
    wuffs_base__image_config* a_dst,
34477
    wuffs_base__io_buffer* a_src) {
34478
  if (!self) {
34479
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
34480
  }
34481
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
34482
    return wuffs_base__make_status(
34483
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
34484
        ? wuffs_base__error__disabled_by_previous_error
34485
        : wuffs_base__error__initialize_not_called);
34486
  }
34487
  if (!a_src) {
34488
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34489
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
34490
  }
34491
  if ((self->private_impl.active_coroutine != 0) &&
34492
      (self->private_impl.active_coroutine != 1)) {
34493
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34494
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
34495
  }
34496
  self->private_impl.active_coroutine = 0;
34497
  wuffs_base__status status = wuffs_base__make_status(NULL);
34498
34499
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
34500
34501
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
34502
  switch (coro_susp_point) {
34503
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34504
34505
    while (true) {
34506
      {
34507
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_image_config(self, a_dst, a_src);
34508
        v_status = t_0;
34509
      }
34510
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
34511
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
34512
        goto exit;
34513
      }
34514
      status = v_status;
34515
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
34516
    }
34517
34518
    ok:
34519
    self->private_impl.p_decode_image_config = 0;
34520
    goto exit;
34521
  }
34522
34523
  goto suspend;
34524
  suspend:
34525
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
34526
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
34527
34528
  goto exit;
34529
  exit:
34530
  if (wuffs_base__status__is_error(&status)) {
34531
    self->private_impl.magic = WUFFS_BASE__DISABLED;
34532
  }
34533
  return status;
34534
}
34535
34536
// -------- func bmp.decoder.do_decode_image_config
34537
34538
WUFFS_BASE__GENERATED_C_CODE
34539
static wuffs_base__status
34540
wuffs_bmp__decoder__do_decode_image_config(
34541
    wuffs_bmp__decoder* self,
34542
    wuffs_base__image_config* a_dst,
34543
    wuffs_base__io_buffer* a_src) {
34544
  wuffs_base__status status = wuffs_base__make_status(NULL);
34545
34546
  uint32_t v_magic = 0;
34547
  uint32_t v_width = 0;
34548
  uint32_t v_height = 0;
34549
  uint32_t v_planes = 0;
34550
  uint32_t v_n = 0;
34551
  uint32_t v_dst_pixfmt = 0;
34552
  uint32_t v_byte_width = 0;
34553
34554
  const uint8_t* iop_a_src = NULL;
34555
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34556
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34557
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
34558
  if (a_src && a_src->data.ptr) {
34559
    io0_a_src = a_src->data.ptr;
34560
    io1_a_src = io0_a_src + a_src->meta.ri;
34561
    iop_a_src = io1_a_src;
34562
    io2_a_src = io0_a_src + a_src->meta.wi;
34563
  }
34564
34565
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
34566
  switch (coro_susp_point) {
34567
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
34568
34569
    if ((self->private_impl.f_call_sequence != 0u) || (self->private_impl.f_io_redirect_fourcc == 1u)) {
34570
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
34571
      goto exit;
34572
    } else if (self->private_impl.f_io_redirect_fourcc != 0u) {
34573
      status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
34574
      goto ok;
34575
    }
34576
    {
34577
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
34578
      uint32_t t_0;
34579
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34580
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34581
        iop_a_src += 2;
34582
      } else {
34583
        self->private_data.s_do_decode_image_config.scratch = 0;
34584
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
34585
        while (true) {
34586
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34587
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34588
            goto suspend;
34589
          }
34590
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34591
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
34592
          *scratch <<= 8;
34593
          *scratch >>= 8;
34594
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
34595
          if (num_bits_0 == 8) {
34596
            t_0 = ((uint32_t)(*scratch));
34597
            break;
34598
          }
34599
          num_bits_0 += 8u;
34600
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
34601
        }
34602
      }
34603
      v_magic = t_0;
34604
    }
34605
    if (v_magic != 19778u) {
34606
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34607
      goto exit;
34608
    }
34609
    self->private_data.s_do_decode_image_config.scratch = 8u;
34610
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
34611
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
34612
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
34613
      iop_a_src = io2_a_src;
34614
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34615
      goto suspend;
34616
    }
34617
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
34618
    {
34619
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
34620
      uint32_t t_1;
34621
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34622
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34623
        iop_a_src += 4;
34624
      } else {
34625
        self->private_data.s_do_decode_image_config.scratch = 0;
34626
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
34627
        while (true) {
34628
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34629
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34630
            goto suspend;
34631
          }
34632
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34633
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
34634
          *scratch <<= 8;
34635
          *scratch >>= 8;
34636
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
34637
          if (num_bits_1 == 24) {
34638
            t_1 = ((uint32_t)(*scratch));
34639
            break;
34640
          }
34641
          num_bits_1 += 8u;
34642
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
34643
        }
34644
      }
34645
      self->private_impl.f_padding = t_1;
34646
    }
34647
    if (self->private_impl.f_padding < 14u) {
34648
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34649
      goto exit;
34650
    }
34651
    self->private_impl.f_padding -= 14u;
34652
    self->private_impl.f_io_redirect_pos = wuffs_base__u64__sat_add(((uint64_t)(self->private_impl.f_padding)), wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))));
34653
    {
34654
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
34655
      uint32_t t_2;
34656
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34657
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34658
        iop_a_src += 4;
34659
      } else {
34660
        self->private_data.s_do_decode_image_config.scratch = 0;
34661
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
34662
        while (true) {
34663
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34664
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34665
            goto suspend;
34666
          }
34667
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34668
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
34669
          *scratch <<= 8;
34670
          *scratch >>= 8;
34671
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
34672
          if (num_bits_2 == 24) {
34673
            t_2 = ((uint32_t)(*scratch));
34674
            break;
34675
          }
34676
          num_bits_2 += 8u;
34677
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
34678
        }
34679
      }
34680
      self->private_impl.f_bitmap_info_len = t_2;
34681
    }
34682
    if (self->private_impl.f_padding < self->private_impl.f_bitmap_info_len) {
34683
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34684
      goto exit;
34685
    }
34686
    self->private_impl.f_padding -= self->private_impl.f_bitmap_info_len;
34687
    if (self->private_impl.f_bitmap_info_len == 12u) {
34688
      {
34689
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
34690
        uint32_t t_3;
34691
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34692
          t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34693
          iop_a_src += 2;
34694
        } else {
34695
          self->private_data.s_do_decode_image_config.scratch = 0;
34696
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
34697
          while (true) {
34698
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34699
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34700
              goto suspend;
34701
            }
34702
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34703
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
34704
            *scratch <<= 8;
34705
            *scratch >>= 8;
34706
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
34707
            if (num_bits_3 == 8) {
34708
              t_3 = ((uint32_t)(*scratch));
34709
              break;
34710
            }
34711
            num_bits_3 += 8u;
34712
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
34713
          }
34714
        }
34715
        self->private_impl.f_width = t_3;
34716
      }
34717
      {
34718
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
34719
        uint32_t t_4;
34720
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34721
          t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34722
          iop_a_src += 2;
34723
        } else {
34724
          self->private_data.s_do_decode_image_config.scratch = 0;
34725
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
34726
          while (true) {
34727
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34728
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34729
              goto suspend;
34730
            }
34731
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34732
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
34733
            *scratch <<= 8;
34734
            *scratch >>= 8;
34735
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
34736
            if (num_bits_4 == 8) {
34737
              t_4 = ((uint32_t)(*scratch));
34738
              break;
34739
            }
34740
            num_bits_4 += 8u;
34741
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
34742
          }
34743
        }
34744
        self->private_impl.f_height = t_4;
34745
      }
34746
      {
34747
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
34748
        uint32_t t_5;
34749
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34750
          t_5 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34751
          iop_a_src += 2;
34752
        } else {
34753
          self->private_data.s_do_decode_image_config.scratch = 0;
34754
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
34755
          while (true) {
34756
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34757
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34758
              goto suspend;
34759
            }
34760
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34761
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
34762
            *scratch <<= 8;
34763
            *scratch >>= 8;
34764
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
34765
            if (num_bits_5 == 8) {
34766
              t_5 = ((uint32_t)(*scratch));
34767
              break;
34768
            }
34769
            num_bits_5 += 8u;
34770
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
34771
          }
34772
        }
34773
        v_planes = t_5;
34774
      }
34775
      if (v_planes != 1u) {
34776
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34777
        goto exit;
34778
      }
34779
      {
34780
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
34781
        uint32_t t_6;
34782
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34783
          t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34784
          iop_a_src += 2;
34785
        } else {
34786
          self->private_data.s_do_decode_image_config.scratch = 0;
34787
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
34788
          while (true) {
34789
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34790
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34791
              goto suspend;
34792
            }
34793
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34794
            uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
34795
            *scratch <<= 8;
34796
            *scratch >>= 8;
34797
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
34798
            if (num_bits_6 == 8) {
34799
              t_6 = ((uint32_t)(*scratch));
34800
              break;
34801
            }
34802
            num_bits_6 += 8u;
34803
            *scratch |= ((uint64_t)(num_bits_6)) << 56;
34804
          }
34805
        }
34806
        self->private_impl.f_bits_per_pixel = t_6;
34807
      }
34808
    } else if (self->private_impl.f_bitmap_info_len == 16u) {
34809
      {
34810
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
34811
        uint32_t t_7;
34812
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34813
          t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34814
          iop_a_src += 4;
34815
        } else {
34816
          self->private_data.s_do_decode_image_config.scratch = 0;
34817
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
34818
          while (true) {
34819
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34820
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34821
              goto suspend;
34822
            }
34823
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34824
            uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
34825
            *scratch <<= 8;
34826
            *scratch >>= 8;
34827
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
34828
            if (num_bits_7 == 24) {
34829
              t_7 = ((uint32_t)(*scratch));
34830
              break;
34831
            }
34832
            num_bits_7 += 8u;
34833
            *scratch |= ((uint64_t)(num_bits_7)) << 56;
34834
          }
34835
        }
34836
        v_width = t_7;
34837
      }
34838
      if (v_width > 2147483647u) {
34839
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34840
        goto exit;
34841
      } else if (v_width > 16777215u) {
34842
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34843
        goto exit;
34844
      }
34845
      self->private_impl.f_width = v_width;
34846
      {
34847
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
34848
        uint32_t t_8;
34849
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34850
          t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34851
          iop_a_src += 4;
34852
        } else {
34853
          self->private_data.s_do_decode_image_config.scratch = 0;
34854
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
34855
          while (true) {
34856
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34857
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34858
              goto suspend;
34859
            }
34860
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34861
            uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
34862
            *scratch <<= 8;
34863
            *scratch >>= 8;
34864
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
34865
            if (num_bits_8 == 24) {
34866
              t_8 = ((uint32_t)(*scratch));
34867
              break;
34868
            }
34869
            num_bits_8 += 8u;
34870
            *scratch |= ((uint64_t)(num_bits_8)) << 56;
34871
          }
34872
        }
34873
        v_height = t_8;
34874
      }
34875
      if (v_height > 2147483647u) {
34876
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34877
        goto exit;
34878
      } else if (v_height > 16777215u) {
34879
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34880
        goto exit;
34881
      }
34882
      self->private_impl.f_height = v_height;
34883
      {
34884
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
34885
        uint32_t t_9;
34886
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34887
          t_9 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34888
          iop_a_src += 2;
34889
        } else {
34890
          self->private_data.s_do_decode_image_config.scratch = 0;
34891
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
34892
          while (true) {
34893
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34894
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34895
              goto suspend;
34896
            }
34897
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34898
            uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
34899
            *scratch <<= 8;
34900
            *scratch >>= 8;
34901
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
34902
            if (num_bits_9 == 8) {
34903
              t_9 = ((uint32_t)(*scratch));
34904
              break;
34905
            }
34906
            num_bits_9 += 8u;
34907
            *scratch |= ((uint64_t)(num_bits_9)) << 56;
34908
          }
34909
        }
34910
        v_planes = t_9;
34911
      }
34912
      if (v_planes != 1u) {
34913
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
34914
        goto exit;
34915
      }
34916
      {
34917
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
34918
        uint32_t t_10;
34919
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
34920
          t_10 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
34921
          iop_a_src += 2;
34922
        } else {
34923
          self->private_data.s_do_decode_image_config.scratch = 0;
34924
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
34925
          while (true) {
34926
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34927
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34928
              goto suspend;
34929
            }
34930
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34931
            uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
34932
            *scratch <<= 8;
34933
            *scratch >>= 8;
34934
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
34935
            if (num_bits_10 == 8) {
34936
              t_10 = ((uint32_t)(*scratch));
34937
              break;
34938
            }
34939
            num_bits_10 += 8u;
34940
            *scratch |= ((uint64_t)(num_bits_10)) << 56;
34941
          }
34942
        }
34943
        self->private_impl.f_bits_per_pixel = t_10;
34944
      }
34945
    } else {
34946
      {
34947
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
34948
        uint32_t t_11;
34949
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34950
          t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34951
          iop_a_src += 4;
34952
        } else {
34953
          self->private_data.s_do_decode_image_config.scratch = 0;
34954
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
34955
          while (true) {
34956
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34957
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34958
              goto suspend;
34959
            }
34960
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34961
            uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
34962
            *scratch <<= 8;
34963
            *scratch >>= 8;
34964
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
34965
            if (num_bits_11 == 24) {
34966
              t_11 = ((uint32_t)(*scratch));
34967
              break;
34968
            }
34969
            num_bits_11 += 8u;
34970
            *scratch |= ((uint64_t)(num_bits_11)) << 56;
34971
          }
34972
        }
34973
        v_width = t_11;
34974
      }
34975
      if (v_width > 2147483647u) {
34976
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
34977
        goto exit;
34978
      } else if (v_width > 16777215u) {
34979
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
34980
        goto exit;
34981
      }
34982
      self->private_impl.f_width = v_width;
34983
      {
34984
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
34985
        uint32_t t_12;
34986
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
34987
          t_12 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
34988
          iop_a_src += 4;
34989
        } else {
34990
          self->private_data.s_do_decode_image_config.scratch = 0;
34991
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
34992
          while (true) {
34993
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
34994
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
34995
              goto suspend;
34996
            }
34997
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
34998
            uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
34999
            *scratch <<= 8;
35000
            *scratch >>= 8;
35001
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
35002
            if (num_bits_12 == 24) {
35003
              t_12 = ((uint32_t)(*scratch));
35004
              break;
35005
            }
35006
            num_bits_12 += 8u;
35007
            *scratch |= ((uint64_t)(num_bits_12)) << 56;
35008
          }
35009
        }
35010
        v_height = t_12;
35011
      }
35012
      if (v_height == 2147483648u) {
35013
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35014
        goto exit;
35015
      } else if (v_height > 2147483648u) {
35016
        v_height = ((uint32_t)(0u - v_height));
35017
        if (v_height > 16777215u) {
35018
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35019
          goto exit;
35020
        }
35021
        self->private_impl.f_height = v_height;
35022
        self->private_impl.f_top_down = true;
35023
      } else if (v_height > 16777215u) {
35024
        status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
35025
        goto exit;
35026
      } else {
35027
        self->private_impl.f_height = v_height;
35028
      }
35029
      {
35030
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
35031
        uint32_t t_13;
35032
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35033
          t_13 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35034
          iop_a_src += 2;
35035
        } else {
35036
          self->private_data.s_do_decode_image_config.scratch = 0;
35037
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
35038
          while (true) {
35039
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35040
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35041
              goto suspend;
35042
            }
35043
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35044
            uint32_t num_bits_13 = ((uint32_t)(*scratch >> 56));
35045
            *scratch <<= 8;
35046
            *scratch >>= 8;
35047
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_13;
35048
            if (num_bits_13 == 8) {
35049
              t_13 = ((uint32_t)(*scratch));
35050
              break;
35051
            }
35052
            num_bits_13 += 8u;
35053
            *scratch |= ((uint64_t)(num_bits_13)) << 56;
35054
          }
35055
        }
35056
        v_planes = t_13;
35057
      }
35058
      if (v_planes != 1u) {
35059
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35060
        goto exit;
35061
      }
35062
      {
35063
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
35064
        uint32_t t_14;
35065
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
35066
          t_14 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
35067
          iop_a_src += 2;
35068
        } else {
35069
          self->private_data.s_do_decode_image_config.scratch = 0;
35070
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
35071
          while (true) {
35072
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35073
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35074
              goto suspend;
35075
            }
35076
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35077
            uint32_t num_bits_14 = ((uint32_t)(*scratch >> 56));
35078
            *scratch <<= 8;
35079
            *scratch >>= 8;
35080
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_14;
35081
            if (num_bits_14 == 8) {
35082
              t_14 = ((uint32_t)(*scratch));
35083
              break;
35084
            }
35085
            num_bits_14 += 8u;
35086
            *scratch |= ((uint64_t)(num_bits_14)) << 56;
35087
          }
35088
        }
35089
        self->private_impl.f_bits_per_pixel = t_14;
35090
      }
35091
      {
35092
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
35093
        uint32_t t_15;
35094
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35095
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35096
          iop_a_src += 4;
35097
        } else {
35098
          self->private_data.s_do_decode_image_config.scratch = 0;
35099
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
35100
          while (true) {
35101
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35102
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35103
              goto suspend;
35104
            }
35105
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35106
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
35107
            *scratch <<= 8;
35108
            *scratch >>= 8;
35109
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
35110
            if (num_bits_15 == 24) {
35111
              t_15 = ((uint32_t)(*scratch));
35112
              break;
35113
            }
35114
            num_bits_15 += 8u;
35115
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
35116
          }
35117
        }
35118
        self->private_impl.f_compression = t_15;
35119
      }
35120
      if (self->private_impl.f_bits_per_pixel == 0u) {
35121
        if (self->private_impl.f_compression == 4u) {
35122
          self->private_impl.f_io_redirect_fourcc = 1246774599u;
35123
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
35124
          goto ok;
35125
        } else if (self->private_impl.f_compression == 5u) {
35126
          self->private_impl.f_io_redirect_fourcc = 1347307296u;
35127
          status = wuffs_base__make_status(wuffs_base__note__i_o_redirect);
35128
          goto ok;
35129
        }
35130
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35131
        goto exit;
35132
      }
35133
      self->private_data.s_do_decode_image_config.scratch = 20u;
35134
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(34);
35135
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35136
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35137
        iop_a_src = io2_a_src;
35138
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35139
        goto suspend;
35140
      }
35141
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
35142
      if (self->private_impl.f_bitmap_info_len == 40u) {
35143
        if (self->private_impl.f_bits_per_pixel >= 16u) {
35144
          if (self->private_impl.f_padding >= 16u) {
35145
            self->private_impl.f_bitmap_info_len = 56u;
35146
            self->private_impl.f_padding -= 16u;
35147
          } else if (self->private_impl.f_padding >= 12u) {
35148
            self->private_impl.f_bitmap_info_len = 52u;
35149
            self->private_impl.f_padding -= 12u;
35150
          }
35151
        }
35152
      } else if ((self->private_impl.f_bitmap_info_len != 52u) &&
35153
          (self->private_impl.f_bitmap_info_len != 56u) &&
35154
          (self->private_impl.f_bitmap_info_len != 64u) &&
35155
          (self->private_impl.f_bitmap_info_len != 108u) &&
35156
          (self->private_impl.f_bitmap_info_len != 124u)) {
35157
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35158
        goto exit;
35159
      }
35160
      if (self->private_impl.f_compression == 6u) {
35161
        self->private_impl.f_compression = 3u;
35162
      }
35163
      if (self->private_impl.f_compression == 3u) {
35164
        if (self->private_impl.f_bitmap_info_len >= 52u) {
35165
          {
35166
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(35);
35167
            uint32_t t_16;
35168
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35169
              t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35170
              iop_a_src += 4;
35171
            } else {
35172
              self->private_data.s_do_decode_image_config.scratch = 0;
35173
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(36);
35174
              while (true) {
35175
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35176
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35177
                  goto suspend;
35178
                }
35179
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35180
                uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
35181
                *scratch <<= 8;
35182
                *scratch >>= 8;
35183
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
35184
                if (num_bits_16 == 24) {
35185
                  t_16 = ((uint32_t)(*scratch));
35186
                  break;
35187
                }
35188
                num_bits_16 += 8u;
35189
                *scratch |= ((uint64_t)(num_bits_16)) << 56;
35190
              }
35191
            }
35192
            self->private_impl.f_channel_masks[2u] = t_16;
35193
          }
35194
          {
35195
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(37);
35196
            uint32_t t_17;
35197
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35198
              t_17 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35199
              iop_a_src += 4;
35200
            } else {
35201
              self->private_data.s_do_decode_image_config.scratch = 0;
35202
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(38);
35203
              while (true) {
35204
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35205
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35206
                  goto suspend;
35207
                }
35208
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35209
                uint32_t num_bits_17 = ((uint32_t)(*scratch >> 56));
35210
                *scratch <<= 8;
35211
                *scratch >>= 8;
35212
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_17;
35213
                if (num_bits_17 == 24) {
35214
                  t_17 = ((uint32_t)(*scratch));
35215
                  break;
35216
                }
35217
                num_bits_17 += 8u;
35218
                *scratch |= ((uint64_t)(num_bits_17)) << 56;
35219
              }
35220
            }
35221
            self->private_impl.f_channel_masks[1u] = t_17;
35222
          }
35223
          {
35224
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(39);
35225
            uint32_t t_18;
35226
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35227
              t_18 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35228
              iop_a_src += 4;
35229
            } else {
35230
              self->private_data.s_do_decode_image_config.scratch = 0;
35231
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(40);
35232
              while (true) {
35233
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35234
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35235
                  goto suspend;
35236
                }
35237
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35238
                uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
35239
                *scratch <<= 8;
35240
                *scratch >>= 8;
35241
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
35242
                if (num_bits_18 == 24) {
35243
                  t_18 = ((uint32_t)(*scratch));
35244
                  break;
35245
                }
35246
                num_bits_18 += 8u;
35247
                *scratch |= ((uint64_t)(num_bits_18)) << 56;
35248
              }
35249
            }
35250
            self->private_impl.f_channel_masks[0u] = t_18;
35251
          }
35252
          if (self->private_impl.f_bitmap_info_len >= 56u) {
35253
            {
35254
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(41);
35255
              uint32_t t_19;
35256
              if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
35257
                t_19 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
35258
                iop_a_src += 4;
35259
              } else {
35260
                self->private_data.s_do_decode_image_config.scratch = 0;
35261
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(42);
35262
                while (true) {
35263
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
35264
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35265
                    goto suspend;
35266
                  }
35267
                  uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
35268
                  uint32_t num_bits_19 = ((uint32_t)(*scratch >> 56));
35269
                  *scratch <<= 8;
35270
                  *scratch >>= 8;
35271
                  *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_19;
35272
                  if (num_bits_19 == 24) {
35273
                    t_19 = ((uint32_t)(*scratch));
35274
                    break;
35275
                  }
35276
                  num_bits_19 += 8u;
35277
                  *scratch |= ((uint64_t)(num_bits_19)) << 56;
35278
                }
35279
              }
35280
              self->private_impl.f_channel_masks[3u] = t_19;
35281
            }
35282
            self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_bitmap_info_len - 56u));
35283
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(43);
35284
            if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35285
              self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35286
              iop_a_src = io2_a_src;
35287
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35288
              goto suspend;
35289
            }
35290
            iop_a_src += self->private_data.s_do_decode_image_config.scratch;
35291
          }
35292
          if ((self->private_impl.f_channel_masks[0u] == 255u) && (self->private_impl.f_channel_masks[1u] == 65280u) && (self->private_impl.f_channel_masks[2u] == 16711680u)) {
35293
            if (self->private_impl.f_bits_per_pixel == 24u) {
35294
              self->private_impl.f_compression = 0u;
35295
            } else if (self->private_impl.f_bits_per_pixel == 32u) {
35296
              if ((self->private_impl.f_channel_masks[3u] == 0u) || (self->private_impl.f_channel_masks[3u] == 4278190080u)) {
35297
                self->private_impl.f_compression = 0u;
35298
              }
35299
            }
35300
          }
35301
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(44);
35302
          status = wuffs_bmp__decoder__process_masks(self);
35303
          if (status.repr) {
35304
            goto suspend;
35305
          }
35306
        }
35307
      } else if (self->private_impl.f_bitmap_info_len >= 40u) {
35308
        v_n = (self->private_impl.f_bitmap_info_len - 40u);
35309
        self->private_data.s_do_decode_image_config.scratch = v_n;
35310
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(45);
35311
        if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35312
          self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35313
          iop_a_src = io2_a_src;
35314
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35315
          goto suspend;
35316
        }
35317
        iop_a_src += self->private_data.s_do_decode_image_config.scratch;
35318
      } else {
35319
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35320
        goto exit;
35321
      }
35322
    }
35323
    if (self->private_impl.f_compression != 3u) {
35324
      if (self->private_impl.f_bits_per_pixel < 16u) {
35325
        if (a_src) {
35326
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35327
        }
35328
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(46);
35329
        status = wuffs_bmp__decoder__read_palette(self, a_src);
35330
        if (a_src) {
35331
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
35332
        }
35333
        if (status.repr) {
35334
          goto suspend;
35335
        }
35336
      }
35337
    }
35338
    if (self->private_impl.f_compression == 0u) {
35339
      if ((self->private_impl.f_bits_per_pixel == 1u) || (self->private_impl.f_bits_per_pixel == 2u) || (self->private_impl.f_bits_per_pixel == 4u)) {
35340
        self->private_impl.f_src_pixfmt = 2198077448u;
35341
        self->private_impl.f_compression = 256u;
35342
      } else if (self->private_impl.f_bits_per_pixel == 8u) {
35343
        self->private_impl.f_src_pixfmt = 2198077448u;
35344
      } else if (self->private_impl.f_bits_per_pixel == 16u) {
35345
        self->private_impl.f_compression = 3u;
35346
        self->private_impl.f_channel_masks[0u] = 31u;
35347
        self->private_impl.f_channel_masks[1u] = 992u;
35348
        self->private_impl.f_channel_masks[2u] = 31744u;
35349
        self->private_impl.f_channel_masks[3u] = 0u;
35350
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(47);
35351
        status = wuffs_bmp__decoder__process_masks(self);
35352
        if (status.repr) {
35353
          goto suspend;
35354
        }
35355
        self->private_impl.f_src_pixfmt = 2164308923u;
35356
      } else if (self->private_impl.f_bits_per_pixel == 24u) {
35357
        self->private_impl.f_src_pixfmt = 2147485832u;
35358
      } else if (self->private_impl.f_bits_per_pixel == 32u) {
35359
        if (self->private_impl.f_channel_masks[3u] == 0u) {
35360
          self->private_impl.f_src_pixfmt = 2415954056u;
35361
        } else {
35362
          self->private_impl.f_src_pixfmt = 2164295816u;
35363
        }
35364
      } else {
35365
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35366
        goto exit;
35367
      }
35368
    } else if (self->private_impl.f_compression == 1u) {
35369
      if (self->private_impl.f_bits_per_pixel == 8u) {
35370
        self->private_impl.f_src_pixfmt = 2198077448u;
35371
      } else {
35372
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35373
        goto exit;
35374
      }
35375
    } else if (self->private_impl.f_compression == 2u) {
35376
      if (self->private_impl.f_bits_per_pixel == 4u) {
35377
        self->private_impl.f_src_pixfmt = 2198077448u;
35378
      } else {
35379
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35380
        goto exit;
35381
      }
35382
    } else if (self->private_impl.f_compression == 3u) {
35383
      if ((self->private_impl.f_bits_per_pixel == 16u) || (self->private_impl.f_bits_per_pixel == 32u)) {
35384
        self->private_impl.f_src_pixfmt = 2164308923u;
35385
      } else {
35386
        status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35387
        goto exit;
35388
      }
35389
    } else {
35390
      status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35391
      goto exit;
35392
    }
35393
    if (((self->private_impl.f_bitmap_info_len < 40u) || (self->private_impl.f_bitmap_info_len == 64u)) &&
35394
        (self->private_impl.f_bits_per_pixel != 1u) &&
35395
        (self->private_impl.f_bits_per_pixel != 4u) &&
35396
        (self->private_impl.f_bits_per_pixel != 8u) &&
35397
        (self->private_impl.f_bits_per_pixel != 24u)) {
35398
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
35399
      goto exit;
35400
    }
35401
    if (self->private_impl.f_bits_per_pixel == 1u) {
35402
      v_byte_width = ((self->private_impl.f_width >> 3u) + (((self->private_impl.f_width & 7u) + 7u) >> 3u));
35403
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
35404
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
35405
      v_byte_width = ((self->private_impl.f_width >> 2u) + (((self->private_impl.f_width & 3u) + 3u) >> 2u));
35406
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
35407
    } else if (self->private_impl.f_bits_per_pixel == 4u) {
35408
      v_byte_width = ((self->private_impl.f_width >> 1u) + (self->private_impl.f_width & 1u));
35409
      self->private_impl.f_pad_per_row = ((4u - (v_byte_width & 3u)) & 3u);
35410
    } else if (self->private_impl.f_bits_per_pixel == 8u) {
35411
      self->private_impl.f_pad_per_row = ((4u - (self->private_impl.f_width & 3u)) & 3u);
35412
    } else if (self->private_impl.f_bits_per_pixel == 16u) {
35413
      self->private_impl.f_pad_per_row = ((self->private_impl.f_width & 1u) * 2u);
35414
    } else if (self->private_impl.f_bits_per_pixel == 24u) {
35415
      self->private_impl.f_pad_per_row = (self->private_impl.f_width & 3u);
35416
    } else if (self->private_impl.f_bits_per_pixel == 32u) {
35417
      self->private_impl.f_pad_per_row = 0u;
35418
    }
35419
    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)));
35420
    if (a_dst != NULL) {
35421
      v_dst_pixfmt = 2164295816u;
35422
      if ((self->private_impl.f_channel_num_bits[0u] > 8u) ||
35423
          (self->private_impl.f_channel_num_bits[1u] > 8u) ||
35424
          (self->private_impl.f_channel_num_bits[2u] > 8u) ||
35425
          (self->private_impl.f_channel_num_bits[3u] > 8u)) {
35426
        v_dst_pixfmt = 2164308923u;
35427
      } 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))) {
35428
        v_dst_pixfmt = 2415954056u;
35429
      }
35430
      wuffs_base__image_config__set(
35431
          a_dst,
35432
          v_dst_pixfmt,
35433
          0u,
35434
          self->private_impl.f_width,
35435
          self->private_impl.f_height,
35436
          self->private_impl.f_frame_config_io_position,
35437
          (self->private_impl.f_channel_masks[3u] == 0u));
35438
    }
35439
    self->private_impl.f_call_sequence = 32u;
35440
35441
    ok:
35442
    self->private_impl.p_do_decode_image_config = 0;
35443
    goto exit;
35444
  }
35445
35446
  goto suspend;
35447
  suspend:
35448
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35449
35450
  goto exit;
35451
  exit:
35452
  if (a_src && a_src->data.ptr) {
35453
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35454
  }
35455
35456
  return status;
35457
}
35458
35459
// -------- func bmp.decoder.decode_frame_config
35460
35461
WUFFS_BASE__GENERATED_C_CODE
35462
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35463
wuffs_bmp__decoder__decode_frame_config(
35464
    wuffs_bmp__decoder* self,
35465
    wuffs_base__frame_config* a_dst,
35466
    wuffs_base__io_buffer* a_src) {
35467
  if (!self) {
35468
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35469
  }
35470
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35471
    return wuffs_base__make_status(
35472
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35473
        ? wuffs_base__error__disabled_by_previous_error
35474
        : wuffs_base__error__initialize_not_called);
35475
  }
35476
  if (!a_src) {
35477
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35478
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
35479
  }
35480
  if ((self->private_impl.active_coroutine != 0) &&
35481
      (self->private_impl.active_coroutine != 2)) {
35482
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35483
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
35484
  }
35485
  self->private_impl.active_coroutine = 0;
35486
  wuffs_base__status status = wuffs_base__make_status(NULL);
35487
35488
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
35489
35490
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
35491
  switch (coro_susp_point) {
35492
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35493
35494
    while (true) {
35495
      {
35496
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame_config(self, a_dst, a_src);
35497
        v_status = t_0;
35498
      }
35499
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
35500
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
35501
        goto exit;
35502
      }
35503
      status = v_status;
35504
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
35505
    }
35506
35507
    ok:
35508
    self->private_impl.p_decode_frame_config = 0;
35509
    goto exit;
35510
  }
35511
35512
  goto suspend;
35513
  suspend:
35514
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35515
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
35516
35517
  goto exit;
35518
  exit:
35519
  if (wuffs_base__status__is_error(&status)) {
35520
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35521
  }
35522
  return status;
35523
}
35524
35525
// -------- func bmp.decoder.do_decode_frame_config
35526
35527
WUFFS_BASE__GENERATED_C_CODE
35528
static wuffs_base__status
35529
wuffs_bmp__decoder__do_decode_frame_config(
35530
    wuffs_bmp__decoder* self,
35531
    wuffs_base__frame_config* a_dst,
35532
    wuffs_base__io_buffer* a_src) {
35533
  wuffs_base__status status = wuffs_base__make_status(NULL);
35534
35535
  wuffs_base__pixel_format v_pixfmt = {0};
35536
35537
  const uint8_t* iop_a_src = NULL;
35538
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35539
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35540
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35541
  if (a_src && a_src->data.ptr) {
35542
    io0_a_src = a_src->data.ptr;
35543
    io1_a_src = io0_a_src + a_src->meta.ri;
35544
    iop_a_src = io1_a_src;
35545
    io2_a_src = io0_a_src + a_src->meta.wi;
35546
  }
35547
35548
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
35549
  switch (coro_susp_point) {
35550
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35551
35552
    if (self->private_impl.f_call_sequence == 32u) {
35553
    } else if (self->private_impl.f_call_sequence < 32u) {
35554
      if (a_src) {
35555
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35556
      }
35557
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
35558
      status = wuffs_bmp__decoder__do_decode_image_config(self, NULL, a_src);
35559
      if (a_src) {
35560
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
35561
      }
35562
      if (status.repr) {
35563
        goto suspend;
35564
      }
35565
    } else if (self->private_impl.f_call_sequence == 40u) {
35566
      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)))) {
35567
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
35568
        goto exit;
35569
      }
35570
    } else if (self->private_impl.f_call_sequence == 64u) {
35571
      self->private_impl.f_call_sequence = 96u;
35572
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
35573
      goto ok;
35574
    } else {
35575
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
35576
      goto ok;
35577
    }
35578
    if (a_dst != NULL) {
35579
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
35580
      wuffs_base__frame_config__set(
35581
          a_dst,
35582
          wuffs_base__utility__make_rect_ie_u32(
35583
          0u,
35584
          0u,
35585
          self->private_impl.f_width,
35586
          self->private_impl.f_height),
35587
          ((wuffs_base__flicks)(0u)),
35588
          0u,
35589
          self->private_impl.f_frame_config_io_position,
35590
          0u,
35591
          true,
35592
          false,
35593
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
35594
    }
35595
    self->private_impl.f_call_sequence = 64u;
35596
35597
    ok:
35598
    self->private_impl.p_do_decode_frame_config = 0;
35599
    goto exit;
35600
  }
35601
35602
  goto suspend;
35603
  suspend:
35604
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35605
35606
  goto exit;
35607
  exit:
35608
  if (a_src && a_src->data.ptr) {
35609
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35610
  }
35611
35612
  return status;
35613
}
35614
35615
// -------- func bmp.decoder.decode_frame
35616
35617
WUFFS_BASE__GENERATED_C_CODE
35618
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
35619
wuffs_bmp__decoder__decode_frame(
35620
    wuffs_bmp__decoder* self,
35621
    wuffs_base__pixel_buffer* a_dst,
35622
    wuffs_base__io_buffer* a_src,
35623
    wuffs_base__pixel_blend a_blend,
35624
    wuffs_base__slice_u8 a_workbuf,
35625
    wuffs_base__decode_frame_options* a_opts) {
35626
  if (!self) {
35627
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
35628
  }
35629
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
35630
    return wuffs_base__make_status(
35631
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
35632
        ? wuffs_base__error__disabled_by_previous_error
35633
        : wuffs_base__error__initialize_not_called);
35634
  }
35635
  if (!a_dst || !a_src) {
35636
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35637
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
35638
  }
35639
  if ((self->private_impl.active_coroutine != 0) &&
35640
      (self->private_impl.active_coroutine != 3)) {
35641
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35642
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
35643
  }
35644
  self->private_impl.active_coroutine = 0;
35645
  wuffs_base__status status = wuffs_base__make_status(NULL);
35646
35647
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
35648
35649
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
35650
  switch (coro_susp_point) {
35651
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35652
35653
    while (true) {
35654
      {
35655
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_decode_frame(self,
35656
            a_dst,
35657
            a_src,
35658
            a_blend,
35659
            a_workbuf,
35660
            a_opts);
35661
        v_status = t_0;
35662
      }
35663
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
35664
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
35665
        goto exit;
35666
      }
35667
      status = v_status;
35668
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
35669
    }
35670
35671
    ok:
35672
    self->private_impl.p_decode_frame = 0;
35673
    goto exit;
35674
  }
35675
35676
  goto suspend;
35677
  suspend:
35678
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35679
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
35680
35681
  goto exit;
35682
  exit:
35683
  if (wuffs_base__status__is_error(&status)) {
35684
    self->private_impl.magic = WUFFS_BASE__DISABLED;
35685
  }
35686
  return status;
35687
}
35688
35689
// -------- func bmp.decoder.do_decode_frame
35690
35691
WUFFS_BASE__GENERATED_C_CODE
35692
static wuffs_base__status
35693
wuffs_bmp__decoder__do_decode_frame(
35694
    wuffs_bmp__decoder* self,
35695
    wuffs_base__pixel_buffer* a_dst,
35696
    wuffs_base__io_buffer* a_src,
35697
    wuffs_base__pixel_blend a_blend,
35698
    wuffs_base__slice_u8 a_workbuf,
35699
    wuffs_base__decode_frame_options* a_opts) {
35700
  wuffs_base__status status = wuffs_base__make_status(NULL);
35701
35702
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
35703
35704
  const uint8_t* iop_a_src = NULL;
35705
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35706
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35707
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35708
  if (a_src && a_src->data.ptr) {
35709
    io0_a_src = a_src->data.ptr;
35710
    io1_a_src = io0_a_src + a_src->meta.ri;
35711
    iop_a_src = io1_a_src;
35712
    io2_a_src = io0_a_src + a_src->meta.wi;
35713
  }
35714
35715
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
35716
  switch (coro_susp_point) {
35717
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
35718
35719
    if (self->private_impl.f_call_sequence == 64u) {
35720
    } else if (self->private_impl.f_call_sequence < 64u) {
35721
      if (a_src) {
35722
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35723
      }
35724
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
35725
      status = wuffs_bmp__decoder__do_decode_frame_config(self, NULL, a_src);
35726
      if (a_src) {
35727
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
35728
      }
35729
      if (status.repr) {
35730
        goto suspend;
35731
      }
35732
    } else {
35733
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
35734
      goto ok;
35735
    }
35736
    self->private_data.s_do_decode_frame.scratch = self->private_impl.f_padding;
35737
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
35738
    if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35739
      self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35740
      iop_a_src = io2_a_src;
35741
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35742
      goto suspend;
35743
    }
35744
    iop_a_src += self->private_data.s_do_decode_frame.scratch;
35745
    if ((self->private_impl.f_width > 0u) && (self->private_impl.f_height > 0u)) {
35746
      self->private_impl.f_dst_x = 0u;
35747
      if (self->private_impl.f_top_down) {
35748
        self->private_impl.f_dst_y = 0u;
35749
        self->private_impl.f_dst_y_inc = 1u;
35750
      } else {
35751
        self->private_impl.f_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
35752
        self->private_impl.f_dst_y_inc = 4294967295u;
35753
      }
35754
      v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
35755
          wuffs_base__pixel_buffer__pixel_format(a_dst),
35756
          wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048)),
35757
          wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
35758
          wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
35759
          a_blend);
35760
      if ( ! wuffs_base__status__is_ok(&v_status)) {
35761
        status = v_status;
35762
        if (wuffs_base__status__is_error(&status)) {
35763
          goto exit;
35764
        } else if (wuffs_base__status__is_suspension(&status)) {
35765
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
35766
          goto exit;
35767
        }
35768
        goto ok;
35769
      }
35770
      while (true) {
35771
        if (self->private_impl.f_compression == 0u) {
35772
          if (a_src) {
35773
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35774
          }
35775
          v_status = wuffs_bmp__decoder__swizzle_none(self, a_dst, a_src);
35776
          if (a_src) {
35777
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
35778
          }
35779
        } else if (self->private_impl.f_compression < 3u) {
35780
          if (a_src) {
35781
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35782
          }
35783
          v_status = wuffs_bmp__decoder__swizzle_rle(self, a_dst, a_src);
35784
          if (a_src) {
35785
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
35786
          }
35787
        } else if (self->private_impl.f_compression == 3u) {
35788
          if (a_src) {
35789
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35790
          }
35791
          v_status = wuffs_bmp__decoder__swizzle_bitfields(self, a_dst, a_src);
35792
          if (a_src) {
35793
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
35794
          }
35795
        } else {
35796
          if (a_src) {
35797
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35798
          }
35799
          v_status = wuffs_bmp__decoder__swizzle_low_bit_depth(self, a_dst, a_src);
35800
          if (a_src) {
35801
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
35802
          }
35803
        }
35804
        if (wuffs_base__status__is_ok(&v_status)) {
35805
          break;
35806
        } else if (v_status.repr != wuffs_bmp__note__internal_note_short_read) {
35807
          status = v_status;
35808
          if (wuffs_base__status__is_error(&status)) {
35809
            goto exit;
35810
          } else if (wuffs_base__status__is_suspension(&status)) {
35811
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
35812
            goto exit;
35813
          }
35814
          goto ok;
35815
        }
35816
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35817
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
35818
      }
35819
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_pending_pad;
35820
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
35821
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
35822
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
35823
        iop_a_src = io2_a_src;
35824
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
35825
        goto suspend;
35826
      }
35827
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
35828
      self->private_impl.f_pending_pad = 0u;
35829
    }
35830
    self->private_impl.f_call_sequence = 96u;
35831
35832
    ok:
35833
    self->private_impl.p_do_decode_frame = 0;
35834
    goto exit;
35835
  }
35836
35837
  goto suspend;
35838
  suspend:
35839
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
35840
35841
  goto exit;
35842
  exit:
35843
  if (a_src && a_src->data.ptr) {
35844
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35845
  }
35846
35847
  return status;
35848
}
35849
35850
// -------- func bmp.decoder.swizzle_none
35851
35852
WUFFS_BASE__GENERATED_C_CODE
35853
static wuffs_base__status
35854
wuffs_bmp__decoder__swizzle_none(
35855
    wuffs_bmp__decoder* self,
35856
    wuffs_base__pixel_buffer* a_dst,
35857
    wuffs_base__io_buffer* a_src) {
35858
  wuffs_base__status status = wuffs_base__make_status(NULL);
35859
35860
  wuffs_base__pixel_format v_dst_pixfmt = {0};
35861
  uint32_t v_dst_bits_per_pixel = 0;
35862
  uint32_t v_dst_bytes_per_pixel = 0;
35863
  uint64_t v_dst_bytes_per_row = 0;
35864
  uint32_t v_src_bytes_per_pixel = 0;
35865
  wuffs_base__slice_u8 v_dst_palette = {0};
35866
  wuffs_base__table_u8 v_tab = {0};
35867
  wuffs_base__slice_u8 v_dst = {0};
35868
  uint64_t v_i = 0;
35869
  uint64_t v_j = 0;
35870
  uint64_t v_n = 0;
35871
35872
  const uint8_t* iop_a_src = NULL;
35873
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35874
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35875
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
35876
  if (a_src && a_src->data.ptr) {
35877
    io0_a_src = a_src->data.ptr;
35878
    io1_a_src = io0_a_src + a_src->meta.ri;
35879
    iop_a_src = io1_a_src;
35880
    io2_a_src = io0_a_src + a_src->meta.wi;
35881
  }
35882
35883
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
35884
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
35885
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
35886
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
35887
    goto exit;
35888
  }
35889
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
35890
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
35891
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048));
35892
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
35893
  label__outer__continue:;
35894
  while (true) {
35895
    while (self->private_impl.f_pending_pad > 0u) {
35896
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
35897
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35898
        goto ok;
35899
      }
35900
      self->private_impl.f_pending_pad -= 1u;
35901
      iop_a_src += 1u;
35902
    }
35903
    while (true) {
35904
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
35905
        self->private_impl.f_dst_x = 0u;
35906
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
35907
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
35908
          if (self->private_impl.f_height > 0u) {
35909
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35910
          }
35911
          goto label__outer__break;
35912
        } else if (self->private_impl.f_pad_per_row != 0u) {
35913
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
35914
          goto label__outer__continue;
35915
        }
35916
      }
35917
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
35918
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
35919
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
35920
      }
35921
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
35922
      if (v_i >= ((uint64_t)(v_dst.len))) {
35923
        if (self->private_impl.f_bits_per_pixel > 32u) {
35924
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35925
          goto exit;
35926
        }
35927
        v_src_bytes_per_pixel = (self->private_impl.f_bits_per_pixel / 8u);
35928
        if (v_src_bytes_per_pixel == 0u) {
35929
          status = wuffs_base__make_status(wuffs_bmp__error__unsupported_bmp_file);
35930
          goto exit;
35931
        }
35932
        v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
35933
        v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
35934
        v_j = v_n;
35935
        while (v_j >= 8u) {
35936
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
35937
            iop_a_src += (v_src_bytes_per_pixel * 8u);
35938
          }
35939
          v_j -= 8u;
35940
        }
35941
        while (v_j > 0u) {
35942
          if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
35943
            iop_a_src += (v_src_bytes_per_pixel * 1u);
35944
          }
35945
          v_j -= 1u;
35946
        }
35947
      } else {
35948
        v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
35949
            &self->private_impl.f_swizzler,
35950
            wuffs_base__slice_u8__subslice_i(v_dst, v_i),
35951
            v_dst_palette,
35952
            &iop_a_src,
35953
            io2_a_src);
35954
      }
35955
      if (v_n == 0u) {
35956
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
35957
        goto ok;
35958
      }
35959
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
35960
    }
35961
  }
35962
  label__outer__break:;
35963
  status = wuffs_base__make_status(NULL);
35964
  goto ok;
35965
35966
  ok:
35967
  goto exit;
35968
  exit:
35969
  if (a_src && a_src->data.ptr) {
35970
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
35971
  }
35972
35973
  return status;
35974
}
35975
35976
// -------- func bmp.decoder.swizzle_rle
35977
35978
WUFFS_BASE__GENERATED_C_CODE
35979
static wuffs_base__status
35980
wuffs_bmp__decoder__swizzle_rle(
35981
    wuffs_bmp__decoder* self,
35982
    wuffs_base__pixel_buffer* a_dst,
35983
    wuffs_base__io_buffer* a_src) {
35984
  wuffs_base__status status = wuffs_base__make_status(NULL);
35985
35986
  wuffs_base__pixel_format v_dst_pixfmt = {0};
35987
  uint32_t v_dst_bits_per_pixel = 0;
35988
  uint32_t v_dst_bytes_per_pixel = 0;
35989
  uint64_t v_dst_bytes_per_row = 0;
35990
  wuffs_base__slice_u8 v_dst_palette = {0};
35991
  wuffs_base__table_u8 v_tab = {0};
35992
  wuffs_base__slice_u8 v_row = {0};
35993
  wuffs_base__slice_u8 v_dst = {0};
35994
  uint64_t v_i = 0;
35995
  uint64_t v_n = 0;
35996
  uint32_t v_p0 = 0;
35997
  uint8_t v_code = 0;
35998
  uint8_t v_indexes[2] = {0};
35999
  uint32_t v_rle_state = 0;
36000
  uint32_t v_chunk_bits = 0;
36001
  uint32_t v_chunk_count = 0;
36002
36003
  const uint8_t* iop_a_src = NULL;
36004
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36005
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36006
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36007
  if (a_src && a_src->data.ptr) {
36008
    io0_a_src = a_src->data.ptr;
36009
    io1_a_src = io0_a_src + a_src->meta.ri;
36010
    iop_a_src = io1_a_src;
36011
    io2_a_src = io0_a_src + a_src->meta.wi;
36012
  }
36013
36014
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
36015
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
36016
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
36017
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
36018
    goto exit;
36019
  }
36020
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
36021
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
36022
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048));
36023
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
36024
  v_rle_state = self->private_impl.f_rle_state;
36025
  label__outer__continue:;
36026
  while (true) {
36027
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36028
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
36029
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
36030
    }
36031
    label__middle__continue:;
36032
    while (true) {
36033
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
36034
      if (v_i <= ((uint64_t)(v_row.len))) {
36035
        v_dst = wuffs_base__slice_u8__subslice_i(v_row, v_i);
36036
      } else {
36037
        v_dst = wuffs_base__utility__empty_slice_u8();
36038
      }
36039
      while (true) {
36040
        if (v_rle_state == 0u) {
36041
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36042
            break;
36043
          }
36044
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36045
          iop_a_src += 1u;
36046
          if (v_code == 0u) {
36047
            v_rle_state = 2u;
36048
            continue;
36049
          }
36050
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
36051
          v_rle_state = 1u;
36052
          continue;
36053
        } else if (v_rle_state == 1u) {
36054
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36055
            break;
36056
          }
36057
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36058
          iop_a_src += 1u;
36059
          if (self->private_impl.f_bits_per_pixel == 8u) {
36060
            v_p0 = 0u;
36061
            while (v_p0 < self->private_impl.f_rle_length) {
36062
              self->private_data.f_scratch[v_p0] = v_code;
36063
              v_p0 += 1u;
36064
            }
36065
          } else {
36066
            v_indexes[0u] = ((uint8_t)(((uint8_t)(v_code >> 4u))));
36067
            v_indexes[1u] = ((uint8_t)(v_code & 15u));
36068
            v_p0 = 0u;
36069
            while (v_p0 < self->private_impl.f_rle_length) {
36070
              self->private_data.f_scratch[(v_p0 + 0u)] = v_indexes[0u];
36071
              self->private_data.f_scratch[(v_p0 + 1u)] = v_indexes[1u];
36072
              v_p0 += 2u;
36073
            }
36074
          }
36075
          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));
36076
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, self->private_impl.f_rle_length);
36077
          v_rle_state = 0u;
36078
          goto label__middle__continue;
36079
        } else if (v_rle_state == 2u) {
36080
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36081
            break;
36082
          }
36083
          v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36084
          iop_a_src += 1u;
36085
          if (v_code < 2u) {
36086
            if ((self->private_impl.f_dst_y >= self->private_impl.f_height) && (v_code == 0u)) {
36087
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
36088
              goto exit;
36089
            }
36090
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_dst, v_dst_palette, 18446744073709551615u);
36091
            self->private_impl.f_dst_x = 0u;
36092
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36093
            if (v_code > 0u) {
36094
              goto label__outer__break;
36095
            }
36096
            v_rle_state = 0u;
36097
            goto label__outer__continue;
36098
          } else if (v_code == 2u) {
36099
            v_rle_state = 4u;
36100
            continue;
36101
          }
36102
          self->private_impl.f_rle_length = ((uint32_t)(v_code));
36103
          self->private_impl.f_rle_padded = ((self->private_impl.f_bits_per_pixel == 8u) && (((uint8_t)(v_code & 1u)) != 0u));
36104
          v_rle_state = 3u;
36105
          continue;
36106
        } else if (v_rle_state == 3u) {
36107
          if (self->private_impl.f_bits_per_pixel == 8u) {
36108
            v_n = wuffs_base__pixel_swizzler__limited_swizzle_u32_interleaved_from_reader(
36109
                &self->private_impl.f_swizzler,
36110
                self->private_impl.f_rle_length,
36111
                v_dst,
36112
                v_dst_palette,
36113
                &iop_a_src,
36114
                io2_a_src);
36115
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
36116
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, ((uint32_t)(v_n)));
36117
          } else {
36118
            v_chunk_count = ((self->private_impl.f_rle_length + 3u) / 4u);
36119
            v_p0 = 0u;
36120
            while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 2u)) {
36121
              v_chunk_bits = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
36122
              iop_a_src += 2u;
36123
              self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
36124
              self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
36125
              self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
36126
              self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
36127
              v_p0 = ((v_p0 & 255u) + 4u);
36128
              v_chunk_count -= 1u;
36129
            }
36130
            v_p0 = wuffs_base__u32__min(v_p0, self->private_impl.f_rle_length);
36131
            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));
36132
            wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, v_p0);
36133
            wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_rle_length, v_p0);
36134
          }
36135
          if (self->private_impl.f_rle_length > 0u) {
36136
            break;
36137
          }
36138
          if (self->private_impl.f_rle_padded) {
36139
            if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36140
              break;
36141
            }
36142
            iop_a_src += 1u;
36143
            self->private_impl.f_rle_padded = false;
36144
          }
36145
          v_rle_state = 0u;
36146
          goto label__middle__continue;
36147
        } else if (v_rle_state == 4u) {
36148
          if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36149
            break;
36150
          }
36151
          self->private_impl.f_rle_delta_x = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36152
          iop_a_src += 1u;
36153
          v_rle_state = 5u;
36154
          continue;
36155
        }
36156
        if (((uint64_t)(io2_a_src - iop_a_src)) < 1u) {
36157
          break;
36158
        }
36159
        v_code = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
36160
        iop_a_src += 1u;
36161
        if (self->private_impl.f_rle_delta_x > 0u) {
36162
          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)));
36163
          wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(self->private_impl.f_rle_delta_x)));
36164
          self->private_impl.f_rle_delta_x = 0u;
36165
          if (self->private_impl.f_dst_x > self->private_impl.f_width) {
36166
            status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
36167
            goto exit;
36168
          }
36169
        }
36170
        if (v_code > 0u) {
36171
#if defined(__GNUC__)
36172
#pragma GCC diagnostic push
36173
#pragma GCC diagnostic ignored "-Wconversion"
36174
#endif
36175
          v_code -= 1u;
36176
#if defined(__GNUC__)
36177
#pragma GCC diagnostic pop
36178
#endif
36179
          while (true) {
36180
            self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36181
            if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
36182
              status = wuffs_base__make_status(wuffs_bmp__error__bad_rle_compression);
36183
              goto exit;
36184
            }
36185
            v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36186
            if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
36187
              v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
36188
            }
36189
            if (v_code <= 0u) {
36190
              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)));
36191
              break;
36192
            }
36193
            wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
36194
#if defined(__GNUC__)
36195
#pragma GCC diagnostic push
36196
#pragma GCC diagnostic ignored "-Wconversion"
36197
#endif
36198
            v_code -= 1u;
36199
#if defined(__GNUC__)
36200
#pragma GCC diagnostic pop
36201
#endif
36202
          }
36203
        }
36204
        v_rle_state = 0u;
36205
        goto label__middle__continue;
36206
      }
36207
      self->private_impl.f_rle_state = v_rle_state;
36208
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36209
      goto ok;
36210
    }
36211
  }
36212
  label__outer__break:;
36213
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
36214
    v_row = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36215
    if (v_dst_bytes_per_row < ((uint64_t)(v_row.len))) {
36216
      v_row = wuffs_base__slice_u8__subslice_j(v_row, v_dst_bytes_per_row);
36217
    }
36218
    wuffs_base__pixel_swizzler__swizzle_interleaved_transparent_black(&self->private_impl.f_swizzler, v_row, v_dst_palette, 18446744073709551615u);
36219
    self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36220
  }
36221
  status = wuffs_base__make_status(NULL);
36222
  goto ok;
36223
36224
  ok:
36225
  goto exit;
36226
  exit:
36227
  if (a_src && a_src->data.ptr) {
36228
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36229
  }
36230
36231
  return status;
36232
}
36233
36234
// -------- func bmp.decoder.swizzle_bitfields
36235
36236
WUFFS_BASE__GENERATED_C_CODE
36237
static wuffs_base__status
36238
wuffs_bmp__decoder__swizzle_bitfields(
36239
    wuffs_bmp__decoder* self,
36240
    wuffs_base__pixel_buffer* a_dst,
36241
    wuffs_base__io_buffer* a_src) {
36242
  wuffs_base__status status = wuffs_base__make_status(NULL);
36243
36244
  wuffs_base__pixel_format v_dst_pixfmt = {0};
36245
  uint32_t v_dst_bits_per_pixel = 0;
36246
  uint32_t v_dst_bytes_per_pixel = 0;
36247
  uint64_t v_dst_bytes_per_row = 0;
36248
  wuffs_base__slice_u8 v_dst_palette = {0};
36249
  wuffs_base__table_u8 v_tab = {0};
36250
  wuffs_base__slice_u8 v_dst = {0};
36251
  uint64_t v_i = 0;
36252
  uint64_t v_n = 0;
36253
  uint32_t v_p0 = 0;
36254
  uint32_t v_p1 = 0;
36255
  uint32_t v_p1_temp = 0;
36256
  uint32_t v_num_bits = 0;
36257
  uint32_t v_c = 0;
36258
  uint32_t v_c32 = 0;
36259
  uint32_t v_channel = 0;
36260
36261
  const uint8_t* iop_a_src = NULL;
36262
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36263
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36264
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36265
  if (a_src && a_src->data.ptr) {
36266
    io0_a_src = a_src->data.ptr;
36267
    io1_a_src = io0_a_src + a_src->meta.ri;
36268
    iop_a_src = io1_a_src;
36269
    io2_a_src = io0_a_src + a_src->meta.wi;
36270
  }
36271
36272
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
36273
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
36274
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
36275
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
36276
    goto exit;
36277
  }
36278
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
36279
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
36280
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048));
36281
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
36282
  label__outer__continue:;
36283
  while (true) {
36284
    while (self->private_impl.f_pending_pad > 0u) {
36285
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
36286
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36287
        goto ok;
36288
      }
36289
      self->private_impl.f_pending_pad -= 1u;
36290
      iop_a_src += 1u;
36291
    }
36292
    while (true) {
36293
      if (self->private_impl.f_dst_x == self->private_impl.f_width) {
36294
        self->private_impl.f_dst_x = 0u;
36295
        self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36296
        if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
36297
          if (self->private_impl.f_height > 0u) {
36298
            self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
36299
          }
36300
          goto label__outer__break;
36301
        } else if (self->private_impl.f_pad_per_row != 0u) {
36302
          self->private_impl.f_pending_pad = self->private_impl.f_pad_per_row;
36303
          goto label__outer__continue;
36304
        }
36305
      }
36306
      v_p1_temp = ((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x));
36307
      v_p1 = wuffs_base__u32__min(v_p1_temp, 256u);
36308
      v_p0 = 0u;
36309
      while (v_p0 < v_p1) {
36310
        if (self->private_impl.f_bits_per_pixel == 16u) {
36311
          if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
36312
            break;
36313
          }
36314
          v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
36315
          iop_a_src += 2u;
36316
        } else {
36317
          if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
36318
            break;
36319
          }
36320
          v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36321
          iop_a_src += 4u;
36322
        }
36323
        v_channel = 0u;
36324
        while (v_channel < 4u) {
36325
          if (self->private_impl.f_channel_num_bits[v_channel] == 0u) {
36326
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = 255u;
36327
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = 255u;
36328
          } else {
36329
            v_c = ((v_c32 & self->private_impl.f_channel_masks[v_channel]) >> self->private_impl.f_channel_shifts[v_channel]);
36330
            v_num_bits = ((uint32_t)(self->private_impl.f_channel_num_bits[v_channel]));
36331
            while (v_num_bits < 16u) {
36332
              v_c |= ((uint32_t)(v_c << v_num_bits));
36333
              v_num_bits *= 2u;
36334
            }
36335
            v_c >>= (v_num_bits - 16u);
36336
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 0u)] = ((uint8_t)((v_c >> 0u)));
36337
            self->private_data.f_scratch[((8u * v_p0) + (2u * v_channel) + 1u)] = ((uint8_t)((v_c >> 8u)));
36338
          }
36339
          v_channel += 1u;
36340
        }
36341
        v_p0 += 1u;
36342
      }
36343
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36344
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
36345
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
36346
      }
36347
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
36348
      if (v_i >= ((uint64_t)(v_dst.len))) {
36349
        v_n = ((uint64_t)(v_p0));
36350
      } else {
36351
        v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(self->private_data.f_scratch, (8u * v_p0)));
36352
      }
36353
      if (v_n == 0u) {
36354
        status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36355
        goto ok;
36356
      }
36357
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
36358
    }
36359
  }
36360
  label__outer__break:;
36361
  status = wuffs_base__make_status(NULL);
36362
  goto ok;
36363
36364
  ok:
36365
  goto exit;
36366
  exit:
36367
  if (a_src && a_src->data.ptr) {
36368
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36369
  }
36370
36371
  return status;
36372
}
36373
36374
// -------- func bmp.decoder.swizzle_low_bit_depth
36375
36376
WUFFS_BASE__GENERATED_C_CODE
36377
static wuffs_base__status
36378
wuffs_bmp__decoder__swizzle_low_bit_depth(
36379
    wuffs_bmp__decoder* self,
36380
    wuffs_base__pixel_buffer* a_dst,
36381
    wuffs_base__io_buffer* a_src) {
36382
  wuffs_base__status status = wuffs_base__make_status(NULL);
36383
36384
  wuffs_base__pixel_format v_dst_pixfmt = {0};
36385
  uint32_t v_dst_bits_per_pixel = 0;
36386
  uint32_t v_dst_bytes_per_pixel = 0;
36387
  uint64_t v_dst_bytes_per_row = 0;
36388
  wuffs_base__slice_u8 v_dst_palette = {0};
36389
  wuffs_base__table_u8 v_tab = {0};
36390
  wuffs_base__slice_u8 v_dst = {0};
36391
  uint64_t v_i = 0;
36392
  uint64_t v_n = 0;
36393
  uint32_t v_p0 = 0;
36394
  uint32_t v_chunk_bits = 0;
36395
  uint32_t v_chunk_count = 0;
36396
  uint32_t v_pixels_per_chunk = 0;
36397
36398
  const uint8_t* iop_a_src = NULL;
36399
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36400
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36401
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36402
  if (a_src && a_src->data.ptr) {
36403
    io0_a_src = a_src->data.ptr;
36404
    io1_a_src = io0_a_src + a_src->meta.ri;
36405
    iop_a_src = io1_a_src;
36406
    io2_a_src = io0_a_src + a_src->meta.wi;
36407
  }
36408
36409
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
36410
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
36411
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
36412
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
36413
    goto exit;
36414
  }
36415
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
36416
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
36417
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_scratch, 1024, 2048));
36418
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
36419
  while (true) {
36420
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
36421
      self->private_impl.f_dst_x = 0u;
36422
      self->private_impl.f_dst_y += self->private_impl.f_dst_y_inc;
36423
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
36424
        break;
36425
      }
36426
    }
36427
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
36428
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
36429
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
36430
    }
36431
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
36432
    if (v_i >= ((uint64_t)(v_dst.len))) {
36433
      if (self->private_impl.f_bits_per_pixel == 1u) {
36434
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
36435
        v_pixels_per_chunk = 32u;
36436
      } else if (self->private_impl.f_bits_per_pixel == 2u) {
36437
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
36438
        v_pixels_per_chunk = 16u;
36439
      } else {
36440
        v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
36441
        v_pixels_per_chunk = 8u;
36442
      }
36443
      while ((v_chunk_count >= 64u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 256u)) {
36444
        iop_a_src += 256u;
36445
        self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 64u))));
36446
        v_chunk_count -= 64u;
36447
      }
36448
      while ((v_chunk_count >= 8u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 32u)) {
36449
        iop_a_src += 32u;
36450
        self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 8u))));
36451
        v_chunk_count -= 8u;
36452
      }
36453
      while (v_chunk_count > 0u) {
36454
        if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
36455
          status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36456
          goto ok;
36457
        }
36458
        iop_a_src += 4u;
36459
        self->private_impl.f_dst_x = wuffs_base__u32__min(self->private_impl.f_width, ((uint32_t)(self->private_impl.f_dst_x + (v_pixels_per_chunk * 1u))));
36460
        v_chunk_count -= 1u;
36461
      }
36462
      continue;
36463
    }
36464
    v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
36465
    v_p0 = 0u;
36466
    if (self->private_impl.f_bits_per_pixel == 1u) {
36467
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 31u) / 32u);
36468
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 16u);
36469
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
36470
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
36471
        iop_a_src += 4u;
36472
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((1u & (v_chunk_bits >> 31u))));
36473
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((1u & (v_chunk_bits >> 30u))));
36474
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((1u & (v_chunk_bits >> 29u))));
36475
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((1u & (v_chunk_bits >> 28u))));
36476
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((1u & (v_chunk_bits >> 27u))));
36477
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((1u & (v_chunk_bits >> 26u))));
36478
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((1u & (v_chunk_bits >> 25u))));
36479
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((1u & (v_chunk_bits >> 24u))));
36480
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((1u & (v_chunk_bits >> 23u))));
36481
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((1u & (v_chunk_bits >> 22u))));
36482
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((1u & (v_chunk_bits >> 21u))));
36483
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((1u & (v_chunk_bits >> 20u))));
36484
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((1u & (v_chunk_bits >> 19u))));
36485
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((1u & (v_chunk_bits >> 18u))));
36486
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((1u & (v_chunk_bits >> 17u))));
36487
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((1u & (v_chunk_bits >> 16u))));
36488
        self->private_data.f_scratch[(v_p0 + 16u)] = ((uint8_t)((1u & (v_chunk_bits >> 15u))));
36489
        self->private_data.f_scratch[(v_p0 + 17u)] = ((uint8_t)((1u & (v_chunk_bits >> 14u))));
36490
        self->private_data.f_scratch[(v_p0 + 18u)] = ((uint8_t)((1u & (v_chunk_bits >> 13u))));
36491
        self->private_data.f_scratch[(v_p0 + 19u)] = ((uint8_t)((1u & (v_chunk_bits >> 12u))));
36492
        self->private_data.f_scratch[(v_p0 + 20u)] = ((uint8_t)((1u & (v_chunk_bits >> 11u))));
36493
        self->private_data.f_scratch[(v_p0 + 21u)] = ((uint8_t)((1u & (v_chunk_bits >> 10u))));
36494
        self->private_data.f_scratch[(v_p0 + 22u)] = ((uint8_t)((1u & (v_chunk_bits >> 9u))));
36495
        self->private_data.f_scratch[(v_p0 + 23u)] = ((uint8_t)((1u & (v_chunk_bits >> 8u))));
36496
        self->private_data.f_scratch[(v_p0 + 24u)] = ((uint8_t)((1u & (v_chunk_bits >> 7u))));
36497
        self->private_data.f_scratch[(v_p0 + 25u)] = ((uint8_t)((1u & (v_chunk_bits >> 6u))));
36498
        self->private_data.f_scratch[(v_p0 + 26u)] = ((uint8_t)((1u & (v_chunk_bits >> 5u))));
36499
        self->private_data.f_scratch[(v_p0 + 27u)] = ((uint8_t)((1u & (v_chunk_bits >> 4u))));
36500
        self->private_data.f_scratch[(v_p0 + 28u)] = ((uint8_t)((1u & (v_chunk_bits >> 3u))));
36501
        self->private_data.f_scratch[(v_p0 + 29u)] = ((uint8_t)((1u & (v_chunk_bits >> 2u))));
36502
        self->private_data.f_scratch[(v_p0 + 30u)] = ((uint8_t)((1u & (v_chunk_bits >> 1u))));
36503
        self->private_data.f_scratch[(v_p0 + 31u)] = ((uint8_t)((1u & (v_chunk_bits >> 0u))));
36504
        v_p0 = ((v_p0 & 511u) + 32u);
36505
        v_chunk_count -= 1u;
36506
      }
36507
    } else if (self->private_impl.f_bits_per_pixel == 2u) {
36508
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 15u) / 16u);
36509
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 32u);
36510
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
36511
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
36512
        iop_a_src += 4u;
36513
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((3u & (v_chunk_bits >> 30u))));
36514
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((3u & (v_chunk_bits >> 28u))));
36515
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((3u & (v_chunk_bits >> 26u))));
36516
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((3u & (v_chunk_bits >> 24u))));
36517
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((3u & (v_chunk_bits >> 22u))));
36518
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((3u & (v_chunk_bits >> 20u))));
36519
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((3u & (v_chunk_bits >> 18u))));
36520
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((3u & (v_chunk_bits >> 16u))));
36521
        self->private_data.f_scratch[(v_p0 + 8u)] = ((uint8_t)((3u & (v_chunk_bits >> 14u))));
36522
        self->private_data.f_scratch[(v_p0 + 9u)] = ((uint8_t)((3u & (v_chunk_bits >> 12u))));
36523
        self->private_data.f_scratch[(v_p0 + 10u)] = ((uint8_t)((3u & (v_chunk_bits >> 10u))));
36524
        self->private_data.f_scratch[(v_p0 + 11u)] = ((uint8_t)((3u & (v_chunk_bits >> 8u))));
36525
        self->private_data.f_scratch[(v_p0 + 12u)] = ((uint8_t)((3u & (v_chunk_bits >> 6u))));
36526
        self->private_data.f_scratch[(v_p0 + 13u)] = ((uint8_t)((3u & (v_chunk_bits >> 4u))));
36527
        self->private_data.f_scratch[(v_p0 + 14u)] = ((uint8_t)((3u & (v_chunk_bits >> 2u))));
36528
        self->private_data.f_scratch[(v_p0 + 15u)] = ((uint8_t)((3u & (v_chunk_bits >> 0u))));
36529
        v_p0 = ((v_p0 & 511u) + 16u);
36530
        v_chunk_count -= 1u;
36531
      }
36532
    } else {
36533
      v_chunk_count = ((wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x) + 7u) / 8u);
36534
      v_chunk_count = wuffs_base__u32__min(v_chunk_count, 64u);
36535
      while ((v_chunk_count > 0u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
36536
        v_chunk_bits = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
36537
        iop_a_src += 4u;
36538
        self->private_data.f_scratch[(v_p0 + 0u)] = ((uint8_t)((15u & (v_chunk_bits >> 28u))));
36539
        self->private_data.f_scratch[(v_p0 + 1u)] = ((uint8_t)((15u & (v_chunk_bits >> 24u))));
36540
        self->private_data.f_scratch[(v_p0 + 2u)] = ((uint8_t)((15u & (v_chunk_bits >> 20u))));
36541
        self->private_data.f_scratch[(v_p0 + 3u)] = ((uint8_t)((15u & (v_chunk_bits >> 16u))));
36542
        self->private_data.f_scratch[(v_p0 + 4u)] = ((uint8_t)((15u & (v_chunk_bits >> 12u))));
36543
        self->private_data.f_scratch[(v_p0 + 5u)] = ((uint8_t)((15u & (v_chunk_bits >> 8u))));
36544
        self->private_data.f_scratch[(v_p0 + 6u)] = ((uint8_t)((15u & (v_chunk_bits >> 4u))));
36545
        self->private_data.f_scratch[(v_p0 + 7u)] = ((uint8_t)((15u & (v_chunk_bits >> 0u))));
36546
        v_p0 = ((v_p0 & 511u) + 8u);
36547
        v_chunk_count -= 1u;
36548
      }
36549
    }
36550
    v_p0 = wuffs_base__u32__min(v_p0, wuffs_base__u32__sat_sub(self->private_impl.f_width, self->private_impl.f_dst_x));
36551
    v_n = 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));
36552
    if (v_n == 0u) {
36553
      status = wuffs_base__make_status(wuffs_bmp__note__internal_note_short_read);
36554
      goto ok;
36555
    }
36556
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
36557
  }
36558
  status = wuffs_base__make_status(NULL);
36559
  goto ok;
36560
36561
  ok:
36562
  goto exit;
36563
  exit:
36564
  if (a_src && a_src->data.ptr) {
36565
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36566
  }
36567
36568
  return status;
36569
}
36570
36571
// -------- func bmp.decoder.frame_dirty_rect
36572
36573
WUFFS_BASE__GENERATED_C_CODE
36574
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
36575
wuffs_bmp__decoder__frame_dirty_rect(
36576
    const wuffs_bmp__decoder* self) {
36577
  if (!self) {
36578
    return wuffs_base__utility__empty_rect_ie_u32();
36579
  }
36580
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36581
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36582
    return wuffs_base__utility__empty_rect_ie_u32();
36583
  }
36584
36585
  return wuffs_base__utility__make_rect_ie_u32(
36586
      0u,
36587
      0u,
36588
      self->private_impl.f_width,
36589
      self->private_impl.f_height);
36590
}
36591
36592
// -------- func bmp.decoder.num_animation_loops
36593
36594
WUFFS_BASE__GENERATED_C_CODE
36595
WUFFS_BASE__MAYBE_STATIC uint32_t
36596
wuffs_bmp__decoder__num_animation_loops(
36597
    const wuffs_bmp__decoder* self) {
36598
  if (!self) {
36599
    return 0;
36600
  }
36601
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36602
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36603
    return 0;
36604
  }
36605
36606
  return 0u;
36607
}
36608
36609
// -------- func bmp.decoder.num_decoded_frame_configs
36610
36611
WUFFS_BASE__GENERATED_C_CODE
36612
WUFFS_BASE__MAYBE_STATIC uint64_t
36613
wuffs_bmp__decoder__num_decoded_frame_configs(
36614
    const wuffs_bmp__decoder* self) {
36615
  if (!self) {
36616
    return 0;
36617
  }
36618
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36619
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36620
    return 0;
36621
  }
36622
36623
  if (self->private_impl.f_call_sequence > 32u) {
36624
    return 1u;
36625
  }
36626
  return 0u;
36627
}
36628
36629
// -------- func bmp.decoder.num_decoded_frames
36630
36631
WUFFS_BASE__GENERATED_C_CODE
36632
WUFFS_BASE__MAYBE_STATIC uint64_t
36633
wuffs_bmp__decoder__num_decoded_frames(
36634
    const wuffs_bmp__decoder* self) {
36635
  if (!self) {
36636
    return 0;
36637
  }
36638
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36639
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36640
    return 0;
36641
  }
36642
36643
  if (self->private_impl.f_call_sequence > 64u) {
36644
    return 1u;
36645
  }
36646
  return 0u;
36647
}
36648
36649
// -------- func bmp.decoder.restart_frame
36650
36651
WUFFS_BASE__GENERATED_C_CODE
36652
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36653
wuffs_bmp__decoder__restart_frame(
36654
    wuffs_bmp__decoder* self,
36655
    uint64_t a_index,
36656
    uint64_t a_io_position) {
36657
  if (!self) {
36658
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36659
  }
36660
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36661
    return wuffs_base__make_status(
36662
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36663
        ? wuffs_base__error__disabled_by_previous_error
36664
        : wuffs_base__error__initialize_not_called);
36665
  }
36666
36667
  if (self->private_impl.f_call_sequence < 32u) {
36668
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
36669
  }
36670
  if (a_index != 0u) {
36671
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
36672
  }
36673
  self->private_impl.f_call_sequence = 40u;
36674
  self->private_impl.f_frame_config_io_position = a_io_position;
36675
  return wuffs_base__make_status(NULL);
36676
}
36677
36678
// -------- func bmp.decoder.set_report_metadata
36679
36680
WUFFS_BASE__GENERATED_C_CODE
36681
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
36682
wuffs_bmp__decoder__set_report_metadata(
36683
    wuffs_bmp__decoder* self,
36684
    uint32_t a_fourcc,
36685
    bool a_report) {
36686
  return wuffs_base__make_empty_struct();
36687
}
36688
36689
// -------- func bmp.decoder.tell_me_more
36690
36691
WUFFS_BASE__GENERATED_C_CODE
36692
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
36693
wuffs_bmp__decoder__tell_me_more(
36694
    wuffs_bmp__decoder* self,
36695
    wuffs_base__io_buffer* a_dst,
36696
    wuffs_base__more_information* a_minfo,
36697
    wuffs_base__io_buffer* a_src) {
36698
  if (!self) {
36699
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
36700
  }
36701
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
36702
    return wuffs_base__make_status(
36703
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
36704
        ? wuffs_base__error__disabled_by_previous_error
36705
        : wuffs_base__error__initialize_not_called);
36706
  }
36707
  if (!a_dst || !a_src) {
36708
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36709
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
36710
  }
36711
  if ((self->private_impl.active_coroutine != 0) &&
36712
      (self->private_impl.active_coroutine != 4)) {
36713
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36714
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
36715
  }
36716
  self->private_impl.active_coroutine = 0;
36717
  wuffs_base__status status = wuffs_base__make_status(NULL);
36718
36719
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
36720
36721
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
36722
  switch (coro_susp_point) {
36723
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36724
36725
    while (true) {
36726
      {
36727
        wuffs_base__status t_0 = wuffs_bmp__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
36728
        v_status = t_0;
36729
      }
36730
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
36731
        status = wuffs_base__make_status(wuffs_bmp__error__truncated_input);
36732
        goto exit;
36733
      }
36734
      status = v_status;
36735
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
36736
    }
36737
36738
    ok:
36739
    self->private_impl.p_tell_me_more = 0;
36740
    goto exit;
36741
  }
36742
36743
  goto suspend;
36744
  suspend:
36745
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36746
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
36747
36748
  goto exit;
36749
  exit:
36750
  if (wuffs_base__status__is_error(&status)) {
36751
    self->private_impl.magic = WUFFS_BASE__DISABLED;
36752
  }
36753
  return status;
36754
}
36755
36756
// -------- func bmp.decoder.do_tell_me_more
36757
36758
WUFFS_BASE__GENERATED_C_CODE
36759
static wuffs_base__status
36760
wuffs_bmp__decoder__do_tell_me_more(
36761
    wuffs_bmp__decoder* self,
36762
    wuffs_base__io_buffer* a_dst,
36763
    wuffs_base__more_information* a_minfo,
36764
    wuffs_base__io_buffer* a_src) {
36765
  wuffs_base__status status = wuffs_base__make_status(NULL);
36766
36767
  if (self->private_impl.f_io_redirect_fourcc <= 1u) {
36768
    status = wuffs_base__make_status(wuffs_base__error__no_more_information);
36769
    goto exit;
36770
  }
36771
  if (a_minfo != NULL) {
36772
    wuffs_base__more_information__set(a_minfo,
36773
        1u,
36774
        self->private_impl.f_io_redirect_fourcc,
36775
        0u,
36776
        self->private_impl.f_io_redirect_pos,
36777
        18446744073709551615u);
36778
  }
36779
  self->private_impl.f_io_redirect_fourcc = 1u;
36780
36781
  goto ok;
36782
  ok:
36783
  goto exit;
36784
  exit:
36785
  return status;
36786
}
36787
36788
// -------- func bmp.decoder.workbuf_len
36789
36790
WUFFS_BASE__GENERATED_C_CODE
36791
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
36792
wuffs_bmp__decoder__workbuf_len(
36793
    const wuffs_bmp__decoder* self) {
36794
  if (!self) {
36795
    return wuffs_base__utility__empty_range_ii_u64();
36796
  }
36797
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
36798
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
36799
    return wuffs_base__utility__empty_range_ii_u64();
36800
  }
36801
36802
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
36803
}
36804
36805
// -------- func bmp.decoder.read_palette
36806
36807
WUFFS_BASE__GENERATED_C_CODE
36808
static wuffs_base__status
36809
wuffs_bmp__decoder__read_palette(
36810
    wuffs_bmp__decoder* self,
36811
    wuffs_base__io_buffer* a_src) {
36812
  wuffs_base__status status = wuffs_base__make_status(NULL);
36813
36814
  uint32_t v_i = 0;
36815
  uint32_t v_argb = 0;
36816
36817
  const uint8_t* iop_a_src = NULL;
36818
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36819
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36820
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
36821
  if (a_src && a_src->data.ptr) {
36822
    io0_a_src = a_src->data.ptr;
36823
    io1_a_src = io0_a_src + a_src->meta.ri;
36824
    iop_a_src = io1_a_src;
36825
    io2_a_src = io0_a_src + a_src->meta.wi;
36826
  }
36827
36828
  uint32_t coro_susp_point = self->private_impl.p_read_palette;
36829
  if (coro_susp_point) {
36830
    v_i = self->private_data.s_read_palette.v_i;
36831
  }
36832
  switch (coro_susp_point) {
36833
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
36834
36835
    if (self->private_impl.f_bitmap_info_len == 12u) {
36836
      while ((v_i < 256u) && (self->private_impl.f_padding >= 3u)) {
36837
        self->private_impl.f_padding -= 3u;
36838
        {
36839
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
36840
          uint32_t t_0;
36841
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
36842
            t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
36843
            iop_a_src += 3;
36844
          } else {
36845
            self->private_data.s_read_palette.scratch = 0;
36846
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
36847
            while (true) {
36848
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36849
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36850
                goto suspend;
36851
              }
36852
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
36853
              uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
36854
              *scratch <<= 8;
36855
              *scratch >>= 8;
36856
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
36857
              if (num_bits_0 == 16) {
36858
                t_0 = ((uint32_t)(*scratch));
36859
                break;
36860
              }
36861
              num_bits_0 += 8u;
36862
              *scratch |= ((uint64_t)(num_bits_0)) << 56;
36863
            }
36864
          }
36865
          v_argb = t_0;
36866
        }
36867
        v_argb |= 4278190080u;
36868
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
36869
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
36870
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
36871
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
36872
        v_i += 1u;
36873
      }
36874
    } else {
36875
      while ((v_i < 256u) && (self->private_impl.f_padding >= 4u)) {
36876
        self->private_impl.f_padding -= 4u;
36877
        {
36878
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
36879
          uint32_t t_1;
36880
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
36881
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
36882
            iop_a_src += 4;
36883
          } else {
36884
            self->private_data.s_read_palette.scratch = 0;
36885
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
36886
            while (true) {
36887
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
36888
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
36889
                goto suspend;
36890
              }
36891
              uint64_t* scratch = &self->private_data.s_read_palette.scratch;
36892
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
36893
              *scratch <<= 8;
36894
              *scratch >>= 8;
36895
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
36896
              if (num_bits_1 == 24) {
36897
                t_1 = ((uint32_t)(*scratch));
36898
                break;
36899
              }
36900
              num_bits_1 += 8u;
36901
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
36902
            }
36903
          }
36904
          v_argb = t_1;
36905
        }
36906
        v_argb |= 4278190080u;
36907
        self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
36908
        self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
36909
        self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
36910
        self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
36911
        v_i += 1u;
36912
      }
36913
    }
36914
    while (v_i < 256u) {
36915
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
36916
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
36917
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
36918
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
36919
      v_i += 1u;
36920
    }
36921
36922
    goto ok;
36923
    ok:
36924
    self->private_impl.p_read_palette = 0;
36925
    goto exit;
36926
  }
36927
36928
  goto suspend;
36929
  suspend:
36930
  self->private_impl.p_read_palette = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
36931
  self->private_data.s_read_palette.v_i = v_i;
36932
36933
  goto exit;
36934
  exit:
36935
  if (a_src && a_src->data.ptr) {
36936
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
36937
  }
36938
36939
  return status;
36940
}
36941
36942
// -------- func bmp.decoder.process_masks
36943
36944
WUFFS_BASE__GENERATED_C_CODE
36945
static wuffs_base__status
36946
wuffs_bmp__decoder__process_masks(
36947
    wuffs_bmp__decoder* self) {
36948
  wuffs_base__status status = wuffs_base__make_status(NULL);
36949
36950
  uint32_t v_i = 0;
36951
  uint32_t v_mask = 0;
36952
  uint32_t v_n = 0;
36953
36954
  while (v_i < 4u) {
36955
    v_mask = self->private_impl.f_channel_masks[v_i];
36956
    if (v_mask != 0u) {
36957
      v_n = 0u;
36958
      while ((v_mask & 1u) == 0u) {
36959
        v_n += 1u;
36960
        v_mask >>= 1u;
36961
      }
36962
      self->private_impl.f_channel_shifts[v_i] = ((uint8_t)((v_n & 31u)));
36963
      v_n = 0u;
36964
      while ((v_mask & 1u) == 1u) {
36965
        v_n += 1u;
36966
        v_mask >>= 1u;
36967
      }
36968
      if ((v_mask != 0u) || (v_n > 32u)) {
36969
        status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
36970
        goto exit;
36971
      }
36972
      self->private_impl.f_channel_num_bits[v_i] = ((uint8_t)(v_n));
36973
    } else if (v_i != 3u) {
36974
      status = wuffs_base__make_status(wuffs_bmp__error__bad_header);
36975
      goto exit;
36976
    }
36977
    v_i += 1u;
36978
  }
36979
36980
  goto ok;
36981
  ok:
36982
  goto exit;
36983
  exit:
36984
  return status;
36985
}
36986
36987
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
36988
36989
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
36990
36991
// ---------------- Status Codes Implementations
36992
36993
const char wuffs_bzip2__error__bad_huffman_code_over_subscribed[] = "#bzip2: bad Huffman code (over-subscribed)";
36994
const char wuffs_bzip2__error__bad_huffman_code_under_subscribed[] = "#bzip2: bad Huffman code (under-subscribed)";
36995
const char wuffs_bzip2__error__bad_block_header[] = "#bzip2: bad block header";
36996
const char wuffs_bzip2__error__bad_block_length[] = "#bzip2: bad block length";
36997
const char wuffs_bzip2__error__bad_checksum[] = "#bzip2: bad checksum";
36998
const char wuffs_bzip2__error__bad_header[] = "#bzip2: bad header";
36999
const char wuffs_bzip2__error__bad_number_of_sections[] = "#bzip2: bad number of sections";
37000
const char wuffs_bzip2__error__truncated_input[] = "#bzip2: truncated input";
37001
const char wuffs_bzip2__error__unsupported_block_randomization[] = "#bzip2: unsupported block randomization";
37002
const char wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state[] = "#bzip2: internal error: inconsistent Huffman decoder state";
37003
37004
// ---------------- Private Consts
37005
37006
static const uint8_t
37007
WUFFS_BZIP2__CLAMP_TO_5[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
37008
  0u, 1u, 2u, 3u, 4u, 5u, 5u, 5u,
37009
};
37010
37011
static const uint32_t
37012
WUFFS_BZIP2__REV_CRC32_TABLE[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
37013
  0u, 79764919u, 159529838u, 222504665u, 319059676u, 398814059u, 445009330u, 507990021u,
37014
  638119352u, 583659535u, 797628118u, 726387553u, 890018660u, 835552979u, 1015980042u, 944750013u,
37015
  1276238704u, 1221641927u, 1167319070u, 1095957929u, 1595256236u, 1540665371u, 1452775106u, 1381403509u,
37016
  1780037320u, 1859660671u, 1671105958u, 1733955601u, 2031960084u, 2111593891u, 1889500026u, 1952343757u,
37017
  2552477408u, 2632100695u, 2443283854u, 2506133561u, 2334638140u, 2414271883u, 2191915858u, 2254759653u,
37018
  3190512472u, 3135915759u, 3081330742u, 3009969537u, 2905550212u, 2850959411u, 2762807018u, 2691435357u,
37019
  3560074640u, 3505614887u, 3719321342u, 3648080713u, 3342211916u, 3287746299u, 3467911202u, 3396681109u,
37020
  4063920168u, 4143685023u, 4223187782u, 4286162673u, 3779000052u, 3858754371u, 3904687514u, 3967668269u,
37021
  881225847u, 809987520u, 1023691545u, 969234094u, 662832811u, 591600412u, 771767749u, 717299826u,
37022
  311336399u, 374308984u, 453813921u, 533576470u, 25881363u, 88864420u, 134795389u, 214552010u,
37023
  2023205639u, 2086057648u, 1897238633u, 1976864222u, 1804852699u, 1867694188u, 1645340341u, 1724971778u,
37024
  1587496639u, 1516133128u, 1461550545u, 1406951526u, 1302016099u, 1230646740u, 1142491917u, 1087903418u,
37025
  2896545431u, 2825181984u, 2770861561u, 2716262478u, 3215044683u, 3143675388u, 3055782693u, 3001194130u,
37026
  2326604591u, 2389456536u, 2200899649u, 2280525302u, 2578013683u, 2640855108u, 2418763421u, 2498394922u,
37027
  3769900519u, 3832873040u, 3912640137u, 3992402750u, 4088425275u, 4151408268u, 4197601365u, 4277358050u,
37028
  3334271071u, 3263032808u, 3476998961u, 3422541446u, 3585640067u, 3514407732u, 3694837229u, 3640369242u,
37029
  1762451694u, 1842216281u, 1619975040u, 1682949687u, 2047383090u, 2127137669u, 1938468188u, 2001449195u,
37030
  1325665622u, 1271206113u, 1183200824u, 1111960463u, 1543535498u, 1489069629u, 1434599652u, 1363369299u,
37031
  622672798u, 568075817u, 748617968u, 677256519u, 907627842u, 853037301u, 1067152940u, 995781531u,
37032
  51762726u, 131386257u, 177728840u, 240578815u, 269590778u, 349224269u, 429104020u, 491947555u,
37033
  4046411278u, 4126034873u, 4172115296u, 4234965207u, 3794477266u, 3874110821u, 3953728444u, 4016571915u,
37034
  3609705398u, 3555108353u, 3735388376u, 3664026991u, 3290680682u, 3236090077u, 3449943556u, 3378572211u,
37035
  3174993278u, 3120533705u, 3032266256u, 2961025959u, 2923101090u, 2868635157u, 2813903052u, 2742672763u,
37036
  2604032198u, 2683796849u, 2461293480u, 2524268063u, 2284983834u, 2364738477u, 2175806836u, 2238787779u,
37037
  1569362073u, 1498123566u, 1409854455u, 1355396672u, 1317987909u, 1246755826u, 1192025387u, 1137557660u,
37038
  2072149281u, 2135122070u, 1912620623u, 1992383480u, 1753615357u, 1816598090u, 1627664531u, 1707420964u,
37039
  295390185u, 358241886u, 404320391u, 483945776u, 43990325u, 106832002u, 186451547u, 266083308u,
37040
  932423249u, 861060070u, 1041341759u, 986742920u, 613929101u, 542559546u, 756411363u, 701822548u,
37041
  3316196985u, 3244833742u, 3425377559u, 3370778784u, 3601682597u, 3530312978u, 3744426955u, 3689838204u,
37042
  3819031489u, 3881883254u, 3928223919u, 4007849240u, 4037393693u, 4100235434u, 4180117107u, 4259748804u,
37043
  2310601993u, 2373574846u, 2151335527u, 2231098320u, 2596047829u, 2659030626u, 2470359227u, 2550115596u,
37044
  2947551409u, 2876312838u, 2788305887u, 2733848168u, 3165939309u, 3094707162u, 3040238851u, 2985771188u,
37045
};
37046
37047
// ---------------- Private Initializer Prototypes
37048
37049
// ---------------- Private Function Prototypes
37050
37051
WUFFS_BASE__GENERATED_C_CODE
37052
static wuffs_base__status
37053
wuffs_bzip2__decoder__do_transform_io(
37054
    wuffs_bzip2__decoder* self,
37055
    wuffs_base__io_buffer* a_dst,
37056
    wuffs_base__io_buffer* a_src,
37057
    wuffs_base__slice_u8 a_workbuf);
37058
37059
WUFFS_BASE__GENERATED_C_CODE
37060
static wuffs_base__status
37061
wuffs_bzip2__decoder__prepare_block(
37062
    wuffs_bzip2__decoder* self,
37063
    wuffs_base__io_buffer* a_src);
37064
37065
WUFFS_BASE__GENERATED_C_CODE
37066
static wuffs_base__status
37067
wuffs_bzip2__decoder__read_code_lengths(
37068
    wuffs_bzip2__decoder* self,
37069
    wuffs_base__io_buffer* a_src);
37070
37071
WUFFS_BASE__GENERATED_C_CODE
37072
static wuffs_base__status
37073
wuffs_bzip2__decoder__build_huffman_tree(
37074
    wuffs_bzip2__decoder* self,
37075
    uint32_t a_which);
37076
37077
WUFFS_BASE__GENERATED_C_CODE
37078
static wuffs_base__empty_struct
37079
wuffs_bzip2__decoder__build_huffman_table(
37080
    wuffs_bzip2__decoder* self,
37081
    uint32_t a_which);
37082
37083
WUFFS_BASE__GENERATED_C_CODE
37084
static wuffs_base__empty_struct
37085
wuffs_bzip2__decoder__invert_bwt(
37086
    wuffs_bzip2__decoder* self);
37087
37088
WUFFS_BASE__GENERATED_C_CODE
37089
static wuffs_base__empty_struct
37090
wuffs_bzip2__decoder__flush_fast(
37091
    wuffs_bzip2__decoder* self,
37092
    wuffs_base__io_buffer* a_dst);
37093
37094
WUFFS_BASE__GENERATED_C_CODE
37095
static wuffs_base__status
37096
wuffs_bzip2__decoder__flush_slow(
37097
    wuffs_bzip2__decoder* self,
37098
    wuffs_base__io_buffer* a_dst);
37099
37100
WUFFS_BASE__GENERATED_C_CODE
37101
static wuffs_base__status
37102
wuffs_bzip2__decoder__decode_huffman_fast(
37103
    wuffs_bzip2__decoder* self,
37104
    wuffs_base__io_buffer* a_src);
37105
37106
WUFFS_BASE__GENERATED_C_CODE
37107
static wuffs_base__status
37108
wuffs_bzip2__decoder__decode_huffman_slow(
37109
    wuffs_bzip2__decoder* self,
37110
    wuffs_base__io_buffer* a_src);
37111
37112
// ---------------- VTables
37113
37114
const wuffs_base__io_transformer__func_ptrs
37115
wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer = {
37116
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_bzip2__decoder__dst_history_retain_length),
37117
  (uint64_t(*)(const void*,
37118
      uint32_t))(&wuffs_bzip2__decoder__get_quirk),
37119
  (wuffs_base__status(*)(void*,
37120
      uint32_t,
37121
      uint64_t))(&wuffs_bzip2__decoder__set_quirk),
37122
  (wuffs_base__status(*)(void*,
37123
      wuffs_base__io_buffer*,
37124
      wuffs_base__io_buffer*,
37125
      wuffs_base__slice_u8))(&wuffs_bzip2__decoder__transform_io),
37126
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_bzip2__decoder__workbuf_len),
37127
};
37128
37129
// ---------------- Initializer Implementations
37130
37131
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
37132
wuffs_bzip2__decoder__initialize(
37133
    wuffs_bzip2__decoder* self,
37134
    size_t sizeof_star_self,
37135
    uint64_t wuffs_version,
37136
    uint32_t options){
37137
  if (!self) {
37138
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37139
  }
37140
  if (sizeof(*self) != sizeof_star_self) {
37141
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
37142
  }
37143
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
37144
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
37145
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
37146
  }
37147
37148
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
37149
    // The whole point of this if-check is to detect an uninitialized *self.
37150
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
37151
#if !defined(__clang__) && defined(__GNUC__)
37152
#pragma GCC diagnostic push
37153
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
37154
#endif
37155
    if (self->private_impl.magic != 0) {
37156
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
37157
    }
37158
#if !defined(__clang__) && defined(__GNUC__)
37159
#pragma GCC diagnostic pop
37160
#endif
37161
  } else {
37162
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
37163
      memset(self, 0, sizeof(*self));
37164
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
37165
    } else {
37166
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
37167
    }
37168
  }
37169
37170
  self->private_impl.magic = WUFFS_BASE__MAGIC;
37171
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
37172
      wuffs_base__io_transformer__vtable_name;
37173
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
37174
      (const void*)(&wuffs_bzip2__decoder__func_ptrs_for__wuffs_base__io_transformer);
37175
  return wuffs_base__make_status(NULL);
37176
}
37177
37178
wuffs_bzip2__decoder*
37179
wuffs_bzip2__decoder__alloc(void) {
37180
  wuffs_bzip2__decoder* x =
37181
      (wuffs_bzip2__decoder*)(calloc(1, sizeof(wuffs_bzip2__decoder)));
37182
  if (!x) {
37183
    return NULL;
37184
  }
37185
  if (wuffs_bzip2__decoder__initialize(
37186
      x, sizeof(wuffs_bzip2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
37187
    free(x);
37188
    return NULL;
37189
  }
37190
  return x;
37191
}
37192
37193
size_t
37194
sizeof__wuffs_bzip2__decoder(void) {
37195
  return sizeof(wuffs_bzip2__decoder);
37196
}
37197
37198
// ---------------- Function Implementations
37199
37200
// -------- func bzip2.decoder.get_quirk
37201
37202
WUFFS_BASE__GENERATED_C_CODE
37203
WUFFS_BASE__MAYBE_STATIC uint64_t
37204
wuffs_bzip2__decoder__get_quirk(
37205
    const wuffs_bzip2__decoder* self,
37206
    uint32_t a_key) {
37207
  if (!self) {
37208
    return 0;
37209
  }
37210
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37211
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37212
    return 0;
37213
  }
37214
37215
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
37216
    return 1u;
37217
  }
37218
  return 0u;
37219
}
37220
37221
// -------- func bzip2.decoder.set_quirk
37222
37223
WUFFS_BASE__GENERATED_C_CODE
37224
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37225
wuffs_bzip2__decoder__set_quirk(
37226
    wuffs_bzip2__decoder* self,
37227
    uint32_t a_key,
37228
    uint64_t a_value) {
37229
  if (!self) {
37230
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37231
  }
37232
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37233
    return wuffs_base__make_status(
37234
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37235
        ? wuffs_base__error__disabled_by_previous_error
37236
        : wuffs_base__error__initialize_not_called);
37237
  }
37238
37239
  if (a_key == 1u) {
37240
    self->private_impl.f_ignore_checksum = (a_value > 0u);
37241
    return wuffs_base__make_status(NULL);
37242
  }
37243
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
37244
}
37245
37246
// -------- func bzip2.decoder.dst_history_retain_length
37247
37248
WUFFS_BASE__GENERATED_C_CODE
37249
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
37250
wuffs_bzip2__decoder__dst_history_retain_length(
37251
    const wuffs_bzip2__decoder* self) {
37252
  if (!self) {
37253
    return wuffs_base__utility__make_optional_u63(false, 0u);
37254
  }
37255
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37256
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37257
    return wuffs_base__utility__make_optional_u63(false, 0u);
37258
  }
37259
37260
  return wuffs_base__utility__make_optional_u63(true, 0u);
37261
}
37262
37263
// -------- func bzip2.decoder.workbuf_len
37264
37265
WUFFS_BASE__GENERATED_C_CODE
37266
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
37267
wuffs_bzip2__decoder__workbuf_len(
37268
    const wuffs_bzip2__decoder* self) {
37269
  if (!self) {
37270
    return wuffs_base__utility__empty_range_ii_u64();
37271
  }
37272
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
37273
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
37274
    return wuffs_base__utility__empty_range_ii_u64();
37275
  }
37276
37277
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
37278
}
37279
37280
// -------- func bzip2.decoder.transform_io
37281
37282
WUFFS_BASE__GENERATED_C_CODE
37283
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
37284
wuffs_bzip2__decoder__transform_io(
37285
    wuffs_bzip2__decoder* self,
37286
    wuffs_base__io_buffer* a_dst,
37287
    wuffs_base__io_buffer* a_src,
37288
    wuffs_base__slice_u8 a_workbuf) {
37289
  if (!self) {
37290
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
37291
  }
37292
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
37293
    return wuffs_base__make_status(
37294
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
37295
        ? wuffs_base__error__disabled_by_previous_error
37296
        : wuffs_base__error__initialize_not_called);
37297
  }
37298
  if (!a_dst || !a_src) {
37299
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37300
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
37301
  }
37302
  if ((self->private_impl.active_coroutine != 0) &&
37303
      (self->private_impl.active_coroutine != 1)) {
37304
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37305
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
37306
  }
37307
  self->private_impl.active_coroutine = 0;
37308
  wuffs_base__status status = wuffs_base__make_status(NULL);
37309
37310
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
37311
37312
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
37313
  switch (coro_susp_point) {
37314
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37315
37316
    while (true) {
37317
      {
37318
        wuffs_base__status t_0 = wuffs_bzip2__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
37319
        v_status = t_0;
37320
      }
37321
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
37322
        status = wuffs_base__make_status(wuffs_bzip2__error__truncated_input);
37323
        goto exit;
37324
      }
37325
      status = v_status;
37326
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
37327
    }
37328
37329
    ok:
37330
    self->private_impl.p_transform_io = 0;
37331
    goto exit;
37332
  }
37333
37334
  goto suspend;
37335
  suspend:
37336
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37337
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
37338
37339
  goto exit;
37340
  exit:
37341
  if (wuffs_base__status__is_error(&status)) {
37342
    self->private_impl.magic = WUFFS_BASE__DISABLED;
37343
  }
37344
  return status;
37345
}
37346
37347
// -------- func bzip2.decoder.do_transform_io
37348
37349
WUFFS_BASE__GENERATED_C_CODE
37350
static wuffs_base__status
37351
wuffs_bzip2__decoder__do_transform_io(
37352
    wuffs_bzip2__decoder* self,
37353
    wuffs_base__io_buffer* a_dst,
37354
    wuffs_base__io_buffer* a_src,
37355
    wuffs_base__slice_u8 a_workbuf) {
37356
  wuffs_base__status status = wuffs_base__make_status(NULL);
37357
37358
  uint8_t v_c8 = 0;
37359
  uint32_t v_i = 0;
37360
  uint64_t v_tag = 0;
37361
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
37362
  uint32_t v_final_checksum_want = 0;
37363
37364
  const uint8_t* iop_a_src = NULL;
37365
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37366
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37367
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37368
  if (a_src && a_src->data.ptr) {
37369
    io0_a_src = a_src->data.ptr;
37370
    io1_a_src = io0_a_src + a_src->meta.ri;
37371
    iop_a_src = io1_a_src;
37372
    io2_a_src = io0_a_src + a_src->meta.wi;
37373
  }
37374
37375
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
37376
  if (coro_susp_point) {
37377
    v_i = self->private_data.s_do_transform_io.v_i;
37378
    v_tag = self->private_data.s_do_transform_io.v_tag;
37379
    v_final_checksum_want = self->private_data.s_do_transform_io.v_final_checksum_want;
37380
  }
37381
  switch (coro_susp_point) {
37382
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37383
37384
    {
37385
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37386
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37387
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37388
        goto suspend;
37389
      }
37390
      uint8_t t_0 = *iop_a_src++;
37391
      v_c8 = t_0;
37392
    }
37393
    if (v_c8 != 66u) {
37394
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
37395
      goto exit;
37396
    }
37397
    {
37398
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37399
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37400
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37401
        goto suspend;
37402
      }
37403
      uint8_t t_1 = *iop_a_src++;
37404
      v_c8 = t_1;
37405
    }
37406
    if (v_c8 != 90u) {
37407
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
37408
      goto exit;
37409
    }
37410
    {
37411
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
37412
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37413
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37414
        goto suspend;
37415
      }
37416
      uint8_t t_2 = *iop_a_src++;
37417
      v_c8 = t_2;
37418
    }
37419
    if (v_c8 != 104u) {
37420
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
37421
      goto exit;
37422
    }
37423
    {
37424
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
37425
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37426
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37427
        goto suspend;
37428
      }
37429
      uint8_t t_3 = *iop_a_src++;
37430
      v_c8 = t_3;
37431
    }
37432
    if ((v_c8 < 49u) || (57u < v_c8)) {
37433
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_header);
37434
      goto exit;
37435
    }
37436
    self->private_impl.f_max_incl_block_size = (((uint32_t)(((uint8_t)(v_c8 - 48u)))) * 100000u);
37437
    while (true) {
37438
      v_tag = 0u;
37439
      v_i = 0u;
37440
      while (v_i < 48u) {
37441
        if (self->private_impl.f_n_bits <= 0u) {
37442
          {
37443
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
37444
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37445
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37446
              goto suspend;
37447
            }
37448
            uint8_t t_4 = *iop_a_src++;
37449
            v_c8 = t_4;
37450
          }
37451
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37452
          self->private_impl.f_n_bits = 8u;
37453
        }
37454
        v_tag <<= 1u;
37455
        v_tag |= ((uint64_t)((self->private_impl.f_bits >> 31u)));
37456
        self->private_impl.f_bits <<= 1u;
37457
        self->private_impl.f_n_bits -= 1u;
37458
        v_i += 1u;
37459
      }
37460
      if (v_tag == 25779555029136u) {
37461
        break;
37462
      } else if (v_tag != 54156738319193u) {
37463
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37464
        goto exit;
37465
      }
37466
      if (a_src) {
37467
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37468
      }
37469
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
37470
      status = wuffs_bzip2__decoder__prepare_block(self, a_src);
37471
      if (a_src) {
37472
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
37473
      }
37474
      if (status.repr) {
37475
        goto suspend;
37476
      }
37477
      self->private_impl.f_block_size = 0u;
37478
      self->private_impl.f_decode_huffman_finished = false;
37479
      self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[0u] & 7u))];
37480
      self->private_impl.f_decode_huffman_ticks = 50u;
37481
      self->private_impl.f_decode_huffman_section = 0u;
37482
      self->private_impl.f_decode_huffman_run_shift = 0u;
37483
      while ( ! self->private_impl.f_decode_huffman_finished) {
37484
        if (a_src) {
37485
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37486
        }
37487
        v_status = wuffs_bzip2__decoder__decode_huffman_fast(self, a_src);
37488
        if (a_src) {
37489
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
37490
        }
37491
        if (wuffs_base__status__is_error(&v_status)) {
37492
          status = v_status;
37493
          goto exit;
37494
        } else if (self->private_impl.f_decode_huffman_finished) {
37495
          break;
37496
        }
37497
        if (a_src) {
37498
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37499
        }
37500
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
37501
        status = wuffs_bzip2__decoder__decode_huffman_slow(self, a_src);
37502
        if (a_src) {
37503
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
37504
        }
37505
        if (status.repr) {
37506
          goto suspend;
37507
        }
37508
      }
37509
      wuffs_bzip2__decoder__invert_bwt(self);
37510
      self->private_impl.f_block_checksum_have = 4294967295u;
37511
      if (self->private_impl.f_original_pointer >= self->private_impl.f_block_size) {
37512
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
37513
        goto exit;
37514
      }
37515
      self->private_impl.f_flush_pointer = (self->private_data.f_bwt[self->private_impl.f_original_pointer] >> 12u);
37516
      self->private_impl.f_flush_repeat_count = 0u;
37517
      self->private_impl.f_flush_prev = 0u;
37518
      while (self->private_impl.f_block_size > 0u) {
37519
        wuffs_bzip2__decoder__flush_fast(self, a_dst);
37520
        if (self->private_impl.f_block_size <= 0u) {
37521
          break;
37522
        }
37523
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
37524
        status = wuffs_bzip2__decoder__flush_slow(self, a_dst);
37525
        if (status.repr) {
37526
          goto suspend;
37527
        }
37528
      }
37529
      self->private_impl.f_block_checksum_have ^= 4294967295u;
37530
      if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_block_checksum_have != self->private_impl.f_block_checksum_want)) {
37531
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
37532
        goto exit;
37533
      }
37534
      self->private_impl.f_final_checksum_have = (self->private_impl.f_block_checksum_have ^ ((self->private_impl.f_final_checksum_have >> 31u) | ((uint32_t)(self->private_impl.f_final_checksum_have << 1u))));
37535
    }
37536
    v_final_checksum_want = 0u;
37537
    v_i = 0u;
37538
    while (v_i < 32u) {
37539
      if (self->private_impl.f_n_bits <= 0u) {
37540
        {
37541
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
37542
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37543
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37544
            goto suspend;
37545
          }
37546
          uint8_t t_5 = *iop_a_src++;
37547
          v_c8 = t_5;
37548
        }
37549
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37550
        self->private_impl.f_n_bits = 8u;
37551
      }
37552
      v_final_checksum_want <<= 1u;
37553
      v_final_checksum_want |= (self->private_impl.f_bits >> 31u);
37554
      self->private_impl.f_bits <<= 1u;
37555
      self->private_impl.f_n_bits -= 1u;
37556
      v_i += 1u;
37557
    }
37558
    if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_final_checksum_have != v_final_checksum_want)) {
37559
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_checksum);
37560
      goto exit;
37561
    }
37562
37563
    goto ok;
37564
    ok:
37565
    self->private_impl.p_do_transform_io = 0;
37566
    goto exit;
37567
  }
37568
37569
  goto suspend;
37570
  suspend:
37571
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37572
  self->private_data.s_do_transform_io.v_i = v_i;
37573
  self->private_data.s_do_transform_io.v_tag = v_tag;
37574
  self->private_data.s_do_transform_io.v_final_checksum_want = v_final_checksum_want;
37575
37576
  goto exit;
37577
  exit:
37578
  if (a_src && a_src->data.ptr) {
37579
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37580
  }
37581
37582
  return status;
37583
}
37584
37585
// -------- func bzip2.decoder.prepare_block
37586
37587
WUFFS_BASE__GENERATED_C_CODE
37588
static wuffs_base__status
37589
wuffs_bzip2__decoder__prepare_block(
37590
    wuffs_bzip2__decoder* self,
37591
    wuffs_base__io_buffer* a_src) {
37592
  wuffs_base__status status = wuffs_base__make_status(NULL);
37593
37594
  uint8_t v_c8 = 0;
37595
  uint32_t v_i = 0;
37596
  uint32_t v_j = 0;
37597
  uint32_t v_selector = 0;
37598
  uint32_t v_sel_ff = 0;
37599
  uint8_t v_movee = 0;
37600
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
37601
37602
  const uint8_t* iop_a_src = NULL;
37603
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37604
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37605
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37606
  if (a_src && a_src->data.ptr) {
37607
    io0_a_src = a_src->data.ptr;
37608
    io1_a_src = io0_a_src + a_src->meta.ri;
37609
    iop_a_src = io1_a_src;
37610
    io2_a_src = io0_a_src + a_src->meta.wi;
37611
  }
37612
37613
  uint32_t coro_susp_point = self->private_impl.p_prepare_block;
37614
  if (coro_susp_point) {
37615
    v_i = self->private_data.s_prepare_block.v_i;
37616
    v_selector = self->private_data.s_prepare_block.v_selector;
37617
  }
37618
  switch (coro_susp_point) {
37619
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37620
37621
    self->private_impl.f_block_checksum_want = 0u;
37622
    v_i = 0u;
37623
    while (v_i < 32u) {
37624
      if (self->private_impl.f_n_bits <= 0u) {
37625
        {
37626
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37627
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37628
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37629
            goto suspend;
37630
          }
37631
          uint8_t t_0 = *iop_a_src++;
37632
          v_c8 = t_0;
37633
        }
37634
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37635
        self->private_impl.f_n_bits = 8u;
37636
      }
37637
      self->private_impl.f_block_checksum_want <<= 1u;
37638
      self->private_impl.f_block_checksum_want |= (self->private_impl.f_bits >> 31u);
37639
      self->private_impl.f_bits <<= 1u;
37640
      self->private_impl.f_n_bits -= 1u;
37641
      v_i += 1u;
37642
    }
37643
    if (self->private_impl.f_n_bits <= 0u) {
37644
      {
37645
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37646
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37647
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37648
          goto suspend;
37649
        }
37650
        uint8_t t_1 = *iop_a_src++;
37651
        v_c8 = t_1;
37652
      }
37653
      self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37654
      self->private_impl.f_n_bits = 8u;
37655
    }
37656
    if ((self->private_impl.f_bits >> 31u) != 0u) {
37657
      status = wuffs_base__make_status(wuffs_bzip2__error__unsupported_block_randomization);
37658
      goto exit;
37659
    }
37660
    self->private_impl.f_bits <<= 1u;
37661
    self->private_impl.f_n_bits -= 1u;
37662
    self->private_impl.f_original_pointer = 0u;
37663
    v_i = 0u;
37664
    while (v_i < 24u) {
37665
      if (self->private_impl.f_n_bits <= 0u) {
37666
        {
37667
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
37668
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37669
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37670
            goto suspend;
37671
          }
37672
          uint8_t t_2 = *iop_a_src++;
37673
          v_c8 = t_2;
37674
        }
37675
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37676
        self->private_impl.f_n_bits = 8u;
37677
      }
37678
      self->private_impl.f_original_pointer <<= 1u;
37679
      self->private_impl.f_original_pointer |= (self->private_impl.f_bits >> 31u);
37680
      self->private_impl.f_bits <<= 1u;
37681
      self->private_impl.f_n_bits -= 1u;
37682
      v_i += 1u;
37683
    }
37684
    v_i = 0u;
37685
    while (v_i < 256u) {
37686
      self->private_data.f_presence[v_i] = 0u;
37687
      v_i += 1u;
37688
    }
37689
    v_i = 0u;
37690
    while (v_i < 256u) {
37691
      if (self->private_impl.f_n_bits <= 0u) {
37692
        {
37693
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
37694
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37695
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37696
            goto suspend;
37697
          }
37698
          uint8_t t_3 = *iop_a_src++;
37699
          v_c8 = t_3;
37700
        }
37701
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37702
        self->private_impl.f_n_bits = 8u;
37703
      }
37704
      if ((self->private_impl.f_bits >> 31u) != 0u) {
37705
        self->private_data.f_presence[v_i] = 1u;
37706
      }
37707
      self->private_impl.f_bits <<= 1u;
37708
      self->private_impl.f_n_bits -= 1u;
37709
      v_i += 16u;
37710
    }
37711
    self->private_data.f_scratch = 0u;
37712
    v_i = 0u;
37713
    while (v_i < 256u) {
37714
      if (self->private_data.f_presence[v_i] == 0u) {
37715
        v_i += 16u;
37716
        continue;
37717
      }
37718
      while (true) {
37719
        if (self->private_impl.f_n_bits <= 0u) {
37720
          {
37721
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
37722
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37723
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37724
              goto suspend;
37725
            }
37726
            uint8_t t_4 = *iop_a_src++;
37727
            v_c8 = t_4;
37728
          }
37729
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37730
          self->private_impl.f_n_bits = 8u;
37731
        }
37732
        self->private_data.f_scratch += (self->private_impl.f_bits >> 31u);
37733
        self->private_data.f_presence[(v_i & 255u)] = ((uint8_t)((self->private_impl.f_bits >> 31u)));
37734
        self->private_impl.f_bits <<= 1u;
37735
        self->private_impl.f_n_bits -= 1u;
37736
        v_i += 1u;
37737
        if ((v_i & 15u) == 0u) {
37738
          break;
37739
        }
37740
      }
37741
    }
37742
    if ((self->private_data.f_scratch < 1u) || (256u < self->private_data.f_scratch)) {
37743
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37744
      goto exit;
37745
    }
37746
    self->private_impl.f_num_symbols = (self->private_data.f_scratch + 2u);
37747
    self->private_data.f_scratch = 0u;
37748
    v_i = 0u;
37749
    while (v_i < 3u) {
37750
      if (self->private_impl.f_n_bits <= 0u) {
37751
        {
37752
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
37753
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37754
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37755
            goto suspend;
37756
          }
37757
          uint8_t t_5 = *iop_a_src++;
37758
          v_c8 = t_5;
37759
        }
37760
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37761
        self->private_impl.f_n_bits = 8u;
37762
      }
37763
      self->private_data.f_scratch <<= 1u;
37764
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
37765
      self->private_impl.f_bits <<= 1u;
37766
      self->private_impl.f_n_bits -= 1u;
37767
      v_i += 1u;
37768
    }
37769
    if ((self->private_data.f_scratch < 2u) || (6u < self->private_data.f_scratch)) {
37770
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37771
      goto exit;
37772
    }
37773
    self->private_impl.f_num_huffman_codes = self->private_data.f_scratch;
37774
    self->private_data.f_scratch = 0u;
37775
    v_i = 0u;
37776
    while (v_i < 15u) {
37777
      if (self->private_impl.f_n_bits <= 0u) {
37778
        {
37779
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
37780
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37781
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37782
            goto suspend;
37783
          }
37784
          uint8_t t_6 = *iop_a_src++;
37785
          v_c8 = t_6;
37786
        }
37787
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37788
        self->private_impl.f_n_bits = 8u;
37789
      }
37790
      self->private_data.f_scratch <<= 1u;
37791
      self->private_data.f_scratch |= (self->private_impl.f_bits >> 31u);
37792
      self->private_impl.f_bits <<= 1u;
37793
      self->private_impl.f_n_bits -= 1u;
37794
      v_i += 1u;
37795
    }
37796
    if ((self->private_data.f_scratch < 1u) || (18001u < self->private_data.f_scratch)) {
37797
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37798
      goto exit;
37799
    }
37800
    self->private_impl.f_num_sections = self->private_data.f_scratch;
37801
    v_i = 0u;
37802
    while (v_i < self->private_impl.f_num_huffman_codes) {
37803
      self->private_data.f_mtft[v_i] = ((uint8_t)(v_i));
37804
      v_i += 1u;
37805
    }
37806
    v_i = 0u;
37807
    while (v_i < self->private_impl.f_num_sections) {
37808
      v_selector = 0u;
37809
      while (true) {
37810
        if (self->private_impl.f_n_bits <= 0u) {
37811
          {
37812
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
37813
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37814
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37815
              goto suspend;
37816
            }
37817
            uint8_t t_7 = *iop_a_src++;
37818
            v_c8 = t_7;
37819
          }
37820
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37821
          self->private_impl.f_n_bits = 8u;
37822
        }
37823
        if ((self->private_impl.f_bits >> 31u) == 0u) {
37824
          self->private_impl.f_bits <<= 1u;
37825
          self->private_impl.f_n_bits -= 1u;
37826
          break;
37827
        }
37828
        self->private_impl.f_bits <<= 1u;
37829
        self->private_impl.f_n_bits -= 1u;
37830
        v_selector += 1u;
37831
        if (v_selector >= self->private_impl.f_num_huffman_codes) {
37832
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37833
          goto exit;
37834
        }
37835
      }
37836
      if (v_selector == 0u) {
37837
        self->private_data.f_huffman_selectors[v_i] = self->private_data.f_mtft[0u];
37838
      } else {
37839
        v_sel_ff = (v_selector & 255u);
37840
        v_movee = self->private_data.f_mtft[v_sel_ff];
37841
        wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_sel_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_sel_ff));
37842
        self->private_data.f_mtft[0u] = v_movee;
37843
        self->private_data.f_huffman_selectors[v_i] = v_movee;
37844
      }
37845
      v_i += 1u;
37846
    }
37847
    v_i = 0u;
37848
    while (v_i < self->private_impl.f_num_huffman_codes) {
37849
      if (a_src) {
37850
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37851
      }
37852
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
37853
      status = wuffs_bzip2__decoder__read_code_lengths(self, a_src);
37854
      if (a_src) {
37855
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
37856
      }
37857
      if (status.repr) {
37858
        goto suspend;
37859
      }
37860
      v_status = wuffs_bzip2__decoder__build_huffman_tree(self, v_i);
37861
      if (wuffs_base__status__is_error(&v_status)) {
37862
        status = v_status;
37863
        goto exit;
37864
      }
37865
      wuffs_bzip2__decoder__build_huffman_table(self, v_i);
37866
      v_i += 1u;
37867
    }
37868
    v_i = 0u;
37869
    v_j = 0u;
37870
    while (v_i < 256u) {
37871
      if (self->private_data.f_presence[v_i] != 0u) {
37872
        self->private_data.f_mtft[(v_j & 255u)] = ((uint8_t)(v_i));
37873
        v_j += 1u;
37874
      }
37875
      v_i += 1u;
37876
    }
37877
    v_i = 0u;
37878
    while (v_i < 256u) {
37879
      self->private_data.f_letter_counts[v_i] = 0u;
37880
      v_i += 1u;
37881
    }
37882
37883
    goto ok;
37884
    ok:
37885
    self->private_impl.p_prepare_block = 0;
37886
    goto exit;
37887
  }
37888
37889
  goto suspend;
37890
  suspend:
37891
  self->private_impl.p_prepare_block = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
37892
  self->private_data.s_prepare_block.v_i = v_i;
37893
  self->private_data.s_prepare_block.v_selector = v_selector;
37894
37895
  goto exit;
37896
  exit:
37897
  if (a_src && a_src->data.ptr) {
37898
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
37899
  }
37900
37901
  return status;
37902
}
37903
37904
// -------- func bzip2.decoder.read_code_lengths
37905
37906
WUFFS_BASE__GENERATED_C_CODE
37907
static wuffs_base__status
37908
wuffs_bzip2__decoder__read_code_lengths(
37909
    wuffs_bzip2__decoder* self,
37910
    wuffs_base__io_buffer* a_src) {
37911
  wuffs_base__status status = wuffs_base__make_status(NULL);
37912
37913
  uint8_t v_c8 = 0;
37914
  uint32_t v_i = 0;
37915
  uint32_t v_code_length = 0;
37916
37917
  const uint8_t* iop_a_src = NULL;
37918
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37919
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37920
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
37921
  if (a_src && a_src->data.ptr) {
37922
    io0_a_src = a_src->data.ptr;
37923
    io1_a_src = io0_a_src + a_src->meta.ri;
37924
    iop_a_src = io1_a_src;
37925
    io2_a_src = io0_a_src + a_src->meta.wi;
37926
  }
37927
37928
  uint32_t coro_susp_point = self->private_impl.p_read_code_lengths;
37929
  if (coro_susp_point) {
37930
    v_i = self->private_data.s_read_code_lengths.v_i;
37931
    v_code_length = self->private_data.s_read_code_lengths.v_code_length;
37932
  }
37933
  switch (coro_susp_point) {
37934
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
37935
37936
    self->private_impl.f_code_lengths_bitmask = 0u;
37937
    v_i = 0u;
37938
    while (v_i < 5u) {
37939
      if (self->private_impl.f_n_bits <= 0u) {
37940
        {
37941
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
37942
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37943
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37944
            goto suspend;
37945
          }
37946
          uint8_t t_0 = *iop_a_src++;
37947
          v_c8 = t_0;
37948
        }
37949
        self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37950
        self->private_impl.f_n_bits = 8u;
37951
      }
37952
      v_code_length <<= 1u;
37953
      v_code_length |= (self->private_impl.f_bits >> 31u);
37954
      self->private_impl.f_bits <<= 1u;
37955
      self->private_impl.f_n_bits -= 1u;
37956
      v_i += 1u;
37957
    }
37958
    v_i = 0u;
37959
    while (v_i < self->private_impl.f_num_symbols) {
37960
      while (true) {
37961
        if ((v_code_length < 1u) || (20u < v_code_length)) {
37962
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_header);
37963
          goto exit;
37964
        }
37965
        if (self->private_impl.f_n_bits <= 0u) {
37966
          {
37967
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
37968
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37969
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37970
              goto suspend;
37971
            }
37972
            uint8_t t_1 = *iop_a_src++;
37973
            v_c8 = t_1;
37974
          }
37975
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37976
          self->private_impl.f_n_bits = 8u;
37977
        }
37978
        if ((self->private_impl.f_bits >> 31u) == 0u) {
37979
          self->private_impl.f_bits <<= 1u;
37980
          self->private_impl.f_n_bits -= 1u;
37981
          break;
37982
        }
37983
        self->private_impl.f_bits <<= 1u;
37984
        self->private_impl.f_n_bits -= 1u;
37985
        if (self->private_impl.f_n_bits <= 0u) {
37986
          {
37987
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
37988
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
37989
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
37990
              goto suspend;
37991
            }
37992
            uint8_t t_2 = *iop_a_src++;
37993
            v_c8 = t_2;
37994
          }
37995
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
37996
          self->private_impl.f_n_bits = 8u;
37997
        }
37998
        if ((self->private_impl.f_bits >> 31u) == 0u) {
37999
          v_code_length += 1u;
38000
        } else {
38001
          v_code_length -= 1u;
38002
        }
38003
        self->private_impl.f_bits <<= 1u;
38004
        self->private_impl.f_n_bits -= 1u;
38005
      }
38006
      self->private_impl.f_code_lengths_bitmask |= (((uint32_t)(1u)) << (v_code_length & 31u));
38007
      self->private_data.f_bwt[v_i] = v_code_length;
38008
      v_i += 1u;
38009
    }
38010
38011
    goto ok;
38012
    ok:
38013
    self->private_impl.p_read_code_lengths = 0;
38014
    goto exit;
38015
  }
38016
38017
  goto suspend;
38018
  suspend:
38019
  self->private_impl.p_read_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38020
  self->private_data.s_read_code_lengths.v_i = v_i;
38021
  self->private_data.s_read_code_lengths.v_code_length = v_code_length;
38022
38023
  goto exit;
38024
  exit:
38025
  if (a_src && a_src->data.ptr) {
38026
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38027
  }
38028
38029
  return status;
38030
}
38031
38032
// -------- func bzip2.decoder.build_huffman_tree
38033
38034
WUFFS_BASE__GENERATED_C_CODE
38035
static wuffs_base__status
38036
wuffs_bzip2__decoder__build_huffman_tree(
38037
    wuffs_bzip2__decoder* self,
38038
    uint32_t a_which) {
38039
  uint32_t v_code_length = 0;
38040
  uint32_t v_symbol_index = 0;
38041
  uint32_t v_num_branch_nodes = 0;
38042
  uint32_t v_stack_height = 0;
38043
  uint32_t v_stack_values[21] = {0};
38044
  uint32_t v_node_index = 0;
38045
  uint16_t v_leaf_value = 0;
38046
38047
  self->private_data.f_huffman_trees[a_which][0u][0u] = 0u;
38048
  self->private_data.f_huffman_trees[a_which][0u][1u] = 0u;
38049
  v_num_branch_nodes = 1u;
38050
  v_stack_height = 1u;
38051
  v_stack_values[0u] = 0u;
38052
  v_code_length = 1u;
38053
  while (v_code_length <= 20u) {
38054
    if ((self->private_impl.f_code_lengths_bitmask & (((uint32_t)(1u)) << v_code_length)) == 0u) {
38055
      v_code_length += 1u;
38056
      continue;
38057
    }
38058
    v_symbol_index = 0u;
38059
    while (v_symbol_index < self->private_impl.f_num_symbols) {
38060
      if (self->private_data.f_bwt[v_symbol_index] != v_code_length) {
38061
        v_symbol_index += 1u;
38062
        continue;
38063
      }
38064
      while (true) {
38065
        if (v_stack_height <= 0u) {
38066
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_over_subscribed);
38067
        } else if (v_stack_height >= v_code_length) {
38068
          break;
38069
        }
38070
        v_node_index = v_stack_values[(v_stack_height - 1u)];
38071
        if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
38072
          self->private_data.f_huffman_trees[a_which][v_node_index][0u] = ((uint16_t)(v_num_branch_nodes));
38073
        } else {
38074
          self->private_data.f_huffman_trees[a_which][v_node_index][1u] = ((uint16_t)(v_num_branch_nodes));
38075
        }
38076
        if (v_num_branch_nodes >= 257u) {
38077
          return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
38078
        }
38079
        v_stack_values[v_stack_height] = v_num_branch_nodes;
38080
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][0u] = 0u;
38081
        self->private_data.f_huffman_trees[a_which][v_num_branch_nodes][1u] = 0u;
38082
        v_num_branch_nodes += 1u;
38083
        v_stack_height += 1u;
38084
      }
38085
      v_node_index = v_stack_values[(v_stack_height - 1u)];
38086
      if (v_symbol_index < 2u) {
38087
        v_leaf_value = ((uint16_t)((769u + v_symbol_index)));
38088
      } else if ((v_symbol_index + 1u) < self->private_impl.f_num_symbols) {
38089
        v_leaf_value = ((uint16_t)((511u + v_symbol_index)));
38090
      } else {
38091
        v_leaf_value = 768u;
38092
      }
38093
      if (self->private_data.f_huffman_trees[a_which][v_node_index][0u] == 0u) {
38094
        self->private_data.f_huffman_trees[a_which][v_node_index][0u] = v_leaf_value;
38095
      } else {
38096
        self->private_data.f_huffman_trees[a_which][v_node_index][1u] = v_leaf_value;
38097
        v_stack_height -= 1u;
38098
        while (v_stack_height > 0u) {
38099
          v_node_index = v_stack_values[(v_stack_height - 1u)];
38100
          if (self->private_data.f_huffman_trees[a_which][v_node_index][1u] == 0u) {
38101
            break;
38102
          }
38103
          v_stack_height -= 1u;
38104
        }
38105
      }
38106
      v_symbol_index += 1u;
38107
    }
38108
    v_code_length += 1u;
38109
  }
38110
  if (v_stack_height != 0u) {
38111
    return wuffs_base__make_status(wuffs_bzip2__error__bad_huffman_code_under_subscribed);
38112
  }
38113
  return wuffs_base__make_status(NULL);
38114
}
38115
38116
// -------- func bzip2.decoder.build_huffman_table
38117
38118
WUFFS_BASE__GENERATED_C_CODE
38119
static wuffs_base__empty_struct
38120
wuffs_bzip2__decoder__build_huffman_table(
38121
    wuffs_bzip2__decoder* self,
38122
    uint32_t a_which) {
38123
  uint32_t v_i = 0;
38124
  uint32_t v_bits = 0;
38125
  uint16_t v_n_bits = 0;
38126
  uint16_t v_child = 0;
38127
38128
  while (v_i < 256u) {
38129
    v_bits = (v_i << 24u);
38130
    v_n_bits = 0u;
38131
    v_child = 0u;
38132
    while ((v_child < 257u) && (v_n_bits < 8u)) {
38133
      v_child = self->private_data.f_huffman_trees[a_which][v_child][(v_bits >> 31u)];
38134
      v_bits <<= 1u;
38135
#if defined(__GNUC__)
38136
#pragma GCC diagnostic push
38137
#pragma GCC diagnostic ignored "-Wconversion"
38138
#endif
38139
      v_n_bits += 1u;
38140
#if defined(__GNUC__)
38141
#pragma GCC diagnostic pop
38142
#endif
38143
    }
38144
    self->private_data.f_huffman_tables[a_which][v_i] = ((uint16_t)(((uint16_t)(v_child | ((uint16_t)(v_n_bits << 12u))))));
38145
    v_i += 1u;
38146
  }
38147
  return wuffs_base__make_empty_struct();
38148
}
38149
38150
// -------- func bzip2.decoder.invert_bwt
38151
38152
WUFFS_BASE__GENERATED_C_CODE
38153
static wuffs_base__empty_struct
38154
wuffs_bzip2__decoder__invert_bwt(
38155
    wuffs_bzip2__decoder* self) {
38156
  uint32_t v_i = 0;
38157
  uint32_t v_letter = 0;
38158
  uint32_t v_sum = 0;
38159
  uint32_t v_old_sum = 0;
38160
38161
  v_sum = 0u;
38162
  v_i = 0u;
38163
  while (v_i < 256u) {
38164
    v_old_sum = v_sum;
38165
    v_sum += self->private_data.f_letter_counts[v_i];
38166
    self->private_data.f_letter_counts[v_i] = v_old_sum;
38167
    v_i += 1u;
38168
  }
38169
  v_i = 0u;
38170
  while (v_i < self->private_impl.f_block_size) {
38171
    v_letter = (self->private_data.f_bwt[v_i] & 255u);
38172
    self->private_data.f_bwt[(self->private_data.f_letter_counts[v_letter] & 1048575u)] |= (v_i << 12u);
38173
    self->private_data.f_letter_counts[v_letter] += 1u;
38174
    v_i += 1u;
38175
  }
38176
  return wuffs_base__make_empty_struct();
38177
}
38178
38179
// -------- func bzip2.decoder.flush_fast
38180
38181
WUFFS_BASE__GENERATED_C_CODE
38182
static wuffs_base__empty_struct
38183
wuffs_bzip2__decoder__flush_fast(
38184
    wuffs_bzip2__decoder* self,
38185
    wuffs_base__io_buffer* a_dst) {
38186
  uint32_t v_flush_pointer = 0;
38187
  uint32_t v_flush_repeat_count = 0;
38188
  uint8_t v_flush_prev = 0;
38189
  uint32_t v_block_checksum_have = 0;
38190
  uint32_t v_block_size = 0;
38191
  uint32_t v_entry = 0;
38192
  uint8_t v_curr = 0;
38193
38194
  uint8_t* iop_a_dst = NULL;
38195
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38196
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38197
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38198
  if (a_dst && a_dst->data.ptr) {
38199
    io0_a_dst = a_dst->data.ptr;
38200
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
38201
    iop_a_dst = io1_a_dst;
38202
    io2_a_dst = io0_a_dst + a_dst->data.len;
38203
    if (a_dst->meta.closed) {
38204
      io2_a_dst = iop_a_dst;
38205
    }
38206
  }
38207
38208
  v_flush_pointer = self->private_impl.f_flush_pointer;
38209
  v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
38210
  v_flush_prev = self->private_impl.f_flush_prev;
38211
  v_block_checksum_have = self->private_impl.f_block_checksum_have;
38212
  v_block_size = self->private_impl.f_block_size;
38213
  while ((v_block_size > 0u) && (((uint64_t)(io2_a_dst - iop_a_dst)) >= 255u)) {
38214
    if (v_flush_repeat_count < 4u) {
38215
      v_entry = self->private_data.f_bwt[v_flush_pointer];
38216
      v_curr = ((uint8_t)(v_entry));
38217
      v_flush_pointer = (v_entry >> 12u);
38218
      if (v_curr == v_flush_prev) {
38219
        v_flush_repeat_count += 1u;
38220
      } else {
38221
        v_flush_repeat_count = 1u;
38222
      }
38223
      v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u)));
38224
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_curr), iop_a_dst += 1);
38225
      v_flush_prev = v_curr;
38226
      v_block_size -= 1u;
38227
    } else {
38228
      v_entry = self->private_data.f_bwt[v_flush_pointer];
38229
      v_curr = ((uint8_t)(v_entry));
38230
      v_flush_pointer = (v_entry >> 12u);
38231
      v_flush_repeat_count = ((uint32_t)(v_curr));
38232
      while (v_flush_repeat_count > 0u) {
38233
        v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u)));
38234
        if (((uint64_t)(io2_a_dst - iop_a_dst)) > 0u) {
38235
          (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_flush_prev), iop_a_dst += 1);
38236
        }
38237
        v_flush_repeat_count -= 1u;
38238
      }
38239
      v_flush_repeat_count = 0u;
38240
      v_flush_prev = v_curr;
38241
      v_block_size -= 1u;
38242
    }
38243
  }
38244
  self->private_impl.f_flush_pointer = v_flush_pointer;
38245
  self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
38246
  self->private_impl.f_flush_prev = v_flush_prev;
38247
  self->private_impl.f_block_checksum_have = v_block_checksum_have;
38248
  if (v_block_size <= 900000u) {
38249
    self->private_impl.f_block_size = v_block_size;
38250
  }
38251
  if (a_dst && a_dst->data.ptr) {
38252
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
38253
  }
38254
38255
  return wuffs_base__make_empty_struct();
38256
}
38257
38258
// -------- func bzip2.decoder.flush_slow
38259
38260
WUFFS_BASE__GENERATED_C_CODE
38261
static wuffs_base__status
38262
wuffs_bzip2__decoder__flush_slow(
38263
    wuffs_bzip2__decoder* self,
38264
    wuffs_base__io_buffer* a_dst) {
38265
  wuffs_base__status status = wuffs_base__make_status(NULL);
38266
38267
  uint32_t v_flush_pointer = 0;
38268
  uint32_t v_flush_repeat_count = 0;
38269
  uint8_t v_flush_prev = 0;
38270
  uint32_t v_block_checksum_have = 0;
38271
  uint32_t v_block_size = 0;
38272
  uint32_t v_entry = 0;
38273
  uint8_t v_curr = 0;
38274
38275
  uint8_t* iop_a_dst = NULL;
38276
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38277
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38278
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38279
  if (a_dst && a_dst->data.ptr) {
38280
    io0_a_dst = a_dst->data.ptr;
38281
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
38282
    iop_a_dst = io1_a_dst;
38283
    io2_a_dst = io0_a_dst + a_dst->data.len;
38284
    if (a_dst->meta.closed) {
38285
      io2_a_dst = iop_a_dst;
38286
    }
38287
  }
38288
38289
  uint32_t coro_susp_point = self->private_impl.p_flush_slow;
38290
  if (coro_susp_point) {
38291
    v_flush_pointer = self->private_data.s_flush_slow.v_flush_pointer;
38292
    v_flush_repeat_count = self->private_data.s_flush_slow.v_flush_repeat_count;
38293
    v_flush_prev = self->private_data.s_flush_slow.v_flush_prev;
38294
    v_block_checksum_have = self->private_data.s_flush_slow.v_block_checksum_have;
38295
    v_block_size = self->private_data.s_flush_slow.v_block_size;
38296
    v_curr = self->private_data.s_flush_slow.v_curr;
38297
  }
38298
  switch (coro_susp_point) {
38299
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38300
38301
    v_flush_pointer = self->private_impl.f_flush_pointer;
38302
    v_flush_repeat_count = self->private_impl.f_flush_repeat_count;
38303
    v_flush_prev = self->private_impl.f_flush_prev;
38304
    v_block_checksum_have = self->private_impl.f_block_checksum_have;
38305
    v_block_size = self->private_impl.f_block_size;
38306
    while ((v_block_size > 0u) &&  ! (self->private_impl.p_flush_slow != 0)) {
38307
      if (v_flush_repeat_count < 4u) {
38308
        v_entry = self->private_data.f_bwt[v_flush_pointer];
38309
        v_curr = ((uint8_t)(v_entry));
38310
        v_flush_pointer = (v_entry >> 12u);
38311
        if (v_curr == v_flush_prev) {
38312
          v_flush_repeat_count += 1u;
38313
        } else {
38314
          v_flush_repeat_count = 1u;
38315
        }
38316
        v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_curr))] ^ ((uint32_t)(v_block_checksum_have << 8u)));
38317
        self->private_data.s_flush_slow.scratch = v_curr;
38318
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
38319
        if (iop_a_dst == io2_a_dst) {
38320
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38321
          goto suspend;
38322
        }
38323
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
38324
        v_flush_prev = v_curr;
38325
        v_block_size -= 1u;
38326
      } else {
38327
        v_entry = self->private_data.f_bwt[v_flush_pointer];
38328
        v_curr = ((uint8_t)(v_entry));
38329
        v_flush_pointer = (v_entry >> 12u);
38330
        v_flush_repeat_count = ((uint32_t)(v_curr));
38331
        while (v_flush_repeat_count > 0u) {
38332
          v_block_checksum_have = (WUFFS_BZIP2__REV_CRC32_TABLE[((uint8_t)(((uint8_t)((v_block_checksum_have >> 24u))) ^ v_flush_prev))] ^ ((uint32_t)(v_block_checksum_have << 8u)));
38333
          self->private_data.s_flush_slow.scratch = v_flush_prev;
38334
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
38335
          if (iop_a_dst == io2_a_dst) {
38336
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38337
            goto suspend;
38338
          }
38339
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_flush_slow.scratch));
38340
          v_flush_repeat_count -= 1u;
38341
        }
38342
        v_flush_repeat_count = 0u;
38343
        v_flush_prev = v_curr;
38344
        v_block_size -= 1u;
38345
      }
38346
    }
38347
    self->private_impl.f_flush_pointer = v_flush_pointer;
38348
    self->private_impl.f_flush_repeat_count = v_flush_repeat_count;
38349
    self->private_impl.f_flush_prev = v_flush_prev;
38350
    self->private_impl.f_block_checksum_have = v_block_checksum_have;
38351
    if (v_block_size <= 900000u) {
38352
      self->private_impl.f_block_size = v_block_size;
38353
    }
38354
38355
    goto ok;
38356
    ok:
38357
    self->private_impl.p_flush_slow = 0;
38358
    goto exit;
38359
  }
38360
38361
  goto suspend;
38362
  suspend:
38363
  self->private_impl.p_flush_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38364
  self->private_data.s_flush_slow.v_flush_pointer = v_flush_pointer;
38365
  self->private_data.s_flush_slow.v_flush_repeat_count = v_flush_repeat_count;
38366
  self->private_data.s_flush_slow.v_flush_prev = v_flush_prev;
38367
  self->private_data.s_flush_slow.v_block_checksum_have = v_block_checksum_have;
38368
  self->private_data.s_flush_slow.v_block_size = v_block_size;
38369
  self->private_data.s_flush_slow.v_curr = v_curr;
38370
38371
  goto exit;
38372
  exit:
38373
  if (a_dst && a_dst->data.ptr) {
38374
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
38375
  }
38376
38377
  return status;
38378
}
38379
38380
// -------- func bzip2.decoder.decode_huffman_fast
38381
38382
WUFFS_BASE__GENERATED_C_CODE
38383
static wuffs_base__status
38384
wuffs_bzip2__decoder__decode_huffman_fast(
38385
    wuffs_bzip2__decoder* self,
38386
    wuffs_base__io_buffer* a_src) {
38387
  wuffs_base__status status = wuffs_base__make_status(NULL);
38388
38389
  uint32_t v_bits = 0;
38390
  uint32_t v_n_bits = 0;
38391
  uint32_t v_block_size = 0;
38392
  uint8_t v_which = 0;
38393
  uint32_t v_ticks = 0;
38394
  uint32_t v_section = 0;
38395
  uint32_t v_run_shift = 0;
38396
  uint16_t v_table_entry = 0;
38397
  uint16_t v_child = 0;
38398
  uint32_t v_child_ff = 0;
38399
  uint32_t v_i = 0;
38400
  uint32_t v_j = 0;
38401
  uint32_t v_output = 0;
38402
  uint32_t v_run = 0;
38403
  uint32_t v_mtft0 = 0;
38404
38405
  const uint8_t* iop_a_src = NULL;
38406
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38407
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38408
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38409
  if (a_src && a_src->data.ptr) {
38410
    io0_a_src = a_src->data.ptr;
38411
    io1_a_src = io0_a_src + a_src->meta.ri;
38412
    iop_a_src = io1_a_src;
38413
    io2_a_src = io0_a_src + a_src->meta.wi;
38414
  }
38415
38416
  v_bits = self->private_impl.f_bits;
38417
  v_n_bits = self->private_impl.f_n_bits;
38418
  v_block_size = self->private_impl.f_block_size;
38419
  v_which = self->private_impl.f_decode_huffman_which;
38420
  v_ticks = self->private_impl.f_decode_huffman_ticks;
38421
  v_section = self->private_impl.f_decode_huffman_section;
38422
  v_run_shift = self->private_impl.f_decode_huffman_run_shift;
38423
  while (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
38424
    if (v_ticks > 0u) {
38425
      v_ticks -= 1u;
38426
    } else {
38427
      v_ticks = 49u;
38428
      v_section += 1u;
38429
      if (v_section >= self->private_impl.f_num_sections) {
38430
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
38431
        goto exit;
38432
      }
38433
      v_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(v_section & 32767u)] & 7u))];
38434
    }
38435
    v_bits |= (wuffs_base__peek_u32be__no_bounds_check(iop_a_src) >> v_n_bits);
38436
    iop_a_src += ((31u - v_n_bits) >> 3u);
38437
    v_n_bits |= 24u;
38438
    v_table_entry = self->private_data.f_huffman_tables[v_which][(v_bits >> 24u)];
38439
    v_bits <<= ((uint16_t)(v_table_entry >> 12u));
38440
    v_n_bits -= ((uint32_t)(((uint16_t)(v_table_entry >> 12u))));
38441
    v_child = ((uint16_t)(v_table_entry & 1023u));
38442
    while (v_child < 257u) {
38443
      v_child = self->private_data.f_huffman_trees[v_which][v_child][(v_bits >> 31u)];
38444
      v_bits <<= 1u;
38445
      if (v_n_bits <= 0u) {
38446
        status = wuffs_base__make_status(wuffs_bzip2__error__internal_error_inconsistent_huffman_decoder_state);
38447
        goto exit;
38448
      }
38449
      v_n_bits -= 1u;
38450
    }
38451
    if (v_child < 768u) {
38452
      v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
38453
      v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
38454
      wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff));
38455
      self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
38456
      self->private_data.f_letter_counts[v_output] += 1u;
38457
      self->private_data.f_bwt[v_block_size] = v_output;
38458
      if (v_block_size >= self->private_impl.f_max_incl_block_size) {
38459
        status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38460
        goto exit;
38461
      }
38462
      v_block_size += 1u;
38463
      v_run_shift = 0u;
38464
      continue;
38465
    } else if (v_child == 768u) {
38466
      self->private_impl.f_decode_huffman_finished = true;
38467
      break;
38468
    }
38469
    if (v_run_shift >= 23u) {
38470
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38471
      goto exit;
38472
    }
38473
    v_run = ((((uint32_t)(v_child)) & 3u) << v_run_shift);
38474
    v_run_shift += 1u;
38475
    v_i = v_block_size;
38476
    v_j = (v_run + v_block_size);
38477
    if (v_j > self->private_impl.f_max_incl_block_size) {
38478
      status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38479
      goto exit;
38480
    }
38481
    v_block_size = v_j;
38482
    v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
38483
    self->private_data.f_letter_counts[v_mtft0] += v_run;
38484
    while (v_i < v_j) {
38485
      self->private_data.f_bwt[v_i] = v_mtft0;
38486
      v_i += 1u;
38487
    }
38488
  }
38489
  self->private_impl.f_bits = v_bits;
38490
  self->private_impl.f_n_bits = v_n_bits;
38491
  self->private_impl.f_block_size = v_block_size;
38492
  self->private_impl.f_decode_huffman_which = v_which;
38493
  self->private_impl.f_decode_huffman_ticks = v_ticks;
38494
  self->private_impl.f_decode_huffman_section = v_section;
38495
  self->private_impl.f_decode_huffman_run_shift = v_run_shift;
38496
  status = wuffs_base__make_status(NULL);
38497
  goto ok;
38498
38499
  ok:
38500
  goto exit;
38501
  exit:
38502
  if (a_src && a_src->data.ptr) {
38503
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38504
  }
38505
38506
  return status;
38507
}
38508
38509
// -------- func bzip2.decoder.decode_huffman_slow
38510
38511
WUFFS_BASE__GENERATED_C_CODE
38512
static wuffs_base__status
38513
wuffs_bzip2__decoder__decode_huffman_slow(
38514
    wuffs_bzip2__decoder* self,
38515
    wuffs_base__io_buffer* a_src) {
38516
  wuffs_base__status status = wuffs_base__make_status(NULL);
38517
38518
  uint8_t v_c8 = 0;
38519
  uint32_t v_node_index = 0;
38520
  uint16_t v_child = 0;
38521
  uint32_t v_child_ff = 0;
38522
  uint32_t v_i = 0;
38523
  uint32_t v_j = 0;
38524
  uint32_t v_output = 0;
38525
  uint32_t v_run = 0;
38526
  uint32_t v_mtft0 = 0;
38527
38528
  const uint8_t* iop_a_src = NULL;
38529
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38530
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38531
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38532
  if (a_src && a_src->data.ptr) {
38533
    io0_a_src = a_src->data.ptr;
38534
    io1_a_src = io0_a_src + a_src->meta.ri;
38535
    iop_a_src = io1_a_src;
38536
    io2_a_src = io0_a_src + a_src->meta.wi;
38537
  }
38538
38539
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
38540
  if (coro_susp_point) {
38541
    v_node_index = self->private_data.s_decode_huffman_slow.v_node_index;
38542
  }
38543
  switch (coro_susp_point) {
38544
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38545
38546
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
38547
      if (self->private_impl.f_decode_huffman_ticks > 0u) {
38548
        self->private_impl.f_decode_huffman_ticks -= 1u;
38549
      } else {
38550
        self->private_impl.f_decode_huffman_ticks = 49u;
38551
        self->private_impl.f_decode_huffman_section += 1u;
38552
        if (self->private_impl.f_decode_huffman_section >= self->private_impl.f_num_sections) {
38553
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_number_of_sections);
38554
          goto exit;
38555
        }
38556
        self->private_impl.f_decode_huffman_which = WUFFS_BZIP2__CLAMP_TO_5[((uint8_t)(self->private_data.f_huffman_selectors[(self->private_impl.f_decode_huffman_section & 32767u)] & 7u))];
38557
      }
38558
      v_node_index = 0u;
38559
      while (true) {
38560
        if (self->private_impl.f_n_bits <= 0u) {
38561
          {
38562
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
38563
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
38564
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38565
              goto suspend;
38566
            }
38567
            uint8_t t_0 = *iop_a_src++;
38568
            v_c8 = t_0;
38569
          }
38570
          self->private_impl.f_bits = (((uint32_t)(v_c8)) << 24u);
38571
          self->private_impl.f_n_bits = 8u;
38572
        }
38573
        v_child = self->private_data.f_huffman_trees[self->private_impl.f_decode_huffman_which][v_node_index][(self->private_impl.f_bits >> 31u)];
38574
        self->private_impl.f_bits <<= 1u;
38575
        self->private_impl.f_n_bits -= 1u;
38576
        if (v_child < 257u) {
38577
          v_node_index = ((uint32_t)(v_child));
38578
          continue;
38579
        } else if (v_child < 768u) {
38580
          v_child_ff = ((uint32_t)(((uint16_t)(v_child & 255u))));
38581
          v_output = ((uint32_t)(self->private_data.f_mtft[v_child_ff]));
38582
          wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_mtft, 1, (1u + v_child_ff)), wuffs_base__make_slice_u8(self->private_data.f_mtft, v_child_ff));
38583
          self->private_data.f_mtft[0u] = ((uint8_t)(v_output));
38584
          self->private_data.f_letter_counts[v_output] += 1u;
38585
          self->private_data.f_bwt[self->private_impl.f_block_size] = v_output;
38586
          if (self->private_impl.f_block_size >= self->private_impl.f_max_incl_block_size) {
38587
            status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38588
            goto exit;
38589
          }
38590
          self->private_impl.f_block_size += 1u;
38591
          self->private_impl.f_decode_huffman_run_shift = 0u;
38592
          break;
38593
        } else if (v_child == 768u) {
38594
          self->private_impl.f_decode_huffman_finished = true;
38595
          goto label__outer__break;
38596
        }
38597
        if (self->private_impl.f_decode_huffman_run_shift >= 23u) {
38598
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38599
          goto exit;
38600
        }
38601
        v_run = ((((uint32_t)(v_child)) & 3u) << self->private_impl.f_decode_huffman_run_shift);
38602
        self->private_impl.f_decode_huffman_run_shift += 1u;
38603
        v_i = self->private_impl.f_block_size;
38604
        v_j = (v_run + self->private_impl.f_block_size);
38605
        if (v_j > self->private_impl.f_max_incl_block_size) {
38606
          status = wuffs_base__make_status(wuffs_bzip2__error__bad_block_length);
38607
          goto exit;
38608
        }
38609
        self->private_impl.f_block_size = v_j;
38610
        v_mtft0 = ((uint32_t)(self->private_data.f_mtft[0u]));
38611
        self->private_data.f_letter_counts[v_mtft0] += v_run;
38612
        while (v_i < v_j) {
38613
          self->private_data.f_bwt[v_i] = v_mtft0;
38614
          v_i += 1u;
38615
        }
38616
        break;
38617
      }
38618
    }
38619
    label__outer__break:;
38620
38621
    goto ok;
38622
    ok:
38623
    self->private_impl.p_decode_huffman_slow = 0;
38624
    goto exit;
38625
  }
38626
38627
  goto suspend;
38628
  suspend:
38629
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
38630
  self->private_data.s_decode_huffman_slow.v_node_index = v_node_index;
38631
38632
  goto exit;
38633
  exit:
38634
  if (a_src && a_src->data.ptr) {
38635
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
38636
  }
38637
38638
  return status;
38639
}
38640
38641
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BZIP2)
38642
38643
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
38644
38645
// ---------------- Status Codes Implementations
38646
38647
const char wuffs_cbor__error__bad_input[] = "#cbor: bad input";
38648
const char wuffs_cbor__error__unsupported_recursion_depth[] = "#cbor: unsupported recursion depth";
38649
const char wuffs_cbor__error__internal_error_inconsistent_i_o[] = "#cbor: internal error: inconsistent I/O";
38650
const char wuffs_cbor__error__internal_error_inconsistent_token_length[] = "#cbor: internal error: inconsistent token length";
38651
38652
// ---------------- Private Consts
38653
38654
static const uint32_t
38655
WUFFS_CBOR__LITERALS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
38656
  8388612u, 8388616u, 8388610u, 8388609u,
38657
};
38658
38659
static const uint8_t
38660
WUFFS_CBOR__TOKEN_LENGTHS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
38661
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
38662
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
38663
  1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
38664
  2u, 3u, 5u, 9u, 0u, 0u, 0u, 1u,
38665
};
38666
38667
// ---------------- Private Initializer Prototypes
38668
38669
// ---------------- Private Function Prototypes
38670
38671
// ---------------- VTables
38672
38673
const wuffs_base__token_decoder__func_ptrs
38674
wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder = {
38675
  (wuffs_base__status(*)(void*,
38676
      wuffs_base__token_buffer*,
38677
      wuffs_base__io_buffer*,
38678
      wuffs_base__slice_u8))(&wuffs_cbor__decoder__decode_tokens),
38679
  (uint64_t(*)(const void*,
38680
      uint32_t))(&wuffs_cbor__decoder__get_quirk),
38681
  (wuffs_base__status(*)(void*,
38682
      uint32_t,
38683
      uint64_t))(&wuffs_cbor__decoder__set_quirk),
38684
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_cbor__decoder__workbuf_len),
38685
};
38686
38687
// ---------------- Initializer Implementations
38688
38689
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
38690
wuffs_cbor__decoder__initialize(
38691
    wuffs_cbor__decoder* self,
38692
    size_t sizeof_star_self,
38693
    uint64_t wuffs_version,
38694
    uint32_t options){
38695
  if (!self) {
38696
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38697
  }
38698
  if (sizeof(*self) != sizeof_star_self) {
38699
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
38700
  }
38701
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
38702
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
38703
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
38704
  }
38705
38706
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
38707
    // The whole point of this if-check is to detect an uninitialized *self.
38708
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
38709
#if !defined(__clang__) && defined(__GNUC__)
38710
#pragma GCC diagnostic push
38711
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
38712
#endif
38713
    if (self->private_impl.magic != 0) {
38714
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
38715
    }
38716
#if !defined(__clang__) && defined(__GNUC__)
38717
#pragma GCC diagnostic pop
38718
#endif
38719
  } else {
38720
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
38721
      memset(self, 0, sizeof(*self));
38722
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
38723
    } else {
38724
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
38725
    }
38726
  }
38727
38728
  self->private_impl.magic = WUFFS_BASE__MAGIC;
38729
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
38730
      wuffs_base__token_decoder__vtable_name;
38731
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
38732
      (const void*)(&wuffs_cbor__decoder__func_ptrs_for__wuffs_base__token_decoder);
38733
  return wuffs_base__make_status(NULL);
38734
}
38735
38736
wuffs_cbor__decoder*
38737
wuffs_cbor__decoder__alloc(void) {
38738
  wuffs_cbor__decoder* x =
38739
      (wuffs_cbor__decoder*)(calloc(1, sizeof(wuffs_cbor__decoder)));
38740
  if (!x) {
38741
    return NULL;
38742
  }
38743
  if (wuffs_cbor__decoder__initialize(
38744
      x, sizeof(wuffs_cbor__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
38745
    free(x);
38746
    return NULL;
38747
  }
38748
  return x;
38749
}
38750
38751
size_t
38752
sizeof__wuffs_cbor__decoder(void) {
38753
  return sizeof(wuffs_cbor__decoder);
38754
}
38755
38756
// ---------------- Function Implementations
38757
38758
// -------- func cbor.decoder.get_quirk
38759
38760
WUFFS_BASE__GENERATED_C_CODE
38761
WUFFS_BASE__MAYBE_STATIC uint64_t
38762
wuffs_cbor__decoder__get_quirk(
38763
    const wuffs_cbor__decoder* self,
38764
    uint32_t a_key) {
38765
  if (!self) {
38766
    return 0;
38767
  }
38768
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
38769
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
38770
    return 0;
38771
  }
38772
38773
  return 0u;
38774
}
38775
38776
// -------- func cbor.decoder.set_quirk
38777
38778
WUFFS_BASE__GENERATED_C_CODE
38779
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
38780
wuffs_cbor__decoder__set_quirk(
38781
    wuffs_cbor__decoder* self,
38782
    uint32_t a_key,
38783
    uint64_t a_value) {
38784
  if (!self) {
38785
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38786
  }
38787
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
38788
    return wuffs_base__make_status(
38789
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
38790
        ? wuffs_base__error__disabled_by_previous_error
38791
        : wuffs_base__error__initialize_not_called);
38792
  }
38793
38794
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
38795
}
38796
38797
// -------- func cbor.decoder.workbuf_len
38798
38799
WUFFS_BASE__GENERATED_C_CODE
38800
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
38801
wuffs_cbor__decoder__workbuf_len(
38802
    const wuffs_cbor__decoder* self) {
38803
  if (!self) {
38804
    return wuffs_base__utility__empty_range_ii_u64();
38805
  }
38806
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
38807
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
38808
    return wuffs_base__utility__empty_range_ii_u64();
38809
  }
38810
38811
  return wuffs_base__utility__empty_range_ii_u64();
38812
}
38813
38814
// -------- func cbor.decoder.decode_tokens
38815
38816
WUFFS_BASE__GENERATED_C_CODE
38817
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
38818
wuffs_cbor__decoder__decode_tokens(
38819
    wuffs_cbor__decoder* self,
38820
    wuffs_base__token_buffer* a_dst,
38821
    wuffs_base__io_buffer* a_src,
38822
    wuffs_base__slice_u8 a_workbuf) {
38823
  if (!self) {
38824
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
38825
  }
38826
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
38827
    return wuffs_base__make_status(
38828
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
38829
        ? wuffs_base__error__disabled_by_previous_error
38830
        : wuffs_base__error__initialize_not_called);
38831
  }
38832
  if (!a_dst || !a_src) {
38833
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38834
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
38835
  }
38836
  if ((self->private_impl.active_coroutine != 0) &&
38837
      (self->private_impl.active_coroutine != 1)) {
38838
    self->private_impl.magic = WUFFS_BASE__DISABLED;
38839
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
38840
  }
38841
  self->private_impl.active_coroutine = 0;
38842
  wuffs_base__status status = wuffs_base__make_status(NULL);
38843
38844
  uint64_t v_string_length = 0;
38845
  uint64_t v_n64 = 0;
38846
  uint32_t v_depth = 0;
38847
  uint32_t v_stack_byte = 0;
38848
  uint32_t v_stack_bit = 0;
38849
  uint32_t v_stack_val = 0;
38850
  uint32_t v_token_length = 0;
38851
  uint32_t v_vminor = 0;
38852
  uint32_t v_vminor_alt = 0;
38853
  uint32_t v_continued = 0;
38854
  uint8_t v_c8 = 0;
38855
  uint8_t v_c_major = 0;
38856
  uint8_t v_c_minor = 0;
38857
  bool v_tagged = false;
38858
  uint8_t v_indefinite_string_major_type = 0;
38859
38860
  wuffs_base__token* iop_a_dst = NULL;
38861
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38862
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38863
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38864
  if (a_dst && a_dst->data.ptr) {
38865
    io0_a_dst = a_dst->data.ptr;
38866
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
38867
    iop_a_dst = io1_a_dst;
38868
    io2_a_dst = io0_a_dst + a_dst->data.len;
38869
    if (a_dst->meta.closed) {
38870
      io2_a_dst = iop_a_dst;
38871
    }
38872
  }
38873
  const uint8_t* iop_a_src = NULL;
38874
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38875
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38876
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
38877
  if (a_src && a_src->data.ptr) {
38878
    io0_a_src = a_src->data.ptr;
38879
    io1_a_src = io0_a_src + a_src->meta.ri;
38880
    iop_a_src = io1_a_src;
38881
    io2_a_src = io0_a_src + a_src->meta.wi;
38882
  }
38883
38884
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
38885
  if (coro_susp_point) {
38886
    v_string_length = self->private_data.s_decode_tokens.v_string_length;
38887
    v_depth = self->private_data.s_decode_tokens.v_depth;
38888
    v_tagged = self->private_data.s_decode_tokens.v_tagged;
38889
    v_indefinite_string_major_type = self->private_data.s_decode_tokens.v_indefinite_string_major_type;
38890
  }
38891
  switch (coro_susp_point) {
38892
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
38893
38894
    if (self->private_impl.f_end_of_data) {
38895
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
38896
      goto ok;
38897
    }
38898
    label__outer__continue:;
38899
    while (true) {
38900
      while (true) {
38901
        do {
38902
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
38903
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
38904
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
38905
            goto label__outer__continue;
38906
          }
38907
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
38908
            if (a_src && a_src->meta.closed) {
38909
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38910
              goto exit;
38911
            }
38912
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38913
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
38914
            goto label__outer__continue;
38915
          }
38916
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
38917
          if ((v_indefinite_string_major_type != 0u) && (v_indefinite_string_major_type != ((uint8_t)(v_c8 >> 5u)))) {
38918
            if (v_c8 != 255u) {
38919
              status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38920
              goto exit;
38921
            }
38922
            v_vminor = 4194560u;
38923
            if (v_indefinite_string_major_type == 3u) {
38924
              v_vminor |= 19u;
38925
            }
38926
            v_indefinite_string_major_type = 0u;
38927
            iop_a_src += 1u;
38928
            *iop_a_dst++ = wuffs_base__make_token(
38929
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38930
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38931
            goto label__goto_parsed_a_leaf_value__break;
38932
          }
38933
          iop_a_src += 1u;
38934
          v_c_major = ((uint8_t)(((uint8_t)(v_c8 >> 5u))));
38935
          v_c_minor = ((uint8_t)(v_c8 & 31u));
38936
          if (v_c_minor < 24u) {
38937
            v_string_length = ((uint64_t)(v_c_minor));
38938
          } else {
38939
            while (true) {
38940
              if (v_c_minor == 24u) {
38941
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 1u) {
38942
                  v_string_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
38943
                  iop_a_src += 1u;
38944
                  break;
38945
                }
38946
              } else if (v_c_minor == 25u) {
38947
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 2u) {
38948
                  v_string_length = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
38949
                  iop_a_src += 2u;
38950
                  break;
38951
                }
38952
              } else if (v_c_minor == 26u) {
38953
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
38954
                  v_string_length = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
38955
                  iop_a_src += 4u;
38956
                  break;
38957
                }
38958
              } else if (v_c_minor == 27u) {
38959
                if (((uint64_t)(io2_a_src - iop_a_src)) >= 8u) {
38960
                  v_string_length = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
38961
                  iop_a_src += 8u;
38962
                  break;
38963
                }
38964
              } else {
38965
                v_string_length = 0u;
38966
                break;
38967
              }
38968
              if (iop_a_src > io1_a_src) {
38969
                iop_a_src--;
38970
                if (a_src && a_src->meta.closed) {
38971
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
38972
                  goto exit;
38973
                }
38974
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
38975
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
38976
                goto label__outer__continue;
38977
              }
38978
              status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
38979
              goto exit;
38980
            }
38981
          }
38982
          if (v_c_major == 0u) {
38983
            if (v_c_minor < 26u) {
38984
              *iop_a_dst++ = wuffs_base__make_token(
38985
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length & 65535u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38986
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38987
              goto label__goto_parsed_a_leaf_value__break;
38988
            } else if (v_c_minor < 28u) {
38989
              *iop_a_dst++ = wuffs_base__make_token(
38990
                  (((uint64_t)((14680064u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
38991
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
38992
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38993
              *iop_a_dst++ = wuffs_base__make_token(
38994
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
38995
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
38996
              goto label__goto_parsed_a_leaf_value__break;
38997
            }
38998
          } else if (v_c_major == 1u) {
38999
            if (v_c_minor < 26u) {
39000
              *iop_a_dst++ = wuffs_base__make_token(
39001
                  (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length & 65535u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39002
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39003
              goto label__goto_parsed_a_leaf_value__break;
39004
            } else if (v_c_minor < 28u) {
39005
              if (v_string_length < 9223372036854775808u) {
39006
                *iop_a_dst++ = wuffs_base__make_token(
39007
                    (((uint64_t)((12582912u | (2097151u - ((uint32_t)((v_string_length >> 46u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39008
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39009
                    (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39010
                *iop_a_dst++ = wuffs_base__make_token(
39011
                    (~((18446744073709551615u - v_string_length) & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
39012
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39013
              } else {
39014
                *iop_a_dst++ = wuffs_base__make_token(
39015
                    (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39016
                    (((uint64_t)(16777216u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39017
                    (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39018
              }
39019
              goto label__goto_parsed_a_leaf_value__break;
39020
            }
39021
          } else if (v_c_major == 2u) {
39022
            if (v_c_minor < 28u) {
39023
              if (v_string_length == 0u) {
39024
                *iop_a_dst++ = wuffs_base__make_token(
39025
                    (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39026
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39027
                goto label__goto_parsed_a_leaf_value__break;
39028
              }
39029
              *iop_a_dst++ = wuffs_base__make_token(
39030
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39031
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39032
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39033
            } else if (v_c_minor == 31u) {
39034
              if (v_indefinite_string_major_type != 0u) {
39035
                break;
39036
              }
39037
              v_indefinite_string_major_type = 2u;
39038
              *iop_a_dst++ = wuffs_base__make_token(
39039
                  (((uint64_t)(4194560u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39040
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39041
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39042
              goto label__outer__continue;
39043
            } else {
39044
              break;
39045
            }
39046
            while (true) {
39047
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
39048
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39049
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
39050
                continue;
39051
              }
39052
              v_n64 = wuffs_base__u64__min(v_string_length, ((uint64_t)(io2_a_src - iop_a_src)));
39053
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
39054
              if (v_n64 > 65535u) {
39055
                v_token_length = 65535u;
39056
              } else if (v_token_length <= 0u) {
39057
                if (a_src && a_src->meta.closed) {
39058
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39059
                  goto exit;
39060
                }
39061
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39062
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
39063
                continue;
39064
              }
39065
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
39066
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
39067
                goto exit;
39068
              }
39069
              v_string_length -= ((uint64_t)(v_token_length));
39070
              v_continued = 0u;
39071
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
39072
                v_continued = 1u;
39073
              }
39074
              iop_a_src += v_token_length;
39075
              *iop_a_dst++ = wuffs_base__make_token(
39076
                  (((uint64_t)(4194816u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39077
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39078
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39079
              if (v_string_length > 0u) {
39080
                continue;
39081
              } else if (v_indefinite_string_major_type > 0u) {
39082
                goto label__outer__continue;
39083
              }
39084
              goto label__goto_parsed_a_leaf_value__break;
39085
            }
39086
          } else if (v_c_major == 3u) {
39087
            if (v_c_minor < 28u) {
39088
              if (v_string_length == 0u) {
39089
                *iop_a_dst++ = wuffs_base__make_token(
39090
                    (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39091
                    (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39092
                goto label__goto_parsed_a_leaf_value__break;
39093
              }
39094
              *iop_a_dst++ = wuffs_base__make_token(
39095
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39096
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39097
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39098
            } else if (v_c_minor == 31u) {
39099
              if (v_indefinite_string_major_type != 0u) {
39100
                break;
39101
              }
39102
              v_indefinite_string_major_type = 3u;
39103
              *iop_a_dst++ = wuffs_base__make_token(
39104
                  (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39105
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39106
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39107
              goto label__outer__continue;
39108
            } else {
39109
              break;
39110
            }
39111
            while (true) {
39112
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
39113
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39114
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
39115
                continue;
39116
              }
39117
              v_n64 = wuffs_base__u64__min(v_string_length, 65535u);
39118
              v_n64 = ((uint64_t)(wuffs_base__utf_8__longest_valid_prefix(iop_a_src,
39119
                  ((size_t)(wuffs_base__u64__min(((uint64_t)(io2_a_src - iop_a_src)), v_n64))))));
39120
              v_token_length = ((uint32_t)((v_n64 & 65535u)));
39121
              if (v_token_length <= 0u) {
39122
                if ((a_src && a_src->meta.closed) || (((uint64_t)(io2_a_src - iop_a_src)) >= 4u)) {
39123
                  status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39124
                  goto exit;
39125
                }
39126
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
39127
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
39128
                continue;
39129
              }
39130
              if (((uint64_t)(io2_a_src - iop_a_src)) < ((uint64_t)(v_token_length))) {
39131
                status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_token_length);
39132
                goto exit;
39133
              }
39134
              v_string_length -= ((uint64_t)(v_token_length));
39135
              v_continued = 0u;
39136
              if ((v_string_length > 0u) || (v_indefinite_string_major_type > 0u)) {
39137
                v_continued = 1u;
39138
              }
39139
              iop_a_src += v_token_length;
39140
              *iop_a_dst++ = wuffs_base__make_token(
39141
                  (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39142
                  (((uint64_t)(v_continued)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39143
                  (((uint64_t)(v_token_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39144
              if (v_string_length > 0u) {
39145
                continue;
39146
              } else if (v_indefinite_string_major_type > 0u) {
39147
                goto label__outer__continue;
39148
              }
39149
              goto label__goto_parsed_a_leaf_value__break;
39150
            }
39151
          } else if (v_c_major == 4u) {
39152
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
39153
              break;
39154
            } else if (v_depth >= 1024u) {
39155
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
39156
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
39157
                iop_a_src--;
39158
                v_token_length -= 1u;
39159
              }
39160
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
39161
              goto exit;
39162
            }
39163
            v_vminor = 2105361u;
39164
            v_vminor_alt = 2101282u;
39165
            if (v_depth > 0u) {
39166
              v_stack_byte = ((v_depth - 1u) / 16u);
39167
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
39168
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
39169
                v_vminor = 2105377u;
39170
                v_vminor_alt = 2105378u;
39171
              } else {
39172
                v_vminor = 2105409u;
39173
                v_vminor_alt = 2113570u;
39174
              }
39175
            }
39176
            *iop_a_dst++ = wuffs_base__make_token(
39177
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39178
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39179
            if (v_c_minor == 0u) {
39180
              *iop_a_dst++ = wuffs_base__make_token(
39181
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39182
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39183
              goto label__goto_parsed_a_leaf_value__break;
39184
            }
39185
            v_stack_byte = (v_depth / 16u);
39186
            v_stack_bit = ((v_depth & 15u) * 2u);
39187
            self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(3u)) << v_stack_bit));
39188
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
39189
            v_depth += 1u;
39190
            v_tagged = false;
39191
            goto label__outer__continue;
39192
          } else if (v_c_major == 5u) {
39193
            if (WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor] == 0u) {
39194
              break;
39195
            } else if (v_depth >= 1024u) {
39196
              v_token_length = ((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor]));
39197
              while ((v_token_length > 0u) && (iop_a_src > io1_a_src)) {
39198
                iop_a_src--;
39199
                v_token_length -= 1u;
39200
              }
39201
              status = wuffs_base__make_status(wuffs_cbor__error__unsupported_recursion_depth);
39202
              goto exit;
39203
            }
39204
            v_vminor = 2113553u;
39205
            v_vminor_alt = 2101314u;
39206
            if (v_depth > 0u) {
39207
              v_stack_byte = ((v_depth - 1u) / 16u);
39208
              v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
39209
              if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
39210
                v_vminor = 2113569u;
39211
                v_vminor_alt = 2105410u;
39212
              } else {
39213
                v_vminor = 2113601u;
39214
                v_vminor_alt = 2113602u;
39215
              }
39216
            }
39217
            *iop_a_dst++ = wuffs_base__make_token(
39218
                (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39219
                (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39220
            if (v_c_minor == 0u) {
39221
              *iop_a_dst++ = wuffs_base__make_token(
39222
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39223
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39224
              goto label__goto_parsed_a_leaf_value__break;
39225
            }
39226
            v_stack_byte = (v_depth / 16u);
39227
            v_stack_bit = ((v_depth & 15u) * 2u);
39228
            self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(3u)) << v_stack_bit);
39229
            self->private_data.f_container_num_remaining[v_depth] = v_string_length;
39230
            v_depth += 1u;
39231
            v_tagged = false;
39232
            goto label__outer__continue;
39233
          } else if (v_c_major == 6u) {
39234
            if (v_c_minor >= 28u) {
39235
              break;
39236
            }
39237
            if (v_string_length < 262144u) {
39238
              *iop_a_dst++ = wuffs_base__make_token(
39239
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39240
                  (((uint64_t)((4194304u | ((uint32_t)(v_string_length))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39241
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39242
            } else {
39243
              *iop_a_dst++ = wuffs_base__make_token(
39244
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39245
                  (((uint64_t)((4194304u | ((uint32_t)((v_string_length >> 46u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39246
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
39247
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39248
              *iop_a_dst++ = wuffs_base__make_token(
39249
                  (~(v_string_length & 70368744177663u) << WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT) |
39250
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39251
            }
39252
            v_tagged = true;
39253
            goto label__outer__continue;
39254
          } else if (v_c_major == 7u) {
39255
            if (v_c_minor < 20u) {
39256
              *iop_a_dst++ = wuffs_base__make_token(
39257
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39258
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39259
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39260
              goto label__goto_parsed_a_leaf_value__break;
39261
            } else if (v_c_minor < 24u) {
39262
              *iop_a_dst++ = wuffs_base__make_token(
39263
                  (((uint64_t)(WUFFS_CBOR__LITERALS[((uint8_t)(v_c_minor & 3u))])) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39264
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39265
              goto label__goto_parsed_a_leaf_value__break;
39266
            } else if (v_c_minor == 24u) {
39267
              if (v_string_length < 24u) {
39268
                if ( ! (iop_a_src > io1_a_src)) {
39269
                  status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
39270
                  goto exit;
39271
                }
39272
                iop_a_src--;
39273
                break;
39274
              }
39275
              *iop_a_dst++ = wuffs_base__make_token(
39276
                  (((uint64_t)(731642u)) << WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT) |
39277
                  (((uint64_t)((8388608u | ((uint32_t)((v_string_length & 255u)))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39278
                  (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39279
              goto label__goto_parsed_a_leaf_value__break;
39280
            } else if (v_c_minor < 28u) {
39281
              *iop_a_dst++ = wuffs_base__make_token(
39282
                  (((uint64_t)(10490113u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39283
                  (((uint64_t)(((uint32_t)(WUFFS_CBOR__TOKEN_LENGTHS[v_c_minor])))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39284
              goto label__goto_parsed_a_leaf_value__break;
39285
            } else if (v_c_minor == 31u) {
39286
              if (v_tagged || (v_depth <= 0u)) {
39287
                break;
39288
              }
39289
              v_depth -= 1u;
39290
              if (self->private_data.f_container_num_remaining[v_depth] != 0u) {
39291
                break;
39292
              }
39293
              v_stack_byte = (v_depth / 16u);
39294
              v_stack_bit = ((v_depth & 15u) * 2u);
39295
              v_stack_val = (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit));
39296
              if (v_stack_val == 1u) {
39297
                break;
39298
              }
39299
              if (v_stack_val != 3u) {
39300
                v_vminor_alt = 2097186u;
39301
              } else {
39302
                v_vminor_alt = 2097218u;
39303
              }
39304
              if (v_depth <= 0u) {
39305
                v_vminor_alt |= 4096u;
39306
              } else {
39307
                v_stack_byte = ((v_depth - 1u) / 16u);
39308
                v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
39309
                if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
39310
                  v_vminor_alt |= 8192u;
39311
                } else {
39312
                  v_vminor_alt |= 16384u;
39313
                }
39314
              }
39315
              *iop_a_dst++ = wuffs_base__make_token(
39316
                  (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39317
                  (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39318
              goto label__goto_parsed_a_leaf_value__break;
39319
            }
39320
          }
39321
        } while (0);
39322
        if (iop_a_src > io1_a_src) {
39323
          iop_a_src--;
39324
          status = wuffs_base__make_status(wuffs_cbor__error__bad_input);
39325
          goto exit;
39326
        }
39327
        status = wuffs_base__make_status(wuffs_cbor__error__internal_error_inconsistent_i_o);
39328
        goto exit;
39329
      }
39330
      label__goto_parsed_a_leaf_value__break:;
39331
      v_tagged = false;
39332
      while (v_depth > 0u) {
39333
        v_stack_byte = ((v_depth - 1u) / 16u);
39334
        v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
39335
        self->private_data.f_stack[v_stack_byte] ^= (((uint32_t)(1u)) << (v_stack_bit + 1u));
39336
        if (1u == (3u & (self->private_data.f_stack[v_stack_byte] >> v_stack_bit))) {
39337
          goto label__outer__continue;
39338
        }
39339
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] <= 0u) {
39340
          goto label__outer__continue;
39341
        }
39342
        self->private_data.f_container_num_remaining[(v_depth - 1u)] -= 1u;
39343
        if (self->private_data.f_container_num_remaining[(v_depth - 1u)] > 0u) {
39344
          goto label__outer__continue;
39345
        }
39346
        while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
39347
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
39348
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
39349
          continue;
39350
        }
39351
        v_depth -= 1u;
39352
        v_stack_byte = (v_depth / 16u);
39353
        v_stack_bit = ((v_depth & 15u) * 2u);
39354
        if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
39355
          v_vminor_alt = 2097186u;
39356
        } else {
39357
          v_vminor_alt = 2097218u;
39358
        }
39359
        if (v_depth <= 0u) {
39360
          v_vminor_alt |= 4096u;
39361
        } else {
39362
          v_stack_byte = ((v_depth - 1u) / 16u);
39363
          v_stack_bit = (((v_depth - 1u) & 15u) * 2u);
39364
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
39365
            v_vminor_alt |= 8192u;
39366
          } else {
39367
            v_vminor_alt |= 16384u;
39368
          }
39369
        }
39370
        *iop_a_dst++ = wuffs_base__make_token(
39371
            (((uint64_t)(v_vminor_alt)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
39372
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
39373
      }
39374
      break;
39375
    }
39376
    self->private_impl.f_end_of_data = true;
39377
39378
    ok:
39379
    self->private_impl.p_decode_tokens = 0;
39380
    goto exit;
39381
  }
39382
39383
  goto suspend;
39384
  suspend:
39385
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
39386
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
39387
  self->private_data.s_decode_tokens.v_string_length = v_string_length;
39388
  self->private_data.s_decode_tokens.v_depth = v_depth;
39389
  self->private_data.s_decode_tokens.v_tagged = v_tagged;
39390
  self->private_data.s_decode_tokens.v_indefinite_string_major_type = v_indefinite_string_major_type;
39391
39392
  goto exit;
39393
  exit:
39394
  if (a_dst && a_dst->data.ptr) {
39395
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
39396
  }
39397
  if (a_src && a_src->data.ptr) {
39398
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
39399
  }
39400
39401
  if (wuffs_base__status__is_error(&status)) {
39402
    self->private_impl.magic = WUFFS_BASE__DISABLED;
39403
  }
39404
  return status;
39405
}
39406
39407
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CBOR)
39408
39409
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
39410
39411
// ---------------- Status Codes Implementations
39412
39413
// ---------------- Private Consts
39414
39415
static const uint32_t
39416
WUFFS_CRC32__IEEE_TABLE[16][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
39417
  {
39418
    0u, 1996959894u, 3993919788u, 2567524794u, 124634137u, 1886057615u, 3915621685u, 2657392035u,
39419
    249268274u, 2044508324u, 3772115230u, 2547177864u, 162941995u, 2125561021u, 3887607047u, 2428444049u,
39420
    498536548u, 1789927666u, 4089016648u, 2227061214u, 450548861u, 1843258603u, 4107580753u, 2211677639u,
39421
    325883990u, 1684777152u, 4251122042u, 2321926636u, 335633487u, 1661365465u, 4195302755u, 2366115317u,
39422
    997073096u, 1281953886u, 3579855332u, 2724688242u, 1006888145u, 1258607687u, 3524101629u, 2768942443u,
39423
    901097722u, 1119000684u, 3686517206u, 2898065728u, 853044451u, 1172266101u, 3705015759u, 2882616665u,
39424
    651767980u, 1373503546u, 3369554304u, 3218104598u, 565507253u, 1454621731u, 3485111705u, 3099436303u,
39425
    671266974u, 1594198024u, 3322730930u, 2970347812u, 795835527u, 1483230225u, 3244367275u, 3060149565u,
39426
    1994146192u, 31158534u, 2563907772u, 4023717930u, 1907459465u, 112637215u, 2680153253u, 3904427059u,
39427
    2013776290u, 251722036u, 2517215374u, 3775830040u, 2137656763u, 141376813u, 2439277719u, 3865271297u,
39428
    1802195444u, 476864866u, 2238001368u, 4066508878u, 1812370925u, 453092731u, 2181625025u, 4111451223u,
39429
    1706088902u, 314042704u, 2344532202u, 4240017532u, 1658658271u, 366619977u, 2362670323u, 4224994405u,
39430
    1303535960u, 984961486u, 2747007092u, 3569037538u, 1256170817u, 1037604311u, 2765210733u, 3554079995u,
39431
    1131014506u, 879679996u, 2909243462u, 3663771856u, 1141124467u, 855842277u, 2852801631u, 3708648649u,
39432
    1342533948u, 654459306u, 3188396048u, 3373015174u, 1466479909u, 544179635u, 3110523913u, 3462522015u,
39433
    1591671054u, 702138776u, 2966460450u, 3352799412u, 1504918807u, 783551873u, 3082640443u, 3233442989u,
39434
    3988292384u, 2596254646u, 62317068u, 1957810842u, 3939845945u, 2647816111u, 81470997u, 1943803523u,
39435
    3814918930u, 2489596804u, 225274430u, 2053790376u, 3826175755u, 2466906013u, 167816743u, 2097651377u,
39436
    4027552580u, 2265490386u, 503444072u, 1762050814u, 4150417245u, 2154129355u, 426522225u, 1852507879u,
39437
    4275313526u, 2312317920u, 282753626u, 1742555852u, 4189708143u, 2394877945u, 397917763u, 1622183637u,
39438
    3604390888u, 2714866558u, 953729732u, 1340076626u, 3518719985u, 2797360999u, 1068828381u, 1219638859u,
39439
    3624741850u, 2936675148u, 906185462u, 1090812512u, 3747672003u, 2825379669u, 829329135u, 1181335161u,
39440
    3412177804u, 3160834842u, 628085408u, 1382605366u, 3423369109u, 3138078467u, 570562233u, 1426400815u,
39441
    3317316542u, 2998733608u, 733239954u, 1555261956u, 3268935591u, 3050360625u, 752459403u, 1541320221u,
39442
    2607071920u, 3965973030u, 1969922972u, 40735498u, 2617837225u, 3943577151u, 1913087877u, 83908371u,
39443
    2512341634u, 3803740692u, 2075208622u, 213261112u, 2463272603u, 3855990285u, 2094854071u, 198958881u,
39444
    2262029012u, 4057260610u, 1759359992u, 534414190u, 2176718541u, 4139329115u, 1873836001u, 414664567u,
39445
    2282248934u, 4279200368u, 1711684554u, 285281116u, 2405801727u, 4167216745u, 1634467795u, 376229701u,
39446
    2685067896u, 3608007406u, 1308918612u, 956543938u, 2808555105u, 3495958263u, 1231636301u, 1047427035u,
39447
    2932959818u, 3654703836u, 1088359270u, 936918000u, 2847714899u, 3736837829u, 1202900863u, 817233897u,
39448
    3183342108u, 3401237130u, 1404277552u, 615818150u, 3134207493u, 3453421203u, 1423857449u, 601450431u,
39449
    3009837614u, 3294710456u, 1567103746u, 711928724u, 3020668471u, 3272380065u, 1510334235u, 755167117u,
39450
  }, {
39451
    0u, 421212481u, 842424962u, 724390851u, 1684849924u, 2105013317u, 1448781702u, 1329698503u,
39452
    3369699848u, 3519200073u, 4210026634u, 3824474571u, 2897563404u, 3048111693u, 2659397006u, 2274893007u,
39453
    1254232657u, 1406739216u, 2029285587u, 1643069842u, 783210325u, 934667796u, 479770071u, 92505238u,
39454
    2182846553u, 2600511768u, 2955803355u, 2838940570u, 3866582365u, 4285295644u, 3561045983u, 3445231262u,
39455
    2508465314u, 2359236067u, 2813478432u, 3198777185u, 4058571174u, 3908292839u, 3286139684u, 3670389349u,
39456
    1566420650u, 1145479147u, 1869335592u, 1987116393u, 959540142u, 539646703u, 185010476u, 303839341u,
39457
    3745920755u, 3327985586u, 3983561841u, 4100678960u, 3140154359u, 2721170102u, 2300350837u, 2416418868u,
39458
    396344571u, 243568058u, 631889529u, 1018359608u, 1945336319u, 1793607870u, 1103436669u, 1490954812u,
39459
    4034481925u, 3915546180u, 3259968903u, 3679722694u, 2484439553u, 2366552896u, 2787371139u, 3208174018u,
39460
    950060301u, 565965900u, 177645455u, 328046286u, 1556873225u, 1171730760u, 1861902987u, 2011255754u,
39461
    3132841300u, 2745199637u, 2290958294u, 2442530455u, 3738671184u, 3352078609u, 3974232786u, 4126854035u,
39462
    1919080284u, 1803150877u, 1079293406u, 1498383519u, 370020952u, 253043481u, 607678682u, 1025720731u,
39463
    1711106983u, 2095471334u, 1472923941u, 1322268772u, 26324643u, 411738082u, 866634785u, 717028704u,
39464
    2904875439u, 3024081134u, 2668790573u, 2248782444u, 3376948395u, 3495106026u, 4219356713u, 3798300520u,
39465
    792689142u, 908347575u, 487136116u, 68299317u, 1263779058u, 1380486579u, 2036719216u, 1618931505u,
39466
    3890672638u, 4278043327u, 3587215740u, 3435896893u, 2206873338u, 2593195963u, 2981909624u, 2829542713u,
39467
    998479947u, 580430090u, 162921161u, 279890824u, 1609522511u, 1190423566u, 1842954189u, 1958874764u,
39468
    4082766403u, 3930137346u, 3245109441u, 3631694208u, 2536953671u, 2385372678u, 2768287173u, 3155920004u,
39469
    1900120602u, 1750776667u, 1131931800u, 1517083097u, 355290910u, 204897887u, 656092572u, 1040194781u,
39470
    3113746450u, 2692952403u, 2343461520u, 2461357009u, 3723805974u, 3304059991u, 4022511508u, 4141455061u,
39471
    2919742697u, 3072101800u, 2620513899u, 2234183466u, 3396041197u, 3547351212u, 4166851439u, 3779471918u,
39472
    1725839073u, 2143618976u, 1424512099u, 1307796770u, 45282277u, 464110244u, 813994343u, 698327078u,
39473
    3838160568u, 4259225593u, 3606301754u, 3488152955u, 2158586812u, 2578602749u, 2996767038u, 2877569151u,
39474
    740041904u, 889656817u, 506086962u, 120682355u, 1215357364u, 1366020341u, 2051441462u, 1667084919u,
39475
    3422213966u, 3538019855u, 4190942668u, 3772220557u, 2945847882u, 3062702859u, 2644537544u, 2226864521u,
39476
    52649286u, 439905287u, 823476164u, 672009861u, 1733269570u, 2119477507u, 1434057408u, 1281543041u,
39477
    2167981343u, 2552493150u, 3004082077u, 2853541596u, 3847487515u, 4233048410u, 3613549209u, 3464057816u,
39478
    1239502615u, 1358593622u, 2077699477u, 1657543892u, 764250643u, 882293586u, 532408465u, 111204816u,
39479
    1585378284u, 1197851309u, 1816695150u, 1968414767u, 974272232u, 587794345u, 136598634u, 289367339u,
39480
    2527558116u, 2411481253u, 2760973158u, 3179948583u, 4073438432u, 3956313505u, 3237863010u, 3655790371u,
39481
    347922877u, 229101820u, 646611775u, 1066513022u, 1892689081u, 1774917112u, 1122387515u, 1543337850u,
39482
    3697634229u, 3313392372u, 3998419255u, 4148705398u, 3087642289u, 2702352368u, 2319436851u, 2468674930u,
39483
  }, {
39484
    0u, 29518391u, 59036782u, 38190681u, 118073564u, 114017003u, 76381362u, 89069189u,
39485
    236147128u, 265370511u, 228034006u, 206958561u, 152762724u, 148411219u, 178138378u, 190596925u,
39486
    472294256u, 501532999u, 530741022u, 509615401u, 456068012u, 451764635u, 413917122u, 426358261u,
39487
    305525448u, 334993663u, 296822438u, 275991697u, 356276756u, 352202787u, 381193850u, 393929805u,
39488
    944588512u, 965684439u, 1003065998u, 973863097u, 1061482044u, 1049003019u, 1019230802u, 1023561829u,
39489
    912136024u, 933002607u, 903529270u, 874031361u, 827834244u, 815125939u, 852716522u, 856752605u,
39490
    611050896u, 631869351u, 669987326u, 640506825u, 593644876u, 580921211u, 551983394u, 556069653u,
39491
    712553512u, 733666847u, 704405574u, 675154545u, 762387700u, 749958851u, 787859610u, 792175277u,
39492
    1889177024u, 1901651959u, 1931368878u, 1927033753u, 2006131996u, 1985040171u, 1947726194u, 1976933189u,
39493
    2122964088u, 2135668303u, 2098006038u, 2093965857u, 2038461604u, 2017599123u, 2047123658u, 2076625661u,
39494
    1824272048u, 1836991623u, 1866005214u, 1861914857u, 1807058540u, 1786244187u, 1748062722u, 1777547317u,
39495
    1655668488u, 1668093247u, 1630251878u, 1625932113u, 1705433044u, 1684323811u, 1713505210u, 1742760333u,
39496
    1222101792u, 1226154263u, 1263738702u, 1251046777u, 1339974652u, 1310460363u, 1281013650u, 1301863845u,
39497
    1187289752u, 1191637167u, 1161842422u, 1149379777u, 1103966788u, 1074747507u, 1112139306u, 1133218845u,
39498
    1425107024u, 1429406311u, 1467333694u, 1454888457u, 1408811148u, 1379576507u, 1350309090u, 1371438805u,
39499
    1524775400u, 1528845279u, 1499917702u, 1487177649u, 1575719220u, 1546255107u, 1584350554u, 1605185389u,
39500
    3778354048u, 3774312887u, 3803303918u, 3816007129u, 3862737756u, 3892238699u, 3854067506u, 3833203973u,
39501
    4012263992u, 4007927823u, 3970080342u, 3982554209u, 3895452388u, 3924658387u, 3953866378u, 3932773565u,
39502
    4245928176u, 4241609415u, 4271336606u, 4283762345u, 4196012076u, 4225268251u, 4187931714u, 4166823541u,
39503
    4076923208u, 4072833919u, 4035198246u, 4047918865u, 4094247316u, 4123732899u, 4153251322u, 4132437965u,
39504
    3648544096u, 3636082519u, 3673983246u, 3678331705u, 3732010428u, 3753090955u, 3723829714u, 3694611429u,
39505
    3614117080u, 3601426159u, 3572488374u, 3576541825u, 3496125444u, 3516976691u, 3555094634u, 3525581405u,
39506
    3311336976u, 3298595879u, 3336186494u, 3340255305u, 3260503756u, 3281337595u, 3251864226u, 3222399125u,
39507
    3410866088u, 3398419871u, 3368647622u, 3372945905u, 3427010420u, 3448139075u, 3485520666u, 3456284973u,
39508
    2444203584u, 2423127159u, 2452308526u, 2481530905u, 2527477404u, 2539934891u, 2502093554u, 2497740997u,
39509
    2679949304u, 2659102159u, 2620920726u, 2650438049u, 2562027300u, 2574714131u, 2603727690u, 2599670141u,
39510
    2374579504u, 2353749767u, 2383274334u, 2412743529u, 2323684844u, 2336421851u, 2298759554u, 2294686645u,
39511
    2207933576u, 2186809023u, 2149495014u, 2178734801u, 2224278612u, 2236720739u, 2266437690u, 2262135309u,
39512
    2850214048u, 2820717207u, 2858812622u, 2879680249u, 2934667388u, 2938704459u, 2909776914u, 2897069605u,
39513
    2817622296u, 2788420399u, 2759153014u, 2780249921u, 2700618180u, 2704950259u, 2742877610u, 2730399645u,
39514
    3049550800u, 3020298727u, 3057690558u, 3078802825u, 2999835404u, 3004150075u, 2974355298u, 2961925461u,
39515
    3151438440u, 3121956959u, 3092510214u, 3113327665u, 3168701108u, 3172786307u, 3210370778u, 3197646061u,
39516
  }, {
39517
    0u, 3099354981u, 2852767883u, 313896942u, 2405603159u, 937357362u, 627793884u, 2648127673u,
39518
    3316918511u, 2097696650u, 1874714724u, 3607201537u, 1255587768u, 4067088605u, 3772741427u, 1482887254u,
39519
    1343838111u, 3903140090u, 4195393300u, 1118632049u, 3749429448u, 1741137837u, 1970407491u, 3452858150u,
39520
    2511175536u, 756094997u, 1067759611u, 2266550430u, 449832999u, 2725482306u, 2965774508u, 142231497u,
39521
    2687676222u, 412010587u, 171665333u, 2995192016u, 793786473u, 2548850444u, 2237264098u, 1038456711u,
39522
    1703315409u, 3711623348u, 3482275674u, 1999841343u, 3940814982u, 1381529571u, 1089329165u, 4166106984u,
39523
    4029413537u, 1217896388u, 1512189994u, 3802027855u, 2135519222u, 3354724499u, 3577784189u, 1845280792u,
39524
    899665998u, 2367928107u, 2677414085u, 657096608u, 3137160985u, 37822588u, 284462994u, 2823350519u,
39525
    2601801789u, 598228824u, 824021174u, 2309093331u, 343330666u, 2898962447u, 3195996129u, 113467524u,
39526
    1587572946u, 3860600759u, 4104763481u, 1276501820u, 3519211397u, 1769898208u, 2076913422u, 3279374443u,
39527
    3406630818u, 1941006535u, 1627703081u, 3652755532u, 1148164341u, 4241751952u, 3999682686u, 1457141531u,
39528
    247015245u, 3053797416u, 2763059142u, 470583459u, 2178658330u, 963106687u, 735213713u, 2473467892u,
39529
    992409347u, 2207944806u, 2435792776u, 697522413u, 3024379988u, 217581361u, 508405983u, 2800865210u,
39530
    4271038444u, 1177467017u, 1419450215u, 3962007554u, 1911572667u, 3377213406u, 3690561584u, 1665525589u,
39531
    1799331996u, 3548628985u, 3241568279u, 2039091058u, 3831314379u, 1558270126u, 1314193216u, 4142438437u,
39532
    2928380019u, 372764438u, 75645176u, 3158189981u, 568925988u, 2572515393u, 2346768303u, 861712586u,
39533
    3982079547u, 1441124702u, 1196457648u, 4293663189u, 1648042348u, 3666298377u, 3358779879u, 1888390786u,
39534
    686661332u, 2421291441u, 2196002399u, 978858298u, 2811169155u, 523464422u, 226935048u, 3040519789u,
39535
    3175145892u, 100435649u, 390670639u, 2952089162u, 841119475u, 2325614998u, 2553003640u, 546822429u,
39536
    2029308235u, 3225988654u, 3539796416u, 1782671013u, 4153826844u, 1328167289u, 1570739863u, 3844338162u,
39537
    1298864389u, 4124540512u, 3882013070u, 1608431339u, 3255406162u, 2058742071u, 1744848601u, 3501990332u,
39538
    2296328682u, 811816591u, 584513889u, 2590678532u, 129869501u, 3204563416u, 2914283062u, 352848211u,
39539
    494030490u, 2781751807u, 3078325777u, 264757620u, 2450577869u, 715964072u, 941166918u, 2158327331u,
39540
    3636881013u, 1618608400u, 1926213374u, 3396585883u, 1470427426u, 4011365959u, 4255988137u, 1158766284u,
39541
    1984818694u, 3471935843u, 3695453837u, 1693991400u, 4180638033u, 1100160564u, 1395044826u, 3952793279u,
39542
    3019491049u, 189112716u, 435162722u, 2706139399u, 1016811966u, 2217162459u, 2526189877u, 774831696u,
39543
    643086745u, 2666061564u, 2354934034u, 887166583u, 2838900430u, 294275499u, 54519365u, 3145957664u,
39544
    3823145334u, 1532818963u, 1240029693u, 4048895640u, 1820460577u, 3560857924u, 3331051178u, 2117577167u,
39545
    3598663992u, 1858283101u, 2088143283u, 3301633750u, 1495127663u, 3785470218u, 4078182116u, 1269332353u,
39546
    332098007u, 2876706482u, 3116540252u, 25085497u, 2628386432u, 605395429u, 916469259u, 2384220526u,
39547
    2254837415u, 1054503362u, 745528876u, 2496903497u, 151290352u, 2981684885u, 2735556987u, 464596510u,
39548
    1137851976u, 4218313005u, 3923506883u, 1365741990u, 3434129695u, 1946996346u, 1723425172u, 3724871409u,
39549
  }, {
39550
    0u, 1029712304u, 2059424608u, 1201699536u, 4118849216u, 3370159984u, 2403399072u, 2988497936u,
39551
    812665793u, 219177585u, 1253054625u, 2010132753u, 3320900865u, 4170237105u, 3207642721u, 2186319825u,
39552
    1625331586u, 1568718386u, 438355170u, 658566482u, 2506109250u, 2818578674u, 4020265506u, 3535817618u,
39553
    1351670851u, 1844508147u, 709922595u, 389064339u, 2769320579u, 2557498163u, 3754961379u, 3803185235u,
39554
    3250663172u, 4238411444u, 3137436772u, 2254525908u, 876710340u, 153198708u, 1317132964u, 1944187668u,
39555
    4054934725u, 3436268917u, 2339452837u, 3054575125u, 70369797u, 961670069u, 2129760613u, 1133623509u,
39556
    2703341702u, 2621542710u, 3689016294u, 3867263574u, 1419845190u, 1774270454u, 778128678u, 318858390u,
39557
    2438067015u, 2888948471u, 3952189479u, 3606153623u, 1691440519u, 1504803895u, 504432359u, 594620247u,
39558
    1492342857u, 1704161785u, 573770537u, 525542041u, 2910060169u, 2417219385u, 3618876905u, 3939730521u,
39559
    1753420680u, 1440954936u, 306397416u, 790849880u, 2634265928u, 2690882808u, 3888375336u, 3668168600u,
39560
    940822475u, 91481723u, 1121164459u, 2142483739u, 3448989963u, 4042473659u, 3075684971u, 2318603227u,
39561
    140739594u, 889433530u, 1923340138u, 1338244826u, 4259521226u, 3229813626u, 2267247018u, 3124975642u,
39562
    2570221389u, 2756861693u, 3824297005u, 3734113693u, 1823658381u, 1372780605u, 376603373u, 722643805u,
39563
    2839690380u, 2485261628u, 3548540908u, 4007806556u, 1556257356u, 1638052860u, 637716780u, 459464860u,
39564
    4191346895u, 3300051327u, 2199040943u, 3195181599u, 206718479u, 825388991u, 1989285231u, 1274166495u,
39565
    3382881038u, 4106388158u, 3009607790u, 2382549470u, 1008864718u, 21111934u, 1189240494u, 2072147742u,
39566
    2984685714u, 2357631266u, 3408323570u, 4131834434u, 1147541074u, 2030452706u, 1051084082u, 63335554u,
39567
    2174155603u, 3170292451u, 4216760371u, 3325460867u, 1947622803u, 1232499747u, 248909555u, 867575619u,
39568
    3506841360u, 3966111392u, 2881909872u, 2527485376u, 612794832u, 434546784u, 1581699760u, 1663499008u,
39569
    3782634705u, 3692447073u, 2612412337u, 2799048193u, 351717905u, 697754529u, 1849071985u, 1398190273u,
39570
    1881644950u, 1296545318u, 182963446u, 931652934u, 2242328918u, 3100053734u, 4284967478u, 3255255942u,
39571
    1079497815u, 2100821479u, 983009079u, 133672583u, 3050795671u, 2293717799u, 3474399735u, 4067887175u,
39572
    281479188u, 765927844u, 1778867060u, 1466397380u, 3846680276u, 3626469220u, 2676489652u, 2733102084u,
39573
    548881365u, 500656741u, 1517752501u, 1729575173u, 3577210133u, 3898068133u, 2952246901u, 2459410373u,
39574
    3910527195u, 3564487019u, 2480257979u, 2931134987u, 479546907u, 569730987u, 1716854139u, 1530213579u,
39575
    3647316762u, 3825568426u, 2745561210u, 2663766474u, 753206746u, 293940330u, 1445287610u, 1799716618u,
39576
    2314567513u, 3029685993u, 4080348217u, 3461678473u, 2088098201u, 1091956777u, 112560889u, 1003856713u,
39577
    3112514712u, 2229607720u, 3276105720u, 4263857736u, 1275433560u, 1902492648u, 918929720u, 195422344u,
39578
    685033439u, 364179055u, 1377080511u, 1869921551u, 3713294623u, 3761522863u, 2811507327u, 2599689167u,
39579
    413436958u, 633644462u, 1650777982u, 1594160846u, 3978570462u, 3494118254u, 2548332990u, 2860797966u,
39580
    1211387997u, 1968470509u, 854852413u, 261368461u, 3182753437u, 2161434413u, 3346310653u, 4195650637u,
39581
    2017729436u, 1160000044u, 42223868u, 1071931724u, 2378480988u, 2963576044u, 4144295484u, 3395602316u,
39582
  }, {
39583
    0u, 3411858341u, 1304994059u, 2257875630u, 2609988118u, 1355649459u, 3596215069u, 486879416u,
39584
    3964895853u, 655315400u, 2711298918u, 1791488195u, 2009251963u, 3164476382u, 973758832u, 4048990933u,
39585
    64357019u, 3364540734u, 1310630800u, 2235723829u, 2554806413u, 1394316072u, 3582976390u, 517157411u,
39586
    4018503926u, 618222419u, 2722963965u, 1762783832u, 1947517664u, 3209171269u, 970744811u, 4068520014u,
39587
    128714038u, 3438335635u, 1248109629u, 2167961496u, 2621261600u, 1466012805u, 3522553387u, 447296910u,
39588
    3959392091u, 547575038u, 2788632144u, 1835791861u, 1886307661u, 3140622056u, 1034314822u, 4143626211u,
39589
    75106221u, 3475428360u, 1236444838u, 2196665603u, 2682996155u, 1421317662u, 3525567664u, 427767573u,
39590
    3895035328u, 594892389u, 2782995659u, 1857943406u, 1941489622u, 3101955187u, 1047553757u, 4113347960u,
39591
    257428076u, 3288652233u, 1116777319u, 2311878850u, 2496219258u, 1603640287u, 3640781169u, 308099796u,
39592
    3809183745u, 676813732u, 2932025610u, 1704983215u, 2023410199u, 3016104370u, 894593820u, 4262377657u,
39593
    210634999u, 3352484690u, 1095150076u, 2316991065u, 2535410401u, 1547934020u, 3671583722u, 294336591u,
39594
    3772615322u, 729897279u, 2903845777u, 1716123700u, 2068629644u, 2953845545u, 914647431u, 4258839074u,
39595
    150212442u, 3282623743u, 1161604689u, 2388688372u, 2472889676u, 1480171241u, 3735940167u, 368132066u,
39596
    3836185911u, 805002898u, 2842635324u, 1647574937u, 2134298401u, 3026852996u, 855535146u, 4188192143u,
39597
    186781121u, 3229539940u, 1189784778u, 2377547631u, 2427670487u, 1542429810u, 3715886812u, 371670393u,
39598
    3882979244u, 741170185u, 2864262823u, 1642462466u, 2095107514u, 3082559007u, 824732849u, 4201955092u,
39599
    514856152u, 3589064573u, 1400419795u, 2552522358u, 2233554638u, 1316849003u, 3370776517u, 62202976u,
39600
    4075001525u, 968836368u, 3207280574u, 1954014235u, 1769133219u, 2720925446u, 616199592u, 4024870413u,
39601
    493229635u, 3594175974u, 1353627464u, 2616354029u, 2264355925u, 1303087088u, 3409966430u, 6498043u,
39602
    4046820398u, 979978123u, 3170710821u, 2007099008u, 1789187640u, 2717386141u, 661419827u, 3962610838u,
39603
    421269998u, 3527459403u, 1423225061u, 2676515648u, 2190300152u, 1238466653u, 3477467891u, 68755798u,
39604
    4115633027u, 1041448998u, 3095868040u, 1943789869u, 1860096405u, 2776760880u, 588673182u, 3897205563u,
39605
    449450869u, 3516317904u, 1459794558u, 2623431131u, 2170245475u, 1242006214u, 3432247400u, 131015629u,
39606
    4137259288u, 1036337853u, 3142660115u, 1879958454u, 1829294862u, 2790523051u, 549483013u, 3952910752u,
39607
    300424884u, 3669282065u, 1545650111u, 2541513754u, 2323209378u, 1092980487u, 3350330793u, 216870412u,
39608
    4256931033u, 921128828u, 2960342482u, 2066738807u, 1714085583u, 2910195050u, 736264132u, 3770592353u,
39609
    306060335u, 3647131530u, 1610005796u, 2494197377u, 2309971513u, 1123257756u, 3295149874u, 255536279u,
39610
    4268596802u, 892423655u, 3013951305u, 2029645036u, 1711070292u, 2929725425u, 674528607u, 3815288570u,
39611
    373562242u, 3709388839u, 1535949449u, 2429577516u, 2379569556u, 1183418929u, 3223189663u, 188820282u,
39612
    4195850735u, 827017802u, 3084859620u, 2089020225u, 1636228089u, 2866415708u, 743340786u, 3876759895u,
39613
    361896217u, 3738094268u, 1482340370u, 2466671543u, 2382584591u, 1163888810u, 3284924932u, 144124321u,
39614
    4190215028u, 849168593u, 3020503679u, 2136336858u, 1649465698u, 2836138695u, 798521449u, 3838094284u,
39615
  }, {
39616
    0u, 2792819636u, 2543784233u, 837294749u, 4098827283u, 1379413927u, 1674589498u, 3316072078u,
39617
    871321191u, 2509784531u, 2758827854u, 34034938u, 3349178996u, 1641505216u, 1346337629u, 4131942633u,
39618
    1742642382u, 3249117050u, 4030828007u, 1446413907u, 2475800797u, 904311657u, 68069876u, 2725880384u,
39619
    1412551337u, 4064729373u, 3283010432u, 1708771380u, 2692675258u, 101317902u, 937551763u, 2442587175u,
39620
    3485284764u, 1774858792u, 1478633653u, 4266992385u, 1005723023u, 2642744891u, 2892827814u, 169477906u,
39621
    4233263099u, 1512406095u, 1808623314u, 3451546982u, 136139752u, 2926205020u, 2676114113u, 972376437u,
39622
    2825102674u, 236236518u, 1073525883u, 2576072655u, 1546420545u, 4200303349u, 3417542760u, 1841601500u,
39623
    2609703733u, 1039917185u, 202635804u, 2858742184u, 1875103526u, 3384067218u, 4166835727u, 1579931067u,
39624
    1141601657u, 3799809741u, 3549717584u, 1977839588u, 2957267306u, 372464350u, 668680259u, 2175552503u,
39625
    2011446046u, 3516084394u, 3766168119u, 1175200131u, 2209029901u, 635180217u, 338955812u, 2990736784u,
39626
    601221559u, 2242044419u, 3024812190u, 306049834u, 3617246628u, 1911408144u, 1074125965u, 3866285881u,
39627
    272279504u, 3058543716u, 2275784441u, 567459149u, 3832906691u, 1107462263u, 1944752874u, 3583875422u,
39628
    2343980261u, 767641425u, 472473036u, 3126744696u, 2147051766u, 3649987394u, 3899029983u, 1309766251u,
39629
    3092841090u, 506333494u, 801510315u, 2310084639u, 1276520081u, 3932237093u, 3683203000u, 2113813516u,
39630
    3966292011u, 1243601823u, 2079834370u, 3716205238u, 405271608u, 3192979340u, 2411259153u, 701492901u,
39631
    3750207052u, 2045810168u, 1209569125u, 4000285905u, 734575199u, 2378150379u, 3159862134u, 438345922u,
39632
    2283203314u, 778166598u, 529136603u, 3120492655u, 2086260449u, 3660498261u, 3955679176u, 1303499900u,
39633
    3153699989u, 495890209u, 744928700u, 2316418568u, 1337360518u, 3921775410u, 3626602927u, 2120129051u,
39634
    4022892092u, 1237286280u, 2018993941u, 3726666913u, 461853231u, 3186645403u, 2350400262u, 711936178u,
39635
    3693557851u, 2052076527u, 1270360434u, 3989775046u, 677911624u, 2384402428u, 3220639073u, 427820757u,
39636
    1202443118u, 3789347034u, 3493118535u, 1984154099u, 3018127229u, 362020041u, 612099668u, 2181885408u,
39637
    1950653705u, 3526596285u, 3822816288u, 1168934804u, 2148251930u, 645706414u, 395618355u, 2984485767u,
39638
    544559008u, 2248295444u, 3085590153u, 295523645u, 3560598451u, 1917673479u, 1134918298u, 3855773998u,
39639
    328860103u, 3052210803u, 2214924526u, 577903450u, 3889505748u, 1101147744u, 1883911421u, 3594338121u,
39640
    3424493451u, 1785369663u, 1535282850u, 4260726038u, 944946072u, 2653270060u, 2949491377u, 163225861u,
39641
    4294103532u, 1501944408u, 1752023237u, 3457862513u, 196998655u, 2915761739u, 2619532502u, 978710370u,
39642
    2881684293u, 229902577u, 1012666988u, 2586515928u, 1603020630u, 4193987810u, 3356702335u, 1852063179u,
39643
    2553040162u, 1046169238u, 263412747u, 2848217023u, 1818454321u, 3390333573u, 4227627032u, 1569420204u,
39644
    60859927u, 2782375331u, 2487203646u, 843627658u, 4159668740u, 1368951216u, 1617990445u, 3322386585u,
39645
    810543216u, 2520310724u, 2815490393u, 27783917u, 3288386659u, 1652017111u, 1402985802u, 4125677310u,
39646
    1685994201u, 3255382381u, 4091620336u, 1435902020u, 2419138250u, 910562686u, 128847843u, 2715354199u,
39647
    1469150398u, 4058414858u, 3222168983u, 1719234083u, 2749255853u, 94984985u, 876691844u, 2453031472u,
39648
  }, {
39649
    0u, 3433693342u, 1109723005u, 2391738339u, 2219446010u, 1222643300u, 3329165703u, 180685081u,
39650
    3555007413u, 525277995u, 2445286600u, 1567235158u, 1471092047u, 2600801745u, 361370162u, 3642757804u,
39651
    2092642603u, 2953916853u, 1050555990u, 4063508168u, 4176560081u, 878395215u, 3134470316u, 1987983410u,
39652
    2942184094u, 1676945920u, 3984272867u, 567356797u, 722740324u, 3887998202u, 1764827929u, 2778407815u,
39653
    4185285206u, 903635656u, 3142804779u, 2012833205u, 2101111980u, 2979425330u, 1058630609u, 4088621903u,
39654
    714308067u, 3862526333u, 1756790430u, 2753330688u, 2933487385u, 1651734407u, 3975966820u, 542535930u,
39655
    2244825981u, 1231508451u, 3353891840u, 188896414u, 25648519u, 3442302233u, 1134713594u, 2399689316u,
39656
    1445480648u, 2592229462u, 336416693u, 3634843435u, 3529655858u, 516441772u, 2420588879u, 1559052753u,
39657
    698204909u, 3845636723u, 1807271312u, 2803025166u, 2916600855u, 1635634313u, 4025666410u, 593021940u,
39658
    4202223960u, 919787974u, 3093159461u, 1962401467u, 2117261218u, 2996361020u, 1008193759u, 4038971457u,
39659
    1428616134u, 2576151384u, 386135227u, 3685348389u, 3513580860u, 499580322u, 2471098945u, 1608776415u,
39660
    2260985971u, 1248454893u, 3303468814u, 139259792u, 42591881u, 3458459159u, 1085071860u, 2349261162u,
39661
    3505103035u, 474062885u, 2463016902u, 1583654744u, 1419882049u, 2550902495u, 377792828u, 3660491170u,
39662
    51297038u, 3483679632u, 1093385331u, 2374089965u, 2269427188u, 1273935210u, 3311514249u, 164344343u,
39663
    2890961296u, 1627033870u, 4000683757u, 585078387u, 672833386u, 3836780532u, 1782552599u, 2794821769u,
39664
    2142603813u, 3005188795u, 1032883544u, 4047146438u, 4227826911u, 928351297u, 3118105506u, 1970307900u,
39665
    1396409818u, 2677114180u, 287212199u, 3719594553u, 3614542624u, 467372990u, 2505346141u, 1509854403u,
39666
    2162073199u, 1282711281u, 3271268626u, 240228748u, 76845205u, 3359543307u, 1186043880u, 2317064054u,
39667
    796964081u, 3811226735u, 1839575948u, 2702160658u, 2882189835u, 1734392469u, 3924802934u, 625327592u,
39668
    4234522436u, 818917338u, 3191908409u, 1927981223u, 2016387518u, 3028656416u, 973776579u, 4137723485u,
39669
    2857232268u, 1726474002u, 3899187441u, 616751215u, 772270454u, 3803048424u, 1814228491u, 2693328533u,
39670
    2041117753u, 3036871847u, 999160644u, 4146592730u, 4259508931u, 826864221u, 3217552830u, 1936586016u,
39671
    3606501031u, 442291769u, 2496909786u, 1484378436u, 1388107869u, 2652297411u, 278519584u, 3694387134u,
39672
    85183762u, 3384397196u, 1194773103u, 2342308593u, 2170143720u, 1307820918u, 3279733909u, 265733131u,
39673
    2057717559u, 3054258089u, 948125770u, 4096344276u, 4276898253u, 843467091u, 3167309488u, 1885556270u,
39674
    2839764098u, 1709792284u, 3949353983u, 667704161u, 755585656u, 3785577190u, 1865176325u, 2743489947u,
39675
    102594076u, 3401021058u, 1144549729u, 2291298815u, 2186770662u, 1325234296u, 3228729243u, 215514885u,
39676
    3589828009u, 424832311u, 2547870420u, 1534552650u, 1370645331u, 2635621325u, 328688686u, 3745342640u,
39677
    2211456353u, 1333405183u, 3254067740u, 224338562u, 127544219u, 3408931589u, 1170156774u, 2299866232u,
39678
    1345666772u, 2627681866u, 303053225u, 3736746295u, 3565105198u, 416624816u, 2522494803u, 1525692365u,
39679
    4285207626u, 868291796u, 3176010551u, 1910772649u, 2065767088u, 3079346734u, 956571085u, 4121828691u,
39680
    747507711u, 3760459617u, 1856702594u, 2717976604u, 2831417605u, 1684930971u, 3940615800u, 642451174u,
39681
  },
39682
  {
39683
    0u, 393942083u, 787884166u, 965557445u, 1575768332u, 1251427663u, 1931114890u, 1684106697u,
39684
    3151536664u, 2896410203u, 2502855326u, 2186649309u, 3862229780u, 4048545623u, 3368213394u, 3753496529u,
39685
    2898281073u, 3149616690u, 2184604407u, 2504883892u, 4046197629u, 3864463166u, 3755621371u, 3366006712u,
39686
    387506281u, 6550570u, 971950319u, 781573292u, 1257550181u, 1569695014u, 1677892067u, 1937345952u,
39687
    2196865699u, 2508887776u, 2886183461u, 3145514598u, 3743273903u, 3362179052u, 4058774313u, 3868258154u,
39688
    958996667u, 777139448u, 400492605u, 10755198u, 1690661303u, 1941857780u, 1244879153u, 1565019506u,
39689
    775012562u, 961205393u, 13101140u, 398261271u, 1943900638u, 1688634781u, 1563146584u, 1246801179u,
39690
    2515100362u, 2190636681u, 3139390028u, 2892258831u, 3355784134u, 3749586821u, 3874691904u, 4052225795u,
39691
    3734110983u, 3387496260u, 4033096577u, 3877584834u, 2206093835u, 2483373640u, 2911402637u, 3136515790u,
39692
    1699389727u, 1915860316u, 1270647193u, 1556585946u, 950464531u, 803071056u, 374397077u, 19647702u,
39693
    1917993334u, 1697207605u, 1554278896u, 1272937907u, 800985210u, 952435769u, 21510396u, 372452543u,
39694
    3381322606u, 3740399405u, 3883715560u, 4027047851u, 2489758306u, 2199758369u, 3130039012u, 2917895847u,
39695
    1550025124u, 1259902439u, 1922410786u, 1710144865u, 26202280u, 385139947u, 796522542u, 939715693u,
39696
    3887801276u, 4039129087u, 3377269562u, 3728088953u, 3126293168u, 2905368307u, 2493602358u, 2212122229u,
39697
    4037264341u, 3889747862u, 3730172755u, 3375300368u, 2907673305u, 3124004506u, 2209987167u, 2495786524u,
39698
    1266377165u, 1543533966u, 1703758155u, 1928748296u, 379007169u, 32253058u, 945887303u, 790236164u,
39699
    1716846671u, 1898845196u, 1218652361u, 1608006794u, 1002000707u, 750929152u, 357530053u, 36990342u,
39700
    3717046871u, 3405166100u, 4084959953u, 3825245842u, 2153902939u, 2535122712u, 2929187805u, 3119304606u,
39701
    3398779454u, 3723384445u, 3831720632u, 4078468859u, 2541294386u, 2147616625u, 3113171892u, 2935238647u,
39702
    1900929062u, 1714877541u, 1606142112u, 1220599011u, 748794154u, 1004184937u, 39295404u, 355241455u,
39703
    3835986668u, 4091516591u, 3394415210u, 3710500393u, 3108557792u, 2922629027u, 2545875814u, 2160455461u,
39704
    1601970420u, 1208431799u, 1904871538u, 1727077425u, 43020792u, 367748539u, 744905086u, 991776061u,
39705
    1214562461u, 1595921630u, 1720903707u, 1911159896u, 361271697u, 49513938u, 998160663u, 738569556u,
39706
    4089209477u, 3838277318u, 3712633347u, 3392233024u, 2924491657u, 3106613194u, 2158369551u, 2547846988u,
39707
    3100050248u, 2948339467u, 2519804878u, 2169126797u, 3844821572u, 4065347079u, 3420289730u, 3701894785u,
39708
    52404560u, 342144275u, 770279894u, 982687125u, 1593045084u, 1233708063u, 1879431386u, 1736363161u,
39709
    336019769u, 58479994u, 988899775u, 764050940u, 1240141877u, 1586496630u, 1729968307u, 1885744368u,
39710
    2950685473u, 3097818978u, 2166999975u, 2522013668u, 4063474221u, 3846743662u, 3703937707u, 3418263272u,
39711
    976650731u, 760059304u, 348170605u, 62635310u, 1742393575u, 1889649828u, 1227683937u, 1582820386u,
39712
    2179867635u, 2526361520u, 2937588597u, 3093503798u, 3691148031u, 3413731004u, 4076100217u, 3851374138u,
39713
    2532754330u, 2173556697u, 3087067932u, 2944139103u, 3407516310u, 3697379029u, 3857496592u, 4070026835u,
39714
    758014338u, 978679233u, 64506116u, 346250567u, 1891774606u, 1740186829u, 1580472328u, 1229917259u,
39715
  }, {
39716
    0u, 4022496062u, 83218493u, 3946298115u, 166436986u, 3861498692u, 220098631u, 3806075769u,
39717
    332873972u, 4229245898u, 388141257u, 4175494135u, 440197262u, 4127099824u, 516501683u, 4044053389u,
39718
    665747944u, 3362581206u, 593187285u, 3432594155u, 776282514u, 3246869164u, 716239279u, 3312622225u,
39719
    880394524u, 3686509090u, 814485793u, 3746462239u, 1033003366u, 3528460888u, 963096923u, 3601193573u,
39720
    1331495888u, 2694801646u, 1269355501u, 2758457555u, 1186374570u, 2843003028u, 1111716759u, 2910918825u,
39721
    1552565028u, 3007850522u, 1484755737u, 3082680359u, 1432478558u, 3131279456u, 1368666979u, 3193329757u,
39722
    1760789048u, 2268195078u, 1812353541u, 2210675003u, 1628971586u, 2396670332u, 1710092927u, 2318375233u,
39723
    2066006732u, 2498144754u, 2144408305u, 2417195471u, 1926193846u, 2634877320u, 1983558283u, 2583222709u,
39724
    2662991776u, 1903717534u, 2588923805u, 1972223139u, 2538711002u, 2022952164u, 2477029351u, 2087066841u,
39725
    2372749140u, 1655647338u, 2308478825u, 1717238871u, 2223433518u, 1799654416u, 2155034387u, 1873894445u,
39726
    3105130056u, 1456926070u, 3185661557u, 1378041163u, 2969511474u, 1597852940u, 3020617231u, 1539874097u,
39727
    2864957116u, 1157737858u, 2922780289u, 1106542015u, 2737333958u, 1290407416u, 2816325371u, 1210047941u,
39728
    3521578096u, 1042640718u, 3574781005u, 986759027u, 3624707082u, 936300340u, 3707335735u, 859512585u,
39729
    3257943172u, 770846650u, 3334837433u, 688390023u, 3420185854u, 605654976u, 3475911875u, 552361981u,
39730
    4132013464u, 428600998u, 4072428965u, 494812827u, 4288816610u, 274747100u, 4216845791u, 345349857u,
39731
    3852387692u, 173846098u, 3781891409u, 245988975u, 3967116566u, 62328360u, 3900749099u, 121822741u,
39732
    3859089665u, 164061759u, 3807435068u, 221426178u, 4025395579u, 2933317u, 3944446278u, 81334904u,
39733
    4124199413u, 437265099u, 4045904328u, 518386422u, 4231653775u, 335250097u, 4174133682u, 386814604u,
39734
    3249244393u, 778691543u, 3311294676u, 714879978u, 3359647891u, 662848429u, 3434477742u, 595039120u,
39735
    3531393053u, 1035903779u, 3599308832u, 961245982u, 3684132967u, 877986649u, 3747788890u, 815846244u,
39736
    2841119441u, 1184522735u, 2913852140u, 1114616274u, 2696129195u, 1332855189u, 2756082326u, 1266946472u,
39737
    3129952805u, 1431118107u, 3195705880u, 1371074854u, 3009735263u, 1554415969u, 3079748194u, 1481855324u,
39738
    2398522169u, 1630855175u, 2315475716u, 1707159610u, 2266835779u, 1759461501u, 2213084030u, 1814728768u,
39739
    2636237773u, 1927520499u, 2580814832u, 1981182158u, 2496293815u, 2064121993u, 2420095882u, 2147340468u,
39740
    2025787041u, 2541577631u, 2085281436u, 2475210146u, 1901375195u, 2660681189u, 1973518054u, 2590184920u,
39741
    1801997909u, 2225743211u, 1872600680u, 2153772374u, 1652813359u, 2369881361u, 1719025170u, 2310296876u,
39742
    1594986313u, 2966676599u, 1541693300u, 3022402634u, 1459236659u, 3107472397u, 1376780046u, 3184366640u,
39743
    1288097725u, 2734990467u, 1211309952u, 2817619134u, 1160605639u, 2867791097u, 1104723962u, 2920993988u,
39744
    937561457u, 3626001999u, 857201996u, 3704993394u, 1040821515u, 3519792693u, 989625654u, 3577615880u,
39745
    607473029u, 3421972155u, 549494200u, 3473077894u, 769584639u, 3256649409u, 690699714u, 3337180924u,
39746
    273452185u, 4287555495u, 347692196u, 4219156378u, 430386403u, 4133832669u, 491977950u, 4069562336u,
39747
    60542061u, 3965298515u, 124656720u, 3903616878u, 175139863u, 3853649705u, 243645482u, 3779581716u,
39748
  }, {
39749
    0u, 3247366080u, 1483520449u, 2581751297u, 2967040898u, 1901571138u, 3904227907u, 691737987u,
39750
    3133399365u, 2068659845u, 3803142276u, 589399876u, 169513671u, 3415493895u, 1383475974u, 2482566342u,
39751
    2935407819u, 1870142219u, 4137319690u, 924099274u, 506443593u, 3751897225u, 1178799752u, 2278412616u,
39752
    339027342u, 3585866318u, 1280941135u, 2379694991u, 2766951948u, 1700956620u, 4236308429u, 1024339981u,
39753
    2258407383u, 1192382487u, 3740284438u, 528411094u, 910556245u, 4157285269u, 1848198548u, 2946996820u,
39754
    1012887186u, 4258378066u, 1681119059u, 2780629139u, 2357599504u, 1292419792u, 3572147409u, 358906641u,
39755
    678054684u, 3924071644u, 1879503581u, 2978491677u, 2561882270u, 1497229150u, 3235873119u, 22109855u,
39756
    2460592729u, 1395094937u, 3401913240u, 189516888u, 577821147u, 3825075739u, 2048679962u, 3146956762u,
39757
    3595049455u, 398902831u, 2384764974u, 1336573934u, 1720805997u, 2803873197u, 1056822188u, 4285729900u,
39758
    1821112490u, 2902796138u, 887570795u, 4117339819u, 3696397096u, 500978920u, 2218668777u, 1169222953u,
39759
    2025774372u, 3106931428u, 550659301u, 3780950821u, 3362238118u, 166293862u, 2416645991u, 1367722151u,
39760
    3262987361u, 66315169u, 2584839584u, 1537170016u, 1923370979u, 3005911075u, 717813282u, 3947244002u,
39761
    1356109368u, 2438613496u, 146288633u, 3375820857u, 3759007162u, 562248314u, 3093388411u, 2045739963u,
39762
    3927406461u, 731490493u, 2994458300u, 1945440636u, 1523451135u, 2604718911u, 44219710u, 3274466046u,
39763
    4263662323u, 1068272947u, 2790189874u, 1740649714u, 1325080945u, 2406874801u, 379033776u, 3608758128u,
39764
    1155642294u, 2238671990u, 479005303u, 3708016055u, 4097359924u, 901128180u, 2891217397u, 1843045941u,
39765
    2011248031u, 3060787807u, 797805662u, 3993195422u, 3342353949u, 112630237u, 2673147868u, 1591353372u,
39766
    3441611994u, 212601626u, 2504944923u, 1421914843u, 2113644376u, 3161815192u, 630660761u, 3826893145u,
39767
    3642224980u, 412692116u, 2172340373u, 1089836885u, 1775141590u, 2822790422u, 832715543u, 4029474007u,
39768
    1674842129u, 2723860433u, 1001957840u, 4197873168u, 3540870035u, 310623315u, 2338445906u, 1257178514u,
39769
    4051548744u, 821257608u, 2836464521u, 1755307081u, 1101318602u, 2150241802u, 432566283u, 3628511179u,
39770
    1270766349u, 2318435533u, 332587724u, 3529260300u, 4217841807u, 988411727u, 2735444302u, 1652903566u,
39771
    1602977411u, 2651169091u, 132630338u, 3328776322u, 4015131905u, 786223809u, 3074340032u, 1991273216u,
39772
    3846741958u, 616972294u, 3173262855u, 2091579847u, 1435626564u, 2485072772u, 234706309u, 3430124101u,
39773
    2712218736u, 1613231024u, 4190475697u, 944458353u, 292577266u, 3506339890u, 1226630707u, 2291284467u,
39774
    459984181u, 3672380149u, 1124496628u, 2189994804u, 2880683703u, 1782407543u, 4091479926u, 844224694u,
39775
    257943739u, 3469817723u, 1462980986u, 2529005242u, 3213269817u, 2114471161u, 3890881272u, 644152632u,
39776
    3046902270u, 1947391550u, 3991973951u, 746483711u, 88439420u, 3301680572u, 1563018173u, 2628197501u,
39777
    657826727u, 3871046759u, 2136545894u, 3201811878u, 2548879397u, 1449267173u, 3481299428u, 235845156u,
39778
    2650161890u, 1551408418u, 3315268387u, 68429027u, 758067552u, 3970035360u, 1967360161u, 3033356129u,
39779
    2311284588u, 1213053100u, 3517963949u, 270598509u, 958010606u, 4170500910u, 1635167535u, 2700636911u,
39780
    855672361u, 4069415401u, 1802256360u, 2866995240u, 2212099499u, 1113008747u, 3686091882u, 440112042u,
39781
  }, {
39782
    0u, 2611301487u, 3963330207u, 2006897392u, 50740095u, 2560849680u, 4013794784u, 1956178319u,
39783
    101480190u, 2645113489u, 3929532513u, 1905435662u, 84561281u, 2662269422u, 3912356638u, 1922342769u,
39784
    202960380u, 2545787283u, 3760419683u, 2072395532u, 253679235u, 2495322860u, 3810871324u, 2021655667u,
39785
    169122562u, 2444351341u, 3861841309u, 2106214898u, 152215677u, 2461527058u, 3844685538u, 2123133581u,
39786
    405920760u, 2207553431u, 4094313831u, 1873742088u, 456646791u, 2157096168u, 4144791064u, 1823027831u,
39787
    507358470u, 2241388905u, 4060492697u, 1772322806u, 490444409u, 2258557462u, 4043311334u, 1789215881u,
39788
    338245124u, 2408348267u, 4161972379u, 1672996084u, 388959611u, 2357870868u, 4212429796u, 1622269835u,
39789
    304431354u, 2306870421u, 4263435877u, 1706791434u, 287538053u, 2324051946u, 4246267162u, 1723705717u,
39790
    811841520u, 2881944479u, 3696765295u, 1207788800u, 862293135u, 2831204576u, 3747484176u, 1157324415u,
39791
    913293582u, 2915732833u, 3662962577u, 1106318334u, 896137841u, 2932651550u, 3646055662u, 1123494017u,
39792
    1014716940u, 2816349795u, 3493905555u, 1273334012u, 1065181555u, 2765630748u, 3544645612u, 1222882179u,
39793
    980888818u, 2714919069u, 3595350637u, 1307180546u, 963712909u, 2731826146u, 3578431762u, 1324336509u,
39794
    676490248u, 3019317351u, 3295277719u, 1607253752u, 726947703u, 2968591128u, 3345992168u, 1556776327u,
39795
    777919222u, 3053147801u, 3261432937u, 1505806342u, 760750473u, 3070062054u, 3244539670u, 1522987897u,
39796
    608862708u, 3220163995u, 3362856811u, 1406423812u, 659339915u, 3169449700u, 3413582868u, 1355966587u,
39797
    575076106u, 3118709605u, 3464325525u, 1440228858u, 557894773u, 3135602714u, 3447411434u, 1457397381u,
39798
    1623683040u, 4217512847u, 2365387135u, 391757072u, 1673614495u, 4167309552u, 2415577600u, 341804655u,
39799
    1724586270u, 4251866481u, 2331019137u, 290835438u, 1707942497u, 4268256782u, 2314648830u, 307490961u,
39800
    1826587164u, 4152020595u, 2162433155u, 457265388u, 1876539747u, 4101829900u, 2212636668u, 407333779u,
39801
    1792275682u, 4051089549u, 2263378557u, 491595282u, 1775619997u, 4067460082u, 2246988034u, 508239213u,
39802
    2029433880u, 3813931127u, 2496473735u, 258500328u, 2079362919u, 3763716872u, 2546668024u, 208559511u,
39803
    2130363110u, 3848244873u, 2462145657u, 157552662u, 2113730969u, 3864638966u, 2445764358u, 174205801u,
39804
    1961777636u, 4014675339u, 2564147067u, 57707284u, 2011718299u, 3964481268u, 2614361092u, 7778411u,
39805
    1927425818u, 3913769845u, 2665066885u, 92077546u, 1910772837u, 3930150922u, 2648673018u, 108709525u,
39806
    1352980496u, 3405878399u, 3164554895u, 658115296u, 1403183983u, 3355946752u, 3214507504u, 607924639u,
39807
    1453895406u, 3440239233u, 3130208369u, 557218846u, 1437504913u, 3456883198u, 3113552654u, 573589345u,
39808
    1555838444u, 3340335491u, 2961681267u, 723707676u, 1606028947u, 3290383100u, 3011612684u, 673504355u,
39809
    1521500946u, 3239382909u, 3062619533u, 758026722u, 1505130605u, 3256038402u, 3045975794u, 774417053u,
39810
    1217725416u, 3543158663u, 2762906999u, 1057739032u, 1267939479u, 3493229816u, 2812847624u, 1007544935u,
39811
    1318679830u, 3577493881u, 2728586121u, 956803046u, 1302285929u, 3594125830u, 2711933174u, 973184153u,
39812
    1150152212u, 3743982203u, 2830528651u, 856898788u, 1200346475u, 3694041348u, 2880457716u, 806684571u,
39813
    1115789546u, 3643069573u, 2931426933u, 891243034u, 1099408277u, 3659722746u, 2914794762u, 907637093u,
39814
  }, {
39815
    0u, 3717650821u, 1616688459u, 3184159950u, 3233376918u, 489665299u, 2699419613u, 2104690264u,
39816
    1510200173u, 2274691816u, 979330598u, 3888758691u, 2595928571u, 1194090622u, 4209380528u, 661706037u,
39817
    3020400346u, 1771143007u, 3562738577u, 164481556u, 1958661196u, 2837976521u, 350386439u, 3379863682u,
39818
    3993269687u, 865250354u, 2388181244u, 1406015865u, 784146209u, 4079732388u, 1323412074u, 2474079215u,
39819
    3011398645u, 1860735600u, 3542286014u, 246687547u, 1942430051u, 2924607718u, 328963112u, 3456978349u,
39820
    3917322392u, 887832861u, 2300653011u, 1421341782u, 700772878u, 4099025803u, 1234716485u, 2483986112u,
39821
    125431087u, 3673109674u, 1730500708u, 3132326369u, 3351283641u, 441867836u, 2812031730u, 2047535991u,
39822
    1568292418u, 2163009479u, 1025936137u, 3769651852u, 2646824148u, 1079348561u, 4255113631u, 537475098u,
39823
    3180171691u, 1612400686u, 3721471200u, 4717925u, 2100624189u, 2694980280u, 493375094u, 3237910515u,
39824
    3884860102u, 974691139u, 2278750093u, 1514417672u, 657926224u, 4204917205u, 1198234907u, 2600289438u,
39825
    160053105u, 3558665972u, 1775665722u, 3024116671u, 3375586791u, 346391650u, 2842683564u, 1962488105u,
39826
    1401545756u, 2384412057u, 869618007u, 3997403346u, 2469432970u, 1319524111u, 4083956673u, 788193860u,
39827
    250862174u, 3546612699u, 1856990997u, 3006903952u, 3461001416u, 333211981u, 2920678787u, 1937824774u,
39828
    1425017139u, 2305216694u, 883735672u, 3912918525u, 2487837605u, 1239398944u, 4095071982u, 696455019u,
39829
    3136584836u, 1734518017u, 3668494799u, 121507914u, 2051872274u, 2816200599u, 437363545u, 3347544796u,
39830
    3774328809u, 1029797484u, 2158697122u, 1564328743u, 542033279u, 4258798842u, 1074950196u, 2642717105u,
39831
    2691310871u, 2113731730u, 3224801372u, 497043929u, 1624461185u, 3175454212u, 9435850u, 3709412175u,
39832
    4201248378u, 671035391u, 2587181873u, 1201904308u, 986750188u, 3880142185u, 1519135143u, 2266689570u,
39833
    342721485u, 3388693064u, 1949382278u, 2846355203u, 3570723163u, 155332830u, 3028835344u, 1763607957u,
39834
    1315852448u, 2482538789u, 775087595u, 4087626862u, 2396469814u, 1396827059u, 4002123645u, 857560824u,
39835
    320106210u, 3464673127u, 1934154665u, 2933785132u, 3551331444u, 238804465u, 3018961215u, 1852270778u,
39836
    1226292623u, 2491507722u, 692783300u, 4108177729u, 2309936921u, 1412959900u, 3924976210u, 879016919u,
39837
    2803091512u, 2055541181u, 3343875443u, 450471158u, 1739236014u, 3124525867u, 133568485u, 3663777376u,
39838
    4245691221u, 545702608u, 2639048222u, 1088059291u, 1034514883u, 3762268230u, 1576387720u, 2153979149u,
39839
    501724348u, 3228659001u, 2109407735u, 2687359090u, 3713981994u, 13109167u, 3171052385u, 1620357860u,
39840
    1206151121u, 2591211092u, 666423962u, 4197321503u, 2271022407u, 1523307714u, 3875649548u, 982999433u,
39841
    2850034278u, 1953942499u, 3384583981u, 338329256u, 1767471344u, 3033506165u, 151375291u, 3566408766u,
39842
    4091789579u, 779425934u, 2478797888u, 1311354309u, 861580189u, 4006375960u, 1392910038u, 2391852883u,
39843
    2929327945u, 1930372812u, 3469036034u, 324244359u, 1847629279u, 3015068762u, 243015828u, 3555391761u,
39844
    4103744548u, 688715169u, 2496043375u, 1229996266u, 874727090u, 3920994103u, 1417671673u, 2313759356u,
39845
    446585235u, 3339223062u, 2059594968u, 2807313757u, 3660002053u, 129100416u, 3128657486u, 1743609803u,
39846
    1084066558u, 2634765179u, 549535669u, 4250396208u, 2149900392u, 1571961325u, 3765982499u, 1039043750u,
39847
  }, {
39848
    0u, 2635063670u, 3782132909u, 2086741467u, 430739227u, 2225303149u, 4173482934u, 1707977408u,
39849
    861478454u, 2924937024u, 3526875803u, 1329085421u, 720736557u, 3086643291u, 3415954816u, 1452586230u,
39850
    1722956908u, 4223524122u, 2279405761u, 450042295u, 2132718455u, 3792785921u, 2658170842u, 58693292u,
39851
    1441473114u, 3370435372u, 3028674295u, 696911745u, 1279765825u, 3511176247u, 2905172460u, 807831706u,
39852
    3445913816u, 1349228974u, 738901109u, 2969918723u, 3569940419u, 1237784245u, 900084590u, 2829701656u,
39853
    4265436910u, 1664255896u, 525574723u, 2187084597u, 3885099509u, 2057177219u, 117386584u, 2616249390u,
39854
    2882946228u, 920233410u, 1253605401u, 3619119471u, 2994391983u, 796207833u, 1393823490u, 3457937012u,
39855
    2559531650u, 92322804u, 2044829231u, 3840835417u, 2166609305u, 472659183u, 1615663412u, 4249022530u,
39856
    1102706673u, 3702920839u, 2698457948u, 1037619754u, 1477802218u, 3306854812u, 3111894087u, 611605809u,
39857
    1927342535u, 4025419953u, 2475568490u, 243387420u, 1800169180u, 4131620778u, 2317525617u, 388842247u,
39858
    655084445u, 3120835307u, 3328511792u, 1533734470u, 1051149446u, 2745738736u, 3754524715u, 1120297309u,
39859
    340972971u, 2304586973u, 4114354438u, 1748234352u, 234773168u, 2431761350u, 3968900637u, 1906278251u,
39860
    2363330345u, 299003487u, 1840466820u, 4038896370u, 2507210802u, 142532932u, 1948239007u, 3910149609u,
39861
    3213136159u, 579563625u, 1592415666u, 3286611140u, 2787646980u, 992477042u, 1195825833u, 3662232543u,
39862
    3933188933u, 2002801203u, 184645608u, 2517538462u, 4089658462u, 1858919720u, 313391347u, 2409765253u,
39863
    3644239219u, 1144605701u, 945318366u, 2773977256u, 3231326824u, 1570095902u, 569697989u, 3170568115u,
39864
    2205413346u, 511446676u, 1646078799u, 4279421497u, 2598330617u, 131105167u, 2075239508u, 3871229218u,
39865
    2955604436u, 757403810u, 1363424633u, 3427521551u, 2844163791u, 881434553u, 1223211618u, 3588709140u,
39866
    3854685070u, 2026779384u, 78583587u, 2577462869u, 4235025557u, 1633861091u, 486774840u, 2148301134u,
39867
    3600338360u, 1268198606u, 938871061u, 2868504675u, 3476308643u, 1379640277u, 777684494u, 3008718712u,
39868
    1310168890u, 3541595724u, 2943964055u, 846639841u, 1471879201u, 3400857943u, 3067468940u, 735723002u,
39869
    2102298892u, 3762382970u, 2619362721u, 19901655u, 1692534295u, 4193118049u, 2240594618u, 411247564u,
39870
    681945942u, 3047836192u, 3385552891u, 1422167693u, 822682701u, 2886124859u, 3496468704u, 1298661782u,
39871
    469546336u, 2264093718u, 4203901389u, 1738379451u, 38812283u, 2673859341u, 3812556502u, 2117148576u,
39872
    3268024339u, 1606809957u, 598006974u, 3198893512u, 3680933640u, 1181316734u, 973624229u, 2802299603u,
39873
    4052944421u, 1822222163u, 285065864u, 2381456382u, 3896478014u, 1966106696u, 156323219u, 2489232613u,
39874
    2759337087u, 964150537u, 1159127250u, 3625517476u, 3184831332u, 551242258u, 1555722185u, 3249901247u,
39875
    2535537225u, 170842943u, 1984954084u, 3946848146u, 2391651666u, 327308324u, 1877176831u, 4075589769u,
39876
    263086283u, 2460058045u, 4005602406u, 1942963472u, 369291216u, 2332888742u, 4151061373u, 1784924683u,
39877
    1022852861u, 2717425547u, 3717839440u, 1083595558u, 626782694u, 3092517008u, 3291821387u, 1497027645u,
39878
    1763466407u, 4094934481u, 2289211402u, 360544636u, 1890636732u, 3988730570u, 2447251217u, 215086695u,
39879
    1514488465u, 3343557607u, 3140191804u, 639919946u, 1139395978u, 3739626748u, 2726758695u, 1065936977u,
39880
  }, {
39881
    0u, 3120290792u, 2827399569u, 293431929u, 2323408227u, 864534155u, 586863858u, 2600537882u,
39882
    3481914503u, 1987188591u, 1729068310u, 3740575486u, 1173727716u, 4228805132u, 3983743093u, 1418249117u,
39883
    1147313999u, 4254680231u, 3974377182u, 1428157750u, 3458136620u, 2011505092u, 1721256893u, 3747844181u,
39884
    2347455432u, 839944224u, 594403929u, 2593536433u, 26687147u, 3094146371u, 2836498234u, 283794642u,
39885
    2294627998u, 826205558u, 541298447u, 2578994407u, 45702141u, 3141697557u, 2856315500u, 331624836u,
39886
    1196225049u, 4273416689u, 4023010184u, 1446090848u, 3442513786u, 1959480466u, 1706436331u, 3696098563u,
39887
    3433538001u, 1968994873u, 1679888448u, 3722103720u, 1188807858u, 4280295258u, 3999102243u, 1470541515u,
39888
    53374294u, 3134568126u, 2879970503u, 307431215u, 2303854645u, 816436189u, 567589284u, 2553242188u,
39889
    3405478781u, 1929420949u, 1652411116u, 3682996484u, 1082596894u, 4185703926u, 3892424591u, 1375368295u,
39890
    91404282u, 3163122706u, 2918450795u, 336584067u, 2400113305u, 922028401u, 663249672u, 2658384096u,
39891
    2392450098u, 929185754u, 639587747u, 2682555979u, 82149713u, 3172883129u, 2892181696u, 362343208u,
39892
    1091578037u, 4176212829u, 3918960932u, 1349337804u, 3412872662u, 1922537022u, 1676344391u, 3658557359u,
39893
    1111377379u, 4224032267u, 3937989746u, 1396912026u, 3359776896u, 1908013928u, 1623494929u, 3644803833u,
39894
    2377615716u, 877417100u, 623982837u, 2630542109u, 130804743u, 3190831087u, 2941083030u, 381060734u,
39895
    106748588u, 3215393092u, 2933549885u, 388083925u, 2350956495u, 903570471u, 614862430u, 2640172470u,
39896
    3386185259u, 1882115523u, 1632872378u, 3634920530u, 1135178568u, 4199721120u, 3945775833u, 1389631793u,
39897
    1317531835u, 4152109907u, 3858841898u, 1610259138u, 3304822232u, 2097172016u, 1820140617u, 3582394273u,
39898
    2165193788u, 955639764u, 696815021u, 2423477829u, 192043359u, 2995356343u, 2750736590u, 437203750u,
39899
    182808564u, 3005133852u, 2724453989u, 462947725u, 2157513367u, 962777471u, 673168134u, 2447663342u,
39900
    3312231283u, 2090301595u, 1844056802u, 3557935370u, 1326499344u, 4142603768u, 3885397889u, 1584245865u,
39901
    3326266917u, 2142836173u, 1858371508u, 3611272284u, 1279175494u, 4123357358u, 3837270743u, 1564721471u,
39902
    164299426u, 2955991370u, 2706223923u, 414607579u, 2209834945u, 978107433u, 724686416u, 2462715320u,
39903
    2183156074u, 1004243586u, 715579643u, 2472360723u, 140260361u, 2980573153u, 2698675608u, 421617264u,
39904
    1302961645u, 4099032581u, 3845074044u, 1557460884u, 3352688782u, 2116952934u, 1867729183u, 3601371895u,
39905
    2222754758u, 1032278062u, 754596439u, 2499928511u, 234942117u, 3086693709u, 2793824052u, 528319708u,
39906
    1274365761u, 4061043881u, 3816027856u, 1518873912u, 3246989858u, 2020800970u, 1762628531u, 3505670235u,
39907
    3223196809u, 2045103969u, 1754834200u, 3512958704u, 1247965674u, 4086934018u, 3806642299u, 1528765331u,
39908
    261609486u, 3060532198u, 2802936223u, 518697591u, 2246819181u, 1007707781u, 762121468u, 2492913428u,
39909
    213497176u, 3041029808u, 2755593417u, 499441441u, 2261110843u, 1061030867u, 776167850u, 2545465922u,
39910
    3274734047u, 2060165687u, 1807140942u, 3528266662u, 1229724860u, 4038575956u, 3788156205u, 1479636677u,
39911
    1222322711u, 4045468159u, 3764231046u, 1504067694u, 3265744756u, 2069664924u, 1780612837u, 3554288909u,
39912
    2270357136u, 1051278712u, 802445057u, 2519698665u, 221152243u, 3033880603u, 2779263586u, 475261322u,
39913
  }, {
39914
    0u, 2926088593u, 2275419491u, 701019378u, 3560000647u, 2052709654u, 1402038756u, 4261017717u,
39915
    1930665807u, 3715829470u, 4105419308u, 1524313021u, 2804077512u, 155861593u, 545453739u, 2397726522u,
39916
    3861331614u, 1213181711u, 1636244477u, 3488582252u, 840331801u, 2625561480u, 3048626042u, 467584747u,
39917
    2503254481u, 995897408u, 311723186u, 3170637091u, 1090907478u, 4016929991u, 3332753461u, 1758288292u,
39918
    390036349u, 3109546732u, 2426363422u, 1056427919u, 3272488954u, 1835443819u, 1152258713u, 3938878216u,
39919
    1680663602u, 3393484195u, 3817652561u, 1306808512u, 2954733749u, 510998820u, 935169494u, 2580880455u,
39920
    4044899811u, 1601229938u, 1991794816u, 3637571857u, 623446372u, 2336332021u, 2726898695u, 216120726u,
39921
    2181814956u, 744704829u, 95158223u, 2881711710u, 1446680107u, 4166125498u, 3516576584u, 2146575065u,
39922
    780072698u, 2148951915u, 2849952665u, 129384968u, 4199529085u, 1411853292u, 2112855838u, 3548843663u,
39923
    1567451573u, 4077254692u, 3670887638u, 1957027143u, 2304517426u, 657765539u, 251396177u, 2694091200u,
39924
    3361327204u, 1714510325u, 1341779207u, 3784408214u, 476611811u, 2986349938u, 2613617024u, 899690513u,
39925
    3142211371u, 354600634u, 1021997640u, 2458051545u, 1870338988u, 3239283261u, 3906682575u, 1186180958u,
39926
    960597383u, 2536053782u, 3202459876u, 277428597u, 3983589632u, 1125666961u, 1792074851u, 3300423154u,
39927
    1246892744u, 3829039961u, 3455203243u, 1671079482u, 2657312335u, 806080478u, 432241452u, 3081497277u,
39928
    3748049689u, 1896751752u, 1489409658u, 4138600427u, 190316446u, 2772397583u, 2365053693u, 580864876u,
39929
    2893360214u, 35503559u, 735381813u, 2243795108u, 2017747153u, 3593269568u, 4293150130u, 1368183843u,
39930
    1560145396u, 4069882981u, 3680356503u, 1966430470u, 2295112051u, 648294626u, 258769936u, 2701399425u,
39931
    804156091u, 2173100842u, 2823706584u, 103204425u, 4225711676u, 1438101421u, 2088704863u, 3524758222u,
39932
    3134903146u, 347226875u, 1031468553u, 2467456920u, 1860935661u, 3229814396u, 3914054286u, 1193487135u,
39933
    3385412645u, 1738661300u, 1315531078u, 3758225623u, 502792354u, 3012596019u, 2589468097u, 875607120u,
39934
    1271043721u, 3853125400u, 3429020650u, 1644831355u, 2683558414u, 832261023u, 408158061u, 3057348348u,
39935
    953223622u, 2528745559u, 3211865253u, 286899508u, 3974120769u, 1116263632u, 1799381026u, 3307794867u,
39936
    2917509143u, 59586950u, 709201268u, 2217549029u, 2043995280u, 3619452161u, 4269064691u, 1344032866u,
39937
    3740677976u, 1889445577u, 1498812987u, 4148069290u, 180845535u, 2762992206u, 2372361916u, 588238637u,
39938
    1921194766u, 3706423967u, 4112727661u, 1531686908u, 2796705673u, 148555288u, 554857194u, 2407195515u,
39939
    26248257u, 2952271312u, 2251333922u, 676868275u, 3584149702u, 2076793175u, 1375858085u, 4234771508u,
39940
    2493785488u, 986493953u, 319029491u, 3178008930u, 1083533591u, 4009621638u, 3342158964u, 1767759333u,
39941
    3887577823u, 1239362382u, 1612160956u, 3464433197u, 864482904u, 2649647049u, 3022443323u, 441336490u,
39942
    1706844275u, 3419730402u, 3793503504u, 1282724993u, 2978819316u, 535149925u, 908921239u, 2554697734u,
39943
    380632892u, 3100077741u, 2433735263u, 1063734222u, 3265180603u, 1828069930u, 1161729752u, 3948283721u,
39944
    2207997677u, 770953084u, 71007118u, 2857626143u, 1470763626u, 4190274555u, 3490330377u, 2120394392u,
39945
    4035494306u, 1591758899u, 1999168705u, 3644880208u, 616140069u, 2328960180u, 2736367686u, 225524183u,
39946
  },
39947
};
39948
39949
// ---------------- Private Initializer Prototypes
39950
39951
// ---------------- Private Function Prototypes
39952
39953
WUFFS_BASE__GENERATED_C_CODE
39954
static wuffs_base__empty_struct
39955
wuffs_crc32__ieee_hasher__up(
39956
    wuffs_crc32__ieee_hasher* self,
39957
    wuffs_base__slice_u8 a_x);
39958
39959
WUFFS_BASE__GENERATED_C_CODE
39960
static wuffs_base__empty_struct
39961
wuffs_crc32__ieee_hasher__up__choosy_default(
39962
    wuffs_crc32__ieee_hasher* self,
39963
    wuffs_base__slice_u8 a_x);
39964
39965
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39966
WUFFS_BASE__GENERATED_C_CODE
39967
static wuffs_base__empty_struct
39968
wuffs_crc32__ieee_hasher__up_arm_crc32(
39969
    wuffs_crc32__ieee_hasher* self,
39970
    wuffs_base__slice_u8 a_x);
39971
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
39972
39973
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39974
WUFFS_BASE__GENERATED_C_CODE
39975
static wuffs_base__empty_struct
39976
wuffs_crc32__ieee_hasher__up_x86_sse42(
39977
    wuffs_crc32__ieee_hasher* self,
39978
    wuffs_base__slice_u8 a_x);
39979
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
39980
39981
// ---------------- VTables
39982
39983
const wuffs_base__hasher_u32__func_ptrs
39984
wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
39985
  (uint32_t(*)(const void*))(&wuffs_crc32__ieee_hasher__checksum_u32),
39986
  (uint64_t(*)(const void*,
39987
      uint32_t))(&wuffs_crc32__ieee_hasher__get_quirk),
39988
  (wuffs_base__status(*)(void*,
39989
      uint32_t,
39990
      uint64_t))(&wuffs_crc32__ieee_hasher__set_quirk),
39991
  (wuffs_base__empty_struct(*)(void*,
39992
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update),
39993
  (uint32_t(*)(void*,
39994
      wuffs_base__slice_u8))(&wuffs_crc32__ieee_hasher__update_u32),
39995
};
39996
39997
// ---------------- Initializer Implementations
39998
39999
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
40000
wuffs_crc32__ieee_hasher__initialize(
40001
    wuffs_crc32__ieee_hasher* self,
40002
    size_t sizeof_star_self,
40003
    uint64_t wuffs_version,
40004
25.7k
    uint32_t options){
40005
25.7k
  if (!self) {
40006
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40007
0
  }
40008
25.7k
  if (sizeof(*self) != sizeof_star_self) {
40009
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
40010
0
  }
40011
25.7k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
40012
25.7k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
40013
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
40014
0
  }
40015
40016
25.7k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
40017
    // The whole point of this if-check is to detect an uninitialized *self.
40018
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
40019
#if !defined(__clang__) && defined(__GNUC__)
40020
#pragma GCC diagnostic push
40021
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40022
#endif
40023
2.82k
    if (self->private_impl.magic != 0) {
40024
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
40025
0
    }
40026
#if !defined(__clang__) && defined(__GNUC__)
40027
#pragma GCC diagnostic pop
40028
#endif
40029
22.8k
  } else {
40030
22.8k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
40031
0
      memset(self, 0, sizeof(*self));
40032
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
40033
22.8k
    } else {
40034
22.8k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
40035
22.8k
    }
40036
22.8k
  }
40037
40038
25.7k
  self->private_impl.choosy_up = &wuffs_crc32__ieee_hasher__up__choosy_default;
40039
40040
25.7k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
40041
25.7k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
40042
25.7k
      wuffs_base__hasher_u32__vtable_name;
40043
25.7k
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
40044
25.7k
      (const void*)(&wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32);
40045
25.7k
  return wuffs_base__make_status(NULL);
40046
25.7k
}
40047
40048
wuffs_crc32__ieee_hasher*
40049
0
wuffs_crc32__ieee_hasher__alloc(void) {
40050
0
  wuffs_crc32__ieee_hasher* x =
40051
0
      (wuffs_crc32__ieee_hasher*)(calloc(1, sizeof(wuffs_crc32__ieee_hasher)));
40052
0
  if (!x) {
40053
0
    return NULL;
40054
0
  }
40055
0
  if (wuffs_crc32__ieee_hasher__initialize(
40056
0
      x, sizeof(wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
40057
0
    free(x);
40058
0
    return NULL;
40059
0
  }
40060
0
  return x;
40061
0
}
40062
40063
size_t
40064
0
sizeof__wuffs_crc32__ieee_hasher(void) {
40065
0
  return sizeof(wuffs_crc32__ieee_hasher);
40066
0
}
40067
40068
// ---------------- Function Implementations
40069
40070
// -------- func crc32.ieee_hasher.get_quirk
40071
40072
WUFFS_BASE__GENERATED_C_CODE
40073
WUFFS_BASE__MAYBE_STATIC uint64_t
40074
wuffs_crc32__ieee_hasher__get_quirk(
40075
    const wuffs_crc32__ieee_hasher* self,
40076
0
    uint32_t a_key) {
40077
0
  if (!self) {
40078
0
    return 0;
40079
0
  }
40080
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40081
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40082
0
    return 0;
40083
0
  }
40084
40085
0
  return 0u;
40086
0
}
40087
40088
// -------- func crc32.ieee_hasher.set_quirk
40089
40090
WUFFS_BASE__GENERATED_C_CODE
40091
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40092
wuffs_crc32__ieee_hasher__set_quirk(
40093
    wuffs_crc32__ieee_hasher* self,
40094
    uint32_t a_key,
40095
0
    uint64_t a_value) {
40096
0
  if (!self) {
40097
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40098
0
  }
40099
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40100
0
    return wuffs_base__make_status(
40101
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40102
0
        ? wuffs_base__error__disabled_by_previous_error
40103
0
        : wuffs_base__error__initialize_not_called);
40104
0
  }
40105
40106
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
40107
0
}
40108
40109
// -------- func crc32.ieee_hasher.update
40110
40111
WUFFS_BASE__GENERATED_C_CODE
40112
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
40113
wuffs_crc32__ieee_hasher__update(
40114
    wuffs_crc32__ieee_hasher* self,
40115
56.6k
    wuffs_base__slice_u8 a_x) {
40116
56.6k
  if (!self) {
40117
0
    return wuffs_base__make_empty_struct();
40118
0
  }
40119
56.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40120
0
    return wuffs_base__make_empty_struct();
40121
0
  }
40122
40123
56.6k
  if (self->private_impl.f_state == 0u) {
40124
20.1k
    self->private_impl.choosy_up = (
40125
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
40126
        wuffs_base__cpu_arch__have_arm_crc32() ? &wuffs_crc32__ieee_hasher__up_arm_crc32 :
40127
#endif
40128
20.1k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40129
20.1k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc32__ieee_hasher__up_x86_sse42 :
40130
20.1k
#endif
40131
20.1k
        self->private_impl.choosy_up);
40132
20.1k
  }
40133
56.6k
  wuffs_crc32__ieee_hasher__up(self, a_x);
40134
56.6k
  return wuffs_base__make_empty_struct();
40135
56.6k
}
40136
40137
// -------- func crc32.ieee_hasher.update_u32
40138
40139
WUFFS_BASE__GENERATED_C_CODE
40140
WUFFS_BASE__MAYBE_STATIC uint32_t
40141
wuffs_crc32__ieee_hasher__update_u32(
40142
    wuffs_crc32__ieee_hasher* self,
40143
56.6k
    wuffs_base__slice_u8 a_x) {
40144
56.6k
  if (!self) {
40145
0
    return 0;
40146
0
  }
40147
56.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40148
0
    return 0;
40149
0
  }
40150
40151
56.6k
  wuffs_crc32__ieee_hasher__update(self, a_x);
40152
56.6k
  return self->private_impl.f_state;
40153
56.6k
}
40154
40155
// -------- func crc32.ieee_hasher.up
40156
40157
WUFFS_BASE__GENERATED_C_CODE
40158
static wuffs_base__empty_struct
40159
wuffs_crc32__ieee_hasher__up(
40160
    wuffs_crc32__ieee_hasher* self,
40161
56.6k
    wuffs_base__slice_u8 a_x) {
40162
56.6k
  return (*self->private_impl.choosy_up)(self, a_x);
40163
56.6k
}
40164
40165
WUFFS_BASE__GENERATED_C_CODE
40166
static wuffs_base__empty_struct
40167
wuffs_crc32__ieee_hasher__up__choosy_default(
40168
    wuffs_crc32__ieee_hasher* self,
40169
0
    wuffs_base__slice_u8 a_x) {
40170
0
  uint32_t v_s = 0;
40171
0
  wuffs_base__slice_u8 v_p = {0};
40172
40173
0
  v_s = (4294967295u ^ self->private_impl.f_state);
40174
0
  {
40175
0
    wuffs_base__slice_u8 i_slice_p = a_x;
40176
0
    v_p.ptr = i_slice_p.ptr;
40177
0
    v_p.len = 16;
40178
0
    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)) / 32) * 32));
40179
0
    while (v_p.ptr < i_end0_p) {
40180
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
40181
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
40182
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
40183
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
40184
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
40185
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
40186
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
40187
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
40188
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
40189
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
40190
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
40191
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
40192
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
40193
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
40194
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
40195
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
40196
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
40197
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
40198
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
40199
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
40200
0
      v_p.ptr += 16;
40201
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
40202
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
40203
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
40204
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
40205
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
40206
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
40207
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
40208
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
40209
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
40210
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
40211
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
40212
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
40213
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
40214
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
40215
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
40216
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
40217
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
40218
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
40219
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
40220
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
40221
0
      v_p.ptr += 16;
40222
0
    }
40223
0
    v_p.len = 16;
40224
0
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 16) * 16));
40225
0
    while (v_p.ptr < i_end1_p) {
40226
0
      v_s ^= ((((uint32_t)(v_p.ptr[0u])) << 0u) |
40227
0
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
40228
0
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
40229
0
          (((uint32_t)(v_p.ptr[3u])) << 24u));
40230
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][v_p.ptr[15u]] ^
40231
0
          WUFFS_CRC32__IEEE_TABLE[1u][v_p.ptr[14u]] ^
40232
0
          WUFFS_CRC32__IEEE_TABLE[2u][v_p.ptr[13u]] ^
40233
0
          WUFFS_CRC32__IEEE_TABLE[3u][v_p.ptr[12u]] ^
40234
0
          WUFFS_CRC32__IEEE_TABLE[4u][v_p.ptr[11u]] ^
40235
0
          WUFFS_CRC32__IEEE_TABLE[5u][v_p.ptr[10u]] ^
40236
0
          WUFFS_CRC32__IEEE_TABLE[6u][v_p.ptr[9u]] ^
40237
0
          WUFFS_CRC32__IEEE_TABLE[7u][v_p.ptr[8u]] ^
40238
0
          WUFFS_CRC32__IEEE_TABLE[8u][v_p.ptr[7u]] ^
40239
0
          WUFFS_CRC32__IEEE_TABLE[9u][v_p.ptr[6u]] ^
40240
0
          WUFFS_CRC32__IEEE_TABLE[10u][v_p.ptr[5u]] ^
40241
0
          WUFFS_CRC32__IEEE_TABLE[11u][v_p.ptr[4u]] ^
40242
0
          WUFFS_CRC32__IEEE_TABLE[12u][(255u & (v_s >> 24u))] ^
40243
0
          WUFFS_CRC32__IEEE_TABLE[13u][(255u & (v_s >> 16u))] ^
40244
0
          WUFFS_CRC32__IEEE_TABLE[14u][(255u & (v_s >> 8u))] ^
40245
0
          WUFFS_CRC32__IEEE_TABLE[15u][(255u & (v_s >> 0u))]);
40246
0
      v_p.ptr += 16;
40247
0
    }
40248
0
    v_p.len = 1;
40249
0
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
40250
0
    while (v_p.ptr < i_end2_p) {
40251
0
      v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
40252
0
      v_p.ptr += 1;
40253
0
    }
40254
0
    v_p.len = 0;
40255
0
  }
40256
0
  self->private_impl.f_state = (4294967295u ^ v_s);
40257
0
  return wuffs_base__make_empty_struct();
40258
0
}
40259
40260
// -------- func crc32.ieee_hasher.checksum_u32
40261
40262
WUFFS_BASE__GENERATED_C_CODE
40263
WUFFS_BASE__MAYBE_STATIC uint32_t
40264
wuffs_crc32__ieee_hasher__checksum_u32(
40265
0
    const wuffs_crc32__ieee_hasher* self) {
40266
0
  if (!self) {
40267
0
    return 0;
40268
0
  }
40269
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40270
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40271
0
    return 0;
40272
0
  }
40273
40274
0
  return self->private_impl.f_state;
40275
0
}
40276
40277
// โ€ผ WUFFS MULTI-FILE SECTION +arm_crc32
40278
// -------- func crc32.ieee_hasher.up_arm_crc32
40279
40280
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
40281
WUFFS_BASE__GENERATED_C_CODE
40282
static wuffs_base__empty_struct
40283
wuffs_crc32__ieee_hasher__up_arm_crc32(
40284
    wuffs_crc32__ieee_hasher* self,
40285
    wuffs_base__slice_u8 a_x) {
40286
  wuffs_base__slice_u8 v_p = {0};
40287
  uint32_t v_s = 0;
40288
40289
  v_s = (4294967295u ^ self->private_impl.f_state);
40290
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
40291
    v_s = __crc32b(v_s, a_x.ptr[0u]);
40292
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
40293
  }
40294
  {
40295
    wuffs_base__slice_u8 i_slice_p = a_x;
40296
    v_p.ptr = i_slice_p.ptr;
40297
    v_p.len = 8;
40298
    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)) / 128) * 128));
40299
    while (v_p.ptr < i_end0_p) {
40300
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40301
      v_p.ptr += 8;
40302
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40303
      v_p.ptr += 8;
40304
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40305
      v_p.ptr += 8;
40306
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40307
      v_p.ptr += 8;
40308
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40309
      v_p.ptr += 8;
40310
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40311
      v_p.ptr += 8;
40312
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40313
      v_p.ptr += 8;
40314
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40315
      v_p.ptr += 8;
40316
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40317
      v_p.ptr += 8;
40318
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40319
      v_p.ptr += 8;
40320
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40321
      v_p.ptr += 8;
40322
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40323
      v_p.ptr += 8;
40324
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40325
      v_p.ptr += 8;
40326
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40327
      v_p.ptr += 8;
40328
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40329
      v_p.ptr += 8;
40330
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40331
      v_p.ptr += 8;
40332
    }
40333
    v_p.len = 8;
40334
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(v_p.ptr, (((i_slice_p.len - (size_t)(v_p.ptr - i_slice_p.ptr)) / 8) * 8));
40335
    while (v_p.ptr < i_end1_p) {
40336
      v_s = __crc32d(v_s, wuffs_base__peek_u64le__no_bounds_check(v_p.ptr));
40337
      v_p.ptr += 8;
40338
    }
40339
    v_p.len = 1;
40340
    const uint8_t* i_end2_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
40341
    while (v_p.ptr < i_end2_p) {
40342
      v_s = __crc32b(v_s, v_p.ptr[0u]);
40343
      v_p.ptr += 1;
40344
    }
40345
    v_p.len = 0;
40346
  }
40347
  self->private_impl.f_state = (4294967295u ^ v_s);
40348
  return wuffs_base__make_empty_struct();
40349
}
40350
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_CRC32)
40351
// โ€ผ WUFFS MULTI-FILE SECTION -arm_crc32
40352
40353
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
40354
// -------- func crc32.ieee_hasher.up_x86_sse42
40355
40356
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40357
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
40358
WUFFS_BASE__GENERATED_C_CODE
40359
static wuffs_base__empty_struct
40360
wuffs_crc32__ieee_hasher__up_x86_sse42(
40361
    wuffs_crc32__ieee_hasher* self,
40362
56.6k
    wuffs_base__slice_u8 a_x) {
40363
56.6k
  uint32_t v_s = 0;
40364
56.6k
  __m128i v_kk = {0};
40365
56.6k
  __m128i v_x0 = {0};
40366
56.6k
  __m128i v_x1 = {0};
40367
56.6k
  __m128i v_x2 = {0};
40368
56.6k
  __m128i v_x3 = {0};
40369
56.6k
  __m128i v_x4 = {0};
40370
56.6k
  __m128i v_x5 = {0};
40371
56.6k
  __m128i v_x6 = {0};
40372
56.6k
  __m128i v_x7 = {0};
40373
56.6k
  __m128i v_y0 = {0};
40374
56.6k
  __m128i v_y1 = {0};
40375
56.6k
  __m128i v_y2 = {0};
40376
56.6k
  __m128i v_y3 = {0};
40377
56.6k
  __m128i v_y4 = {0};
40378
56.6k
  __m128i v_y5 = {0};
40379
56.6k
  __m128i v_y6 = {0};
40380
56.6k
  __m128i v_y7 = {0};
40381
40382
56.6k
  v_s = (4294967295u ^ self->private_impl.f_state);
40383
113k
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
40384
56.4k
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
40385
56.4k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
40386
56.4k
  }
40387
56.6k
  if (((uint64_t)(a_x.len)) >= 128u) {
40388
2.92k
    v_x0 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u));
40389
2.92k
    v_x1 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
40390
2.92k
    v_x2 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
40391
2.92k
    v_x3 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
40392
2.92k
    v_x4 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
40393
2.92k
    v_x5 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
40394
2.92k
    v_x6 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
40395
2.92k
    v_x7 = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
40396
2.92k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2433674945u), (int32_t)(0u), (int32_t)(872412467u));
40397
2.92k
    v_x0 = _mm_xor_si128(v_x0, _mm_cvtsi32_si128((int32_t)(v_s)));
40398
2.92k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
40399
178k
    while (((uint64_t)(a_x.len)) >= 128u) {
40400
176k
      v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
40401
176k
      v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
40402
176k
      v_y1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(0u));
40403
176k
      v_x1 = _mm_clmulepi64_si128(v_x1, v_kk, (int32_t)(17u));
40404
176k
      v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
40405
176k
      v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
40406
176k
      v_y3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(0u));
40407
176k
      v_x3 = _mm_clmulepi64_si128(v_x3, v_kk, (int32_t)(17u));
40408
176k
      v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
40409
176k
      v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
40410
176k
      v_y5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(0u));
40411
176k
      v_x5 = _mm_clmulepi64_si128(v_x5, v_kk, (int32_t)(17u));
40412
176k
      v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
40413
176k
      v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
40414
176k
      v_y7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(0u));
40415
176k
      v_x7 = _mm_clmulepi64_si128(v_x7, v_kk, (int32_t)(17u));
40416
176k
      v_y0 = _mm_xor_si128(v_y0, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)));
40417
176k
      v_x0 = _mm_xor_si128(v_x0, v_y0);
40418
176k
      v_y1 = _mm_xor_si128(v_y1, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u)));
40419
176k
      v_x1 = _mm_xor_si128(v_x1, v_y1);
40420
176k
      v_y2 = _mm_xor_si128(v_y2, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u)));
40421
176k
      v_x2 = _mm_xor_si128(v_x2, v_y2);
40422
176k
      v_y3 = _mm_xor_si128(v_y3, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u)));
40423
176k
      v_x3 = _mm_xor_si128(v_x3, v_y3);
40424
176k
      v_y4 = _mm_xor_si128(v_y4, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u)));
40425
176k
      v_x4 = _mm_xor_si128(v_x4, v_y4);
40426
176k
      v_y5 = _mm_xor_si128(v_y5, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u)));
40427
176k
      v_x5 = _mm_xor_si128(v_x5, v_y5);
40428
176k
      v_y6 = _mm_xor_si128(v_y6, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u)));
40429
176k
      v_x6 = _mm_xor_si128(v_x6, v_y6);
40430
176k
      v_y7 = _mm_xor_si128(v_y7, _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u)));
40431
176k
      v_x7 = _mm_xor_si128(v_x7, v_y7);
40432
176k
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
40433
176k
    }
40434
2.92k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(3433693342u), (int32_t)(0u), (int32_t)(2926088593u));
40435
2.92k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
40436
2.92k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
40437
2.92k
    v_y2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(0u));
40438
2.92k
    v_x2 = _mm_clmulepi64_si128(v_x2, v_kk, (int32_t)(17u));
40439
2.92k
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
40440
2.92k
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
40441
2.92k
    v_y6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(0u));
40442
2.92k
    v_x6 = _mm_clmulepi64_si128(v_x6, v_kk, (int32_t)(17u));
40443
2.92k
    v_y0 = _mm_xor_si128(v_y0, v_x1);
40444
2.92k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
40445
2.92k
    v_y2 = _mm_xor_si128(v_y2, v_x3);
40446
2.92k
    v_x2 = _mm_xor_si128(v_x2, v_y2);
40447
2.92k
    v_y4 = _mm_xor_si128(v_y4, v_x5);
40448
2.92k
    v_x4 = _mm_xor_si128(v_x4, v_y4);
40449
2.92k
    v_y6 = _mm_xor_si128(v_y6, v_x7);
40450
2.92k
    v_x6 = _mm_xor_si128(v_x6, v_y6);
40451
2.92k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(2166711591u), (int32_t)(0u), (int32_t)(4057597354u));
40452
2.92k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
40453
2.92k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
40454
2.92k
    v_y4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(0u));
40455
2.92k
    v_x4 = _mm_clmulepi64_si128(v_x4, v_kk, (int32_t)(17u));
40456
2.92k
    v_y0 = _mm_xor_si128(v_y0, v_x2);
40457
2.92k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
40458
2.92k
    v_y4 = _mm_xor_si128(v_y4, v_x6);
40459
2.92k
    v_x4 = _mm_xor_si128(v_x4, v_y4);
40460
2.92k
    v_kk = _mm_set_epi32((int32_t)(0u), (int32_t)(496309207u), (int32_t)(0u), (int32_t)(2402626965u));
40461
2.92k
    v_y0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(0u));
40462
2.92k
    v_x0 = _mm_clmulepi64_si128(v_x0, v_kk, (int32_t)(17u));
40463
2.92k
    v_y0 = _mm_xor_si128(v_y0, v_x4);
40464
2.92k
    v_x0 = _mm_xor_si128(v_x0, v_y0);
40465
2.92k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
40466
2.92k
    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))));
40467
2.92k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
40468
2.92k
    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))));
40469
2.92k
  }
40470
99.7k
  while (((uint64_t)(a_x.len)) >= 8u) {
40471
43.1k
    v_kk = _mm_set_epi32((int32_t)(1u), (int32_t)(3681617473u), (int32_t)(3034951717u), (int32_t)(4144043585u));
40472
43.1k
    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))));
40473
43.1k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 8u);
40474
43.1k
  }
40475
183k
  while (((uint64_t)(a_x.len)) > 0u) {
40476
127k
    v_s = (WUFFS_CRC32__IEEE_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
40477
127k
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
40478
127k
  }
40479
56.6k
  self->private_impl.f_state = (4294967295u ^ v_s);
40480
56.6k
  return wuffs_base__make_empty_struct();
40481
56.6k
}
40482
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40483
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
40484
40485
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC32)
40486
40487
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
40488
40489
// ---------------- Status Codes Implementations
40490
40491
// ---------------- Private Consts
40492
40493
static const uint64_t
40494
WUFFS_CRC64__ECMA_TABLE[8][256] WUFFS_BASE__POTENTIALLY_UNUSED = {
40495
  {
40496
    0u, 12911341560706588527u, 17619267392293085275u, 5164075066763771700u, 8921845837811637811u, 14483170935171449180u, 10328150133527543400u, 4357999468653093127u,
40497
    17843691675623275622u, 4940391307328217865u, 226782375002905661u, 12685511915359257426u, 10119945210068853333u, 4566377562367245626u, 8715998937306186254u, 14689403211693301089u,
40498
    9051005139383707209u, 14895072503764629798u, 9880782614656435730u, 4193374422961527165u, 453564750005811322u, 13070904082541799189u, 17496296445768931361u, 4747102235666401102u,
40499
    9960315520700766767u, 4113029525020509504u, 9132755124734491252u, 14812441257301386523u, 17431997874612372508u, 4811156168024382323u, 391483189436228679u, 13132671735097031464u,
40500
    18102010278767414418u, 5195199925788447741u, 1131375642422963401u, 13591081480414639014u, 9288535643022529185u, 3731739485546663374u, 8386748845923054330u, 14361410892855143829u,
40501
    907129500011622644u, 13814943346342178715u, 17875617253995106479u, 5421418680781082560u, 8594564625313771207u, 14152643483341451688u, 9494204471332802204u, 3525329033817543155u,
40502
    9704381199536204507u, 3855837706121835956u, 8226059050041019008u, 13908973417437222383u, 18265510249468982504u, 5643692520190618503u, 718348998302913715u, 13463047253836762076u,
40503
    8146277531524994749u, 13989069943491807698u, 9622312336048764646u, 3938150108875254153u, 782966378872457358u, 13399312233903888353u, 18327840216347633877u, 5582173445676054458u,
40504
    7257036000092981153u, 15535280666427316430u, 10390399851576895482u, 2529986302517213333u, 2262751284845926802u, 12414353723947190013u, 16997392145760156105u, 6398650419759490726u,
40505
    10599130201908394951u, 2322133910755632296u, 7463478971093326748u, 15329644185724306675u, 16773497691846108660u, 6622864283287239323u, 2036569382881248687u, 12640783567252986560u,
40506
    1814259000023245288u, 12250853444207230599u, 17125426475222188467u, 6811676960462675676u, 7132938157145702363u, 15119434731753103540u, 10842837361562165120u, 2690676064372932847u,
40507
    17189129250627542414u, 6747026957542163169u, 1875814858707893717u, 12188560364711551674u, 10762704257491731389u, 2770420489343360210u, 7050658067635086310u, 15201536148867841161u,
40508
    11493583972846619443u, 3219832958944941148u, 7711675412243671912u, 15576564987190227975u, 16452118100082038016u, 6305011443818121839u, 1213047649942025563u, 11816267669673208372u,
40509
    7503259434831574869u, 15784731923736995898u, 11287385040381237006u, 3425713581329221729u, 1436697996605827430u, 11591809733187859977u, 16677985422973077821u, 6078267261889762898u,
40510
    16292555063049989498u, 5851447209550246421u, 1630020308903038241u, 11939238787801010766u, 11081681957373440841u, 3090674103720225830u, 7876300217750508306u, 16023932746787097725u,
40511
    1565932757744914716u, 12003503911822413427u, 16230825569204842823u, 5913566482019610152u, 7956607163135676207u, 15944361922680361024u, 11164346891352108916u, 3008957496780927003u,
40512
    14514072000185962306u, 8809633696146542637u, 4460922918905818905u, 10287960411460399222u, 12879331835779764593u, 113391187501452830u, 5059972605034426666u, 17660565739912801861u,
40513
    4525502569691853604u, 10224187249629523019u, 14576435430675780479u, 8748148222884465680u, 4980157760350383383u, 17740628527280140920u, 12797300839518981452u, 195741594718114339u,
40514
    13040162471224305931u, 565687821211481700u, 4644267821511264592u, 17536326748496696895u, 14926957942186653496u, 8937808626997553239u, 4297282312656885603u, 9839608450464401420u,
40515
    4852190599768102253u, 17327666750234135042u, 13245728566574478646u, 359174499151456857u, 4073138765762497374u, 10063573324157604913u, 14700457781105076997u, 9163920108173816938u,
40516
    3628518000046490576u, 9328460452529085631u, 14330211790445699979u, 8498696072880078052u, 5299565100954197475u, 18061012165519327884u, 13623353920925351352u, 1018284691440624343u,
40517
    14265876314291404726u, 8562713237611094233u, 3566469078572851181u, 9390260331795218562u, 13702854325316886917u, 937907429353946858u, 5381352128745865694u, 17978417549248290481u,
40518
    5746791986423309721u, 18225777846762470134u, 13494053915084326338u, 606523824971012781u, 3751629717415787434u, 9745292510640121029u, 13876787882151992305u, 8338992711486538910u,
40519
    13285957365033343487u, 815010154451519120u, 5540840978686720420u, 18431906428167644875u, 14101316135270172620u, 8115412784602421411u, 3978303581567838103u, 9519354766961195256u,
40520
    12527462061959317731u, 2230461459452909452u, 6439665917889882296u, 16893009583564617687u, 15423350824487343824u, 7288217715337890239u, 2490078880175191691u, 10493603952060017124u,
40521
    6520081235612152965u, 16813546994155744234u, 12610022887636243678u, 2148641156328442801u, 2426095299884051126u, 10557972909709735385u, 15361512820870335213u, 7350228890552538498u,
40522
    15006518869663149738u, 7165105895222849989u, 2649782550477098737u, 10947027550912647582u, 12362696414880903321u, 1783234539286425590u, 6851427162658443458u, 17022309211647725485u,
40523
    2873395993211654860u, 10722532847870938531u, 15232418832718623383u, 6938393941075996152u, 6642978682516671743u, 17230443782969840528u, 12156534523779525796u, 1989151790783919051u,
40524
    6263731030979658865u, 16556202624882645790u, 11702894419100492842u, 1245039440087595845u, 3260040617806076482u, 11390642587947386157u, 15688795063501830681u, 7680756410435167606u,
40525
    11622868312827688983u, 1324891275238549368u, 6181348207440451660u, 16638201170595874595u, 15752600435501016612u, 7616209416359311691u, 3321489341258335871u, 11328242235714328848u,
40526
    3131865515489829432u, 10977756817953029463u, 16137146508898304611u, 7844397531750915340u, 5811434156413844491u, 16395372229761246052u, 11827132964039220304u, 1660744670629167935u,
40527
    15913214326271352414u, 8068573254449152305u, 2905717078206922245u, 11204220263579804010u, 12035829987123708013u, 1452858539103461122u, 6017914993561854006u, 16189773752444600153u,
40528
  }, {
40529
    0u, 6118555238288912653u, 12237110476577825306u, 18247330833359770391u, 13942380710360636081u, 10778293617712507836u, 7543452712389327019u, 4343374206906190246u,
40530
    1162559746622204903u, 4957131115480832746u, 13398436261328603645u, 17084888254066768112u, 15086905424778654038u, 9634902877839851611u, 8686748413812380492u, 3198961161184305729u,
40531
    2325119493244409806u, 8407378615347160771u, 9914262230961665492u, 15960741045388068057u, 16229058527915052415u, 13101053971319389298u, 5254506258681524069u, 2018377927885299304u,
40532
    3487552142959377449u, 7246080283574668580u, 11075676491871100467u, 14798208821638459198u, 17373496827624760984u, 11957750539307177877u, 6397922322368611458u, 873845550624159119u,
40533
    4650238986488819612u, 1468611264581623441u, 16814757230694321542u, 13669406796222545035u, 9364600845881799981u, 15356367945216001056u, 2893367039927949111u, 8993183146101597754u,
40534
    5812680741028562043u, 307286854339917174u, 17976181078471403105u, 12506848973898782572u, 10509012517363048138u, 14213073068277772231u, 4036755855770598608u, 7848658706446142941u,
40535
    6975104285918754898u, 3757679901787621727u, 14492160567149337160u, 11382574084698991429u, 11651310343450272483u, 17679087685142107118u, 604386294999662841u, 6668229816820511220u,
40536
    8137636784695169973u, 2596263716583940792u, 15653459723670892975u, 10220140060479144098u, 12795844644737222916u, 16535671346696648713u, 1747691101248318238u, 5523790692630174227u,
40537
    9300477972977639224u, 15418239225476001333u, 2937222529163246882u, 8947075512310451247u, 4642267913777087881u, 1478833794519692420u, 16842993350473770899u, 13643422681269376670u,
40538
    10462937938231096543u, 14256895642581861842u, 4098594218943518405u, 7784568886045304776u, 5786734079855898222u, 335485660068962147u, 17986366292203195508u, 12498915352811683193u,
40539
    11625361482057124086u, 17707288688936286715u, 614573708679834348u, 6660293997941431265u, 6929031904881267271u, 3801500275841901386u, 14553996732492558429u, 11318486464284246352u,
40540
    12787875770090627857u, 16545891676414235164u, 1775925023235784971u, 5497808777625382918u, 8073511711541197216u, 2658137194938402989u, 15697317412892285882u, 10174030228858301111u,
40541
    13950208571837509796u, 10768213751408296361u, 7515359803575243454u, 4369215658492879795u, 64266086328445461u, 6056541296517372696u, 12193111774187735055u, 18293581128395077890u,
40542
    15112713823828466499u, 9606842886146402894u, 8676701462472931673u, 3206755967968430164u, 1208772589999325682u, 4913169729330573567u, 13336459633641022440u, 17149116886581154533u,
40543
    16275273569390339946u, 13057090384914568807u, 5192527433167881584u, 2082608760381092989u, 2350925692077440475u, 8379320821714095318u, 9904217479574233025u, 15968533654375526092u,
40544
    17437760713698643085u, 11895738795633802624u, 6353925819959930519u, 920093647833407386u, 3495382202496636476u, 7235998217053677361u, 11047581385260348454u, 14824052473177163051u,
40545
    10447068876609200373u, 14128364157388739064u, 4118967294799201007u, 7908597456515216354u, 5874445058326493764u, 391603411424480073u, 17894151024620902494u, 12447300791057279315u,
40546
    9284535827554175762u, 15289779793358354975u, 2957667589039384840u, 9071030930460645381u, 4729911307347480995u, 1535020299074674862u, 16750846767572792249u, 13591740465559749300u,
40547
    12735909365018523451u, 16453465302197274166u, 1832394617641637153u, 5585730863000118316u, 8197188437887036810u, 2678299164963691655u, 15569137772090609552u, 10158372272797335197u,
40548
    11573468159711796444u, 17614790262716542417u, 670971320137924294u, 6748289234561093579u, 7052776217202099821u, 3821593491595032416u, 14425748405936874615u, 11302896163253294458u,
40549
    15020497008676966249u, 9555230900528283236u, 8764415362900159859u, 3262871967819308158u, 1229147417359668696u, 5037195377843840213u, 13320587995882862530u, 17020586948957226703u,
40550
    13858063809762534542u, 10716528681989657987u, 7603000551683802772u, 4425403642365261721u, 84709666887204415u, 6180499360129388338u, 12177172482473303077u, 18165119875451415848u,
40551
    17309582619392432295u, 11880078264510294442u, 6477599625422879421u, 940257368289594288u, 3551850046471569942u, 7323923223311315739u, 10995617555250765836u, 14731624552464748801u,
40552
    16147023423082394432u, 13041502936518885965u, 5316274389876805978u, 2102700497890566231u, 2407324781779167729u, 8467313413945678076u, 9852321304593615851u, 15876037047908055782u,
40553
    1291018766690942925u, 4973072573440528064u, 13274480430592564695u, 17064442507263798490u, 15030719607150486908u, 9547259896855319665u, 8738431316985759590u, 3291108156134209131u,
40554
    128532172656890922u, 6134424711959717159u, 12113082593034745392u, 18226958170089932605u, 13886262546419256987u, 10690581952315096982u, 7595066862094806145u, 4435588787024731532u,
40555
    3580050981226981379u, 7297974293382715662u, 10987681667836234265u, 14741811897106152212u, 17353402924945863346u, 11834005814401532863u, 6413511935936860328u, 1002093465131966885u,
40556
    2417545179998651364u, 8459344608371405545u, 9826339458661147134u, 15904271038397419763u, 16208896970474576213u, 12977377931899316312u, 5270164626790366031u, 2146558256149678658u,
40557
    5864365122984562769u, 399431204366950748u, 17919992407673188939u, 12419207813205476166u, 10385054866335763168u, 14192630174644861933u, 4165217520762185978u, 7864598685623228919u,
40558
    4701851384154880950u, 1560828767195761339u, 16758641643428190636u, 13581693582721149089u, 9240574510442684679u, 15335992705270927370u, 3021896290089222941u, 9009054371811832336u,
40559
    8153224920554538911u, 2724514274940876434u, 15633368673088300421u, 10096393516356015240u, 12707851639919861038u, 16479271570068024355u, 1840187295666814772u, 5575686180147088953u,
40560
    6990764404993272952u, 3885857308630146421u, 14471996434107354722u, 11258899592309161839u, 11563386024119531209u, 17622620253752952772u, 696814903175779539u, 6720194058879067614u,
40561
  }, {
40562
    0u, 4542972359516777931u, 9085944719033555862u, 4691664355513513565u, 18171889438067111724u, 14061474303606774503u, 9383328711027027130u, 13633424072306524529u,
40563
    7676286055365832925u, 6164376987427609878u, 1481798532234586955u, 3142253189322229376u, 10855962452864321521u, 12223826156538735162u, 16771372852738792551u, 15543052108730888620u,
40564
    15352572110731665850u, 16862791698018765937u, 12328753974855219756u, 10669987536837040103u, 2963597064469173910u, 1597421751597874013u, 6284506378644458752u, 7511137813735006411u,
40565
    13801544397233820007u, 9260261528098962604u, 13951919735851666161u, 18344511890033026874u, 4874982405016790603u, 8983709158270585728u, 4445237816650825181u, 196831773885239318u,
40566
    4091022007653359089u, 562346998784700474u, 5103132815620245095u, 8780357948041161644u, 14189083196432476893u, 18150173592266475286u, 13474345022262784331u, 9652793049543924864u,
40567
    5927194128938347820u, 7875246409875505383u, 3194843503195748026u, 1395478681687169905u, 12569012757288917504u, 10477056948030502859u, 15022275627470012822u, 17253916197967211613u,
40568
    17134349580696108107u, 15186860751721288064u, 10655150290339489757u, 12453952663903504918u, 1289987737384422247u, 3381381201708377772u, 8066289525279445233u, 5835212509754572090u,
40569
    9749964810033581206u, 13278076374523191645u, 17967418316541171456u, 14290755639648123595u, 8890475633301650362u, 4929947589851190897u, 393663547770478636u, 4214651972966108647u,
40570
    8182044015306718178u, 5658655167774316073u, 1124693997569400948u, 3499391957275839935u, 10206265631240490190u, 12873559114121502981u, 17560715896082323288u, 14753743294414502547u,
40571
    1948880861322201919u, 2594127930539943668u, 7285718382500778153u, 6491924633276939618u, 16655531858934856723u, 15577868310755742168u, 11039333611388512133u, 11977453108914408014u,
40572
    11854388257876695640u, 11207451878732806035u, 15750492819751010766u, 16545974958769302533u, 6389687006391496052u, 7469038772501250239u, 2790957363374339810u, 1851148384058628905u,
40573
    14845159798643632773u, 17370237963685480270u, 12687582131971748115u, 10311195790054169816u, 3615017233668480425u, 946035540305899618u, 5493509258033841727u, 8302171348940565492u,
40574
    5281120895271462419u, 8521283507583323096u, 3989500891288354181u, 600787064567550030u, 13071075951463747903u, 9974957613568212212u, 14659789384177486505u, 17616368207971182434u,
40575
    2579975474768844494u, 2073357103652371205u, 6762762403416755544u, 7120694423275413651u, 16132579050558890466u, 16206641305794825257u, 11670425019509144180u, 11456679111066785727u,
40576
    11260412520859862953u, 11767594448091671138u, 16308316081471249471u, 15949821717821010420u, 6947506857025941637u, 6872882154850049358u, 2196985003345963795u, 2411294364755134168u,
40577
    17780951266603300724u, 14540225107906894527u, 9859895179702381794u, 13249171359945539881u, 787327095540957272u, 3884007889973030291u, 8429303945932217294u, 5472161678768272901u,
40578
    16364088030613436356u, 15858029804260760079u, 11317310335548632146u, 11674676600264311193u, 2249387995138801896u, 2322888996435045667u, 6998783914551679870u, 6785602652076537525u,
40579
    9916730820443375385u, 13156333278251739858u, 17836661041797717135u, 14448512960480194884u, 8480501340405739573u, 5384944246861192702u, 839650424281590691u, 3795664592519366248u,
40580
    3897761722644403838u, 656471011406904245u, 5188255861079887336u, 8578093388688728099u, 14571436765001556306u, 17668683201823263897u, 12983849266553879236u, 10026146741872662287u,
40581
    6669836397870376611u, 7177582867921406824u, 2488175334770097461u, 2129119614032302334u, 11583119667977343375u, 11507929313807383620u, 16044147764761037337u, 16259017374083049426u,
40582
    15843330937415051829u, 16489139217633298430u, 11946100509993103779u, 11151742071862860904u, 2878174689517968665u, 1799951022334374098u, 6478030266801178255u, 7416715545229372228u,
40583
    12779374012782992104u, 10255423946675697443u, 14938077545002500478u, 17313340186040954037u, 5581914726748679620u, 8249768321177223183u, 3702296768117257810u, 894758378090191769u,
40584
    1067805515879173007u, 3592318064290702916u, 8126281399163064345u, 5750455340522077650u, 17509465798031703203u, 14841048614271029608u, 10153889598922762037u, 12961990299524614910u,
40585
    7230034467336960850u, 6583663697231173273u, 1892071080611799236u, 2686992928761285903u, 10987018516067683454u, 12065805765134311861u, 16604342697881130984u, 15665095101429070371u,
40586
    10562241790542924838u, 12510858718452294125u, 17042567015166646192u, 15242640940723501691u, 7979001782576708362u, 5886480219318720193u, 1201574129135100060u, 3433774845539634519u,
40587
    17875696825445760251u, 14346457162030502192u, 9657117384671061869u, 13334903762452155046u, 305328503063841751u, 4266984645440464412u, 8803266454141587521u, 4981154328058445194u,
40588
    5159950949537688988u, 8687502257518297175u, 4146714207304742410u, 470617173809470401u, 13525524806833511088u, 9565558111887030139u, 14241388846550827302u, 18061812720343526637u,
40589
    3250597773715660097u, 1303669193657626762u, 5984074333724313303u, 7782311056298339100u, 15074661043719826029u, 17165493152098584486u, 12620272307991097851u, 10389759836427934768u,
40590
    12273052416502600151u, 10761709128327461916u, 15295744618112993857u, 16955639155056813962u, 6232173811933554427u, 7599472825692375856u, 2912390363305901421u, 1684630829289181350u,
40591
    13895013714051883274u, 18437420284065877185u, 13745764309700098716u, 9352044056584181591u, 4393970006691927590u, 284119552558480365u, 4822588729510268336u, 9072122871209877627u,
40592
    9177754244107333741u, 4635909983525117350u, 92935459340889083u, 4486092121981797936u, 9471751652205676353u, 13581038687731985034u, 18259186513699183831u, 14010214853299335452u,
40593
    1574654191081914544u, 3085435160094502267u, 7768015779946060582u, 6108684823746459373u, 16858607891864434588u, 15491872287116188247u, 10944323357536545802u, 12171520400656925121u,
40594
  }, {
40595
    0u, 2156813408461955548u, 4313626816923911096u, 2752718492472304228u, 8627253633847822192u, 7661928252530632364u, 5505436984944608456u, 5875429064940414228u,
40596
    17254507267695644384u, 17481523150583344956u, 15323856505061264728u, 14503785508944014468u, 11010873969889216912u, 9592933115173218380u, 11750858129880828456u, 13762408288327199732u,
40597
    5489899806547772229u, 5899293950881604249u, 8641596751236382973u, 7639112309309301025u, 4290280838231655477u, 2766522915734824425u, 24548853041579917u, 2141951263632483921u,
40598
    11764625126767791525u, 13739024951972572281u, 10995904098661322269u, 9617374173086412737u, 15347829100153899733u, 14488356108428585737u, 17231728733602892141u, 17495903608387299505u,
40599
    10979799613095544458u, 9623805157521532758u, 11798587901763208498u, 13714458609834648814u, 17283193502472765946u, 17452775347443867686u, 15278224618618602050u, 14549338234851124126u,
40600
    8580561676463310954u, 7708699370463537590u, 5533045831469648850u, 5847881786764880398u, 49097706083159834u, 2107935609010204358u, 4283902527264967842u, 2782645096555375998u,
40601
    15298762408106657231u, 14537220494637179923u, 17261466032775972471u, 17465946411177207723u, 11811312492909331135u, 13692276008895521635u, 10968273481005252871u, 9644925621600215259u,
40602
    4261616546501692207u, 2795266376586341107u, 70185227798988951u, 2096376465831291211u, 5520961050865536095u, 5868452604588535171u, 8593836137267777511u, 7687075229128879675u,
40603
    11680230827506930577u, 13832259058284016205u, 11080421551794245673u, 9523735455073038837u, 15394057194608301281u, 14432953972299937085u, 17185658977434064729u, 17550865948466574981u,
40604
    5579070418531851633u, 5801301123735731373u, 8552830750928559817u, 7736981982542757653u, 4239857041646656001u, 2826138345940532189u, 75412445699561913u, 2082177495183685733u,
40605
    17161123352926621908u, 17565732457015587080u, 15417398740927075180u, 14419136389292487344u, 11066091662939297700u, 9546555762013386360u, 11695763573529760796u, 13808381012597372352u,
40606
    98195412166319668u, 2067810197125185512u, 4215871218020408716u, 2841563382736944208u, 8567805054529935684u, 7712554084374493336u, 5565290193110751996u, 5824680096370817824u,
40607
    4213277561403610395u, 2852497928146826439u, 118647349622822563u, 2038740285422565247u, 5603244184571253355u, 5777048188553278391u, 8511711324634206675u, 7778039831901335567u,
40608
    15351860113773370363u, 14475212630091872807u, 17208772955998935107u, 17527831139023518111u, 11724816064851319947u, 13787876126790335831u, 11055209722282565427u, 9549167182608629487u,
40609
    8523233093003384414u, 7756906139291137922u, 5590532753172682214u, 5799235221864313914u, 140370455597977902u, 2025555993157185778u, 4192752931662582422u, 2864620100732154698u,
40610
    11041922101731072190u, 9570786891571902818u, 11736905209177070342u, 13767318537498720986u, 17187672274535555022u, 17539385849830522386u, 15374150458257759350u, 14462604578592423338u,
40611
    15486092620961298855u, 14629711868178897019u, 17092483903335922207u, 17355247692313779139u, 11624791503456485079u, 13600030943165030155u, 11137009302703308143u, 9754815117126884531u,
40612
    4151744643171039047u, 2626583331457439387u, 162377516962444543u, 2282879863086044451u, 5631712546292871223u, 6037452326221451755u, 8501327171535303567u, 7499692239708246611u,
40613
    11158140837063703266u, 9743299917872012094u, 11602602247471462746u, 13612749016692676742u, 17105661501857119634u, 17333526894853233742u, 15473963965085515306u, 14650238604571402230u,
40614
    8479714083293312002u, 7512977616177960414u, 5652276691881064378u, 6025361010828170854u, 150824891399123826u, 2303974039851176622u, 4164354990367371466u, 2604286280411140374u,
40615
    5659250822143950637u, 6009834889821986545u, 8454565055791594645u, 7546392787102457161u, 4121809449076176989u, 2656298618920900993u, 211263906290727909u, 2233791159333640761u,
40616
    11672732454520566221u, 13552292306546298897u, 11106145987650286197u, 9785898338790069161u, 15440531030182573757u, 14675335027319969633u, 17121240571213837573u, 17326570184971408601u,
40617
    196390824332639336u, 2258328937796115892u, 4135620394250371024u, 2632959299571932684u, 8431742436040817432u, 7560729365405768388u, 5683126765473888416u, 5994308631384381820u,
40618
    17135610109059871368u, 17303780593489122132u, 15425108168748986672u, 14699314298944934124u, 11130580386221503992u, 9770921945649714212u, 11649360192741635648u, 13566070240564762524u,
40619
    8426555122807220790u, 7574959341548112874u, 5704995856293652878u, 5963537623700588626u, 237294699245645126u, 2208312048661695642u, 4077480570845130494u, 2700071425513574178u,
40620
    11206488369142506710u, 9686112028953249034u, 11554096377106556782u, 13670376701660284594u, 17023422649268413350u, 17424940338905547386u, 15556079663802671134u, 14559229772221530562u,
40621
    4089596066908350835u, 2679540256679954607u, 224121464376355531u, 2230046074588744471u, 5727171952466636291u, 5950815117732351967u, 8405427952099257787u, 7586487769270013031u,
40622
    15543464952953907091u, 14581513594800801359u, 17034988434643772459u, 17403850594581005815u, 11533527867866456291u, 13682454788587061567u, 11228114617197060955u, 9672831084924650119u,
40623
    17046466186006768828u, 17401835225210195296u, 15513812278582275844u, 14601417988320120536u, 11181065506345364428u, 9711332585899690512u, 11598470443728627828u, 13625782737014311336u,
40624
    280740911195955804u, 2165085734748128128u, 4051111986314371556u, 2726642315882184760u, 8385505863325164844u, 7616087770173211888u, 5729240201464309396u, 5939354855465699144u,
40625
    11574598932837183481u, 13641322155266051621u, 11203874897631210561u, 9696991643941850525u, 15500005765847099529u, 14624770467483748693u, 17061326039500450609u, 17377293083093715693u,
40626
    5752625691707646233u, 5925581285101240517u, 8361067032314929825u, 7631051003498906493u, 4066548076212889193u, 2702667407911749557u, 266366940911429073u, 2187862166416278541u,
40627
  }, {
40628
    0u, 6642096280510406750u, 13284192561020813500u, 16462795876764246242u, 16315823105410768893u, 13708963636559134627u, 6500836570635362113u, 439922346977066783u,
40629
    6197597939812213119u, 733872460607717665u, 17174658310779658691u, 12859417258165748125u, 13001673141270724226u, 16736026809386770140u, 879844693954133566u, 5771540452186644064u,
40630
    12395195879624426238u, 17305613297699152544u, 1467744921215435330u, 5220531075568771612u, 5650300446275329283u, 1316336633116425565u, 17740532779662220735u, 12258375912742239713u,
40631
    18016332033719362433u, 11973850846087693279u, 4781749989466252093u, 2193612730179060579u, 1759689387908267132u, 4919860766213921826u, 11543080904373288128u, 18166453874549300382u,
40632
    14614610554166352761u, 10879836598703668007u, 8253805222095936453u, 3361408799105547163u, 2935489842430870660u, 8399638907315561690u, 10441062151137543224u, 14757009366268798054u,
40633
    11300600892550658566u, 13906759146888600152u, 2632673266232851130u, 8693166652788693732u, 9132946036408395259u, 2491556468171146661u, 14331668736193815879u, 11153489555886392601u,
40634
    7409848711186274695u, 4249257595424012761u, 16037314857127418171u, 9413239572791867749u, 9563499978932504186u, 15606406401646028324u, 4387225460358121158u, 6976068332272625304u,
40635
    3519378775816534264u, 7852640824571713702u, 9839721532427843652u, 15321459211647031322u, 15184496315767285509u, 10274783960564057947u, 7701371084599273401u, 3949009615571978215u,
40636
    539203352115488887u, 6581683165424715817u, 13772373076031531211u, 16360516657443457173u, 16507610444191872906u, 13347445937900984276u, 6722817598211094326u, 99441604310980456u,
40637
    5870979684861741320u, 960568039155968342u, 16799277814631123380u, 13046489736199563754u, 12904108438562707189u, 17238069777753355947u, 814716683761407561u, 6296880972452001303u,
40638
    12357655745765665417u, 17821378201246059223u, 1379747099228580405u, 5694995023857257067u, 5265346532465702260u, 1530999186474390826u, 17386333305577387464u, 12494636173022434710u,
40639
    18265892072816790518u, 11623803214076996520u, 4983112936342293322u, 1804507146630605588u, 2238305212630619147u, 4845162757404030037u, 12054694172541097143u, 18115614168568345833u,
40640
    14819697422372549390u, 10486441695742104400u, 8498515190848025522u, 3016776137306395628u, 3442815973027425523u, 8352525304506551469u, 10925090729870978127u, 14677459070913039377u,
40641
    11216336045685248625u, 14376925237369287215u, 2590274523633996493u, 9214355580338500243u, 8774450920716242316u, 2731551919773330898u, 13952136664545250608u, 11363291318662491502u,
40642
    7038757551633068528u, 4432606169309893038u, 15705281649143427404u, 9644785238863483154u, 9494645848386137613u, 16136034042300943955u, 4294513027018469041u, 7472698529450626799u,
40643
    4011857131457007759u, 7746628612951437521u, 10373500843358195763u, 15265904688119197805u, 15402742169198546802u, 9938598876682809132u, 7898019231143956430u, 3582070091934478224u,
40644
    1078406704230977774u, 5970139571501035696u, 13163366330849431634u, 16897748309796073484u, 17049000381336047379u, 12733717820530814797u, 6107119981172920239u, 643361792051163121u,
40645
    6410046491609887121u, 349161128571523535u, 16190407203032477997u, 13583585392940618099u, 13445635196422188652u, 16624205252526067250u, 198883208621960912u, 6840937431151644302u,
40646
    11741959369723482640u, 18365299631022420558u, 1921136078311936684u, 5081265949533565682u, 4656338829252136429u, 2068229881835728307u, 17925537898651110737u, 11883093821164285199u,
40647
    17650059563187254127u, 12167860639460954929u, 5524638460789093331u, 1190641388963713933u, 1629433367522815122u, 5382257181810330828u, 12593761944904002606u, 17504208224571739248u,
40648
    14134199920450915223u, 10956049054195313609u, 8970094247992396587u, 2328741787718953845u, 2759494198457160810u, 8819954874021999668u, 11389990047714514134u, 13996106797082358920u,
40649
    10530693064931404520u, 14846677937748691638u, 3061998372948781652u, 8526176301674629642u, 8091274350704555285u, 3198835872954668363u, 14416890915810522537u, 10682083699634542071u,
40650
    7503655637611612521u, 3751252662574033207u, 15021960841764981205u, 10112215774463453579u, 9966225872684586644u, 15448000658827392714u, 3609014293261211176u, 7942304654960916086u,
40651
    4476610425261238294u, 7065420035288041544u, 9690325514808060074u, 15733189881789008116u, 15874467260079749099u, 9250420838410950581u, 7212375292832610135u, 4051821833783301897u,
40652
    688179623118076057u, 6170372224719608007u, 12814440204992854053u, 17148438651140642939u, 16997030381696051044u, 13244209591132604218u, 6033552274612791256u, 1123099122930255750u,
40653
    6885631946054851046u, 262293608834169272u, 16705050609013102938u, 13544914965422553348u, 13683025758949262875u, 16271127284595091013u, 412415468322195111u, 6454862019777308409u,
40654
    11927910341603441255u, 17988788832627006009u, 2148953154424896219u, 4755777988240824965u, 5180549047267992986u, 2001980365486523844u, 18428711160677000486u, 11786650616022549880u,
40655
    17548901841432484632u, 12657171448130714438u, 5463103839546661796u, 1728714438829439994u, 1290082918514197733u, 5605359706950509755u, 12231113943998710873u, 17694874057198724103u,
40656
    14077515103266137056u, 11488706867561743294u, 8865212338619786076u, 2822341649514070786u, 2391433177253116957u, 9015472726907116611u, 11054926469989481633u, 14215482952762858751u,
40657
    10763369033251996319u, 14515766235920655041u, 3244216653174833699u, 8153963644554617469u, 8589026054036938082u, 3107253741862419772u, 14945397058901253598u, 10612099275430968704u,
40658
    8023714262914015518u, 3707732413820797248u, 15493257225902875042u, 10029072425162228220u, 10174906129304731363u, 15067338284929851069u, 3850131242430201439u, 7584939832928591361u,
40659
    4133108057121652833u, 7311251501606674495u, 9295800309597257949u, 15937155243838988419u, 15796038462287912860u, 9735579710801330114u, 7164140183868956448u, 4558017662132191102u,
40660
  }, {
40661
    0u, 7026975924517234630u, 14053951849034469260u, 11713158812725061706u, 1498566550037692829u, 8453026741656872539u, 15547077823203331601u, 13134332388348864983u,
40662
    2997133100075385658u, 5193532126013515004u, 16906053483313745078u, 10023477084983765872u, 4421425403924087463u, 6690338751863514465u, 18326734871926164779u, 11516110084014746349u,
40663
    5994266200150771316u, 3651077923391955378u, 10387064252027030008u, 17411644826573123134u, 5180286430728521705u, 2765428220391841839u, 9578516152858789989u, 16530863678517358499u,
40664
    8842850807848174926u, 1962664170658947720u, 13380677503727028930u, 15579466327313067268u, 7958959654645957843u, 1150444288916906773u, 12500388506175163231u, 14771411239789669529u,
40665
    11988532400301542632u, 14401112944851970862u, 7302155846783910756u, 347530691846251682u, 12867955000885349749u, 15208934917731379891u, 8186843028093092601u, 1160054057126929727u,
40666
    10360572861457043410u, 17171366937719040020u, 5530856440783683678u, 3262112454209283992u, 11170013709381963343u, 18052407625221859721u, 6344013830343901635u, 4147432248901248517u,
40667
    17685701615696349852u, 10733466276663946586u, 3925328341317895440u, 6340298665266291414u, 16265807495604570881u, 9241127928571882695u, 2500178400086410381u, 4843267757373072203u,
40668
    15917919309291915686u, 13646779991004769888u, 2300888577833813546u, 9109287431904666092u, 14423962049646856251u, 12225267820500938749u, 803223682168014775u, 7683504840782913649u,
40669
    16025789128531904341u, 13827140552201887891u, 2120809441137969369u, 9001136188144267039u, 14604311693567821512u, 12333148557000565006u, 695061383692503364u, 7503436758785666690u,
40670
    17866059964468495471u, 10841338299774886825u, 3817174930229677027u, 6160221704524114981u, 16373686056186185202u, 9421479739856314932u, 2320108114253859454u, 4735107671358188984u,
40671
    10180636633891078433u, 17063072784830850791u, 5638869205660782253u, 3442330069771397483u, 11061712881567367356u, 17872478072565786490u, 6524224908418567984u, 4255451551249279222u,
40672
    11880240423364919835u, 14221174549956093405u, 7482375666214882711u, 455541244296276561u, 12688027660687803270u, 15100631886079386688u, 8294864497802497034u, 1340262959281482700u,
40673
    8662912472460168125u, 1854372134182743163u, 13488687978245964849u, 15759686224643400695u, 7850656682635790880u, 970516889046347238u, 12680597330532582828u, 14879432787265004138u,
40674
    5885971969496909959u, 3471141773623390017u, 10567281927262422795u, 17519657531808653517u, 5000356800172820762u, 2657127470508076764u, 9686535514746144406u, 16711074697083887952u,
40675
    3105005063510429129u, 5373890534425651727u, 16725976600334615109u, 9915323596096578947u, 4601777155667627092u, 6798217371950640018u, 18218574863809332184u, 11336039720248747038u,
40676
    180360639130832627u, 7134845665859430709u, 13945800545768817023u, 11533079735570376377u, 1606447364336029550u, 8633376307814525096u, 15367009681565827298u, 13026170149548992292u,
40677
    3321048140255203375u, 5733767250183223273u, 17086394267351834531u, 10131907641284540517u, 4241618882275938738u, 6582455852881933940u, 18002272376288534078u, 10975340495589554680u,
40678
    540800415553098517u, 7351451582082282707u, 14161821513074465945u, 11892934580260027231u, 1390122767385006728u, 8272655212095272270u, 15006873517571333380u, 12810430501506267842u,
40679
    9023334491325470299u, 2070960623556915613u, 13704726720259086807u, 16119558478964112913u, 7634349860459354054u, 609813203025260544u, 12320443409048229962u, 14663675712440713100u,
40680
    6101997361665611105u, 3831000989484282535u, 10927717295939115757u, 17736259059608567083u, 4640216228507718908u, 2441383434118427450u, 9470215342716377968u, 16350357972595129526u,
40681
    9820495924665654471u, 16847328885758262017u, 5422549171225416523u, 3081613207998608525u, 11277738411321564506u, 18232337151134792348u, 6884660139542794966u, 4472053216375158032u,
40682
    11663933463862517757u, 13860471001487472699u, 7122221882022416497u, 239784031886489527u, 13048449816837135968u, 15317220237859158438u, 8510903102498558444u, 1700135351162517034u,
40683
    15809464669166377651u, 13466419319190748533u, 1760673139591009599u, 8785396677427507961u, 14964751332429765422u, 12549754610540477672u, 911082488592553122u, 7863291466191287140u,
40684
    17505901828360837513u, 10625576643111779919u, 3600872305391818245u, 5799522617425244611u, 16589728995604994068u, 9781356593166352338u, 2680525918562965400u, 4951691578960654430u,
40685
    17325824944920336250u, 10517423154702741692u, 3708744268365486326u, 5979881026315534128u, 16481568986909349607u, 9601286230029496609u, 2860877669727689067u, 5059570199676927661u,
40686
    15701313365271581760u, 13286340242614875014u, 1941033778092694476u, 8893266419348519946u, 14784683190314112477u, 12441592372201976347u, 1018963302412737105u, 8043641032810315159u,
40687
    11771943938993819918u, 14040690898222216904u, 6942283547246780034u, 131491994814691652u, 13228658641689481363u, 15425241784889898837u, 8402600130983321375u, 1520207950847359193u,
40688
    10000713600345641524u, 16955341590498866674u, 5314254941016153528u, 2901677057735113342u, 11385757773804508073u, 18412548169088955503u, 6704730509582687269u, 4363752465879022563u,
40689
    6210010127020858258u, 4011218604585024596u, 10747781068851303454u, 17627964906259002328u, 4820427307211528719u, 2549402735887646153u, 9361914515530929539u, 16170428419360240197u,
40690
    9203554311335254184u, 2178971175377796974u, 13596434743901280036u, 15939620083439087842u, 7742371330630129973u, 790022104701665011u, 12140516069312059065u, 14555372680310567295u,
40691
    360721278261665254u, 7243300338934250016u, 14269691331718861418u, 12073295142069515692u, 1281960468464901243u, 8092587130592951229u, 15187223161047700471u, 12918311238500824113u,
40692
    3212894728672059100u, 5553690289885640986u, 17266752615629050192u, 10239779664840078998u, 4061548595831021377u, 6474295767462639751u, 18110150936257777869u, 11155692307469580043u,
40693
  }, {
40694
    0u, 2517245393515406572u, 5034490787030813144u, 7435750759411199284u, 10068981574061626288u, 12201157653998401372u, 14871501518822398568u, 17045318164640841348u,
40695
    9628913577918544357u, 12056075433989135625u, 13870769438669140029u, 16326061061730899153u, 1016952077871524437u, 3239211695253081785u, 5459183210385793933u, 7578968205522831201u,
40696
    11067918171351838031u, 13508029996328618403u, 15872723984458359959u, 18349972777811820667u, 1307470557354262271u, 3515654148887976467u, 6339673239971903271u, 8436375012170683339u,
40697
    2033904155743048874u, 4528066323082129478u, 6478423390506163570u, 8865607338129291678u, 10918366420771587866u, 13072499669943034870u, 15157936411045662402u, 17344703028974807598u,
40698
    11667391723826758683u, 9441211325989495031u, 16444045520167767491u, 14329311757255665967u, 3050858413050517419u, 628778578755597127u, 8036894684654706291u, 5577642697640442527u,
40699
    2614941114708524542u, 478839856218937618u, 7031308297775952934u, 4862538486186004682u, 12679346479943806542u, 10167187506301176482u, 16872750024341366678u, 14467534086004917114u,
40700
    4067808311486097748u, 1917635425212288440u, 9056132646164258956u, 6864284009665987680u, 12956846781012327140u, 10457633378212404744u, 17731214676258583356u, 15347951510183778256u,
40701
    13678285260964991153u, 11474057634298917981u, 17873974704293108073u, 15772186515461651845u, 3922409453435093761u, 1477250791027468269u, 8336488571297909465u, 5863164957556321845u,
40702
    15063804914172139187u, 17573731408537121375u, 10724047561790938987u, 13131499433903012743u, 6535100908406441219u, 8673469987586793967u, 2265113888856263899u, 4431612735036172343u,
40703
    6101716826101034838u, 8521560882533092282u, 1257557157511194254u, 3719041779816530530u, 16073789369309412582u, 18302240886422657034u, 11155285395280885054u, 13267751491267498450u,
40704
    5229882229417049084u, 7672809353916620560u, 957679712437875236u, 3433240205686757064u, 14062616595551905868u, 16269110787469675680u, 9725076972372009364u, 11824592944582215032u,
40705
    14786588404820918809u, 17283564772171425525u, 9865866699426761665u, 12251361247433944877u, 5082513026899726761u, 7234957975966594373u, 240568853608110193u, 2430150771060047005u,
40706
    8135616622972195496u, 5911125624750880324u, 3835270850424576880u, 1717722887501053852u, 18112265292328517912u, 15687370158510810612u, 13728568019331975360u, 11271004332422294572u,
40707
    17674167644946721613u, 15539754686561718177u, 12725302718847165077u, 10553717607734429305u, 9150035367232403709u, 6635062193578351633u, 4261933579054297381u, 1858407040333796809u,
40708
    16825062113507622887u, 14668696227990231819u, 12439147139764057663u, 10254616302904316627u, 7116415003206659159u, 4624520499557157051u, 2818284765131990415u, 428829699325493603u,
40709
    7844818906870187522u, 5634399380472423150u, 2954501582054936538u, 860032292373900086u, 16672977142595818930u, 14235136279826723166u, 11726329915112643690u, 9246813302127474822u,
40710
    3513487962258617315u, 1309817375275636495u, 8438743075148003899u, 6337546835477044951u, 13510341259434958931u, 11065716548023207103u, 18347741267953084811u, 15874986514718330215u,
40711
    13070201816812882438u, 10920562880461237994u, 17346939975173587934u, 15155660198108440370u, 4530227777712527798u, 2031571415669472602u, 8863225470072344686u, 6480554254231811202u,
40712
    12203433652202069676u, 10066744842596399680u, 17043121765066184564u, 14873799311837557656u, 2515114315022388508u, 2382082824317424u, 7438083559633061060u, 5032329272252129320u,
40713
    3241337884980569929u, 1014584229661574053u, 7576621447749742225u, 5461349336866867837u, 12053812688995611897u, 9631145302510833685u, 16328262745174523169u, 13868458115447806413u,
40714
    10459764458834098168u, 12954464700354433812u, 15345618707833241120u, 17733376188870843084u, 1915359424875750472u, 4070045040789094564u, 6866480411373514128u, 9053834855311329660u,
40715
    1479513538183220765u, 3920177730975673073u, 5860963271950469061u, 8338799892386374441u, 11471931442405006765u, 13680653107046267201u, 15774533275401163893u, 17871808579940708505u,
40716
    626467317811485367u, 3053060038512016987u, 5579874205336949615u, 8034632152261867395u, 9443377510452431111u, 11665044903776710123u, 14326943696444768479u, 16446171926791300147u,
40717
    10165026053799453522u, 12681679222183806910u, 14469915951933188746u, 16870619158449294950u, 481137707216220386u, 2612744652856644622u, 4860301542120094010u, 7033584512875404758u,
40718
    16271233245944390992u, 14060243759811248572u, 11822251249501760648u, 9727246909562751076u, 7670541700849153760u, 5232109988680716812u, 3435445775002107704u, 955373222128557012u,
40719
    7237229143405862069u, 5080272407415421017u, 2427958334666397037u, 242871556844564865u, 17281429885116092165u, 14788965422804986857u, 12253699033039161053u, 9863708918048465457u,
40720
    8671167069616523295u, 6537293559533907187u, 4433853414635209159u, 2262842661302265131u, 17575888975148309423u, 15061467343334031171u, 13129122476067492471u, 10726182388697724571u,
40721
    18300070734464807418u, 16076131279156974870u, 13270124387156703266u, 11153162876657622222u, 8523867158108594762u, 6099511471519499942u, 3716814080667593618u, 1259824750463930238u,
40722
    4622362935074513227u, 7118752576211060135u, 431206655032469651u, 2816149936058911871u, 14670999143827763963u, 16822869460218058263u, 10252375625438018339u, 12441418369480155087u,
40723
    14232830006413318318u, 16675182499310091330u, 9249040999114314102u, 11724062320027170202u, 5636569530263980830u, 7842476994894082034u, 857659398650987206u, 2956624102806742570u,
40724
    15689637813740375044u, 18110037535197587688u, 11268798760944846300u, 13730874507508556080u, 5909003164109873076u, 8137989456584309592u, 1720064584747800172u, 3833100915362378368u,
40725
    6637197082762229217u, 9147658351414628621u, 1856069252600036409u, 4264091358266300629u, 15537483516989711953u, 17676408262268928701u, 10555910046260817801u, 12723000017772809061u,
40726
  }, {
40727
    0u, 15762200328042667840u, 2856835172924432389u, 18238190752146915141u, 5713670345848864778u, 10805715811487326026u, 7561135427655163919u, 12848797446532677455u,
40728
    11427340691697729556u, 4911321075843194708u, 13345174655120580625u, 7173389830452510545u, 15122270855310327838u, 820654137405644638u, 17760118084036943899u, 3226275954771115867u,
40729
    12678913378224905901u, 8451595299172663789u, 9822642151686389416u, 5976168202979041768u, 16194808345499688615u, 4179641502022828519u, 14346779660905021090u, 2135996745225445858u,
40730
    3558579666237890233u, 16995468946051088889u, 1641308274811289276u, 14733962144962732540u, 9090961916423626419u, 11859948271085519347u, 6452551909542231734u, 9453764156601606646u,
40731
    14785799433083167711u, 1697614691135618207u, 16903190598345327578u, 3470771065211313306u, 9402037001392841685u, 6396285171454065813u, 11952336405958083536u, 9178809987380452496u,
40732
    6027971268800324555u, 9878982515431963787u, 8359283004045657038u, 12591138999497481358u, 2084233168694272961u, 14290549069261356161u, 4271993490450891716u, 16282692837778922628u,
40733
    7117159332475780466u, 13293411258189767218u, 4999205320339463543u, 11519692655715205687u, 3282616549622578552u, 17811921192019632696u, 732879648334208381u, 15029958398333780541u,
40734
    18181923832847252838u, 2805107922438644262u, 15850048426093911395u, 92388385340408355u, 12905103819084463468u, 7612972483059622444u, 10717907374994120041u, 5621392111171994153u,
40735
    629311348378851643u, 15133597752622646907u, 3395229382271236414u, 17699378041462564478u, 5183867188229904689u, 11335100742646646385u, 6941542130422626612u, 13469099241846138484u,
40736
    10821536956051937583u, 5517832210058282607u, 12792570342908131626u, 7725577015716947562u, 15665448522205731109u, 277059068684322405u, 18357619974760904992u, 2629481737494357600u,
40737
    12055942537600649110u, 9075274912216783062u, 9289461107078326163u, 6508930745710590163u, 16718566008091314076u, 3655465612432595164u, 14961454118931310489u, 1522030784741112025u,
40738
    4168466337388545922u, 16386289672930760898u, 2196870928291817351u, 14177982363995224263u, 8543986980901783432u, 12406505804242475208u, 5852377756745475981u, 10054645982306597069u,
40739
    14234318664951560932u, 2248669261341992356u, 16298510681658284769u, 4076149859246245281u, 9998410640678927086u, 5800610134637962670u, 12494386096293518059u, 8636334373997692331u,
40740
    6565233099245157104u, 9341293662428177840u, 8987461698644630261u, 11963660006880118197u, 1465759296668416762u, 14909722918146729402u, 3743309483160705791u, 16810949547632248255u,
40741
    7673845564465570889u, 12736298827739970313u, 5610215844877288524u, 10909381007990496012u, 2681314179816367171u, 18413922163761052419u, 184776770680816710u, 15577635352405072646u,
40742
    17647610443766686813u, 3338994288425483037u, 15225944966119244888u, 717191546761911064u, 13520897736746902615u, 6997878541721926423u, 11242784222343988306u, 5096087965850491666u,
40743
    1258622696757703286u, 14684288965200833846u, 3950222953022231155u, 17036158029906267443u, 6790458764542472828u, 9548224856613104956u, 8762045755503235705u, 11756540858562383161u,
40744
    10367734376459809378u, 6151638724996853026u, 12124837022850257511u, 8285082520580115751u, 13883084260845253224u, 1879138195689975080u, 16649556998353834605u, 4445490780332133677u,
40745
    13727827248377474267u, 7223104792207356827u, 11035664420116565214u, 4870673773980832670u, 17422178244240010449u, 3131857036752565137u, 15451154031433895124u, 924103331921597332u,
40746
    2311784730144877775u, 18062687245331231631u, 554118137368644810u, 15928680121837474698u, 8024872609708797125u, 13105623011270275973u, 5258963474988715200u, 10539833548380279680u,
40747
    15872427342139003305u, 502333042764009193u, 18150549824433566124u, 2404114375865757420u, 10596187595637903779u, 5310779519913856739u, 13017861491421180326u, 7932573568563556070u,
40748
    4814384572959953341u, 10983915471956430589u, 7310931224865190328u, 13820193315420761848u, 980423156880069047u, 15503004023780282103u, 3044061569482224050u, 17329913425393921778u,
40749
    8336932674777091844u, 12181156958151692356u, 6059373863990406913u, 10279938678082531393u, 4393741856583634702u, 16593268045114871886u, 1971504083133951755u, 13970910599835103307u,
40750
    17087973961803566864u, 4006576835745435728u, 14591990156772618005u, 1170861220680101973u, 11704755513490951962u, 8705792948709298266u, 9640554597612056351u, 6878321524855255135u,
40751
    1858937689852799821u, 14083548048513152013u, 4497338522683984712u, 16489741062169236488u, 6235036951360285511u, 10104345546597921799u, 8152299718492490562u, 12365860697102636034u,
40752
    9753200483853429593u, 6765745319621112857u, 11601220269275925340u, 8809399250468705308u, 14416405870873226067u, 1346516287098352659u, 17272668747995384662u, 3821952007586370582u,
40753
    13130466198490314208u, 7820039919040899744u, 10492627387899532773u, 5414409408661555877u, 17974923397289260522u, 2579810761044912810u, 16057098401758057967u, 317732763665910447u,
40754
    2931518593336833524u, 17442526084696124084u, 1084062204544407025u, 15399436031514938033u, 7486618966321411582u, 13644576356632980158u, 4629793036166665723u, 11168576964637084347u,
40755
    15347691128931141778u, 1027777753507534802u, 17534896747071563927u, 3019349226222860247u, 11220431689754577048u, 4686116923914377176u, 13552315720802183325u, 7398828111596124125u,
40756
    5362628359632734342u, 10436379358185592774u, 7912374160093407363u, 13218332977821366211u, 369553541361633420u, 16113456511805446092u, 2487515902914439305u, 17887166489985742793u,
40757
    8865757316743550527u, 11653040814255671679u, 6677988576850966074u, 9660905738751846778u, 3765703796660934197u, 17220887603689539957u, 1434383093523822128u, 14508740362393577840u,
40758
    16546065181022836267u, 4549193289962883435u, 13995757083443852846u, 1766676892172462446u, 12309576339732698657u, 8100554995509053793u, 10192175931700983332u, 6327407589325138276u,
40759
  },
40760
};
40761
40762
static const uint8_t
40763
WUFFS_CRC64__ECMA_X86_SSE42_FOLD1[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
40764
  228u, 58u, 57u, 202u, 151u, 212u, 93u, 224u,
40765
  64u, 95u, 135u, 199u, 175u, 149u, 190u, 218u,
40766
};
40767
40768
static const uint8_t
40769
WUFFS_CRC64__ECMA_X86_SSE42_FOLD2[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
40770
  68u, 250u, 158u, 138u, 0u, 91u, 9u, 96u,
40771
  81u, 175u, 225u, 15u, 163u, 83u, 230u, 59u,
40772
};
40773
40774
static const uint8_t
40775
WUFFS_CRC64__ECMA_X86_SSE42_FOLD4[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
40776
  243u, 65u, 212u, 157u, 187u, 239u, 227u, 106u,
40777
  244u, 45u, 132u, 167u, 84u, 96u, 31u, 8u,
40778
};
40779
40780
static const uint8_t
40781
WUFFS_CRC64__ECMA_X86_SSE42_FOLD8[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
40782
  0u, 16u, 204u, 79u, 29u, 215u, 87u, 135u,
40783
  64u, 231u, 61u, 247u, 42u, 107u, 216u, 215u,
40784
};
40785
40786
static const uint8_t
40787
WUFFS_CRC64__ECMA_X86_SSE42_MUPX[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
40788
  213u, 99u, 41u, 23u, 108u, 70u, 62u, 156u,
40789
  133u, 30u, 14u, 175u, 43u, 175u, 216u, 146u,
40790
};
40791
40792
// ---------------- Private Initializer Prototypes
40793
40794
// ---------------- Private Function Prototypes
40795
40796
WUFFS_BASE__GENERATED_C_CODE
40797
static wuffs_base__empty_struct
40798
wuffs_crc64__ecma_hasher__up(
40799
    wuffs_crc64__ecma_hasher* self,
40800
    wuffs_base__slice_u8 a_x);
40801
40802
WUFFS_BASE__GENERATED_C_CODE
40803
static wuffs_base__empty_struct
40804
wuffs_crc64__ecma_hasher__up__choosy_default(
40805
    wuffs_crc64__ecma_hasher* self,
40806
    wuffs_base__slice_u8 a_x);
40807
40808
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40809
WUFFS_BASE__GENERATED_C_CODE
40810
static wuffs_base__empty_struct
40811
wuffs_crc64__ecma_hasher__up_x86_sse42(
40812
    wuffs_crc64__ecma_hasher* self,
40813
    wuffs_base__slice_u8 a_x);
40814
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40815
40816
// ---------------- VTables
40817
40818
const wuffs_base__hasher_u64__func_ptrs
40819
wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
40820
  (uint64_t(*)(const void*))(&wuffs_crc64__ecma_hasher__checksum_u64),
40821
  (uint64_t(*)(const void*,
40822
      uint32_t))(&wuffs_crc64__ecma_hasher__get_quirk),
40823
  (wuffs_base__status(*)(void*,
40824
      uint32_t,
40825
      uint64_t))(&wuffs_crc64__ecma_hasher__set_quirk),
40826
  (wuffs_base__empty_struct(*)(void*,
40827
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update),
40828
  (uint64_t(*)(void*,
40829
      wuffs_base__slice_u8))(&wuffs_crc64__ecma_hasher__update_u64),
40830
};
40831
40832
// ---------------- Initializer Implementations
40833
40834
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
40835
wuffs_crc64__ecma_hasher__initialize(
40836
    wuffs_crc64__ecma_hasher* self,
40837
    size_t sizeof_star_self,
40838
    uint64_t wuffs_version,
40839
    uint32_t options){
40840
  if (!self) {
40841
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40842
  }
40843
  if (sizeof(*self) != sizeof_star_self) {
40844
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
40845
  }
40846
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
40847
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
40848
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
40849
  }
40850
40851
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
40852
    // The whole point of this if-check is to detect an uninitialized *self.
40853
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
40854
#if !defined(__clang__) && defined(__GNUC__)
40855
#pragma GCC diagnostic push
40856
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
40857
#endif
40858
    if (self->private_impl.magic != 0) {
40859
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
40860
    }
40861
#if !defined(__clang__) && defined(__GNUC__)
40862
#pragma GCC diagnostic pop
40863
#endif
40864
  } else {
40865
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
40866
      memset(self, 0, sizeof(*self));
40867
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
40868
    } else {
40869
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
40870
    }
40871
  }
40872
40873
  self->private_impl.choosy_up = &wuffs_crc64__ecma_hasher__up__choosy_default;
40874
40875
  self->private_impl.magic = WUFFS_BASE__MAGIC;
40876
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
40877
      wuffs_base__hasher_u64__vtable_name;
40878
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
40879
      (const void*)(&wuffs_crc64__ecma_hasher__func_ptrs_for__wuffs_base__hasher_u64);
40880
  return wuffs_base__make_status(NULL);
40881
}
40882
40883
wuffs_crc64__ecma_hasher*
40884
wuffs_crc64__ecma_hasher__alloc(void) {
40885
  wuffs_crc64__ecma_hasher* x =
40886
      (wuffs_crc64__ecma_hasher*)(calloc(1, sizeof(wuffs_crc64__ecma_hasher)));
40887
  if (!x) {
40888
    return NULL;
40889
  }
40890
  if (wuffs_crc64__ecma_hasher__initialize(
40891
      x, sizeof(wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
40892
    free(x);
40893
    return NULL;
40894
  }
40895
  return x;
40896
}
40897
40898
size_t
40899
sizeof__wuffs_crc64__ecma_hasher(void) {
40900
  return sizeof(wuffs_crc64__ecma_hasher);
40901
}
40902
40903
// ---------------- Function Implementations
40904
40905
// -------- func crc64.ecma_hasher.get_quirk
40906
40907
WUFFS_BASE__GENERATED_C_CODE
40908
WUFFS_BASE__MAYBE_STATIC uint64_t
40909
wuffs_crc64__ecma_hasher__get_quirk(
40910
    const wuffs_crc64__ecma_hasher* self,
40911
    uint32_t a_key) {
40912
  if (!self) {
40913
    return 0;
40914
  }
40915
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
40916
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
40917
    return 0;
40918
  }
40919
40920
  return 0u;
40921
}
40922
40923
// -------- func crc64.ecma_hasher.set_quirk
40924
40925
WUFFS_BASE__GENERATED_C_CODE
40926
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
40927
wuffs_crc64__ecma_hasher__set_quirk(
40928
    wuffs_crc64__ecma_hasher* self,
40929
    uint32_t a_key,
40930
    uint64_t a_value) {
40931
  if (!self) {
40932
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
40933
  }
40934
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40935
    return wuffs_base__make_status(
40936
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
40937
        ? wuffs_base__error__disabled_by_previous_error
40938
        : wuffs_base__error__initialize_not_called);
40939
  }
40940
40941
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
40942
}
40943
40944
// -------- func crc64.ecma_hasher.update
40945
40946
WUFFS_BASE__GENERATED_C_CODE
40947
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
40948
wuffs_crc64__ecma_hasher__update(
40949
    wuffs_crc64__ecma_hasher* self,
40950
    wuffs_base__slice_u8 a_x) {
40951
  if (!self) {
40952
    return wuffs_base__make_empty_struct();
40953
  }
40954
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40955
    return wuffs_base__make_empty_struct();
40956
  }
40957
40958
  if (self->private_impl.f_state == 0u) {
40959
    self->private_impl.choosy_up = (
40960
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
40961
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_crc64__ecma_hasher__up_x86_sse42 :
40962
#endif
40963
        self->private_impl.choosy_up);
40964
  }
40965
  wuffs_crc64__ecma_hasher__up(self, a_x);
40966
  return wuffs_base__make_empty_struct();
40967
}
40968
40969
// -------- func crc64.ecma_hasher.update_u64
40970
40971
WUFFS_BASE__GENERATED_C_CODE
40972
WUFFS_BASE__MAYBE_STATIC uint64_t
40973
wuffs_crc64__ecma_hasher__update_u64(
40974
    wuffs_crc64__ecma_hasher* self,
40975
    wuffs_base__slice_u8 a_x) {
40976
  if (!self) {
40977
    return 0;
40978
  }
40979
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
40980
    return 0;
40981
  }
40982
40983
  wuffs_crc64__ecma_hasher__update(self, a_x);
40984
  return wuffs_crc64__ecma_hasher__checksum_u64(self);
40985
}
40986
40987
// -------- func crc64.ecma_hasher.up
40988
40989
WUFFS_BASE__GENERATED_C_CODE
40990
static wuffs_base__empty_struct
40991
wuffs_crc64__ecma_hasher__up(
40992
    wuffs_crc64__ecma_hasher* self,
40993
    wuffs_base__slice_u8 a_x) {
40994
  return (*self->private_impl.choosy_up)(self, a_x);
40995
}
40996
40997
WUFFS_BASE__GENERATED_C_CODE
40998
static wuffs_base__empty_struct
40999
wuffs_crc64__ecma_hasher__up__choosy_default(
41000
    wuffs_crc64__ecma_hasher* self,
41001
    wuffs_base__slice_u8 a_x) {
41002
  uint64_t v_s = 0;
41003
  wuffs_base__slice_u8 v_p = {0};
41004
41005
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
41006
  {
41007
    wuffs_base__slice_u8 i_slice_p = a_x;
41008
    v_p.ptr = i_slice_p.ptr;
41009
    v_p.len = 8;
41010
    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)) / 8) * 8));
41011
    while (v_p.ptr < i_end0_p) {
41012
      v_s ^= ((((uint64_t)(v_p.ptr[0u])) << 0u) |
41013
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
41014
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
41015
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
41016
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
41017
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
41018
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
41019
          (((uint64_t)(v_p.ptr[7u])) << 56u));
41020
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][(255u & (v_s >> 56u))] ^
41021
          WUFFS_CRC64__ECMA_TABLE[1u][(255u & (v_s >> 48u))] ^
41022
          WUFFS_CRC64__ECMA_TABLE[2u][(255u & (v_s >> 40u))] ^
41023
          WUFFS_CRC64__ECMA_TABLE[3u][(255u & (v_s >> 32u))] ^
41024
          WUFFS_CRC64__ECMA_TABLE[4u][(255u & (v_s >> 24u))] ^
41025
          WUFFS_CRC64__ECMA_TABLE[5u][(255u & (v_s >> 16u))] ^
41026
          WUFFS_CRC64__ECMA_TABLE[6u][(255u & (v_s >> 8u))] ^
41027
          WUFFS_CRC64__ECMA_TABLE[7u][(255u & (v_s >> 0u))]);
41028
      v_p.ptr += 8;
41029
    }
41030
    v_p.len = 1;
41031
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41032
    while (v_p.ptr < i_end1_p) {
41033
      v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
41034
      v_p.ptr += 1;
41035
    }
41036
    v_p.len = 0;
41037
  }
41038
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
41039
  return wuffs_base__make_empty_struct();
41040
}
41041
41042
// -------- func crc64.ecma_hasher.checksum_u64
41043
41044
WUFFS_BASE__GENERATED_C_CODE
41045
WUFFS_BASE__MAYBE_STATIC uint64_t
41046
wuffs_crc64__ecma_hasher__checksum_u64(
41047
    const wuffs_crc64__ecma_hasher* self) {
41048
  if (!self) {
41049
    return 0;
41050
  }
41051
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41052
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41053
    return 0;
41054
  }
41055
41056
  return self->private_impl.f_state;
41057
}
41058
41059
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
41060
// -------- func crc64.ecma_hasher.up_x86_sse42
41061
41062
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41063
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
41064
WUFFS_BASE__GENERATED_C_CODE
41065
static wuffs_base__empty_struct
41066
wuffs_crc64__ecma_hasher__up_x86_sse42(
41067
    wuffs_crc64__ecma_hasher* self,
41068
    wuffs_base__slice_u8 a_x) {
41069
  uint64_t v_s = 0;
41070
  wuffs_base__slice_u8 v_p = {0};
41071
  uint8_t v_buf[48] = {0};
41072
  __m128i v_xa = {0};
41073
  __m128i v_xb = {0};
41074
  __m128i v_xc = {0};
41075
  __m128i v_xd = {0};
41076
  __m128i v_xe = {0};
41077
  __m128i v_xf = {0};
41078
  __m128i v_xg = {0};
41079
  __m128i v_xh = {0};
41080
  __m128i v_mu1 = {0};
41081
  __m128i v_mu2 = {0};
41082
  __m128i v_mu4 = {0};
41083
  __m128i v_mu8 = {0};
41084
  __m128i v_mupx = {0};
41085
41086
  v_s = (18446744073709551615u ^ self->private_impl.f_state);
41087
  while ((((uint64_t)(a_x.len)) > 0u) && ((15u & ((uint32_t)(0xFFFu & (uintptr_t)(a_x.ptr)))) != 0u)) {
41088
    v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ a_x.ptr[0u]))] ^ (v_s >> 8u));
41089
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
41090
  }
41091
  do {
41092
    do {
41093
      if (((uint64_t)(a_x.len)) >= 128u) {
41094
      } else if (((uint64_t)(a_x.len)) >= 64u) {
41095
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
41096
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41097
        v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
41098
        v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
41099
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
41100
        break;
41101
      } else if (((uint64_t)(a_x.len)) >= 32u) {
41102
        v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
41103
        v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41104
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
41105
        goto label__chain2__break;
41106
      } else {
41107
        {
41108
          wuffs_base__slice_u8 i_slice_p = a_x;
41109
          v_p.ptr = i_slice_p.ptr;
41110
          v_p.len = 1;
41111
          const uint8_t* i_end0_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
41112
          while (v_p.ptr < i_end0_p) {
41113
            v_s = (WUFFS_CRC64__ECMA_TABLE[0u][((uint8_t)(((uint8_t)(v_s)) ^ v_p.ptr[0u]))] ^ (v_s >> 8u));
41114
            v_p.ptr += 1;
41115
          }
41116
          v_p.len = 0;
41117
        }
41118
        self->private_impl.f_state = (18446744073709551615u ^ v_s);
41119
        return wuffs_base__make_empty_struct();
41120
      }
41121
      v_xa = _mm_xor_si128(_mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 0u)), _mm_cvtsi64_si128((int64_t)(v_s)));
41122
      v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 16u));
41123
      v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 32u));
41124
      v_xd = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 48u));
41125
      v_xe = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 64u));
41126
      v_xf = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 80u));
41127
      v_xg = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 96u));
41128
      v_xh = _mm_lddqu_si128((const __m128i*)(const void*)(a_x.ptr + 112u));
41129
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
41130
      v_mu8 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD8));
41131
      while (((uint64_t)(a_x.len)) >= 128u) {
41132
        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)));
41133
        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)));
41134
        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)));
41135
        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)));
41136
        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)));
41137
        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)));
41138
        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)));
41139
        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)));
41140
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 128u);
41141
      }
41142
      v_mu4 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD4));
41143
      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);
41144
      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);
41145
      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);
41146
      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);
41147
      if (((uint64_t)(a_x.len)) > 64u) {
41148
        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)));
41149
        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)));
41150
        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)));
41151
        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)));
41152
        a_x = wuffs_base__slice_u8__subslice_i(a_x, 64u);
41153
      }
41154
    } while (0);
41155
    v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
41156
    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);
41157
    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);
41158
    if (((uint64_t)(a_x.len)) > 32u) {
41159
      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)));
41160
      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)));
41161
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 32u);
41162
    }
41163
  } while (0);
41164
  label__chain2__break:;
41165
  v_mu1 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD1));
41166
  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);
41167
  if (((uint64_t)(a_x.len)) > 24u) {
41168
    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)));
41169
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 16u);
41170
    if (((uint64_t)(a_x.len)) > 24u) {
41171
      return wuffs_base__make_empty_struct();
41172
    }
41173
  }
41174
  _mm_storeu_si128((__m128i*)(void*)(v_buf + (24u - ((uint64_t)(a_x.len)))), v_xa);
41175
  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);
41176
  v_mu2 = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_FOLD2));
41177
  v_xa = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 0u));
41178
  v_xb = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 16u));
41179
  v_xc = _mm_lddqu_si128((const __m128i*)(const void*)(v_buf + 32u));
41180
  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)));
41181
  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)));
41182
  v_xa = _mm_xor_si128(v_xd, _mm_xor_si128(v_xe, v_xc));
41183
  v_mupx = _mm_lddqu_si128((const __m128i*)(const void*)(WUFFS_CRC64__ECMA_X86_SSE42_MUPX));
41184
  v_xb = _mm_clmulepi64_si128(v_xa, v_mupx, (int32_t)(0u));
41185
  v_xc = _mm_clmulepi64_si128(v_xb, v_mupx, (int32_t)(16u));
41186
  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))));
41187
  self->private_impl.f_state = (18446744073709551615u ^ v_s);
41188
  return wuffs_base__make_empty_struct();
41189
}
41190
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
41191
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
41192
41193
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__CRC64)
41194
41195
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
41196
41197
// ---------------- Status Codes Implementations
41198
41199
const char wuffs_deflate__error__bad_huffman_code_over_subscribed[] = "#deflate: bad Huffman code (over-subscribed)";
41200
const char wuffs_deflate__error__bad_huffman_code_under_subscribed[] = "#deflate: bad Huffman code (under-subscribed)";
41201
const char wuffs_deflate__error__bad_huffman_code_length_count[] = "#deflate: bad Huffman code length count";
41202
const char wuffs_deflate__error__bad_huffman_code_length_repetition[] = "#deflate: bad Huffman code length repetition";
41203
const char wuffs_deflate__error__bad_huffman_code[] = "#deflate: bad Huffman code";
41204
const char wuffs_deflate__error__bad_huffman_minimum_code_length[] = "#deflate: bad Huffman minimum code length";
41205
const char wuffs_deflate__error__bad_block[] = "#deflate: bad block";
41206
const char wuffs_deflate__error__bad_distance[] = "#deflate: bad distance";
41207
const char wuffs_deflate__error__bad_distance_code_count[] = "#deflate: bad distance code count";
41208
const char wuffs_deflate__error__bad_literal_length_code_count[] = "#deflate: bad literal/length code count";
41209
const char wuffs_deflate__error__inconsistent_stored_block_length[] = "#deflate: inconsistent stored block length";
41210
const char wuffs_deflate__error__missing_end_of_block_code[] = "#deflate: missing end-of-block code";
41211
const char wuffs_deflate__error__no_huffman_codes[] = "#deflate: no Huffman codes";
41212
const char wuffs_deflate__error__truncated_input[] = "#deflate: truncated input";
41213
const char wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state[] = "#deflate: internal error: inconsistent Huffman decoder state";
41214
const char wuffs_deflate__error__internal_error_inconsistent_i_o[] = "#deflate: internal error: inconsistent I/O";
41215
const char wuffs_deflate__error__internal_error_inconsistent_distance[] = "#deflate: internal error: inconsistent distance";
41216
const char wuffs_deflate__error__internal_error_inconsistent_n_bits[] = "#deflate: internal error: inconsistent n_bits";
41217
41218
// ---------------- Private Consts
41219
41220
static const uint8_t
41221
WUFFS_DEFLATE__CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
41222
  16u, 17u, 18u, 0u, 8u, 7u, 9u, 6u,
41223
  10u, 5u, 11u, 4u, 12u, 3u, 13u, 2u,
41224
  14u, 1u, 15u,
41225
};
41226
41227
static const uint8_t
41228
WUFFS_DEFLATE__REVERSE8[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
41229
  0u, 128u, 64u, 192u, 32u, 160u, 96u, 224u,
41230
  16u, 144u, 80u, 208u, 48u, 176u, 112u, 240u,
41231
  8u, 136u, 72u, 200u, 40u, 168u, 104u, 232u,
41232
  24u, 152u, 88u, 216u, 56u, 184u, 120u, 248u,
41233
  4u, 132u, 68u, 196u, 36u, 164u, 100u, 228u,
41234
  20u, 148u, 84u, 212u, 52u, 180u, 116u, 244u,
41235
  12u, 140u, 76u, 204u, 44u, 172u, 108u, 236u,
41236
  28u, 156u, 92u, 220u, 60u, 188u, 124u, 252u,
41237
  2u, 130u, 66u, 194u, 34u, 162u, 98u, 226u,
41238
  18u, 146u, 82u, 210u, 50u, 178u, 114u, 242u,
41239
  10u, 138u, 74u, 202u, 42u, 170u, 106u, 234u,
41240
  26u, 154u, 90u, 218u, 58u, 186u, 122u, 250u,
41241
  6u, 134u, 70u, 198u, 38u, 166u, 102u, 230u,
41242
  22u, 150u, 86u, 214u, 54u, 182u, 118u, 246u,
41243
  14u, 142u, 78u, 206u, 46u, 174u, 110u, 238u,
41244
  30u, 158u, 94u, 222u, 62u, 190u, 126u, 254u,
41245
  1u, 129u, 65u, 193u, 33u, 161u, 97u, 225u,
41246
  17u, 145u, 81u, 209u, 49u, 177u, 113u, 241u,
41247
  9u, 137u, 73u, 201u, 41u, 169u, 105u, 233u,
41248
  25u, 153u, 89u, 217u, 57u, 185u, 121u, 249u,
41249
  5u, 133u, 69u, 197u, 37u, 165u, 101u, 229u,
41250
  21u, 149u, 85u, 213u, 53u, 181u, 117u, 245u,
41251
  13u, 141u, 77u, 205u, 45u, 173u, 109u, 237u,
41252
  29u, 157u, 93u, 221u, 61u, 189u, 125u, 253u,
41253
  3u, 131u, 67u, 195u, 35u, 163u, 99u, 227u,
41254
  19u, 147u, 83u, 211u, 51u, 179u, 115u, 243u,
41255
  11u, 139u, 75u, 203u, 43u, 171u, 107u, 235u,
41256
  27u, 155u, 91u, 219u, 59u, 187u, 123u, 251u,
41257
  7u, 135u, 71u, 199u, 39u, 167u, 103u, 231u,
41258
  23u, 151u, 87u, 215u, 55u, 183u, 119u, 247u,
41259
  15u, 143u, 79u, 207u, 47u, 175u, 111u, 239u,
41260
  31u, 159u, 95u, 223u, 63u, 191u, 127u, 255u,
41261
};
41262
41263
static const uint32_t
41264
WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
41265
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742848u, 1073743104u, 1073743360u, 1073743616u,
41266
  1073743888u, 1073744400u, 1073744912u, 1073745424u, 1073745952u, 1073746976u, 1073748000u, 1073749024u,
41267
  1073750064u, 1073752112u, 1073754160u, 1073756208u, 1073758272u, 1073762368u, 1073766464u, 1073770560u,
41268
  1073774672u, 1073782864u, 1073791056u, 1073799248u, 1073807104u, 134217728u, 134217728u, 134217728u,
41269
};
41270
41271
static const uint32_t
41272
WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
41273
  1073741824u, 1073742080u, 1073742336u, 1073742592u, 1073742864u, 1073743376u, 1073743904u, 1073744928u,
41274
  1073745968u, 1073748016u, 1073750080u, 1073754176u, 1073758288u, 1073766480u, 1073774688u, 1073791072u,
41275
  1073807472u, 1073840240u, 1073873024u, 1073938560u, 1074004112u, 1074135184u, 1074266272u, 1074528416u,
41276
  1074790576u, 1075314864u, 1075839168u, 1076887744u, 1077936336u, 1080033488u, 134217728u, 134217728u,
41277
};
41278
41279
#define WUFFS_DEFLATE__HUFFS_TABLE_SIZE 1024u
41280
41281
#define WUFFS_DEFLATE__HUFFS_TABLE_MASK 1023u
41282
41283
// ---------------- Private Initializer Prototypes
41284
41285
// ---------------- Private Function Prototypes
41286
41287
WUFFS_BASE__GENERATED_C_CODE
41288
static wuffs_base__status
41289
wuffs_deflate__decoder__do_transform_io(
41290
    wuffs_deflate__decoder* self,
41291
    wuffs_base__io_buffer* a_dst,
41292
    wuffs_base__io_buffer* a_src,
41293
    wuffs_base__slice_u8 a_workbuf);
41294
41295
WUFFS_BASE__GENERATED_C_CODE
41296
static wuffs_base__status
41297
wuffs_deflate__decoder__decode_blocks(
41298
    wuffs_deflate__decoder* self,
41299
    wuffs_base__io_buffer* a_dst,
41300
    wuffs_base__io_buffer* a_src);
41301
41302
WUFFS_BASE__GENERATED_C_CODE
41303
static wuffs_base__status
41304
wuffs_deflate__decoder__decode_uncompressed(
41305
    wuffs_deflate__decoder* self,
41306
    wuffs_base__io_buffer* a_dst,
41307
    wuffs_base__io_buffer* a_src);
41308
41309
WUFFS_BASE__GENERATED_C_CODE
41310
static wuffs_base__status
41311
wuffs_deflate__decoder__init_fixed_huffman(
41312
    wuffs_deflate__decoder* self);
41313
41314
WUFFS_BASE__GENERATED_C_CODE
41315
static wuffs_base__status
41316
wuffs_deflate__decoder__init_dynamic_huffman(
41317
    wuffs_deflate__decoder* self,
41318
    wuffs_base__io_buffer* a_src);
41319
41320
WUFFS_BASE__GENERATED_C_CODE
41321
static wuffs_base__status
41322
wuffs_deflate__decoder__init_huff(
41323
    wuffs_deflate__decoder* self,
41324
    uint32_t a_which,
41325
    uint32_t a_n_codes0,
41326
    uint32_t a_n_codes1,
41327
    uint32_t a_base_symbol);
41328
41329
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
41330
WUFFS_BASE__GENERATED_C_CODE
41331
static wuffs_base__status
41332
wuffs_deflate__decoder__decode_huffman_bmi2(
41333
    wuffs_deflate__decoder* self,
41334
    wuffs_base__io_buffer* a_dst,
41335
    wuffs_base__io_buffer* a_src);
41336
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
41337
41338
WUFFS_BASE__GENERATED_C_CODE
41339
static wuffs_base__status
41340
wuffs_deflate__decoder__decode_huffman_fast32(
41341
    wuffs_deflate__decoder* self,
41342
    wuffs_base__io_buffer* a_dst,
41343
    wuffs_base__io_buffer* a_src);
41344
41345
WUFFS_BASE__GENERATED_C_CODE
41346
static wuffs_base__status
41347
wuffs_deflate__decoder__decode_huffman_fast64(
41348
    wuffs_deflate__decoder* self,
41349
    wuffs_base__io_buffer* a_dst,
41350
    wuffs_base__io_buffer* a_src);
41351
41352
WUFFS_BASE__GENERATED_C_CODE
41353
static wuffs_base__status
41354
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
41355
    wuffs_deflate__decoder* self,
41356
    wuffs_base__io_buffer* a_dst,
41357
    wuffs_base__io_buffer* a_src);
41358
41359
WUFFS_BASE__GENERATED_C_CODE
41360
static wuffs_base__status
41361
wuffs_deflate__decoder__decode_huffman_slow(
41362
    wuffs_deflate__decoder* self,
41363
    wuffs_base__io_buffer* a_dst,
41364
    wuffs_base__io_buffer* a_src);
41365
41366
// ---------------- VTables
41367
41368
const wuffs_base__io_transformer__func_ptrs
41369
wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer = {
41370
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_deflate__decoder__dst_history_retain_length),
41371
  (uint64_t(*)(const void*,
41372
      uint32_t))(&wuffs_deflate__decoder__get_quirk),
41373
  (wuffs_base__status(*)(void*,
41374
      uint32_t,
41375
      uint64_t))(&wuffs_deflate__decoder__set_quirk),
41376
  (wuffs_base__status(*)(void*,
41377
      wuffs_base__io_buffer*,
41378
      wuffs_base__io_buffer*,
41379
      wuffs_base__slice_u8))(&wuffs_deflate__decoder__transform_io),
41380
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_deflate__decoder__workbuf_len),
41381
};
41382
41383
// ---------------- Initializer Implementations
41384
41385
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
41386
wuffs_deflate__decoder__initialize(
41387
    wuffs_deflate__decoder* self,
41388
    size_t sizeof_star_self,
41389
    uint64_t wuffs_version,
41390
7.31k
    uint32_t options){
41391
7.31k
  if (!self) {
41392
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
41393
0
  }
41394
7.31k
  if (sizeof(*self) != sizeof_star_self) {
41395
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
41396
0
  }
41397
7.31k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
41398
7.31k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
41399
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
41400
0
  }
41401
41402
7.31k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
41403
    // The whole point of this if-check is to detect an uninitialized *self.
41404
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
41405
#if !defined(__clang__) && defined(__GNUC__)
41406
#pragma GCC diagnostic push
41407
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
41408
#endif
41409
2.82k
    if (self->private_impl.magic != 0) {
41410
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
41411
0
    }
41412
#if !defined(__clang__) && defined(__GNUC__)
41413
#pragma GCC diagnostic pop
41414
#endif
41415
4.49k
  } else {
41416
4.49k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
41417
0
      memset(self, 0, sizeof(*self));
41418
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
41419
4.49k
    } else {
41420
4.49k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
41421
4.49k
    }
41422
4.49k
  }
41423
41424
7.31k
  self->private_impl.choosy_decode_huffman_fast64 = &wuffs_deflate__decoder__decode_huffman_fast64__choosy_default;
41425
41426
7.31k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
41427
7.31k
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
41428
7.31k
      wuffs_base__io_transformer__vtable_name;
41429
7.31k
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
41430
7.31k
      (const void*)(&wuffs_deflate__decoder__func_ptrs_for__wuffs_base__io_transformer);
41431
7.31k
  return wuffs_base__make_status(NULL);
41432
7.31k
}
41433
41434
wuffs_deflate__decoder*
41435
0
wuffs_deflate__decoder__alloc(void) {
41436
0
  wuffs_deflate__decoder* x =
41437
0
      (wuffs_deflate__decoder*)(calloc(1, sizeof(wuffs_deflate__decoder)));
41438
0
  if (!x) {
41439
0
    return NULL;
41440
0
  }
41441
0
  if (wuffs_deflate__decoder__initialize(
41442
0
      x, sizeof(wuffs_deflate__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
41443
0
    free(x);
41444
0
    return NULL;
41445
0
  }
41446
0
  return x;
41447
0
}
41448
41449
size_t
41450
0
sizeof__wuffs_deflate__decoder(void) {
41451
0
  return sizeof(wuffs_deflate__decoder);
41452
0
}
41453
41454
// ---------------- Function Implementations
41455
41456
// -------- func deflate.decoder.add_history
41457
41458
WUFFS_BASE__GENERATED_C_CODE
41459
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
41460
wuffs_deflate__decoder__add_history(
41461
    wuffs_deflate__decoder* self,
41462
15.4k
    wuffs_base__slice_u8 a_hist) {
41463
15.4k
  if (!self) {
41464
0
    return wuffs_base__make_empty_struct();
41465
0
  }
41466
15.4k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41467
0
    return wuffs_base__make_empty_struct();
41468
0
  }
41469
41470
15.4k
  wuffs_base__slice_u8 v_s = {0};
41471
15.4k
  uint64_t v_n_copied = 0;
41472
15.4k
  uint32_t v_already_full = 0;
41473
41474
15.4k
  v_s = a_hist;
41475
15.4k
  if (((uint64_t)(v_s.len)) >= 32768u) {
41476
637
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, 32768u);
41477
637
    wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
41478
637
    self->private_impl.f_history_index = 32768u;
41479
14.7k
  } else {
41480
14.7k
    v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, (self->private_impl.f_history_index & 32767u), 32768), v_s);
41481
14.7k
    if (v_n_copied < ((uint64_t)(v_s.len))) {
41482
432
      v_s = wuffs_base__slice_u8__subslice_i(v_s, v_n_copied);
41483
432
      v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_history, 32768), v_s);
41484
432
      self->private_impl.f_history_index = (((uint32_t)((v_n_copied & 32767u))) + 32768u);
41485
14.3k
    } else {
41486
14.3k
      v_already_full = 0u;
41487
14.3k
      if (self->private_impl.f_history_index >= 32768u) {
41488
978
        v_already_full = 32768u;
41489
978
      }
41490
14.3k
      self->private_impl.f_history_index = ((self->private_impl.f_history_index & 32767u) + ((uint32_t)((v_n_copied & 32767u))) + v_already_full);
41491
14.3k
    }
41492
14.7k
  }
41493
15.4k
  wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8_ij(self->private_data.f_history, 32768, 33025), wuffs_base__make_slice_u8(self->private_data.f_history, 33025));
41494
15.4k
  return wuffs_base__make_empty_struct();
41495
15.4k
}
41496
41497
// -------- func deflate.decoder.get_quirk
41498
41499
WUFFS_BASE__GENERATED_C_CODE
41500
WUFFS_BASE__MAYBE_STATIC uint64_t
41501
wuffs_deflate__decoder__get_quirk(
41502
    const wuffs_deflate__decoder* self,
41503
0
    uint32_t a_key) {
41504
0
  if (!self) {
41505
0
    return 0;
41506
0
  }
41507
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41508
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41509
0
    return 0;
41510
0
  }
41511
41512
0
  return 0u;
41513
0
}
41514
41515
// -------- func deflate.decoder.set_quirk
41516
41517
WUFFS_BASE__GENERATED_C_CODE
41518
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
41519
wuffs_deflate__decoder__set_quirk(
41520
    wuffs_deflate__decoder* self,
41521
    uint32_t a_key,
41522
0
    uint64_t a_value) {
41523
0
  if (!self) {
41524
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
41525
0
  }
41526
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41527
0
    return wuffs_base__make_status(
41528
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
41529
0
        ? wuffs_base__error__disabled_by_previous_error
41530
0
        : wuffs_base__error__initialize_not_called);
41531
0
  }
41532
41533
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
41534
0
}
41535
41536
// -------- func deflate.decoder.dst_history_retain_length
41537
41538
WUFFS_BASE__GENERATED_C_CODE
41539
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
41540
wuffs_deflate__decoder__dst_history_retain_length(
41541
0
    const wuffs_deflate__decoder* self) {
41542
0
  if (!self) {
41543
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
41544
0
  }
41545
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41546
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41547
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
41548
0
  }
41549
41550
0
  return wuffs_base__utility__make_optional_u63(true, 0u);
41551
0
}
41552
41553
// -------- func deflate.decoder.workbuf_len
41554
41555
WUFFS_BASE__GENERATED_C_CODE
41556
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
41557
wuffs_deflate__decoder__workbuf_len(
41558
0
    const wuffs_deflate__decoder* self) {
41559
0
  if (!self) {
41560
0
    return wuffs_base__utility__empty_range_ii_u64();
41561
0
  }
41562
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
41563
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
41564
0
    return wuffs_base__utility__empty_range_ii_u64();
41565
0
  }
41566
41567
0
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
41568
0
}
41569
41570
// -------- func deflate.decoder.transform_io
41571
41572
WUFFS_BASE__GENERATED_C_CODE
41573
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
41574
wuffs_deflate__decoder__transform_io(
41575
    wuffs_deflate__decoder* self,
41576
    wuffs_base__io_buffer* a_dst,
41577
    wuffs_base__io_buffer* a_src,
41578
17.6k
    wuffs_base__slice_u8 a_workbuf) {
41579
17.6k
  if (!self) {
41580
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
41581
0
  }
41582
17.6k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
41583
0
    return wuffs_base__make_status(
41584
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
41585
0
        ? wuffs_base__error__disabled_by_previous_error
41586
0
        : wuffs_base__error__initialize_not_called);
41587
0
  }
41588
17.6k
  if (!a_dst || !a_src) {
41589
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
41590
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
41591
0
  }
41592
17.6k
  if ((self->private_impl.active_coroutine != 0) &&
41593
17.6k
      (self->private_impl.active_coroutine != 1)) {
41594
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
41595
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
41596
0
  }
41597
17.6k
  self->private_impl.active_coroutine = 0;
41598
17.6k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41599
41600
17.6k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
41601
41602
17.6k
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
41603
17.6k
  switch (coro_susp_point) {
41604
4.99k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41605
41606
17.6k
    while (true) {
41607
17.6k
      {
41608
17.6k
        wuffs_base__status t_0 = wuffs_deflate__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
41609
17.6k
        v_status = t_0;
41610
17.6k
      }
41611
17.6k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
41612
1.27k
        status = wuffs_base__make_status(wuffs_deflate__error__truncated_input);
41613
1.27k
        goto exit;
41614
1.27k
      }
41615
16.3k
      status = v_status;
41616
16.3k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
41617
12.6k
    }
41618
41619
1.85k
    ok:
41620
1.85k
    self->private_impl.p_transform_io = 0;
41621
1.85k
    goto exit;
41622
17.6k
  }
41623
41624
0
  goto suspend;
41625
14.1k
  suspend:
41626
14.1k
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41627
14.1k
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
41628
41629
14.1k
  goto exit;
41630
17.6k
  exit:
41631
17.6k
  if (wuffs_base__status__is_error(&status)) {
41632
1.65k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
41633
1.65k
  }
41634
17.6k
  return status;
41635
17.6k
}
41636
41637
// -------- func deflate.decoder.do_transform_io
41638
41639
WUFFS_BASE__GENERATED_C_CODE
41640
static wuffs_base__status
41641
wuffs_deflate__decoder__do_transform_io(
41642
    wuffs_deflate__decoder* self,
41643
    wuffs_base__io_buffer* a_dst,
41644
    wuffs_base__io_buffer* a_src,
41645
17.6k
    wuffs_base__slice_u8 a_workbuf) {
41646
17.6k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41647
41648
17.6k
  uint64_t v_mark = 0;
41649
17.6k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
41650
41651
17.6k
  uint8_t* iop_a_dst = NULL;
41652
17.6k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41653
17.6k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41654
17.6k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41655
17.6k
  if (a_dst && a_dst->data.ptr) {
41656
17.6k
    io0_a_dst = a_dst->data.ptr;
41657
17.6k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
41658
17.6k
    iop_a_dst = io1_a_dst;
41659
17.6k
    io2_a_dst = io0_a_dst + a_dst->data.len;
41660
17.6k
    if (a_dst->meta.closed) {
41661
0
      io2_a_dst = iop_a_dst;
41662
0
    }
41663
17.6k
  }
41664
41665
17.6k
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
41666
17.6k
  switch (coro_susp_point) {
41667
4.99k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41668
41669
4.99k
    self->private_impl.choosy_decode_huffman_fast64 = (
41670
4.99k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
41671
4.99k
        wuffs_base__cpu_arch__have_x86_bmi2() ? &wuffs_deflate__decoder__decode_huffman_bmi2 :
41672
4.99k
#endif
41673
4.99k
        self->private_impl.choosy_decode_huffman_fast64);
41674
17.6k
    while (true) {
41675
17.6k
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
41676
17.6k
      {
41677
17.6k
        if (a_dst) {
41678
17.6k
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
41679
17.6k
        }
41680
17.6k
        wuffs_base__status t_0 = wuffs_deflate__decoder__decode_blocks(self, a_dst, a_src);
41681
17.6k
        v_status = t_0;
41682
17.6k
        if (a_dst) {
41683
17.6k
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
41684
17.6k
        }
41685
17.6k
      }
41686
17.6k
      if ( ! wuffs_base__status__is_suspension(&v_status)) {
41687
2.23k
        status = v_status;
41688
2.23k
        if (wuffs_base__status__is_error(&status)) {
41689
386
          goto exit;
41690
1.85k
        } else if (wuffs_base__status__is_suspension(&status)) {
41691
0
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
41692
0
          goto exit;
41693
0
        }
41694
1.85k
        goto ok;
41695
2.23k
      }
41696
15.4k
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_transformed_history_count, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))));
41697
15.4k
      wuffs_deflate__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
41698
15.4k
      status = v_status;
41699
15.4k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
41700
12.6k
    }
41701
41702
1.85k
    ok:
41703
1.85k
    self->private_impl.p_do_transform_io = 0;
41704
1.85k
    goto exit;
41705
17.6k
  }
41706
41707
0
  goto suspend;
41708
15.4k
  suspend:
41709
15.4k
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41710
41711
15.4k
  goto exit;
41712
17.6k
  exit:
41713
17.6k
  if (a_dst && a_dst->data.ptr) {
41714
17.6k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
41715
17.6k
  }
41716
41717
17.6k
  return status;
41718
17.6k
}
41719
41720
// -------- func deflate.decoder.decode_blocks
41721
41722
WUFFS_BASE__GENERATED_C_CODE
41723
static wuffs_base__status
41724
wuffs_deflate__decoder__decode_blocks(
41725
    wuffs_deflate__decoder* self,
41726
    wuffs_base__io_buffer* a_dst,
41727
17.6k
    wuffs_base__io_buffer* a_src) {
41728
17.6k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41729
41730
17.6k
  uint32_t v_final = 0;
41731
17.6k
  uint32_t v_b0 = 0;
41732
17.6k
  uint32_t v_type = 0;
41733
17.6k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
41734
41735
17.6k
  const uint8_t* iop_a_src = NULL;
41736
17.6k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41737
17.6k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41738
17.6k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41739
17.6k
  if (a_src && a_src->data.ptr) {
41740
17.6k
    io0_a_src = a_src->data.ptr;
41741
17.6k
    io1_a_src = io0_a_src + a_src->meta.ri;
41742
17.6k
    iop_a_src = io1_a_src;
41743
17.6k
    io2_a_src = io0_a_src + a_src->meta.wi;
41744
17.6k
  }
41745
41746
17.6k
  uint32_t coro_susp_point = self->private_impl.p_decode_blocks;
41747
17.6k
  if (coro_susp_point) {
41748
12.6k
    v_final = self->private_data.s_decode_blocks.v_final;
41749
12.6k
  }
41750
17.6k
  switch (coro_susp_point) {
41751
4.99k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41752
41753
13.1k
    label__outer__continue:;
41754
14.0k
    while (v_final == 0u) {
41755
21.5k
      while (self->private_impl.f_n_bits < 3u) {
41756
9.43k
        {
41757
9.86k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
41758
9.86k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41759
500
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41760
500
            goto suspend;
41761
500
          }
41762
9.36k
          uint32_t t_0 = *iop_a_src++;
41763
9.36k
          v_b0 = t_0;
41764
9.36k
        }
41765
0
        self->private_impl.f_bits |= (v_b0 << (self->private_impl.f_n_bits & 3u));
41766
9.36k
        self->private_impl.f_n_bits = ((self->private_impl.f_n_bits & 3u) + 8u);
41767
9.36k
      }
41768
12.1k
      v_final = (self->private_impl.f_bits & 1u);
41769
12.1k
      v_type = ((self->private_impl.f_bits >> 1u) & 3u);
41770
12.1k
      self->private_impl.f_bits >>= 3u;
41771
12.1k
      self->private_impl.f_n_bits -= 3u;
41772
12.1k
      if (v_type == 0u) {
41773
1.06k
        if (a_src) {
41774
1.06k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41775
1.06k
        }
41776
2.09k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
41777
2.09k
        status = wuffs_deflate__decoder__decode_uncompressed(self, a_dst, a_src);
41778
2.09k
        if (a_src) {
41779
2.09k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
41780
2.09k
        }
41781
2.09k
        if (status.repr) {
41782
1.24k
          goto suspend;
41783
1.24k
        }
41784
848
        continue;
41785
11.0k
      } else if (v_type == 1u) {
41786
6.84k
        v_status = wuffs_deflate__decoder__init_fixed_huffman(self);
41787
6.84k
        if ( ! wuffs_base__status__is_ok(&v_status)) {
41788
0
          status = v_status;
41789
0
          if (wuffs_base__status__is_error(&status)) {
41790
0
            goto exit;
41791
0
          } else if (wuffs_base__status__is_suspension(&status)) {
41792
0
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
41793
0
            goto exit;
41794
0
          }
41795
0
          goto ok;
41796
0
        }
41797
6.84k
      } else if (v_type == 2u) {
41798
4.17k
        if (a_src) {
41799
4.17k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41800
4.17k
        }
41801
5.61k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
41802
5.61k
        status = wuffs_deflate__decoder__init_dynamic_huffman(self, a_src);
41803
5.61k
        if (a_src) {
41804
5.61k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
41805
5.61k
        }
41806
5.61k
        if (status.repr) {
41807
1.74k
          goto suspend;
41808
1.74k
        }
41809
5.61k
      } else {
41810
43
        status = wuffs_base__make_status(wuffs_deflate__error__bad_block);
41811
43
        goto exit;
41812
43
      }
41813
10.7k
      self->private_impl.f_end_of_block = false;
41814
15.0k
      while (true) {
41815
15.0k
        if (sizeof(void*) == 4u) {
41816
0
          if (a_src) {
41817
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41818
0
          }
41819
0
          v_status = wuffs_deflate__decoder__decode_huffman_fast32(self, a_dst, a_src);
41820
0
          if (a_src) {
41821
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
41822
0
          }
41823
15.0k
        } else {
41824
15.0k
          if (a_src) {
41825
15.0k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41826
15.0k
          }
41827
15.0k
          v_status = wuffs_deflate__decoder__decode_huffman_fast64(self, a_dst, a_src);
41828
15.0k
          if (a_src) {
41829
15.0k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
41830
15.0k
          }
41831
15.0k
        }
41832
15.0k
        if (wuffs_base__status__is_error(&v_status)) {
41833
33
          status = v_status;
41834
33
          goto exit;
41835
33
        }
41836
15.0k
        if (self->private_impl.f_end_of_block) {
41837
3.94k
          goto label__outer__continue;
41838
3.94k
        }
41839
11.1k
        if (a_src) {
41840
11.1k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41841
11.1k
        }
41842
20.8k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
41843
20.8k
        status = wuffs_deflate__decoder__decode_huffman_slow(self, a_dst, a_src);
41844
20.8k
        if (a_src) {
41845
20.8k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
41846
20.8k
        }
41847
20.8k
        if (status.repr) {
41848
12.2k
          goto suspend;
41849
12.2k
        }
41850
8.63k
        if (self->private_impl.f_end_of_block) {
41851
4.25k
          goto label__outer__continue;
41852
4.25k
        }
41853
8.63k
      }
41854
10.7k
    }
41855
41856
1.85k
    ok:
41857
1.85k
    self->private_impl.p_decode_blocks = 0;
41858
1.85k
    goto exit;
41859
17.6k
  }
41860
41861
0
  goto suspend;
41862
15.7k
  suspend:
41863
15.7k
  self->private_impl.p_decode_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41864
15.7k
  self->private_data.s_decode_blocks.v_final = v_final;
41865
41866
15.7k
  goto exit;
41867
17.6k
  exit:
41868
17.6k
  if (a_src && a_src->data.ptr) {
41869
17.6k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41870
17.6k
  }
41871
41872
17.6k
  return status;
41873
17.6k
}
41874
41875
// -------- func deflate.decoder.decode_uncompressed
41876
41877
WUFFS_BASE__GENERATED_C_CODE
41878
static wuffs_base__status
41879
wuffs_deflate__decoder__decode_uncompressed(
41880
    wuffs_deflate__decoder* self,
41881
    wuffs_base__io_buffer* a_dst,
41882
2.09k
    wuffs_base__io_buffer* a_src) {
41883
2.09k
  wuffs_base__status status = wuffs_base__make_status(NULL);
41884
41885
2.09k
  uint32_t v_length = 0;
41886
2.09k
  uint32_t v_n_copied = 0;
41887
41888
2.09k
  uint8_t* iop_a_dst = NULL;
41889
2.09k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41890
2.09k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41891
2.09k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41892
2.09k
  if (a_dst && a_dst->data.ptr) {
41893
2.09k
    io0_a_dst = a_dst->data.ptr;
41894
2.09k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
41895
2.09k
    iop_a_dst = io1_a_dst;
41896
2.09k
    io2_a_dst = io0_a_dst + a_dst->data.len;
41897
2.09k
    if (a_dst->meta.closed) {
41898
0
      io2_a_dst = iop_a_dst;
41899
0
    }
41900
2.09k
  }
41901
2.09k
  const uint8_t* iop_a_src = NULL;
41902
2.09k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41903
2.09k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41904
2.09k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
41905
2.09k
  if (a_src && a_src->data.ptr) {
41906
2.09k
    io0_a_src = a_src->data.ptr;
41907
2.09k
    io1_a_src = io0_a_src + a_src->meta.ri;
41908
2.09k
    iop_a_src = io1_a_src;
41909
2.09k
    io2_a_src = io0_a_src + a_src->meta.wi;
41910
2.09k
  }
41911
41912
2.09k
  uint32_t coro_susp_point = self->private_impl.p_decode_uncompressed;
41913
2.09k
  if (coro_susp_point) {
41914
1.03k
    v_length = self->private_data.s_decode_uncompressed.v_length;
41915
1.03k
  }
41916
2.09k
  switch (coro_susp_point) {
41917
1.06k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
41918
41919
1.06k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
41920
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
41921
0
      goto exit;
41922
0
    }
41923
1.06k
    self->private_impl.f_n_bits = 0u;
41924
1.06k
    self->private_impl.f_bits = 0u;
41925
1.06k
    {
41926
1.06k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
41927
1.06k
      uint32_t t_0;
41928
1.06k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
41929
994
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
41930
994
        iop_a_src += 4;
41931
994
      } else {
41932
68
        self->private_data.s_decode_uncompressed.scratch = 0;
41933
694
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
41934
797
        while (true) {
41935
797
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
41936
689
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41937
689
            goto suspend;
41938
689
          }
41939
108
          uint64_t* scratch = &self->private_data.s_decode_uncompressed.scratch;
41940
108
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
41941
108
          *scratch <<= 8;
41942
108
          *scratch >>= 8;
41943
108
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
41944
108
          if (num_bits_0 == 24) {
41945
5
            t_0 = ((uint32_t)(*scratch));
41946
5
            break;
41947
5
          }
41948
103
          num_bits_0 += 8u;
41949
103
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
41950
103
        }
41951
694
      }
41952
999
      v_length = t_0;
41953
999
    }
41954
999
    if ((((v_length) & 0xFFFFu) + ((v_length) >> (32u - 16u))) != 65535u) {
41955
59
      status = wuffs_base__make_status(wuffs_deflate__error__inconsistent_stored_block_length);
41956
59
      goto exit;
41957
59
    }
41958
940
    v_length = ((v_length) & 0xFFFFu);
41959
1.34k
    while (true) {
41960
1.34k
      v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
41961
1.34k
          &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
41962
1.34k
      if (v_length <= v_n_copied) {
41963
848
        status = wuffs_base__make_status(NULL);
41964
848
        goto ok;
41965
848
      }
41966
499
      v_length -= v_n_copied;
41967
499
      if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
41968
36
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
41969
36
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
41970
463
      } else {
41971
463
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
41972
463
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
41973
374
      }
41974
499
    }
41975
41976
848
    ok:
41977
848
    self->private_impl.p_decode_uncompressed = 0;
41978
848
    goto exit;
41979
2.09k
  }
41980
41981
0
  goto suspend;
41982
1.18k
  suspend:
41983
1.18k
  self->private_impl.p_decode_uncompressed = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
41984
1.18k
  self->private_data.s_decode_uncompressed.v_length = v_length;
41985
41986
1.18k
  goto exit;
41987
2.09k
  exit:
41988
2.09k
  if (a_dst && a_dst->data.ptr) {
41989
2.09k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
41990
2.09k
  }
41991
2.09k
  if (a_src && a_src->data.ptr) {
41992
2.09k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
41993
2.09k
  }
41994
41995
2.09k
  return status;
41996
2.09k
}
41997
41998
// -------- func deflate.decoder.init_fixed_huffman
41999
42000
WUFFS_BASE__GENERATED_C_CODE
42001
static wuffs_base__status
42002
wuffs_deflate__decoder__init_fixed_huffman(
42003
6.84k
    wuffs_deflate__decoder* self) {
42004
6.84k
  uint32_t v_i = 0;
42005
6.84k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42006
42007
991k
  while (v_i < 144u) {
42008
985k
    self->private_data.f_code_lengths[v_i] = 8u;
42009
985k
    v_i += 1u;
42010
985k
  }
42011
773k
  while (v_i < 256u) {
42012
766k
    self->private_data.f_code_lengths[v_i] = 9u;
42013
766k
    v_i += 1u;
42014
766k
  }
42015
171k
  while (v_i < 280u) {
42016
164k
    self->private_data.f_code_lengths[v_i] = 7u;
42017
164k
    v_i += 1u;
42018
164k
  }
42019
61.5k
  while (v_i < 288u) {
42020
54.7k
    self->private_data.f_code_lengths[v_i] = 8u;
42021
54.7k
    v_i += 1u;
42022
54.7k
  }
42023
225k
  while (v_i < 320u) {
42024
218k
    self->private_data.f_code_lengths[v_i] = 5u;
42025
218k
    v_i += 1u;
42026
218k
  }
42027
6.84k
  v_status = wuffs_deflate__decoder__init_huff(self,
42028
6.84k
      0u,
42029
6.84k
      0u,
42030
6.84k
      288u,
42031
6.84k
      257u);
42032
6.84k
  if (wuffs_base__status__is_error(&v_status)) {
42033
0
    return v_status;
42034
0
  }
42035
6.84k
  v_status = wuffs_deflate__decoder__init_huff(self,
42036
6.84k
      1u,
42037
6.84k
      288u,
42038
6.84k
      320u,
42039
6.84k
      0u);
42040
6.84k
  if (wuffs_base__status__is_error(&v_status)) {
42041
0
    return v_status;
42042
0
  }
42043
6.84k
  return wuffs_base__make_status(NULL);
42044
6.84k
}
42045
42046
// -------- func deflate.decoder.init_dynamic_huffman
42047
42048
WUFFS_BASE__GENERATED_C_CODE
42049
static wuffs_base__status
42050
wuffs_deflate__decoder__init_dynamic_huffman(
42051
    wuffs_deflate__decoder* self,
42052
5.61k
    wuffs_base__io_buffer* a_src) {
42053
5.61k
  wuffs_base__status status = wuffs_base__make_status(NULL);
42054
42055
5.61k
  uint32_t v_bits = 0;
42056
5.61k
  uint32_t v_n_bits = 0;
42057
5.61k
  uint32_t v_b0 = 0;
42058
5.61k
  uint32_t v_n_lit = 0;
42059
5.61k
  uint32_t v_n_dist = 0;
42060
5.61k
  uint32_t v_n_clen = 0;
42061
5.61k
  uint32_t v_i = 0;
42062
5.61k
  uint32_t v_b1 = 0;
42063
5.61k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
42064
5.61k
  uint32_t v_mask = 0;
42065
5.61k
  uint32_t v_table_entry = 0;
42066
5.61k
  uint32_t v_table_entry_n_bits = 0;
42067
5.61k
  uint32_t v_b2 = 0;
42068
5.61k
  uint32_t v_n_extra_bits = 0;
42069
5.61k
  uint8_t v_rep_symbol = 0;
42070
5.61k
  uint32_t v_rep_count = 0;
42071
5.61k
  uint32_t v_b3 = 0;
42072
42073
5.61k
  const uint8_t* iop_a_src = NULL;
42074
5.61k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42075
5.61k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42076
5.61k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42077
5.61k
  if (a_src && a_src->data.ptr) {
42078
5.61k
    io0_a_src = a_src->data.ptr;
42079
5.61k
    io1_a_src = io0_a_src + a_src->meta.ri;
42080
5.61k
    iop_a_src = io1_a_src;
42081
5.61k
    io2_a_src = io0_a_src + a_src->meta.wi;
42082
5.61k
  }
42083
42084
5.61k
  uint32_t coro_susp_point = self->private_impl.p_init_dynamic_huffman;
42085
5.61k
  if (coro_susp_point) {
42086
1.44k
    v_bits = self->private_data.s_init_dynamic_huffman.v_bits;
42087
1.44k
    v_n_bits = self->private_data.s_init_dynamic_huffman.v_n_bits;
42088
1.44k
    v_n_lit = self->private_data.s_init_dynamic_huffman.v_n_lit;
42089
1.44k
    v_n_dist = self->private_data.s_init_dynamic_huffman.v_n_dist;
42090
1.44k
    v_n_clen = self->private_data.s_init_dynamic_huffman.v_n_clen;
42091
1.44k
    v_i = self->private_data.s_init_dynamic_huffman.v_i;
42092
1.44k
    v_mask = self->private_data.s_init_dynamic_huffman.v_mask;
42093
1.44k
    v_n_extra_bits = self->private_data.s_init_dynamic_huffman.v_n_extra_bits;
42094
1.44k
    v_rep_symbol = self->private_data.s_init_dynamic_huffman.v_rep_symbol;
42095
1.44k
    v_rep_count = self->private_data.s_init_dynamic_huffman.v_rep_count;
42096
1.44k
  }
42097
5.61k
  switch (coro_susp_point) {
42098
4.17k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
42099
42100
4.17k
    v_bits = self->private_impl.f_bits;
42101
4.17k
    v_n_bits = self->private_impl.f_n_bits;
42102
11.9k
    while (v_n_bits < 14u) {
42103
7.85k
      {
42104
8.21k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
42105
8.21k
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42106
391
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42107
391
          goto suspend;
42108
391
        }
42109
7.82k
        uint32_t t_0 = *iop_a_src++;
42110
7.82k
        v_b0 = t_0;
42111
7.82k
      }
42112
0
      v_bits |= (v_b0 << v_n_bits);
42113
7.82k
      v_n_bits += 8u;
42114
7.82k
    }
42115
4.14k
    v_n_lit = (((v_bits) & 0x1Fu) + 257u);
42116
4.14k
    if (v_n_lit > 286u) {
42117
2
      status = wuffs_base__make_status(wuffs_deflate__error__bad_literal_length_code_count);
42118
2
      goto exit;
42119
2
    }
42120
4.13k
    v_bits >>= 5u;
42121
4.13k
    v_n_dist = (((v_bits) & 0x1Fu) + 1u);
42122
4.13k
    if (v_n_dist > 30u) {
42123
3
      status = wuffs_base__make_status(wuffs_deflate__error__bad_distance_code_count);
42124
3
      goto exit;
42125
3
    }
42126
4.13k
    v_bits >>= 5u;
42127
4.13k
    v_n_clen = (((v_bits) & 0xFu) + 4u);
42128
4.13k
    v_bits >>= 4u;
42129
4.13k
    v_n_bits -= 14u;
42130
4.13k
    v_i = 0u;
42131
74.9k
    while (v_i < v_n_clen) {
42132
95.2k
      while (v_n_bits < 3u) {
42133
24.4k
        {
42134
24.8k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
42135
24.8k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42136
395
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42137
395
            goto suspend;
42138
395
          }
42139
24.4k
          uint32_t t_1 = *iop_a_src++;
42140
24.4k
          v_b1 = t_1;
42141
24.4k
        }
42142
0
        v_bits |= (v_b1 << v_n_bits);
42143
24.4k
        v_n_bits += 8u;
42144
24.4k
      }
42145
70.8k
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = ((uint8_t)((v_bits & 7u)));
42146
70.8k
      v_bits >>= 3u;
42147
70.8k
      v_n_bits -= 3u;
42148
70.8k
      v_i += 1u;
42149
70.8k
    }
42150
11.1k
    while (v_i < 19u) {
42151
7.02k
      self->private_data.f_code_lengths[WUFFS_DEFLATE__CODE_ORDER[v_i]] = 0u;
42152
7.02k
      v_i += 1u;
42153
7.02k
    }
42154
4.08k
    v_status = wuffs_deflate__decoder__init_huff(self,
42155
4.08k
        0u,
42156
4.08k
        0u,
42157
4.08k
        19u,
42158
4.08k
        4095u);
42159
4.08k
    if (wuffs_base__status__is_error(&v_status)) {
42160
52
      status = v_status;
42161
52
      goto exit;
42162
52
    }
42163
4.03k
    v_mask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
42164
4.03k
    v_i = 0u;
42165
305k
    while (v_i < (v_n_lit + v_n_dist)) {
42166
425k
      while (true) {
42167
425k
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_mask)];
42168
425k
        v_table_entry_n_bits = (v_table_entry & 15u);
42169
425k
        if (v_n_bits >= v_table_entry_n_bits) {
42170
301k
          v_bits >>= v_table_entry_n_bits;
42171
301k
          v_n_bits -= v_table_entry_n_bits;
42172
301k
          break;
42173
301k
        }
42174
124k
        {
42175
124k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
42176
124k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42177
443
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42178
443
            goto suspend;
42179
443
          }
42180
124k
          uint32_t t_2 = *iop_a_src++;
42181
124k
          v_b2 = t_2;
42182
124k
        }
42183
0
        v_bits |= (v_b2 << v_n_bits);
42184
124k
        v_n_bits += 8u;
42185
124k
      }
42186
301k
      if ((v_table_entry >> 24u) != 128u) {
42187
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42188
0
        goto exit;
42189
0
      }
42190
301k
      v_table_entry = ((v_table_entry >> 8u) & 255u);
42191
301k
      if (v_table_entry < 16u) {
42192
260k
        self->private_data.f_code_lengths[v_i] = ((uint8_t)(v_table_entry));
42193
260k
        v_i += 1u;
42194
260k
        continue;
42195
260k
      }
42196
40.8k
      v_n_extra_bits = 0u;
42197
40.8k
      v_rep_symbol = 0u;
42198
40.8k
      v_rep_count = 0u;
42199
40.8k
      if (v_table_entry == 16u) {
42200
22.8k
        v_n_extra_bits = 2u;
42201
22.8k
        if (v_i <= 0u) {
42202
6
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_repetition);
42203
6
          goto exit;
42204
6
        }
42205
22.8k
        v_rep_symbol = ((uint8_t)(self->private_data.f_code_lengths[(v_i - 1u)] & 15u));
42206
22.8k
        v_rep_count = 3u;
42207
22.8k
      } else if (v_table_entry == 17u) {
42208
9.84k
        v_n_extra_bits = 3u;
42209
9.84k
        v_rep_symbol = 0u;
42210
9.84k
        v_rep_count = 3u;
42211
9.84k
      } else if (v_table_entry == 18u) {
42212
8.06k
        v_n_extra_bits = 7u;
42213
8.06k
        v_rep_symbol = 0u;
42214
8.06k
        v_rep_count = 11u;
42215
8.06k
      } else {
42216
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42217
0
        goto exit;
42218
0
      }
42219
55.9k
      while (v_n_bits < v_n_extra_bits) {
42220
15.1k
        {
42221
15.5k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
42222
15.5k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
42223
391
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
42224
391
            goto suspend;
42225
391
          }
42226
15.1k
          uint32_t t_3 = *iop_a_src++;
42227
15.1k
          v_b3 = t_3;
42228
15.1k
        }
42229
0
        v_bits |= (v_b3 << v_n_bits);
42230
15.1k
        v_n_bits += 8u;
42231
15.1k
      }
42232
40.7k
      v_rep_count += ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_n_extra_bits));
42233
40.7k
      v_bits >>= v_n_extra_bits;
42234
40.7k
      v_n_bits -= v_n_extra_bits;
42235
948k
      while (v_rep_count > 0u) {
42236
907k
        if (v_i >= (v_n_lit + v_n_dist)) {
42237
5
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
42238
5
          goto exit;
42239
5
        }
42240
907k
        self->private_data.f_code_lengths[v_i] = v_rep_symbol;
42241
907k
        v_i += 1u;
42242
907k
        v_rep_count -= 1u;
42243
907k
      }
42244
40.7k
    }
42245
3.92k
    if (v_i != (v_n_lit + v_n_dist)) {
42246
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_length_count);
42247
0
      goto exit;
42248
0
    }
42249
3.92k
    if (self->private_data.f_code_lengths[256u] == 0u) {
42250
2
      status = wuffs_base__make_status(wuffs_deflate__error__missing_end_of_block_code);
42251
2
      goto exit;
42252
2
    }
42253
3.92k
    v_status = wuffs_deflate__decoder__init_huff(self,
42254
3.92k
        0u,
42255
3.92k
        0u,
42256
3.92k
        v_n_lit,
42257
3.92k
        257u);
42258
3.92k
    if (wuffs_base__status__is_error(&v_status)) {
42259
13
      status = v_status;
42260
13
      goto exit;
42261
13
    }
42262
3.91k
    v_status = wuffs_deflate__decoder__init_huff(self,
42263
3.91k
        1u,
42264
3.91k
        v_n_lit,
42265
3.91k
        (v_n_lit + v_n_dist),
42266
3.91k
        0u);
42267
3.91k
    if (wuffs_base__status__is_error(&v_status)) {
42268
44
      status = v_status;
42269
44
      goto exit;
42270
44
    }
42271
3.87k
    self->private_impl.f_bits = v_bits;
42272
3.87k
    self->private_impl.f_n_bits = v_n_bits;
42273
42274
3.87k
    goto ok;
42275
3.87k
    ok:
42276
3.87k
    self->private_impl.p_init_dynamic_huffman = 0;
42277
3.87k
    goto exit;
42278
5.61k
  }
42279
42280
0
  goto suspend;
42281
1.62k
  suspend:
42282
1.62k
  self->private_impl.p_init_dynamic_huffman = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
42283
1.62k
  self->private_data.s_init_dynamic_huffman.v_bits = v_bits;
42284
1.62k
  self->private_data.s_init_dynamic_huffman.v_n_bits = v_n_bits;
42285
1.62k
  self->private_data.s_init_dynamic_huffman.v_n_lit = v_n_lit;
42286
1.62k
  self->private_data.s_init_dynamic_huffman.v_n_dist = v_n_dist;
42287
1.62k
  self->private_data.s_init_dynamic_huffman.v_n_clen = v_n_clen;
42288
1.62k
  self->private_data.s_init_dynamic_huffman.v_i = v_i;
42289
1.62k
  self->private_data.s_init_dynamic_huffman.v_mask = v_mask;
42290
1.62k
  self->private_data.s_init_dynamic_huffman.v_n_extra_bits = v_n_extra_bits;
42291
1.62k
  self->private_data.s_init_dynamic_huffman.v_rep_symbol = v_rep_symbol;
42292
1.62k
  self->private_data.s_init_dynamic_huffman.v_rep_count = v_rep_count;
42293
42294
1.62k
  goto exit;
42295
5.61k
  exit:
42296
5.61k
  if (a_src && a_src->data.ptr) {
42297
5.61k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42298
5.61k
  }
42299
42300
5.61k
  return status;
42301
5.61k
}
42302
42303
// -------- func deflate.decoder.init_huff
42304
42305
WUFFS_BASE__GENERATED_C_CODE
42306
static wuffs_base__status
42307
wuffs_deflate__decoder__init_huff(
42308
    wuffs_deflate__decoder* self,
42309
    uint32_t a_which,
42310
    uint32_t a_n_codes0,
42311
    uint32_t a_n_codes1,
42312
25.6k
    uint32_t a_base_symbol) {
42313
25.6k
  uint16_t v_counts[16] = {0};
42314
25.6k
  uint32_t v_i = 0;
42315
25.6k
  uint32_t v_remaining = 0;
42316
25.6k
  uint16_t v_offsets[16] = {0};
42317
25.6k
  uint32_t v_n_symbols = 0;
42318
25.6k
  uint32_t v_count = 0;
42319
25.6k
  uint16_t v_symbols[320] = {0};
42320
25.6k
  uint32_t v_min_cl = 0;
42321
25.6k
  uint32_t v_max_cl = 0;
42322
25.6k
  uint32_t v_initial_high_bits = 0;
42323
25.6k
  uint32_t v_prev_cl = 0;
42324
25.6k
  uint32_t v_prev_redirect_key = 0;
42325
25.6k
  uint32_t v_top = 0;
42326
25.6k
  uint32_t v_next_top = 0;
42327
25.6k
  uint32_t v_code = 0;
42328
25.6k
  uint32_t v_key = 0;
42329
25.6k
  uint32_t v_value = 0;
42330
25.6k
  uint32_t v_cl = 0;
42331
25.6k
  uint32_t v_redirect_key = 0;
42332
25.6k
  uint32_t v_j = 0;
42333
25.6k
  uint32_t v_reversed_key = 0;
42334
25.6k
  uint32_t v_symbol = 0;
42335
25.6k
  uint32_t v_high_bits = 0;
42336
25.6k
  uint32_t v_delta = 0;
42337
42338
25.6k
  v_i = a_n_codes0;
42339
3.45M
  while (v_i < a_n_codes1) {
42340
3.42M
    if (v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
42341
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42342
0
    }
42343
3.42M
#if defined(__GNUC__)
42344
3.42M
#pragma GCC diagnostic push
42345
3.42M
#pragma GCC diagnostic ignored "-Wconversion"
42346
3.42M
#endif
42347
3.42M
    v_counts[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
42348
3.42M
#if defined(__GNUC__)
42349
3.42M
#pragma GCC diagnostic pop
42350
3.42M
#endif
42351
3.42M
    v_i += 1u;
42352
3.42M
  }
42353
25.6k
  if ((((uint32_t)(v_counts[0u])) + a_n_codes0) == a_n_codes1) {
42354
10
    return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
42355
10
  }
42356
25.5k
  v_remaining = 1u;
42357
25.5k
  v_i = 1u;
42358
409k
  while (v_i <= 15u) {
42359
383k
    if (v_remaining > 1073741824u) {
42360
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42361
0
    }
42362
383k
    v_remaining <<= 1u;
42363
383k
    if (v_remaining < ((uint32_t)(v_counts[v_i]))) {
42364
30
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_over_subscribed);
42365
30
    }
42366
383k
    v_remaining -= ((uint32_t)(v_counts[v_i]));
42367
383k
    v_i += 1u;
42368
383k
  }
42369
25.5k
  if (v_remaining != 0u) {
42370
995
    if ((a_which == 1u) && (v_counts[1u] == 1u) && ((((uint32_t)(v_counts[0u])) + a_n_codes0 + 1u) == a_n_codes1)) {
42371
926
      v_i = 0u;
42372
2.65k
      while (v_i <= 29u) {
42373
2.65k
        if (self->private_data.f_code_lengths[(a_n_codes0 + v_i)] == 1u) {
42374
926
          self->private_impl.f_n_huffs_bits[1u] = 1u;
42375
926
          self->private_data.f_huffs[1u][0u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[v_i] | 1u);
42376
926
          self->private_data.f_huffs[1u][1u] = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[31u] | 1u);
42377
926
          return wuffs_base__make_status(NULL);
42378
926
        }
42379
1.72k
        v_i += 1u;
42380
1.72k
      }
42381
926
    }
42382
69
    return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code_under_subscribed);
42383
995
  }
42384
24.5k
  v_i = 1u;
42385
393k
  while (v_i <= 15u) {
42386
368k
    v_offsets[v_i] = ((uint16_t)(v_n_symbols));
42387
368k
    v_count = ((uint32_t)(v_counts[v_i]));
42388
368k
    if (v_n_symbols > (320u - v_count)) {
42389
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42390
0
    }
42391
368k
    v_n_symbols = (v_n_symbols + v_count);
42392
368k
    v_i += 1u;
42393
368k
  }
42394
24.5k
  if (v_n_symbols > 288u) {
42395
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42396
0
  }
42397
24.5k
  v_i = a_n_codes0;
42398
3.44M
  while (v_i < a_n_codes1) {
42399
3.41M
    if (v_i < a_n_codes0) {
42400
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42401
0
    }
42402
3.41M
    if (self->private_data.f_code_lengths[v_i] != 0u) {
42403
2.57M
      if (v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] >= 320u) {
42404
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42405
0
      }
42406
2.57M
      v_symbols[v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))]] = ((uint16_t)((v_i - a_n_codes0)));
42407
2.57M
#if defined(__GNUC__)
42408
2.57M
#pragma GCC diagnostic push
42409
2.57M
#pragma GCC diagnostic ignored "-Wconversion"
42410
2.57M
#endif
42411
2.57M
      v_offsets[((uint8_t)(self->private_data.f_code_lengths[v_i] & 15u))] += 1u;
42412
2.57M
#if defined(__GNUC__)
42413
2.57M
#pragma GCC diagnostic pop
42414
2.57M
#endif
42415
2.57M
    }
42416
3.41M
    v_i += 1u;
42417
3.41M
  }
42418
24.5k
  v_min_cl = 1u;
42419
101k
  while (true) {
42420
101k
    if (v_counts[v_min_cl] != 0u) {
42421
24.5k
      break;
42422
24.5k
    }
42423
77.2k
    if (v_min_cl >= 9u) {
42424
0
      return wuffs_base__make_status(wuffs_deflate__error__bad_huffman_minimum_code_length);
42425
0
    }
42426
77.2k
    v_min_cl += 1u;
42427
77.2k
  }
42428
24.5k
  v_max_cl = 15u;
42429
225k
  while (true) {
42430
225k
    if (v_counts[v_max_cl] != 0u) {
42431
24.5k
      break;
42432
24.5k
    }
42433
200k
    if (v_max_cl <= 1u) {
42434
0
      return wuffs_base__make_status(wuffs_deflate__error__no_huffman_codes);
42435
0
    }
42436
200k
    v_max_cl -= 1u;
42437
200k
  }
42438
24.5k
  if (v_max_cl <= 9u) {
42439
22.1k
    self->private_impl.f_n_huffs_bits[a_which] = v_max_cl;
42440
22.1k
  } else {
42441
2.43k
    self->private_impl.f_n_huffs_bits[a_which] = 9u;
42442
2.43k
  }
42443
24.5k
  v_i = 0u;
42444
24.5k
  if ((v_n_symbols != ((uint32_t)(v_offsets[v_max_cl]))) || (v_n_symbols != ((uint32_t)(v_offsets[15u])))) {
42445
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42446
0
  }
42447
24.5k
  if ((a_n_codes0 + ((uint32_t)(v_symbols[0u]))) >= 320u) {
42448
0
    return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42449
0
  }
42450
24.5k
  v_initial_high_bits = 512u;
42451
24.5k
  if (v_max_cl < 9u) {
42452
14.3k
    v_initial_high_bits = (((uint32_t)(1u)) << v_max_cl);
42453
14.3k
  }
42454
24.5k
  v_prev_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[0u])))] & 15u))));
42455
24.5k
  v_prev_redirect_key = 4294967295u;
42456
24.5k
  v_top = 0u;
42457
24.5k
  v_next_top = 512u;
42458
24.5k
  v_code = 0u;
42459
24.5k
  v_key = 0u;
42460
24.5k
  v_value = 0u;
42461
2.57M
  while (true) {
42462
2.57M
    if ((a_n_codes0 + ((uint32_t)(v_symbols[v_i]))) >= 320u) {
42463
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42464
0
    }
42465
2.57M
    v_cl = ((uint32_t)(((uint8_t)(self->private_data.f_code_lengths[(a_n_codes0 + ((uint32_t)(v_symbols[v_i])))] & 15u))));
42466
2.57M
    if (v_cl > v_prev_cl) {
42467
59.1k
      v_code <<= (v_cl - v_prev_cl);
42468
59.1k
      if (v_code >= 32768u) {
42469
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42470
0
      }
42471
59.1k
    }
42472
2.57M
    v_prev_cl = v_cl;
42473
2.57M
    v_key = v_code;
42474
2.57M
    if (v_cl > 9u) {
42475
124k
      v_cl -= 9u;
42476
124k
      v_redirect_key = ((v_key >> v_cl) & 511u);
42477
124k
      v_key = ((v_key) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_cl));
42478
124k
      if (v_prev_redirect_key != v_redirect_key) {
42479
26.9k
        v_prev_redirect_key = v_redirect_key;
42480
26.9k
        v_remaining = (((uint32_t)(1u)) << v_cl);
42481
26.9k
        v_j = v_prev_cl;
42482
31.2k
        while (v_j <= 15u) {
42483
31.2k
          if (v_remaining <= ((uint32_t)(v_counts[v_j]))) {
42484
26.9k
            break;
42485
26.9k
          }
42486
4.34k
          v_remaining -= ((uint32_t)(v_counts[v_j]));
42487
4.34k
          if (v_remaining > 1073741824u) {
42488
0
            return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42489
0
          }
42490
4.34k
          v_remaining <<= 1u;
42491
4.34k
          v_j += 1u;
42492
4.34k
        }
42493
26.9k
        if ((v_j <= 9u) || (15u < v_j)) {
42494
0
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42495
0
        }
42496
26.9k
        v_j -= 9u;
42497
26.9k
        v_initial_high_bits = (((uint32_t)(1u)) << v_j);
42498
26.9k
        v_top = v_next_top;
42499
26.9k
        if ((v_top + (((uint32_t)(1u)) << v_j)) > 1024u) {
42500
0
          return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42501
0
        }
42502
26.9k
        v_next_top = (v_top + (((uint32_t)(1u)) << v_j));
42503
26.9k
        v_redirect_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_redirect_key >> 1u)])) | ((v_redirect_key & 1u) << 8u));
42504
26.9k
        self->private_data.f_huffs[a_which][v_redirect_key] = (268435465u | (v_top << 8u) | (v_j << 4u));
42505
26.9k
      }
42506
124k
    }
42507
2.57M
    if ((v_key >= 512u) || (v_counts[v_prev_cl] <= 0u)) {
42508
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42509
0
    }
42510
2.57M
#if defined(__GNUC__)
42511
2.57M
#pragma GCC diagnostic push
42512
2.57M
#pragma GCC diagnostic ignored "-Wconversion"
42513
2.57M
#endif
42514
2.57M
    v_counts[v_prev_cl] -= 1u;
42515
2.57M
#if defined(__GNUC__)
42516
2.57M
#pragma GCC diagnostic pop
42517
2.57M
#endif
42518
2.57M
    v_reversed_key = (((uint32_t)(WUFFS_DEFLATE__REVERSE8[(v_key >> 1u)])) | ((v_key & 1u) << 8u));
42519
2.57M
    v_reversed_key >>= (9u - v_cl);
42520
2.57M
    v_symbol = ((uint32_t)(v_symbols[v_i]));
42521
2.57M
    if (v_symbol == 256u) {
42522
10.7k
      v_value = (536870912u | v_cl);
42523
2.56M
    } else if ((v_symbol < 256u) && (a_which == 0u)) {
42524
2.04M
      v_value = (2147483648u | (v_symbol << 8u) | v_cl);
42525
2.04M
    } else if (v_symbol >= a_base_symbol) {
42526
522k
      v_symbol -= a_base_symbol;
42527
522k
      if (a_which == 0u) {
42528
261k
        v_value = (WUFFS_DEFLATE__LCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
42529
261k
      } else {
42530
260k
        v_value = (WUFFS_DEFLATE__DCODE_MAGIC_NUMBERS[(v_symbol & 31u)] | v_cl);
42531
260k
      }
42532
522k
    } else {
42533
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42534
0
    }
42535
2.57M
    v_high_bits = v_initial_high_bits;
42536
2.57M
    v_delta = (((uint32_t)(1u)) << v_cl);
42537
8.64M
    while (v_high_bits >= v_delta) {
42538
6.06M
      v_high_bits -= v_delta;
42539
6.06M
      if ((v_top + ((v_high_bits | v_reversed_key) & 511u)) >= 1024u) {
42540
0
        return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42541
0
      }
42542
6.06M
      self->private_data.f_huffs[a_which][(v_top + ((v_high_bits | v_reversed_key) & 511u))] = v_value;
42543
6.06M
    }
42544
2.57M
    v_i += 1u;
42545
2.57M
    if (v_i >= v_n_symbols) {
42546
24.5k
      break;
42547
24.5k
    }
42548
2.54M
    v_code += 1u;
42549
2.54M
    if (v_code >= 32768u) {
42550
0
      return wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42551
0
    }
42552
2.54M
  }
42553
24.5k
  return wuffs_base__make_status(NULL);
42554
24.5k
}
42555
42556
// โ€ผ WUFFS MULTI-FILE SECTION +x86_bmi2
42557
// -------- func deflate.decoder.decode_huffman_bmi2
42558
42559
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
42560
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("bmi2")
42561
WUFFS_BASE__GENERATED_C_CODE
42562
static wuffs_base__status
42563
wuffs_deflate__decoder__decode_huffman_bmi2(
42564
    wuffs_deflate__decoder* self,
42565
    wuffs_base__io_buffer* a_dst,
42566
15.0k
    wuffs_base__io_buffer* a_src) {
42567
15.0k
  wuffs_base__status status = wuffs_base__make_status(NULL);
42568
42569
15.0k
  uint64_t v_bits = 0;
42570
15.0k
  uint32_t v_n_bits = 0;
42571
15.0k
  uint32_t v_table_entry = 0;
42572
15.0k
  uint32_t v_table_entry_n_bits = 0;
42573
15.0k
  uint64_t v_lmask = 0;
42574
15.0k
  uint64_t v_dmask = 0;
42575
15.0k
  uint32_t v_redir_top = 0;
42576
15.0k
  uint32_t v_redir_mask = 0;
42577
15.0k
  uint32_t v_length = 0;
42578
15.0k
  uint32_t v_dist_minus_1 = 0;
42579
15.0k
  uint32_t v_hlen = 0;
42580
15.0k
  uint32_t v_hdist = 0;
42581
15.0k
  uint32_t v_hdist_adjustment = 0;
42582
42583
15.0k
  uint8_t* iop_a_dst = NULL;
42584
15.0k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42585
15.0k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42586
15.0k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42587
15.0k
  if (a_dst && a_dst->data.ptr) {
42588
15.0k
    io0_a_dst = a_dst->data.ptr;
42589
15.0k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42590
15.0k
    iop_a_dst = io1_a_dst;
42591
15.0k
    io2_a_dst = io0_a_dst + a_dst->data.len;
42592
15.0k
    if (a_dst->meta.closed) {
42593
0
      io2_a_dst = iop_a_dst;
42594
0
    }
42595
15.0k
  }
42596
15.0k
  const uint8_t* iop_a_src = NULL;
42597
15.0k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42598
15.0k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42599
15.0k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42600
15.0k
  if (a_src && a_src->data.ptr) {
42601
15.0k
    io0_a_src = a_src->data.ptr;
42602
15.0k
    io1_a_src = io0_a_src + a_src->meta.ri;
42603
15.0k
    iop_a_src = io1_a_src;
42604
15.0k
    io2_a_src = io0_a_src + a_src->meta.wi;
42605
15.0k
  }
42606
42607
15.0k
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42608
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42609
0
    goto exit;
42610
0
  }
42611
15.0k
  v_bits = ((uint64_t)(self->private_impl.f_bits));
42612
15.0k
  v_n_bits = self->private_impl.f_n_bits;
42613
15.0k
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
42614
15.0k
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
42615
15.0k
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
42616
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
42617
0
    goto exit;
42618
0
  }
42619
15.0k
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
42620
214k
  label__loop__continue:;
42621
24.5M
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
42622
24.5M
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
42623
24.5M
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
42624
24.5M
    v_n_bits |= 56u;
42625
24.5M
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
42626
24.5M
    v_table_entry_n_bits = (v_table_entry & 15u);
42627
24.5M
    v_bits >>= v_table_entry_n_bits;
42628
24.5M
    v_n_bits -= v_table_entry_n_bits;
42629
24.5M
    if ((v_table_entry >> 31u) != 0u) {
42630
15.3M
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42631
15.3M
      continue;
42632
15.3M
    } else if ((v_table_entry >> 30u) != 0u) {
42633
8.58M
    } else if ((v_table_entry >> 29u) != 0u) {
42634
3.12k
      self->private_impl.f_end_of_block = true;
42635
3.12k
      break;
42636
577k
    } else if ((v_table_entry >> 28u) != 0u) {
42637
577k
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42638
577k
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42639
577k
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
42640
577k
      v_table_entry_n_bits = (v_table_entry & 15u);
42641
577k
      v_bits >>= v_table_entry_n_bits;
42642
577k
      v_n_bits -= v_table_entry_n_bits;
42643
577k
      if ((v_table_entry >> 31u) != 0u) {
42644
536k
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42645
536k
        continue;
42646
536k
      } else if ((v_table_entry >> 30u) != 0u) {
42647
40.1k
      } else if ((v_table_entry >> 29u) != 0u) {
42648
824
        self->private_impl.f_end_of_block = true;
42649
824
        break;
42650
824
      } else if ((v_table_entry >> 28u) != 0u) {
42651
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42652
0
        goto exit;
42653
0
      } else if ((v_table_entry >> 27u) != 0u) {
42654
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42655
0
        goto exit;
42656
0
      } else {
42657
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42658
0
        goto exit;
42659
0
      }
42660
577k
    } else if ((v_table_entry >> 27u) != 0u) {
42661
2
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42662
2
      goto exit;
42663
2
    } else {
42664
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42665
0
      goto exit;
42666
0
    }
42667
8.62M
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
42668
8.62M
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42669
8.62M
    if (v_table_entry_n_bits > 0u) {
42670
661k
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
42671
661k
      v_bits >>= v_table_entry_n_bits;
42672
661k
      v_n_bits -= v_table_entry_n_bits;
42673
661k
    }
42674
8.62M
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
42675
8.62M
    v_table_entry_n_bits = (v_table_entry & 15u);
42676
8.62M
    v_bits >>= v_table_entry_n_bits;
42677
8.62M
    v_n_bits -= v_table_entry_n_bits;
42678
8.62M
    if ((v_table_entry >> 28u) == 1u) {
42679
790
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42680
790
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42681
790
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
42682
790
      v_table_entry_n_bits = (v_table_entry & 15u);
42683
790
      v_bits >>= v_table_entry_n_bits;
42684
790
      v_n_bits -= v_table_entry_n_bits;
42685
790
    }
42686
8.62M
    if ((v_table_entry >> 24u) != 64u) {
42687
2
      if ((v_table_entry >> 24u) == 8u) {
42688
2
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42689
2
        goto exit;
42690
2
      }
42691
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42692
0
      goto exit;
42693
2
    }
42694
8.62M
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
42695
8.62M
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42696
8.62M
    v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u);
42697
8.62M
    v_bits >>= v_table_entry_n_bits;
42698
8.62M
    v_n_bits -= v_table_entry_n_bits;
42699
8.62M
    do {
42700
8.62M
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
42701
200k
        v_hlen = 0u;
42702
200k
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
42703
200k
        if (v_length > v_hdist) {
42704
637
          v_length -= v_hdist;
42705
637
          v_hlen = v_hdist;
42706
199k
        } else {
42707
199k
          v_hlen = v_length;
42708
199k
          v_length = 0u;
42709
199k
        }
42710
200k
        v_hdist += v_hdist_adjustment;
42711
200k
        if (self->private_impl.f_history_index < v_hdist) {
42712
29
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
42713
29
          goto exit;
42714
29
        }
42715
200k
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
42716
200k
            &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025));
42717
200k
        if (v_length == 0u) {
42718
199k
          goto label__loop__continue;
42719
199k
        }
42720
630
        if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
42721
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
42722
0
          goto exit;
42723
0
        }
42724
630
      }
42725
8.42M
      if ((v_dist_minus_1 + 1u) >= 8u) {
42726
1.25M
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
42727
1.25M
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42728
7.17M
      } else if ((v_dist_minus_1 + 1u) == 1u) {
42729
2.27M
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
42730
2.27M
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42731
4.90M
      } else {
42732
4.90M
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
42733
4.90M
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42734
4.90M
      }
42735
8.42M
    } while (0);
42736
8.62M
  }
42737
15.0k
  if (v_n_bits > 63u) {
42738
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42739
0
    goto exit;
42740
0
  }
42741
65.8k
  while (v_n_bits >= 8u) {
42742
50.8k
    v_n_bits -= 8u;
42743
50.8k
    if (iop_a_src > io1_a_src) {
42744
50.8k
      iop_a_src--;
42745
50.8k
    } else {
42746
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
42747
0
      goto exit;
42748
0
    }
42749
50.8k
  }
42750
15.0k
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
42751
15.0k
  self->private_impl.f_n_bits = v_n_bits;
42752
15.0k
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
42753
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42754
0
    goto exit;
42755
0
  }
42756
15.0k
  goto exit;
42757
15.0k
  exit:
42758
15.0k
  if (a_dst && a_dst->data.ptr) {
42759
15.0k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
42760
15.0k
  }
42761
15.0k
  if (a_src && a_src->data.ptr) {
42762
15.0k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
42763
15.0k
  }
42764
42765
15.0k
  return status;
42766
15.0k
}
42767
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
42768
// โ€ผ WUFFS MULTI-FILE SECTION -x86_bmi2
42769
42770
// -------- func deflate.decoder.decode_huffman_fast32
42771
42772
WUFFS_BASE__GENERATED_C_CODE
42773
static wuffs_base__status
42774
wuffs_deflate__decoder__decode_huffman_fast32(
42775
    wuffs_deflate__decoder* self,
42776
    wuffs_base__io_buffer* a_dst,
42777
0
    wuffs_base__io_buffer* a_src) {
42778
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
42779
0
42780
0
  uint32_t v_bits = 0;
42781
0
  uint32_t v_n_bits = 0;
42782
0
  uint32_t v_table_entry = 0;
42783
0
  uint32_t v_table_entry_n_bits = 0;
42784
0
  uint32_t v_lmask = 0;
42785
0
  uint32_t v_dmask = 0;
42786
0
  uint32_t v_redir_top = 0;
42787
0
  uint32_t v_redir_mask = 0;
42788
0
  uint32_t v_length = 0;
42789
0
  uint32_t v_dist_minus_1 = 0;
42790
0
  uint32_t v_hlen = 0;
42791
0
  uint32_t v_hdist = 0;
42792
0
  uint32_t v_hdist_adjustment = 0;
42793
0
42794
0
  uint8_t* iop_a_dst = NULL;
42795
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42796
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42797
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42798
0
  if (a_dst && a_dst->data.ptr) {
42799
0
    io0_a_dst = a_dst->data.ptr;
42800
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
42801
0
    iop_a_dst = io1_a_dst;
42802
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
42803
0
    if (a_dst->meta.closed) {
42804
0
      io2_a_dst = iop_a_dst;
42805
0
    }
42806
0
  }
42807
0
  const uint8_t* iop_a_src = NULL;
42808
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42809
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42810
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
42811
0
  if (a_src && a_src->data.ptr) {
42812
0
    io0_a_src = a_src->data.ptr;
42813
0
    io1_a_src = io0_a_src + a_src->meta.ri;
42814
0
    iop_a_src = io1_a_src;
42815
0
    io2_a_src = io0_a_src + a_src->meta.wi;
42816
0
  }
42817
0
42818
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
42819
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
42820
0
    goto exit;
42821
0
  }
42822
0
  v_bits = self->private_impl.f_bits;
42823
0
  v_n_bits = self->private_impl.f_n_bits;
42824
0
  v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
42825
0
  v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
42826
0
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
42827
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
42828
0
    goto exit;
42829
0
  }
42830
0
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
42831
0
  label__loop__continue:;
42832
0
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 12u)) {
42833
0
    if (v_n_bits < 15u) {
42834
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42835
0
      iop_a_src += 1u;
42836
0
      v_n_bits += 8u;
42837
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42838
0
      iop_a_src += 1u;
42839
0
      v_n_bits += 8u;
42840
0
    } else {
42841
0
    }
42842
0
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
42843
0
    v_table_entry_n_bits = (v_table_entry & 15u);
42844
0
    v_bits >>= v_table_entry_n_bits;
42845
0
    v_n_bits -= v_table_entry_n_bits;
42846
0
    if ((v_table_entry >> 31u) != 0u) {
42847
0
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42848
0
      continue;
42849
0
    } else if ((v_table_entry >> 30u) != 0u) {
42850
0
    } else if ((v_table_entry >> 29u) != 0u) {
42851
0
      self->private_impl.f_end_of_block = true;
42852
0
      break;
42853
0
    } else if ((v_table_entry >> 28u) != 0u) {
42854
0
      if (v_n_bits < 15u) {
42855
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42856
0
        iop_a_src += 1u;
42857
0
        v_n_bits += 8u;
42858
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42859
0
        iop_a_src += 1u;
42860
0
        v_n_bits += 8u;
42861
0
      } else {
42862
0
      }
42863
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42864
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42865
0
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42866
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42867
0
      v_bits >>= v_table_entry_n_bits;
42868
0
      v_n_bits -= v_table_entry_n_bits;
42869
0
      if ((v_table_entry >> 31u) != 0u) {
42870
0
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
42871
0
        continue;
42872
0
      } else if ((v_table_entry >> 30u) != 0u) {
42873
0
      } else if ((v_table_entry >> 29u) != 0u) {
42874
0
        self->private_impl.f_end_of_block = true;
42875
0
        break;
42876
0
      } else if ((v_table_entry >> 28u) != 0u) {
42877
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42878
0
        goto exit;
42879
0
      } else if ((v_table_entry >> 27u) != 0u) {
42880
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42881
0
        goto exit;
42882
0
      } else {
42883
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42884
0
        goto exit;
42885
0
      }
42886
0
    } else if ((v_table_entry >> 27u) != 0u) {
42887
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42888
0
      goto exit;
42889
0
    } else {
42890
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42891
0
      goto exit;
42892
0
    }
42893
0
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
42894
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42895
0
    if (v_table_entry_n_bits > 0u) {
42896
0
      if (v_n_bits < 15u) {
42897
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42898
0
        iop_a_src += 1u;
42899
0
        v_n_bits += 8u;
42900
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42901
0
        iop_a_src += 1u;
42902
0
        v_n_bits += 8u;
42903
0
      } else {
42904
0
      }
42905
0
      v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
42906
0
      v_bits >>= v_table_entry_n_bits;
42907
0
      v_n_bits -= v_table_entry_n_bits;
42908
0
    } else {
42909
0
    }
42910
0
    if (v_n_bits < 15u) {
42911
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42912
0
      iop_a_src += 1u;
42913
0
      v_n_bits += 8u;
42914
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42915
0
      iop_a_src += 1u;
42916
0
      v_n_bits += 8u;
42917
0
    } else {
42918
0
    }
42919
0
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
42920
0
    v_table_entry_n_bits = (v_table_entry & 15u);
42921
0
    v_bits >>= v_table_entry_n_bits;
42922
0
    v_n_bits -= v_table_entry_n_bits;
42923
0
    if ((v_table_entry >> 28u) == 1u) {
42924
0
      if (v_n_bits < 15u) {
42925
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42926
0
        iop_a_src += 1u;
42927
0
        v_n_bits += 8u;
42928
0
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42929
0
        iop_a_src += 1u;
42930
0
        v_n_bits += 8u;
42931
0
      } else {
42932
0
      }
42933
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
42934
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
42935
0
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
42936
0
      v_table_entry_n_bits = (v_table_entry & 15u);
42937
0
      v_bits >>= v_table_entry_n_bits;
42938
0
      v_n_bits -= v_table_entry_n_bits;
42939
0
    } else {
42940
0
    }
42941
0
    if ((v_table_entry >> 24u) != 64u) {
42942
0
      if ((v_table_entry >> 24u) == 8u) {
42943
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
42944
0
        goto exit;
42945
0
      }
42946
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
42947
0
      goto exit;
42948
0
    }
42949
0
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
42950
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
42951
0
    if (v_n_bits < v_table_entry_n_bits) {
42952
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42953
0
      iop_a_src += 1u;
42954
0
      v_n_bits += 8u;
42955
0
      v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
42956
0
      iop_a_src += 1u;
42957
0
      v_n_bits += 8u;
42958
0
    }
42959
0
    v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
42960
0
    v_bits >>= v_table_entry_n_bits;
42961
0
    v_n_bits -= v_table_entry_n_bits;
42962
0
    do {
42963
0
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
42964
0
        v_hlen = 0u;
42965
0
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
42966
0
        if (v_length > v_hdist) {
42967
0
          v_length -= v_hdist;
42968
0
          v_hlen = v_hdist;
42969
0
        } else {
42970
0
          v_hlen = v_length;
42971
0
          v_length = 0u;
42972
0
        }
42973
0
        v_hdist += v_hdist_adjustment;
42974
0
        if (self->private_impl.f_history_index < v_hdist) {
42975
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
42976
0
          goto exit;
42977
0
        }
42978
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
42979
0
            &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025));
42980
0
        if (v_length == 0u) {
42981
0
          goto label__loop__continue;
42982
0
        }
42983
0
        if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
42984
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
42985
0
          goto exit;
42986
0
        }
42987
0
      }
42988
0
      if ((v_dist_minus_1 + 1u) >= 8u) {
42989
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
42990
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42991
0
      } else {
42992
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
42993
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
42994
0
      }
42995
0
    } while (0);
42996
0
  }
42997
0
  while (v_n_bits >= 8u) {
42998
0
    v_n_bits -= 8u;
42999
0
    if (iop_a_src > io1_a_src) {
43000
0
      iop_a_src--;
43001
0
    } else {
43002
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
43003
0
      goto exit;
43004
0
    }
43005
0
  }
43006
0
  self->private_impl.f_bits = (v_bits & ((((uint32_t)(1u)) << v_n_bits) - 1u));
43007
0
  self->private_impl.f_n_bits = v_n_bits;
43008
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
43009
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43010
0
    goto exit;
43011
0
  }
43012
0
  goto exit;
43013
0
  exit:
43014
0
  if (a_dst && a_dst->data.ptr) {
43015
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
43016
0
  }
43017
0
  if (a_src && a_src->data.ptr) {
43018
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43019
0
  }
43020
0
43021
0
  return status;
43022
0
}
43023
43024
// -------- func deflate.decoder.decode_huffman_fast64
43025
43026
WUFFS_BASE__GENERATED_C_CODE
43027
static wuffs_base__status
43028
wuffs_deflate__decoder__decode_huffman_fast64(
43029
    wuffs_deflate__decoder* self,
43030
    wuffs_base__io_buffer* a_dst,
43031
15.0k
    wuffs_base__io_buffer* a_src) {
43032
15.0k
  return (*self->private_impl.choosy_decode_huffman_fast64)(self, a_dst, a_src);
43033
15.0k
}
43034
43035
WUFFS_BASE__GENERATED_C_CODE
43036
static wuffs_base__status
43037
wuffs_deflate__decoder__decode_huffman_fast64__choosy_default(
43038
    wuffs_deflate__decoder* self,
43039
    wuffs_base__io_buffer* a_dst,
43040
0
    wuffs_base__io_buffer* a_src) {
43041
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
43042
43043
0
  uint64_t v_bits = 0;
43044
0
  uint32_t v_n_bits = 0;
43045
0
  uint32_t v_table_entry = 0;
43046
0
  uint32_t v_table_entry_n_bits = 0;
43047
0
  uint64_t v_lmask = 0;
43048
0
  uint64_t v_dmask = 0;
43049
0
  uint32_t v_redir_top = 0;
43050
0
  uint32_t v_redir_mask = 0;
43051
0
  uint32_t v_length = 0;
43052
0
  uint32_t v_dist_minus_1 = 0;
43053
0
  uint32_t v_hlen = 0;
43054
0
  uint32_t v_hdist = 0;
43055
0
  uint32_t v_hdist_adjustment = 0;
43056
43057
0
  uint8_t* iop_a_dst = NULL;
43058
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43059
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43060
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43061
0
  if (a_dst && a_dst->data.ptr) {
43062
0
    io0_a_dst = a_dst->data.ptr;
43063
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
43064
0
    iop_a_dst = io1_a_dst;
43065
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
43066
0
    if (a_dst->meta.closed) {
43067
0
      io2_a_dst = iop_a_dst;
43068
0
    }
43069
0
  }
43070
0
  const uint8_t* iop_a_src = NULL;
43071
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43072
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43073
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43074
0
  if (a_src && a_src->data.ptr) {
43075
0
    io0_a_src = a_src->data.ptr;
43076
0
    io1_a_src = io0_a_src + a_src->meta.ri;
43077
0
    iop_a_src = io1_a_src;
43078
0
    io2_a_src = io0_a_src + a_src->meta.wi;
43079
0
  }
43080
43081
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43082
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43083
0
    goto exit;
43084
0
  }
43085
0
  v_bits = ((uint64_t)(self->private_impl.f_bits));
43086
0
  v_n_bits = self->private_impl.f_n_bits;
43087
0
  v_lmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43088
0
  v_dmask = ((((uint64_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
43089
0
  if (self->private_impl.f_transformed_history_count < (a_dst ? a_dst->meta.pos : 0u)) {
43090
0
    status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
43091
0
    goto exit;
43092
0
  }
43093
0
  v_hdist_adjustment = ((uint32_t)((self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u))));
43094
0
  label__loop__continue:;
43095
0
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 266u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 8u)) {
43096
0
    v_bits |= ((uint64_t)(wuffs_base__peek_u64le__no_bounds_check(iop_a_src) << (v_n_bits & 63u)));
43097
0
    iop_a_src += ((63u - (v_n_bits & 63u)) >> 3u);
43098
0
    v_n_bits |= 56u;
43099
0
    v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
43100
0
    v_table_entry_n_bits = (v_table_entry & 15u);
43101
0
    v_bits >>= v_table_entry_n_bits;
43102
0
    v_n_bits -= v_table_entry_n_bits;
43103
0
    if ((v_table_entry >> 31u) != 0u) {
43104
0
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43105
0
      continue;
43106
0
    } else if ((v_table_entry >> 30u) != 0u) {
43107
0
    } else if ((v_table_entry >> 29u) != 0u) {
43108
0
      self->private_impl.f_end_of_block = true;
43109
0
      break;
43110
0
    } else if ((v_table_entry >> 28u) != 0u) {
43111
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43112
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43113
0
      v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
43114
0
      v_table_entry_n_bits = (v_table_entry & 15u);
43115
0
      v_bits >>= v_table_entry_n_bits;
43116
0
      v_n_bits -= v_table_entry_n_bits;
43117
0
      if ((v_table_entry >> 31u) != 0u) {
43118
0
        (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)((v_table_entry >> 8u)))), iop_a_dst += 1);
43119
0
        continue;
43120
0
      } else if ((v_table_entry >> 30u) != 0u) {
43121
0
      } else if ((v_table_entry >> 29u) != 0u) {
43122
0
        self->private_impl.f_end_of_block = true;
43123
0
        break;
43124
0
      } else if ((v_table_entry >> 28u) != 0u) {
43125
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43126
0
        goto exit;
43127
0
      } else if ((v_table_entry >> 27u) != 0u) {
43128
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43129
0
        goto exit;
43130
0
      } else {
43131
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43132
0
        goto exit;
43133
0
      }
43134
0
    } else if ((v_table_entry >> 27u) != 0u) {
43135
0
      status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43136
0
      goto exit;
43137
0
    } else {
43138
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43139
0
      goto exit;
43140
0
    }
43141
0
    v_length = (((v_table_entry >> 8u) & 255u) + 3u);
43142
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43143
0
    if (v_table_entry_n_bits > 0u) {
43144
0
      v_length = (((v_length + 253u + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 255u) + 3u);
43145
0
      v_bits >>= v_table_entry_n_bits;
43146
0
      v_n_bits -= v_table_entry_n_bits;
43147
0
    }
43148
0
    v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
43149
0
    v_table_entry_n_bits = (v_table_entry & 15u);
43150
0
    v_bits >>= v_table_entry_n_bits;
43151
0
    v_n_bits -= v_table_entry_n_bits;
43152
0
    if ((v_table_entry >> 28u) == 1u) {
43153
0
      v_redir_top = ((v_table_entry >> 8u) & 65535u);
43154
0
      v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43155
0
      v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (((uint32_t)(v_bits)) & v_redir_mask)) & 1023u)];
43156
0
      v_table_entry_n_bits = (v_table_entry & 15u);
43157
0
      v_bits >>= v_table_entry_n_bits;
43158
0
      v_n_bits -= v_table_entry_n_bits;
43159
0
    }
43160
0
    if ((v_table_entry >> 24u) != 64u) {
43161
0
      if ((v_table_entry >> 24u) == 8u) {
43162
0
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43163
0
        goto exit;
43164
0
      }
43165
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43166
0
      goto exit;
43167
0
    }
43168
0
    v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
43169
0
    v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43170
0
    v_dist_minus_1 = ((v_dist_minus_1 + ((uint32_t)(((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U64(v_table_entry_n_bits))))) & 32767u);
43171
0
    v_bits >>= v_table_entry_n_bits;
43172
0
    v_n_bits -= v_table_entry_n_bits;
43173
0
    do {
43174
0
      if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
43175
0
        v_hlen = 0u;
43176
0
        v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
43177
0
        if (v_length > v_hdist) {
43178
0
          v_length -= v_hdist;
43179
0
          v_hlen = v_hdist;
43180
0
        } else {
43181
0
          v_hlen = v_length;
43182
0
          v_length = 0u;
43183
0
        }
43184
0
        v_hdist += v_hdist_adjustment;
43185
0
        if (self->private_impl.f_history_index < v_hdist) {
43186
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
43187
0
          goto exit;
43188
0
        }
43189
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
43190
0
            &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025));
43191
0
        if (v_length == 0u) {
43192
0
          goto label__loop__continue;
43193
0
        }
43194
0
        if ((((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) || (((uint64_t)(v_length)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_length + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst)))) {
43195
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_distance);
43196
0
          goto exit;
43197
0
        }
43198
0
      }
43199
0
      if ((v_dist_minus_1 + 1u) >= 8u) {
43200
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast(
43201
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43202
0
      } else if ((v_dist_minus_1 + 1u) == 1u) {
43203
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_distance_1_fast(
43204
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43205
0
      } else {
43206
0
        wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast(
43207
0
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43208
0
      }
43209
0
    } while (0);
43210
0
  }
43211
0
  if (v_n_bits > 63u) {
43212
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43213
0
    goto exit;
43214
0
  }
43215
0
  while (v_n_bits >= 8u) {
43216
0
    v_n_bits -= 8u;
43217
0
    if (iop_a_src > io1_a_src) {
43218
0
      iop_a_src--;
43219
0
    } else {
43220
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_i_o);
43221
0
      goto exit;
43222
0
    }
43223
0
  }
43224
0
  self->private_impl.f_bits = ((uint32_t)((v_bits & ((((uint64_t)(1u)) << v_n_bits) - 1u))));
43225
0
  self->private_impl.f_n_bits = v_n_bits;
43226
0
  if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> self->private_impl.f_n_bits) != 0u)) {
43227
0
    status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43228
0
    goto exit;
43229
0
  }
43230
0
  goto exit;
43231
0
  exit:
43232
0
  if (a_dst && a_dst->data.ptr) {
43233
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
43234
0
  }
43235
0
  if (a_src && a_src->data.ptr) {
43236
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43237
0
  }
43238
43239
0
  return status;
43240
0
}
43241
43242
// -------- func deflate.decoder.decode_huffman_slow
43243
43244
WUFFS_BASE__GENERATED_C_CODE
43245
static wuffs_base__status
43246
wuffs_deflate__decoder__decode_huffman_slow(
43247
    wuffs_deflate__decoder* self,
43248
    wuffs_base__io_buffer* a_dst,
43249
20.8k
    wuffs_base__io_buffer* a_src) {
43250
20.8k
  wuffs_base__status status = wuffs_base__make_status(NULL);
43251
43252
20.8k
  uint32_t v_bits = 0;
43253
20.8k
  uint32_t v_n_bits = 0;
43254
20.8k
  uint32_t v_table_entry = 0;
43255
20.8k
  uint32_t v_table_entry_n_bits = 0;
43256
20.8k
  uint32_t v_lmask = 0;
43257
20.8k
  uint32_t v_dmask = 0;
43258
20.8k
  uint32_t v_b0 = 0;
43259
20.8k
  uint32_t v_redir_top = 0;
43260
20.8k
  uint32_t v_redir_mask = 0;
43261
20.8k
  uint32_t v_b1 = 0;
43262
20.8k
  uint32_t v_length = 0;
43263
20.8k
  uint32_t v_b2 = 0;
43264
20.8k
  uint32_t v_b3 = 0;
43265
20.8k
  uint32_t v_b4 = 0;
43266
20.8k
  uint32_t v_dist_minus_1 = 0;
43267
20.8k
  uint32_t v_b5 = 0;
43268
20.8k
  uint32_t v_n_copied = 0;
43269
20.8k
  uint32_t v_hlen = 0;
43270
20.8k
  uint32_t v_hdist = 0;
43271
43272
20.8k
  uint8_t* iop_a_dst = NULL;
43273
20.8k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43274
20.8k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43275
20.8k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43276
20.8k
  if (a_dst && a_dst->data.ptr) {
43277
20.8k
    io0_a_dst = a_dst->data.ptr;
43278
20.8k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
43279
20.8k
    iop_a_dst = io1_a_dst;
43280
20.8k
    io2_a_dst = io0_a_dst + a_dst->data.len;
43281
20.8k
    if (a_dst->meta.closed) {
43282
0
      io2_a_dst = iop_a_dst;
43283
0
    }
43284
20.8k
  }
43285
20.8k
  const uint8_t* iop_a_src = NULL;
43286
20.8k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43287
20.8k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43288
20.8k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
43289
20.8k
  if (a_src && a_src->data.ptr) {
43290
20.8k
    io0_a_src = a_src->data.ptr;
43291
20.8k
    io1_a_src = io0_a_src + a_src->meta.ri;
43292
20.8k
    iop_a_src = io1_a_src;
43293
20.8k
    io2_a_src = io0_a_src + a_src->meta.wi;
43294
20.8k
  }
43295
43296
20.8k
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_slow;
43297
20.8k
  if (coro_susp_point) {
43298
9.74k
    v_bits = self->private_data.s_decode_huffman_slow.v_bits;
43299
9.74k
    v_n_bits = self->private_data.s_decode_huffman_slow.v_n_bits;
43300
9.74k
    v_table_entry_n_bits = self->private_data.s_decode_huffman_slow.v_table_entry_n_bits;
43301
9.74k
    v_lmask = self->private_data.s_decode_huffman_slow.v_lmask;
43302
9.74k
    v_dmask = self->private_data.s_decode_huffman_slow.v_dmask;
43303
9.74k
    v_redir_top = self->private_data.s_decode_huffman_slow.v_redir_top;
43304
9.74k
    v_redir_mask = self->private_data.s_decode_huffman_slow.v_redir_mask;
43305
9.74k
    v_length = self->private_data.s_decode_huffman_slow.v_length;
43306
9.74k
    v_dist_minus_1 = self->private_data.s_decode_huffman_slow.v_dist_minus_1;
43307
9.74k
  }
43308
20.8k
  switch (coro_susp_point) {
43309
11.1k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
43310
43311
11.1k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43312
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43313
0
      goto exit;
43314
0
    }
43315
11.1k
    v_bits = self->private_impl.f_bits;
43316
11.1k
    v_n_bits = self->private_impl.f_n_bits;
43317
11.1k
    v_lmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[0u]) - 1u);
43318
11.1k
    v_dmask = ((((uint32_t)(1u)) << self->private_impl.f_n_huffs_bits[1u]) - 1u);
43319
51.2k
    label__loop__continue:;
43320
89.2k
    while ( ! (self->private_impl.p_decode_huffman_slow != 0)) {
43321
132k
      while (true) {
43322
132k
        v_table_entry = self->private_data.f_huffs[0u][(v_bits & v_lmask)];
43323
132k
        v_table_entry_n_bits = (v_table_entry & 15u);
43324
132k
        if (v_n_bits >= v_table_entry_n_bits) {
43325
83.7k
          v_bits >>= v_table_entry_n_bits;
43326
83.7k
          v_n_bits -= v_table_entry_n_bits;
43327
83.7k
          break;
43328
83.7k
        }
43329
48.9k
        {
43330
51.1k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
43331
51.1k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43332
3.23k
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43333
3.23k
            goto suspend;
43334
3.23k
          }
43335
47.8k
          uint32_t t_0 = *iop_a_src++;
43336
47.8k
          v_b0 = t_0;
43337
47.8k
        }
43338
0
        v_bits |= (v_b0 << v_n_bits);
43339
47.8k
        v_n_bits += 8u;
43340
47.8k
      }
43341
83.7k
      if ((v_table_entry >> 31u) != 0u) {
43342
36.9k
        self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
43343
37.0k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
43344
37.0k
        if (iop_a_dst == io2_a_dst) {
43345
92
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
43346
92
          goto suspend;
43347
92
        }
43348
36.9k
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
43349
36.9k
        continue;
43350
46.8k
      } else if ((v_table_entry >> 30u) != 0u) {
43351
40.8k
      } else if ((v_table_entry >> 29u) != 0u) {
43352
3.37k
        self->private_impl.f_end_of_block = true;
43353
3.37k
        break;
43354
3.37k
      } else if ((v_table_entry >> 28u) != 0u) {
43355
2.61k
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
43356
2.61k
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43357
3.22k
        while (true) {
43358
3.22k
          v_table_entry = self->private_data.f_huffs[0u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
43359
3.22k
          v_table_entry_n_bits = (v_table_entry & 15u);
43360
3.22k
          if (v_n_bits >= v_table_entry_n_bits) {
43361
2.59k
            v_bits >>= v_table_entry_n_bits;
43362
2.59k
            v_n_bits -= v_table_entry_n_bits;
43363
2.59k
            break;
43364
2.59k
          }
43365
632
          {
43366
848
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
43367
848
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43368
229
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43369
229
              goto suspend;
43370
229
            }
43371
619
            uint32_t t_1 = *iop_a_src++;
43372
619
            v_b1 = t_1;
43373
619
          }
43374
0
          v_bits |= (v_b1 << v_n_bits);
43375
619
          v_n_bits += 8u;
43376
619
        }
43377
2.59k
        if ((v_table_entry >> 31u) != 0u) {
43378
1.10k
          self->private_data.s_decode_huffman_slow.scratch = ((uint8_t)((v_table_entry >> 8u)));
43379
1.11k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
43380
1.11k
          if (iop_a_dst == io2_a_dst) {
43381
11
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
43382
11
            goto suspend;
43383
11
          }
43384
1.10k
          *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_huffman_slow.scratch));
43385
1.10k
          continue;
43386
1.49k
        } else if ((v_table_entry >> 30u) != 0u) {
43387
874
        } else if ((v_table_entry >> 29u) != 0u) {
43388
874
          self->private_impl.f_end_of_block = true;
43389
874
          break;
43390
874
        } else if ((v_table_entry >> 28u) != 0u) {
43391
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43392
0
          goto exit;
43393
0
        } else if ((v_table_entry >> 27u) != 0u) {
43394
0
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43395
0
          goto exit;
43396
0
        } else {
43397
0
          status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43398
0
          goto exit;
43399
0
        }
43400
2.59k
      } else if ((v_table_entry >> 27u) != 0u) {
43401
17
        status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43402
17
        goto exit;
43403
17
      } else {
43404
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43405
0
        goto exit;
43406
0
      }
43407
41.4k
      v_length = (((v_table_entry >> 8u) & 255u) + 3u);
43408
41.4k
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43409
41.4k
      if (v_table_entry_n_bits > 0u) {
43410
11.1k
        while (v_n_bits < v_table_entry_n_bits) {
43411
3.04k
          {
43412
3.29k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
43413
3.29k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43414
289
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43415
289
              goto suspend;
43416
289
            }
43417
3.00k
            uint32_t t_2 = *iop_a_src++;
43418
3.00k
            v_b2 = t_2;
43419
3.00k
          }
43420
0
          v_bits |= (v_b2 << v_n_bits);
43421
3.00k
          v_n_bits += 8u;
43422
3.00k
        }
43423
8.12k
        v_length = (((v_length + 253u + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 255u) + 3u);
43424
8.12k
        v_bits >>= v_table_entry_n_bits;
43425
8.12k
        v_n_bits -= v_table_entry_n_bits;
43426
8.12k
      }
43427
50.9k
      while (true) {
43428
50.9k
        v_table_entry = self->private_data.f_huffs[1u][(v_bits & v_dmask)];
43429
50.9k
        v_table_entry_n_bits = (v_table_entry & 15u);
43430
50.9k
        if (v_n_bits >= v_table_entry_n_bits) {
43431
41.1k
          v_bits >>= v_table_entry_n_bits;
43432
41.1k
          v_n_bits -= v_table_entry_n_bits;
43433
41.1k
          break;
43434
41.1k
        }
43435
9.78k
        {
43436
11.6k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
43437
11.6k
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43438
2.08k
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43439
2.08k
            goto suspend;
43440
2.08k
          }
43441
9.54k
          uint32_t t_3 = *iop_a_src++;
43442
9.54k
          v_b3 = t_3;
43443
9.54k
        }
43444
0
        v_bits |= (v_b3 << v_n_bits);
43445
9.54k
        v_n_bits += 8u;
43446
9.54k
      }
43447
41.1k
      if ((v_table_entry >> 28u) == 1u) {
43448
323
        v_redir_top = ((v_table_entry >> 8u) & 65535u);
43449
323
        v_redir_mask = ((((uint32_t)(1u)) << ((v_table_entry >> 4u) & 15u)) - 1u);
43450
445
        while (true) {
43451
445
          v_table_entry = self->private_data.f_huffs[1u][((v_redir_top + (v_bits & v_redir_mask)) & 1023u)];
43452
445
          v_table_entry_n_bits = (v_table_entry & 15u);
43453
445
          if (v_n_bits >= v_table_entry_n_bits) {
43454
306
            v_bits >>= v_table_entry_n_bits;
43455
306
            v_n_bits -= v_table_entry_n_bits;
43456
306
            break;
43457
306
          }
43458
139
          {
43459
536
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
43460
536
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43461
414
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43462
414
              goto suspend;
43463
414
            }
43464
122
            uint32_t t_4 = *iop_a_src++;
43465
122
            v_b4 = t_4;
43466
122
          }
43467
0
          v_bits |= (v_b4 << v_n_bits);
43468
122
          v_n_bits += 8u;
43469
122
        }
43470
323
      }
43471
41.1k
      if ((v_table_entry >> 24u) != 64u) {
43472
39
        if ((v_table_entry >> 24u) == 8u) {
43473
39
          status = wuffs_base__make_status(wuffs_deflate__error__bad_huffman_code);
43474
39
          goto exit;
43475
39
        }
43476
0
        status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_huffman_decoder_state);
43477
0
        goto exit;
43478
39
      }
43479
41.1k
      v_dist_minus_1 = ((v_table_entry >> 8u) & 32767u);
43480
41.1k
      v_table_entry_n_bits = ((v_table_entry >> 4u) & 15u);
43481
41.1k
      if (v_table_entry_n_bits > 0u) {
43482
16.3k
        while (v_n_bits < v_table_entry_n_bits) {
43483
6.68k
          {
43484
7.40k
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
43485
7.40k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
43486
817
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
43487
817
              goto suspend;
43488
817
            }
43489
6.58k
            uint32_t t_5 = *iop_a_src++;
43490
6.58k
            v_b5 = t_5;
43491
6.58k
          }
43492
0
          v_bits |= (v_b5 << v_n_bits);
43493
6.58k
          v_n_bits += 8u;
43494
6.58k
        }
43495
9.61k
        v_dist_minus_1 = ((v_dist_minus_1 + ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_table_entry_n_bits))) & 32767u);
43496
9.61k
        v_bits >>= v_table_entry_n_bits;
43497
9.61k
        v_n_bits -= v_table_entry_n_bits;
43498
9.61k
      }
43499
45.1k
      while (true) {
43500
45.1k
        if (((uint64_t)((v_dist_minus_1 + 1u))) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
43501
6.66k
          v_hdist = ((uint32_t)((((uint64_t)((v_dist_minus_1 + 1u))) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
43502
6.66k
          if (v_hdist < v_length) {
43503
4.98k
            v_hlen = v_hdist;
43504
4.98k
          } else {
43505
1.68k
            v_hlen = v_length;
43506
1.68k
          }
43507
6.66k
          v_hdist += ((uint32_t)(((uint64_t)(self->private_impl.f_transformed_history_count - (a_dst ? a_dst->meta.pos : 0u)))));
43508
6.66k
          if (self->private_impl.f_history_index < v_hdist) {
43509
68
            status = wuffs_base__make_status(wuffs_deflate__error__bad_distance);
43510
68
            goto exit;
43511
68
          }
43512
6.59k
          v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
43513
6.59k
              &iop_a_dst, io2_a_dst,v_hlen, wuffs_base__make_slice_u8_ij(self->private_data.f_history, ((self->private_impl.f_history_index - v_hdist) & 32767u), 33025));
43514
6.59k
          if (v_n_copied < v_hlen) {
43515
100
            v_length -= v_n_copied;
43516
100
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
43517
100
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
43518
92
            continue;
43519
100
          }
43520
6.49k
          v_length -= v_hlen;
43521
6.49k
          if (v_length == 0u) {
43522
1.58k
            goto label__loop__continue;
43523
1.58k
          }
43524
6.49k
        }
43525
43.3k
        v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_history(
43526
43.3k
            &iop_a_dst, io0_a_dst, io2_a_dst, v_length, (v_dist_minus_1 + 1u));
43527
43.3k
        if (v_length <= v_n_copied) {
43528
38.5k
          goto label__loop__continue;
43529
38.5k
        }
43530
4.82k
        v_length -= v_n_copied;
43531
4.82k
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
43532
4.82k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
43533
4.02k
      }
43534
40.9k
    }
43535
8.63k
    self->private_impl.f_bits = v_bits;
43536
8.63k
    self->private_impl.f_n_bits = v_n_bits;
43537
8.63k
    if ((self->private_impl.f_n_bits >= 8u) || ((self->private_impl.f_bits >> (self->private_impl.f_n_bits & 7u)) != 0u)) {
43538
0
      status = wuffs_base__make_status(wuffs_deflate__error__internal_error_inconsistent_n_bits);
43539
0
      goto exit;
43540
0
    }
43541
43542
8.63k
    ok:
43543
8.63k
    self->private_impl.p_decode_huffman_slow = 0;
43544
8.63k
    goto exit;
43545
20.8k
  }
43546
43547
0
  goto suspend;
43548
12.0k
  suspend:
43549
12.0k
  self->private_impl.p_decode_huffman_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
43550
12.0k
  self->private_data.s_decode_huffman_slow.v_bits = v_bits;
43551
12.0k
  self->private_data.s_decode_huffman_slow.v_n_bits = v_n_bits;
43552
12.0k
  self->private_data.s_decode_huffman_slow.v_table_entry_n_bits = v_table_entry_n_bits;
43553
12.0k
  self->private_data.s_decode_huffman_slow.v_lmask = v_lmask;
43554
12.0k
  self->private_data.s_decode_huffman_slow.v_dmask = v_dmask;
43555
12.0k
  self->private_data.s_decode_huffman_slow.v_redir_top = v_redir_top;
43556
12.0k
  self->private_data.s_decode_huffman_slow.v_redir_mask = v_redir_mask;
43557
12.0k
  self->private_data.s_decode_huffman_slow.v_length = v_length;
43558
12.0k
  self->private_data.s_decode_huffman_slow.v_dist_minus_1 = v_dist_minus_1;
43559
43560
12.0k
  goto exit;
43561
20.8k
  exit:
43562
20.8k
  if (a_dst && a_dst->data.ptr) {
43563
20.8k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
43564
20.8k
  }
43565
20.8k
  if (a_src && a_src->data.ptr) {
43566
20.8k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
43567
20.8k
  }
43568
43569
20.8k
  return status;
43570
20.8k
}
43571
43572
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__DEFLATE)
43573
43574
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
43575
43576
// ---------------- Status Codes Implementations
43577
43578
const char wuffs_etc2__error__bad_header[] = "#etc2: bad header";
43579
const char wuffs_etc2__error__truncated_input[] = "#etc2: truncated input";
43580
43581
// ---------------- Private Consts
43582
43583
static const uint32_t
43584
WUFFS_ETC2__DIFFS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
43585
  0u, 1u, 2u, 3u, 4294967292u, 4294967293u, 4294967294u, 4294967295u,
43586
};
43587
43588
static const uint32_t
43589
WUFFS_ETC2__MODIFIERS[16][4] WUFFS_BASE__POTENTIALLY_UNUSED = {
43590
  {
43591
    2u, 8u, 4294967294u, 4294967288u,
43592
  }, {
43593
    5u, 17u, 4294967291u, 4294967279u,
43594
  }, {
43595
    9u, 29u, 4294967287u, 4294967267u,
43596
  }, {
43597
    13u, 42u, 4294967283u, 4294967254u,
43598
  }, {
43599
    18u, 60u, 4294967278u, 4294967236u,
43600
  }, {
43601
    24u, 80u, 4294967272u, 4294967216u,
43602
  }, {
43603
    33u, 106u, 4294967263u, 4294967190u,
43604
  }, {
43605
    47u, 183u, 4294967249u, 4294967113u,
43606
  },
43607
  {
43608
    0u, 8u, 0u, 4294967288u,
43609
  }, {
43610
    0u, 17u, 0u, 4294967279u,
43611
  }, {
43612
    0u, 29u, 0u, 4294967267u,
43613
  }, {
43614
    0u, 42u, 0u, 4294967254u,
43615
  }, {
43616
    0u, 60u, 0u, 4294967236u,
43617
  }, {
43618
    0u, 80u, 0u, 4294967216u,
43619
  }, {
43620
    0u, 106u, 0u, 4294967190u,
43621
  }, {
43622
    0u, 183u, 0u, 4294967113u,
43623
  },
43624
};
43625
43626
static const uint8_t
43627
WUFFS_ETC2__T_H_MODIFIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
43628
  3u, 6u, 11u, 16u, 23u, 32u, 41u, 64u,
43629
};
43630
43631
static const uint32_t
43632
WUFFS_ETC2__ALPHA_MODIFIERS[16][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
43633
  {
43634
    4294967293u, 4294967290u, 4294967287u, 4294967281u, 2u, 5u, 8u, 14u,
43635
  }, {
43636
    4294967293u, 4294967289u, 4294967286u, 4294967283u, 2u, 6u, 9u, 12u,
43637
  }, {
43638
    4294967294u, 4294967291u, 4294967288u, 4294967283u, 1u, 4u, 7u, 12u,
43639
  }, {
43640
    4294967294u, 4294967292u, 4294967290u, 4294967283u, 1u, 3u, 5u, 12u,
43641
  }, {
43642
    4294967293u, 4294967290u, 4294967288u, 4294967284u, 2u, 5u, 7u, 11u,
43643
  }, {
43644
    4294967293u, 4294967289u, 4294967287u, 4294967285u, 2u, 6u, 8u, 10u,
43645
  }, {
43646
    4294967292u, 4294967289u, 4294967288u, 4294967285u, 3u, 6u, 7u, 10u,
43647
  }, {
43648
    4294967293u, 4294967291u, 4294967288u, 4294967285u, 2u, 4u, 7u, 10u,
43649
  },
43650
  {
43651
    4294967294u, 4294967290u, 4294967288u, 4294967286u, 1u, 5u, 7u, 9u,
43652
  }, {
43653
    4294967294u, 4294967291u, 4294967288u, 4294967286u, 1u, 4u, 7u, 9u,
43654
  }, {
43655
    4294967294u, 4294967292u, 4294967288u, 4294967286u, 1u, 3u, 7u, 9u,
43656
  }, {
43657
    4294967294u, 4294967291u, 4294967289u, 4294967286u, 1u, 4u, 6u, 9u,
43658
  }, {
43659
    4294967293u, 4294967292u, 4294967289u, 4294967286u, 2u, 3u, 6u, 9u,
43660
  }, {
43661
    4294967295u, 4294967294u, 4294967293u, 4294967286u, 0u, 1u, 2u, 9u,
43662
  }, {
43663
    4294967292u, 4294967290u, 4294967288u, 4294967287u, 3u, 5u, 7u, 8u,
43664
  }, {
43665
    4294967293u, 4294967291u, 4294967289u, 4294967287u, 2u, 4u, 6u, 8u,
43666
  },
43667
};
43668
43669
static const uint8_t
43670
WUFFS_ETC2__CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
43671
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
43672
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
43673
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
43674
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
43675
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
43676
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
43677
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
43678
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
43679
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
43680
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
43681
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
43682
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
43683
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
43684
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
43685
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
43686
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
43687
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
43688
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
43689
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
43690
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
43691
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
43692
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
43693
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
43694
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
43695
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
43696
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
43697
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
43698
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
43699
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
43700
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
43701
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
43702
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
43703
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43704
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43705
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43706
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43707
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43708
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43709
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43710
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43711
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43712
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43713
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43714
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43715
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43716
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43717
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43718
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43719
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43720
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43721
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43722
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43723
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43724
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43725
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43726
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43727
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43728
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43729
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43730
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43731
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43732
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43733
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43734
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
43735
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43736
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43737
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43738
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43739
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43740
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43741
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43742
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43743
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43744
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43745
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43746
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43747
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43748
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43749
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43750
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43751
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43752
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43753
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43754
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43755
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43756
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43757
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43758
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43759
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43760
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43761
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43762
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43763
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43764
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43765
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43766
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43767
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43768
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43769
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43770
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43771
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43772
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43773
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43774
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43775
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43776
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43777
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43778
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43779
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43780
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43781
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43782
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43783
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43784
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43785
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43786
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43787
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43788
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43789
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43790
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43791
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43792
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43793
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43794
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43795
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43796
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43797
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43798
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
43799
};
43800
43801
// ---------------- Private Initializer Prototypes
43802
43803
// ---------------- Private Function Prototypes
43804
43805
WUFFS_BASE__GENERATED_C_CODE
43806
static wuffs_base__status
43807
wuffs_etc2__decoder__do_decode_image_config(
43808
    wuffs_etc2__decoder* self,
43809
    wuffs_base__image_config* a_dst,
43810
    wuffs_base__io_buffer* a_src);
43811
43812
WUFFS_BASE__GENERATED_C_CODE
43813
static wuffs_base__status
43814
wuffs_etc2__decoder__do_decode_frame_config(
43815
    wuffs_etc2__decoder* self,
43816
    wuffs_base__frame_config* a_dst,
43817
    wuffs_base__io_buffer* a_src);
43818
43819
WUFFS_BASE__GENERATED_C_CODE
43820
static wuffs_base__status
43821
wuffs_etc2__decoder__do_decode_frame(
43822
    wuffs_etc2__decoder* self,
43823
    wuffs_base__pixel_buffer* a_dst,
43824
    wuffs_base__io_buffer* a_src,
43825
    wuffs_base__pixel_blend a_blend,
43826
    wuffs_base__slice_u8 a_workbuf,
43827
    wuffs_base__decode_frame_options* a_opts);
43828
43829
WUFFS_BASE__GENERATED_C_CODE
43830
static wuffs_base__status
43831
wuffs_etc2__decoder__from_src_to_colors(
43832
    wuffs_etc2__decoder* self,
43833
    wuffs_base__io_buffer* a_src);
43834
43835
WUFFS_BASE__GENERATED_C_CODE
43836
static wuffs_base__empty_struct
43837
wuffs_etc2__decoder__from_colors_to_buffer(
43838
    wuffs_etc2__decoder* self);
43839
43840
WUFFS_BASE__GENERATED_C_CODE
43841
static wuffs_base__empty_struct
43842
wuffs_etc2__decoder__from_colors_to_buffer__choosy_default(
43843
    wuffs_etc2__decoder* self);
43844
43845
WUFFS_BASE__GENERATED_C_CODE
43846
static wuffs_base__empty_struct
43847
wuffs_etc2__decoder__decode_t_mode(
43848
    wuffs_etc2__decoder* self,
43849
    uint64_t a_bits,
43850
    uint32_t a_offset,
43851
    bool a_transparent);
43852
43853
WUFFS_BASE__GENERATED_C_CODE
43854
static wuffs_base__empty_struct
43855
wuffs_etc2__decoder__decode_h_mode(
43856
    wuffs_etc2__decoder* self,
43857
    uint64_t a_bits,
43858
    uint32_t a_offset,
43859
    bool a_transparent);
43860
43861
WUFFS_BASE__GENERATED_C_CODE
43862
static wuffs_base__empty_struct
43863
wuffs_etc2__decoder__decode_planar_mode(
43864
    wuffs_etc2__decoder* self,
43865
    uint64_t a_bits,
43866
    uint32_t a_offset);
43867
43868
WUFFS_BASE__GENERATED_C_CODE
43869
static wuffs_base__empty_struct
43870
wuffs_etc2__decoder__decode_half_block(
43871
    wuffs_etc2__decoder* self,
43872
    uint32_t a_bits,
43873
    uint32_t a_offset,
43874
    uint32_t a_which,
43875
    uint32_t a_r,
43876
    uint32_t a_g,
43877
    uint32_t a_b,
43878
    bool a_flip,
43879
    bool a_transparent,
43880
    bool a_second);
43881
43882
WUFFS_BASE__GENERATED_C_CODE
43883
static wuffs_base__empty_struct
43884
wuffs_etc2__decoder__from_alphas_to_buffer(
43885
    wuffs_etc2__decoder* self);
43886
43887
WUFFS_BASE__GENERATED_C_CODE
43888
static wuffs_base__empty_struct
43889
wuffs_etc2__decoder__from_colors_to_buffer_r11u(
43890
    wuffs_etc2__decoder* self);
43891
43892
WUFFS_BASE__GENERATED_C_CODE
43893
static wuffs_base__empty_struct
43894
wuffs_etc2__decoder__from_colors_to_buffer_r11s(
43895
    wuffs_etc2__decoder* self);
43896
43897
WUFFS_BASE__GENERATED_C_CODE
43898
static wuffs_base__empty_struct
43899
wuffs_etc2__decoder__from_colors_to_buffer_rg11u(
43900
    wuffs_etc2__decoder* self);
43901
43902
WUFFS_BASE__GENERATED_C_CODE
43903
static wuffs_base__empty_struct
43904
wuffs_etc2__decoder__from_colors_to_buffer_rg11s(
43905
    wuffs_etc2__decoder* self);
43906
43907
WUFFS_BASE__GENERATED_C_CODE
43908
static wuffs_base__empty_struct
43909
wuffs_etc2__decoder__from_colors_to_buffer_unsigned(
43910
    wuffs_etc2__decoder* self,
43911
    uint32_t a_input,
43912
    uint32_t a_dst_bytes_per_pixel,
43913
    uint32_t a_offset_adjustment);
43914
43915
WUFFS_BASE__GENERATED_C_CODE
43916
static wuffs_base__empty_struct
43917
wuffs_etc2__decoder__from_colors_to_buffer_signed(
43918
    wuffs_etc2__decoder* self,
43919
    uint32_t a_input,
43920
    uint32_t a_dst_bytes_per_pixel,
43921
    uint32_t a_offset_adjustment);
43922
43923
WUFFS_BASE__GENERATED_C_CODE
43924
static wuffs_base__status
43925
wuffs_etc2__decoder__from_buffer_to_dst(
43926
    wuffs_etc2__decoder* self,
43927
    wuffs_base__pixel_buffer* a_dst);
43928
43929
// ---------------- VTables
43930
43931
const wuffs_base__image_decoder__func_ptrs
43932
wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder = {
43933
  (wuffs_base__status(*)(void*,
43934
      wuffs_base__pixel_buffer*,
43935
      wuffs_base__io_buffer*,
43936
      wuffs_base__pixel_blend,
43937
      wuffs_base__slice_u8,
43938
      wuffs_base__decode_frame_options*))(&wuffs_etc2__decoder__decode_frame),
43939
  (wuffs_base__status(*)(void*,
43940
      wuffs_base__frame_config*,
43941
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_frame_config),
43942
  (wuffs_base__status(*)(void*,
43943
      wuffs_base__image_config*,
43944
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__decode_image_config),
43945
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_etc2__decoder__frame_dirty_rect),
43946
  (uint64_t(*)(const void*,
43947
      uint32_t))(&wuffs_etc2__decoder__get_quirk),
43948
  (uint32_t(*)(const void*))(&wuffs_etc2__decoder__num_animation_loops),
43949
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frame_configs),
43950
  (uint64_t(*)(const void*))(&wuffs_etc2__decoder__num_decoded_frames),
43951
  (wuffs_base__status(*)(void*,
43952
      uint64_t,
43953
      uint64_t))(&wuffs_etc2__decoder__restart_frame),
43954
  (wuffs_base__status(*)(void*,
43955
      uint32_t,
43956
      uint64_t))(&wuffs_etc2__decoder__set_quirk),
43957
  (wuffs_base__empty_struct(*)(void*,
43958
      uint32_t,
43959
      bool))(&wuffs_etc2__decoder__set_report_metadata),
43960
  (wuffs_base__status(*)(void*,
43961
      wuffs_base__io_buffer*,
43962
      wuffs_base__more_information*,
43963
      wuffs_base__io_buffer*))(&wuffs_etc2__decoder__tell_me_more),
43964
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_etc2__decoder__workbuf_len),
43965
};
43966
43967
// ---------------- Initializer Implementations
43968
43969
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
43970
wuffs_etc2__decoder__initialize(
43971
    wuffs_etc2__decoder* self,
43972
    size_t sizeof_star_self,
43973
    uint64_t wuffs_version,
43974
    uint32_t options){
43975
  if (!self) {
43976
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
43977
  }
43978
  if (sizeof(*self) != sizeof_star_self) {
43979
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
43980
  }
43981
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
43982
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
43983
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
43984
  }
43985
43986
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
43987
    // The whole point of this if-check is to detect an uninitialized *self.
43988
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
43989
#if !defined(__clang__) && defined(__GNUC__)
43990
#pragma GCC diagnostic push
43991
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
43992
#endif
43993
    if (self->private_impl.magic != 0) {
43994
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
43995
    }
43996
#if !defined(__clang__) && defined(__GNUC__)
43997
#pragma GCC diagnostic pop
43998
#endif
43999
  } else {
44000
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
44001
      memset(self, 0, sizeof(*self));
44002
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
44003
    } else {
44004
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
44005
    }
44006
  }
44007
44008
  self->private_impl.choosy_from_colors_to_buffer = &wuffs_etc2__decoder__from_colors_to_buffer__choosy_default;
44009
44010
  self->private_impl.magic = WUFFS_BASE__MAGIC;
44011
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
44012
      wuffs_base__image_decoder__vtable_name;
44013
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
44014
      (const void*)(&wuffs_etc2__decoder__func_ptrs_for__wuffs_base__image_decoder);
44015
  return wuffs_base__make_status(NULL);
44016
}
44017
44018
wuffs_etc2__decoder*
44019
wuffs_etc2__decoder__alloc(void) {
44020
  wuffs_etc2__decoder* x =
44021
      (wuffs_etc2__decoder*)(calloc(1, sizeof(wuffs_etc2__decoder)));
44022
  if (!x) {
44023
    return NULL;
44024
  }
44025
  if (wuffs_etc2__decoder__initialize(
44026
      x, sizeof(wuffs_etc2__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
44027
    free(x);
44028
    return NULL;
44029
  }
44030
  return x;
44031
}
44032
44033
size_t
44034
sizeof__wuffs_etc2__decoder(void) {
44035
  return sizeof(wuffs_etc2__decoder);
44036
}
44037
44038
// ---------------- Function Implementations
44039
44040
// -------- func etc2.decoder.get_quirk
44041
44042
WUFFS_BASE__GENERATED_C_CODE
44043
WUFFS_BASE__MAYBE_STATIC uint64_t
44044
wuffs_etc2__decoder__get_quirk(
44045
    const wuffs_etc2__decoder* self,
44046
    uint32_t a_key) {
44047
  if (!self) {
44048
    return 0;
44049
  }
44050
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
44051
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
44052
    return 0;
44053
  }
44054
44055
  return 0u;
44056
}
44057
44058
// -------- func etc2.decoder.set_quirk
44059
44060
WUFFS_BASE__GENERATED_C_CODE
44061
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44062
wuffs_etc2__decoder__set_quirk(
44063
    wuffs_etc2__decoder* self,
44064
    uint32_t a_key,
44065
    uint64_t a_value) {
44066
  if (!self) {
44067
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44068
  }
44069
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44070
    return wuffs_base__make_status(
44071
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44072
        ? wuffs_base__error__disabled_by_previous_error
44073
        : wuffs_base__error__initialize_not_called);
44074
  }
44075
44076
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
44077
}
44078
44079
// -------- func etc2.decoder.decode_image_config
44080
44081
WUFFS_BASE__GENERATED_C_CODE
44082
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44083
wuffs_etc2__decoder__decode_image_config(
44084
    wuffs_etc2__decoder* self,
44085
    wuffs_base__image_config* a_dst,
44086
    wuffs_base__io_buffer* a_src) {
44087
  if (!self) {
44088
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44089
  }
44090
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44091
    return wuffs_base__make_status(
44092
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44093
        ? wuffs_base__error__disabled_by_previous_error
44094
        : wuffs_base__error__initialize_not_called);
44095
  }
44096
  if (!a_src) {
44097
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44098
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44099
  }
44100
  if ((self->private_impl.active_coroutine != 0) &&
44101
      (self->private_impl.active_coroutine != 1)) {
44102
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44103
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
44104
  }
44105
  self->private_impl.active_coroutine = 0;
44106
  wuffs_base__status status = wuffs_base__make_status(NULL);
44107
44108
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
44109
44110
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
44111
  switch (coro_susp_point) {
44112
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44113
44114
    while (true) {
44115
      {
44116
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_image_config(self, a_dst, a_src);
44117
        v_status = t_0;
44118
      }
44119
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
44120
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
44121
        goto exit;
44122
      }
44123
      status = v_status;
44124
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
44125
    }
44126
44127
    ok:
44128
    self->private_impl.p_decode_image_config = 0;
44129
    goto exit;
44130
  }
44131
44132
  goto suspend;
44133
  suspend:
44134
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44135
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
44136
44137
  goto exit;
44138
  exit:
44139
  if (wuffs_base__status__is_error(&status)) {
44140
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44141
  }
44142
  return status;
44143
}
44144
44145
// -------- func etc2.decoder.do_decode_image_config
44146
44147
WUFFS_BASE__GENERATED_C_CODE
44148
static wuffs_base__status
44149
wuffs_etc2__decoder__do_decode_image_config(
44150
    wuffs_etc2__decoder* self,
44151
    wuffs_base__image_config* a_dst,
44152
    wuffs_base__io_buffer* a_src) {
44153
  wuffs_base__status status = wuffs_base__make_status(NULL);
44154
44155
  uint32_t v_c32 = 0;
44156
  uint32_t v_i = 0;
44157
  uint16_t v_rounded_up_width = 0;
44158
  uint16_t v_rounded_up_height = 0;
44159
44160
  const uint8_t* iop_a_src = NULL;
44161
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44162
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44163
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44164
  if (a_src && a_src->data.ptr) {
44165
    io0_a_src = a_src->data.ptr;
44166
    io1_a_src = io0_a_src + a_src->meta.ri;
44167
    iop_a_src = io1_a_src;
44168
    io2_a_src = io0_a_src + a_src->meta.wi;
44169
  }
44170
44171
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
44172
  if (coro_susp_point) {
44173
    v_rounded_up_width = self->private_data.s_do_decode_image_config.v_rounded_up_width;
44174
    v_rounded_up_height = self->private_data.s_do_decode_image_config.v_rounded_up_height;
44175
  }
44176
  switch (coro_susp_point) {
44177
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44178
44179
    if (self->private_impl.f_call_sequence != 0u) {
44180
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
44181
      goto exit;
44182
    }
44183
    {
44184
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
44185
      uint32_t t_0;
44186
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
44187
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
44188
        iop_a_src += 4;
44189
      } else {
44190
        self->private_data.s_do_decode_image_config.scratch = 0;
44191
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
44192
        while (true) {
44193
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44194
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44195
            goto suspend;
44196
          }
44197
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44198
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
44199
          *scratch <<= 8;
44200
          *scratch >>= 8;
44201
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
44202
          if (num_bits_0 == 24) {
44203
            t_0 = ((uint32_t)(*scratch));
44204
            break;
44205
          }
44206
          num_bits_0 += 8u;
44207
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
44208
        }
44209
      }
44210
      v_c32 = t_0;
44211
    }
44212
    if (v_c32 != 541936464u) {
44213
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
44214
      goto exit;
44215
    }
44216
    {
44217
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
44218
      uint32_t t_1;
44219
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
44220
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
44221
        iop_a_src += 4;
44222
      } else {
44223
        self->private_data.s_do_decode_image_config.scratch = 0;
44224
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
44225
        while (true) {
44226
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44227
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44228
            goto suspend;
44229
          }
44230
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44231
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
44232
          *scratch <<= 8;
44233
          *scratch >>= 8;
44234
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
44235
          if (num_bits_1 == 24) {
44236
            t_1 = ((uint32_t)(*scratch));
44237
            break;
44238
          }
44239
          num_bits_1 += 8u;
44240
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
44241
        }
44242
      }
44243
      v_c32 = t_1;
44244
    }
44245
    if ((v_c32 == 12337u) || (v_c32 == 16789554u) || (v_c32 == 151007282u)) {
44246
      self->private_impl.f_pixfmt = 2415954056u;
44247
    } else if ((v_c32 == 50343986u) || (v_c32 == 167784498u)) {
44248
      self->private_impl.f_pixfmt = 2164295816u;
44249
    } else if ((v_c32 == 67121202u) || (v_c32 == 184561714u)) {
44250
      self->private_impl.f_pixfmt = 2197850248u;
44251
    } else if (v_c32 == 83898418u) {
44252
      self->private_impl.f_pixfmt = 536870923u;
44253
      self->private_impl.choosy_from_colors_to_buffer = (
44254
          &wuffs_etc2__decoder__from_colors_to_buffer_r11u);
44255
    } else if (v_c32 == 100675634u) {
44256
      self->private_impl.f_pixfmt = 2164308923u;
44257
      self->private_impl.choosy_from_colors_to_buffer = (
44258
          &wuffs_etc2__decoder__from_colors_to_buffer_rg11u);
44259
    } else if (v_c32 == 117452850u) {
44260
      self->private_impl.f_pixfmt = 536870923u;
44261
      self->private_impl.choosy_from_colors_to_buffer = (
44262
          &wuffs_etc2__decoder__from_colors_to_buffer_r11s);
44263
    } else if (v_c32 == 134230066u) {
44264
      self->private_impl.f_pixfmt = 2164308923u;
44265
      self->private_impl.choosy_from_colors_to_buffer = (
44266
          &wuffs_etc2__decoder__from_colors_to_buffer_rg11s);
44267
    } else {
44268
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
44269
      goto exit;
44270
    }
44271
    self->private_impl.f_srgb = ((v_c32 >> 24u) >= 9u);
44272
    if (self->private_impl.f_pixfmt == 2164308923u) {
44273
      v_i = 0u;
44274
      while (v_i <= 4088u) {
44275
        self->private_data.f_buffer[(v_i + 0u)] = 0u;
44276
        self->private_data.f_buffer[(v_i + 1u)] = 0u;
44277
        self->private_data.f_buffer[(v_i + 6u)] = 255u;
44278
        self->private_data.f_buffer[(v_i + 7u)] = 255u;
44279
        v_i += 8u;
44280
      }
44281
    }
44282
    {
44283
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
44284
      uint16_t t_2;
44285
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
44286
        t_2 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
44287
        iop_a_src += 2;
44288
      } else {
44289
        self->private_data.s_do_decode_image_config.scratch = 0;
44290
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
44291
        while (true) {
44292
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44293
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44294
            goto suspend;
44295
          }
44296
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44297
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
44298
          *scratch >>= 8;
44299
          *scratch <<= 8;
44300
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
44301
          if (num_bits_2 == 8) {
44302
            t_2 = ((uint16_t)(*scratch >> 48));
44303
            break;
44304
          }
44305
          num_bits_2 += 8u;
44306
          *scratch |= ((uint64_t)(num_bits_2));
44307
        }
44308
      }
44309
      v_rounded_up_width = t_2;
44310
    }
44311
    {
44312
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
44313
      uint16_t t_3;
44314
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
44315
        t_3 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
44316
        iop_a_src += 2;
44317
      } else {
44318
        self->private_data.s_do_decode_image_config.scratch = 0;
44319
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
44320
        while (true) {
44321
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44322
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44323
            goto suspend;
44324
          }
44325
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44326
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
44327
          *scratch >>= 8;
44328
          *scratch <<= 8;
44329
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
44330
          if (num_bits_3 == 8) {
44331
            t_3 = ((uint16_t)(*scratch >> 48));
44332
            break;
44333
          }
44334
          num_bits_3 += 8u;
44335
          *scratch |= ((uint64_t)(num_bits_3));
44336
        }
44337
      }
44338
      v_rounded_up_height = t_3;
44339
    }
44340
    {
44341
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
44342
      uint32_t t_4;
44343
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
44344
        t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
44345
        iop_a_src += 2;
44346
      } else {
44347
        self->private_data.s_do_decode_image_config.scratch = 0;
44348
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
44349
        while (true) {
44350
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44351
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44352
            goto suspend;
44353
          }
44354
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44355
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
44356
          *scratch >>= 8;
44357
          *scratch <<= 8;
44358
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
44359
          if (num_bits_4 == 8) {
44360
            t_4 = ((uint32_t)(*scratch >> 48));
44361
            break;
44362
          }
44363
          num_bits_4 += 8u;
44364
          *scratch |= ((uint64_t)(num_bits_4));
44365
        }
44366
      }
44367
      v_c32 = t_4;
44368
    }
44369
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_width))) {
44370
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
44371
      goto exit;
44372
    }
44373
    self->private_impl.f_width = v_c32;
44374
    {
44375
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
44376
      uint32_t t_5;
44377
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
44378
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
44379
        iop_a_src += 2;
44380
      } else {
44381
        self->private_data.s_do_decode_image_config.scratch = 0;
44382
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
44383
        while (true) {
44384
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44385
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44386
            goto suspend;
44387
          }
44388
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
44389
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
44390
          *scratch >>= 8;
44391
          *scratch <<= 8;
44392
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
44393
          if (num_bits_5 == 8) {
44394
            t_5 = ((uint32_t)(*scratch >> 48));
44395
            break;
44396
          }
44397
          num_bits_5 += 8u;
44398
          *scratch |= ((uint64_t)(num_bits_5));
44399
        }
44400
      }
44401
      v_c32 = t_5;
44402
    }
44403
    if (((v_c32 + 3u) & 4294967292u) != ((uint32_t)(v_rounded_up_height))) {
44404
      status = wuffs_base__make_status(wuffs_etc2__error__bad_header);
44405
      goto exit;
44406
    }
44407
    self->private_impl.f_height = v_c32;
44408
    if (a_dst != NULL) {
44409
      wuffs_base__image_config__set(
44410
          a_dst,
44411
          self->private_impl.f_pixfmt,
44412
          0u,
44413
          self->private_impl.f_width,
44414
          self->private_impl.f_height,
44415
          16u,
44416
          (self->private_impl.f_pixfmt == 2415954056u));
44417
    }
44418
    self->private_impl.f_call_sequence = 32u;
44419
44420
    goto ok;
44421
    ok:
44422
    self->private_impl.p_do_decode_image_config = 0;
44423
    goto exit;
44424
  }
44425
44426
  goto suspend;
44427
  suspend:
44428
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44429
  self->private_data.s_do_decode_image_config.v_rounded_up_width = v_rounded_up_width;
44430
  self->private_data.s_do_decode_image_config.v_rounded_up_height = v_rounded_up_height;
44431
44432
  goto exit;
44433
  exit:
44434
  if (a_src && a_src->data.ptr) {
44435
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44436
  }
44437
44438
  return status;
44439
}
44440
44441
// -------- func etc2.decoder.decode_frame_config
44442
44443
WUFFS_BASE__GENERATED_C_CODE
44444
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44445
wuffs_etc2__decoder__decode_frame_config(
44446
    wuffs_etc2__decoder* self,
44447
    wuffs_base__frame_config* a_dst,
44448
    wuffs_base__io_buffer* a_src) {
44449
  if (!self) {
44450
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44451
  }
44452
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44453
    return wuffs_base__make_status(
44454
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44455
        ? wuffs_base__error__disabled_by_previous_error
44456
        : wuffs_base__error__initialize_not_called);
44457
  }
44458
  if (!a_src) {
44459
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44460
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44461
  }
44462
  if ((self->private_impl.active_coroutine != 0) &&
44463
      (self->private_impl.active_coroutine != 2)) {
44464
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44465
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
44466
  }
44467
  self->private_impl.active_coroutine = 0;
44468
  wuffs_base__status status = wuffs_base__make_status(NULL);
44469
44470
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
44471
44472
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
44473
  switch (coro_susp_point) {
44474
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44475
44476
    while (true) {
44477
      {
44478
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame_config(self, a_dst, a_src);
44479
        v_status = t_0;
44480
      }
44481
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
44482
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
44483
        goto exit;
44484
      }
44485
      status = v_status;
44486
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
44487
    }
44488
44489
    ok:
44490
    self->private_impl.p_decode_frame_config = 0;
44491
    goto exit;
44492
  }
44493
44494
  goto suspend;
44495
  suspend:
44496
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44497
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
44498
44499
  goto exit;
44500
  exit:
44501
  if (wuffs_base__status__is_error(&status)) {
44502
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44503
  }
44504
  return status;
44505
}
44506
44507
// -------- func etc2.decoder.do_decode_frame_config
44508
44509
WUFFS_BASE__GENERATED_C_CODE
44510
static wuffs_base__status
44511
wuffs_etc2__decoder__do_decode_frame_config(
44512
    wuffs_etc2__decoder* self,
44513
    wuffs_base__frame_config* a_dst,
44514
    wuffs_base__io_buffer* a_src) {
44515
  wuffs_base__status status = wuffs_base__make_status(NULL);
44516
44517
  wuffs_base__pixel_format v_pixfmt = {0};
44518
44519
  const uint8_t* iop_a_src = NULL;
44520
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44521
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44522
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44523
  if (a_src && a_src->data.ptr) {
44524
    io0_a_src = a_src->data.ptr;
44525
    io1_a_src = io0_a_src + a_src->meta.ri;
44526
    iop_a_src = io1_a_src;
44527
    io2_a_src = io0_a_src + a_src->meta.wi;
44528
  }
44529
44530
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
44531
  switch (coro_susp_point) {
44532
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44533
44534
    if (self->private_impl.f_call_sequence == 32u) {
44535
    } else if (self->private_impl.f_call_sequence < 32u) {
44536
      if (a_src) {
44537
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44538
      }
44539
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
44540
      status = wuffs_etc2__decoder__do_decode_image_config(self, NULL, a_src);
44541
      if (a_src) {
44542
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
44543
      }
44544
      if (status.repr) {
44545
        goto suspend;
44546
      }
44547
    } else if (self->private_impl.f_call_sequence == 40u) {
44548
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
44549
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
44550
        goto exit;
44551
      }
44552
    } else if (self->private_impl.f_call_sequence == 64u) {
44553
      self->private_impl.f_call_sequence = 96u;
44554
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
44555
      goto ok;
44556
    } else {
44557
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
44558
      goto ok;
44559
    }
44560
    if (a_dst != NULL) {
44561
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
44562
      wuffs_base__frame_config__set(
44563
          a_dst,
44564
          wuffs_base__utility__make_rect_ie_u32(
44565
          0u,
44566
          0u,
44567
          self->private_impl.f_width,
44568
          self->private_impl.f_height),
44569
          ((wuffs_base__flicks)(0u)),
44570
          0u,
44571
          16u,
44572
          0u,
44573
          (self->private_impl.f_pixfmt == 2415954056u),
44574
          false,
44575
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
44576
    }
44577
    self->private_impl.f_call_sequence = 64u;
44578
44579
    ok:
44580
    self->private_impl.p_do_decode_frame_config = 0;
44581
    goto exit;
44582
  }
44583
44584
  goto suspend;
44585
  suspend:
44586
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44587
44588
  goto exit;
44589
  exit:
44590
  if (a_src && a_src->data.ptr) {
44591
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44592
  }
44593
44594
  return status;
44595
}
44596
44597
// -------- func etc2.decoder.decode_frame
44598
44599
WUFFS_BASE__GENERATED_C_CODE
44600
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
44601
wuffs_etc2__decoder__decode_frame(
44602
    wuffs_etc2__decoder* self,
44603
    wuffs_base__pixel_buffer* a_dst,
44604
    wuffs_base__io_buffer* a_src,
44605
    wuffs_base__pixel_blend a_blend,
44606
    wuffs_base__slice_u8 a_workbuf,
44607
    wuffs_base__decode_frame_options* a_opts) {
44608
  if (!self) {
44609
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
44610
  }
44611
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
44612
    return wuffs_base__make_status(
44613
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
44614
        ? wuffs_base__error__disabled_by_previous_error
44615
        : wuffs_base__error__initialize_not_called);
44616
  }
44617
  if (!a_dst || !a_src) {
44618
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44619
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
44620
  }
44621
  if ((self->private_impl.active_coroutine != 0) &&
44622
      (self->private_impl.active_coroutine != 3)) {
44623
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44624
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
44625
  }
44626
  self->private_impl.active_coroutine = 0;
44627
  wuffs_base__status status = wuffs_base__make_status(NULL);
44628
44629
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
44630
44631
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
44632
  switch (coro_susp_point) {
44633
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44634
44635
    while (true) {
44636
      {
44637
        wuffs_base__status t_0 = wuffs_etc2__decoder__do_decode_frame(self,
44638
            a_dst,
44639
            a_src,
44640
            a_blend,
44641
            a_workbuf,
44642
            a_opts);
44643
        v_status = t_0;
44644
      }
44645
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
44646
        status = wuffs_base__make_status(wuffs_etc2__error__truncated_input);
44647
        goto exit;
44648
      }
44649
      status = v_status;
44650
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
44651
    }
44652
44653
    ok:
44654
    self->private_impl.p_decode_frame = 0;
44655
    goto exit;
44656
  }
44657
44658
  goto suspend;
44659
  suspend:
44660
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44661
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
44662
44663
  goto exit;
44664
  exit:
44665
  if (wuffs_base__status__is_error(&status)) {
44666
    self->private_impl.magic = WUFFS_BASE__DISABLED;
44667
  }
44668
  return status;
44669
}
44670
44671
// -------- func etc2.decoder.do_decode_frame
44672
44673
WUFFS_BASE__GENERATED_C_CODE
44674
static wuffs_base__status
44675
wuffs_etc2__decoder__do_decode_frame(
44676
    wuffs_etc2__decoder* self,
44677
    wuffs_base__pixel_buffer* a_dst,
44678
    wuffs_base__io_buffer* a_src,
44679
    wuffs_base__pixel_blend a_blend,
44680
    wuffs_base__slice_u8 a_workbuf,
44681
    wuffs_base__decode_frame_options* a_opts) {
44682
  wuffs_base__status status = wuffs_base__make_status(NULL);
44683
44684
  uint32_t v_remaining = 0;
44685
  uint32_t v_max_nbb = 0;
44686
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
44687
44688
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
44689
  if (coro_susp_point) {
44690
    v_remaining = self->private_data.s_do_decode_frame.v_remaining;
44691
  }
44692
  switch (coro_susp_point) {
44693
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44694
44695
    if (self->private_impl.f_call_sequence == 64u) {
44696
    } else if (self->private_impl.f_call_sequence < 64u) {
44697
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
44698
      status = wuffs_etc2__decoder__do_decode_frame_config(self, NULL, a_src);
44699
      if (status.repr) {
44700
        goto suspend;
44701
      }
44702
    } else {
44703
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
44704
      goto ok;
44705
    }
44706
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
44707
        wuffs_base__pixel_buffer__pixel_format(a_dst),
44708
        wuffs_base__pixel_buffer__palette(a_dst),
44709
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
44710
        wuffs_base__utility__empty_slice_u8(),
44711
        a_blend);
44712
    if ( ! wuffs_base__status__is_ok(&v_status)) {
44713
      status = v_status;
44714
      if (wuffs_base__status__is_error(&status)) {
44715
        goto exit;
44716
      } else if (wuffs_base__status__is_suspension(&status)) {
44717
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
44718
        goto exit;
44719
      }
44720
      goto ok;
44721
    }
44722
    self->private_impl.f_dst_x = 0u;
44723
    self->private_impl.f_dst_y = 0u;
44724
    v_remaining = (((self->private_impl.f_width + 3u) / 4u) * ((self->private_impl.f_height + 3u) / 4u));
44725
    while (v_remaining > 0u) {
44726
      v_max_nbb = 64u;
44727
      if ((self->private_impl.f_pixfmt == 536870923u) || (self->private_impl.f_pixfmt == 2164308923u)) {
44728
        v_max_nbb = 32u;
44729
      }
44730
      self->private_impl.f_num_buffered_blocks = wuffs_base__u32__min(v_remaining, v_max_nbb);
44731
      if (v_remaining < self->private_impl.f_num_buffered_blocks) {
44732
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
44733
        goto exit;
44734
      }
44735
      v_remaining -= self->private_impl.f_num_buffered_blocks;
44736
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
44737
      status = wuffs_etc2__decoder__from_src_to_colors(self, a_src);
44738
      if (status.repr) {
44739
        goto suspend;
44740
      }
44741
      wuffs_etc2__decoder__from_colors_to_buffer(self);
44742
      if (self->private_impl.f_pixfmt == 2164295816u) {
44743
        wuffs_etc2__decoder__from_alphas_to_buffer(self);
44744
      }
44745
      v_status = wuffs_etc2__decoder__from_buffer_to_dst(self, a_dst);
44746
      if ( ! wuffs_base__status__is_ok(&v_status)) {
44747
        status = v_status;
44748
        if (wuffs_base__status__is_error(&status)) {
44749
          goto exit;
44750
        } else if (wuffs_base__status__is_suspension(&status)) {
44751
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
44752
          goto exit;
44753
        }
44754
        goto ok;
44755
      }
44756
    }
44757
    self->private_impl.f_call_sequence = 96u;
44758
44759
    ok:
44760
    self->private_impl.p_do_decode_frame = 0;
44761
    goto exit;
44762
  }
44763
44764
  goto suspend;
44765
  suspend:
44766
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44767
  self->private_data.s_do_decode_frame.v_remaining = v_remaining;
44768
44769
  goto exit;
44770
  exit:
44771
  return status;
44772
}
44773
44774
// -------- func etc2.decoder.from_src_to_colors
44775
44776
WUFFS_BASE__GENERATED_C_CODE
44777
static wuffs_base__status
44778
wuffs_etc2__decoder__from_src_to_colors(
44779
    wuffs_etc2__decoder* self,
44780
    wuffs_base__io_buffer* a_src) {
44781
  wuffs_base__status status = wuffs_base__make_status(NULL);
44782
44783
  uint32_t v_bi = 0;
44784
44785
  const uint8_t* iop_a_src = NULL;
44786
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44787
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44788
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
44789
  if (a_src && a_src->data.ptr) {
44790
    io0_a_src = a_src->data.ptr;
44791
    io1_a_src = io0_a_src + a_src->meta.ri;
44792
    iop_a_src = io1_a_src;
44793
    io2_a_src = io0_a_src + a_src->meta.wi;
44794
  }
44795
44796
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_colors;
44797
  if (coro_susp_point) {
44798
    v_bi = self->private_data.s_from_src_to_colors.v_bi;
44799
  }
44800
  switch (coro_susp_point) {
44801
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
44802
44803
    while (v_bi < self->private_impl.f_num_buffered_blocks) {
44804
      if ((self->private_impl.f_pixfmt == 2164295816u) || (self->private_impl.f_pixfmt == 2164308923u)) {
44805
        {
44806
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
44807
          uint64_t t_0;
44808
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
44809
            t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
44810
            iop_a_src += 8;
44811
          } else {
44812
            self->private_data.s_from_src_to_colors.scratch = 0;
44813
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
44814
            while (true) {
44815
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44816
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44817
                goto suspend;
44818
              }
44819
              uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
44820
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
44821
              *scratch >>= 8;
44822
              *scratch <<= 8;
44823
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
44824
              if (num_bits_0 == 56) {
44825
                t_0 = ((uint64_t)(*scratch >> 0));
44826
                break;
44827
              }
44828
              num_bits_0 += 8u;
44829
              *scratch |= ((uint64_t)(num_bits_0));
44830
            }
44831
          }
44832
          self->private_data.f_colors[0u][v_bi] = t_0;
44833
        }
44834
      }
44835
      {
44836
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
44837
        uint64_t t_1;
44838
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
44839
          t_1 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
44840
          iop_a_src += 8;
44841
        } else {
44842
          self->private_data.s_from_src_to_colors.scratch = 0;
44843
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
44844
          while (true) {
44845
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
44846
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
44847
              goto suspend;
44848
            }
44849
            uint64_t* scratch = &self->private_data.s_from_src_to_colors.scratch;
44850
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
44851
            *scratch >>= 8;
44852
            *scratch <<= 8;
44853
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
44854
            if (num_bits_1 == 56) {
44855
              t_1 = ((uint64_t)(*scratch >> 0));
44856
              break;
44857
            }
44858
            num_bits_1 += 8u;
44859
            *scratch |= ((uint64_t)(num_bits_1));
44860
          }
44861
        }
44862
        self->private_data.f_colors[1u][v_bi] = t_1;
44863
      }
44864
      v_bi += 1u;
44865
    }
44866
44867
    goto ok;
44868
    ok:
44869
    self->private_impl.p_from_src_to_colors = 0;
44870
    goto exit;
44871
  }
44872
44873
  goto suspend;
44874
  suspend:
44875
  self->private_impl.p_from_src_to_colors = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
44876
  self->private_data.s_from_src_to_colors.v_bi = v_bi;
44877
44878
  goto exit;
44879
  exit:
44880
  if (a_src && a_src->data.ptr) {
44881
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
44882
  }
44883
44884
  return status;
44885
}
44886
44887
// -------- func etc2.decoder.from_colors_to_buffer
44888
44889
WUFFS_BASE__GENERATED_C_CODE
44890
static wuffs_base__empty_struct
44891
wuffs_etc2__decoder__from_colors_to_buffer(
44892
    wuffs_etc2__decoder* self) {
44893
  return (*self->private_impl.choosy_from_colors_to_buffer)(self);
44894
}
44895
44896
WUFFS_BASE__GENERATED_C_CODE
44897
static wuffs_base__empty_struct
44898
wuffs_etc2__decoder__from_colors_to_buffer__choosy_default(
44899
    wuffs_etc2__decoder* self) {
44900
  uint32_t v_bi = 0;
44901
  uint64_t v_color = 0;
44902
  uint32_t v_r0 = 0;
44903
  uint32_t v_r1 = 0;
44904
  uint32_t v_g0 = 0;
44905
  uint32_t v_g1 = 0;
44906
  uint32_t v_b0 = 0;
44907
  uint32_t v_b1 = 0;
44908
  bool v_diff = false;
44909
  bool v_tran = false;
44910
  bool v_flip = false;
44911
44912
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
44913
    v_color = self->private_data.f_colors[1u][v_bi];
44914
    v_diff = ((v_color & 8589934592u) != 0u);
44915
    v_tran = ( ! v_diff && (self->private_impl.f_pixfmt == 2197850248u));
44916
    if ( ! v_diff && (self->private_impl.f_pixfmt != 2197850248u)) {
44917
      v_r0 = ((uint32_t)((15u & (v_color >> 60u))));
44918
      v_r0 = ((v_r0 << 4u) | v_r0);
44919
      v_r1 = ((uint32_t)((15u & (v_color >> 56u))));
44920
      v_r1 = ((v_r1 << 4u) | v_r1);
44921
      v_g0 = ((uint32_t)((15u & (v_color >> 52u))));
44922
      v_g0 = ((v_g0 << 4u) | v_g0);
44923
      v_g1 = ((uint32_t)((15u & (v_color >> 48u))));
44924
      v_g1 = ((v_g1 << 4u) | v_g1);
44925
      v_b0 = ((uint32_t)((15u & (v_color >> 44u))));
44926
      v_b0 = ((v_b0 << 4u) | v_b0);
44927
      v_b1 = ((uint32_t)((15u & (v_color >> 40u))));
44928
      v_b1 = ((v_b1 << 4u) | v_b1);
44929
    } else {
44930
      v_r0 = ((uint32_t)((31u & (v_color >> 59u))));
44931
      v_r1 = ((uint32_t)(v_r0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 56u))]));
44932
      if ((v_r1 >> 5u) != 0u) {
44933
        wuffs_etc2__decoder__decode_t_mode(self, v_color, (16u * v_bi), v_tran);
44934
        v_bi += 1u;
44935
        continue;
44936
      }
44937
      v_r0 = (((uint32_t)(v_r0 << 3u)) | (v_r0 >> 2u));
44938
      v_r1 = (((uint32_t)(v_r1 << 3u)) | (v_r1 >> 2u));
44939
      v_g0 = ((uint32_t)((31u & (v_color >> 51u))));
44940
      v_g1 = ((uint32_t)(v_g0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 48u))]));
44941
      if ((v_g1 >> 5u) != 0u) {
44942
        wuffs_etc2__decoder__decode_h_mode(self, v_color, (16u * v_bi), v_tran);
44943
        v_bi += 1u;
44944
        continue;
44945
      }
44946
      v_g0 = (((uint32_t)(v_g0 << 3u)) | (v_g0 >> 2u));
44947
      v_g1 = (((uint32_t)(v_g1 << 3u)) | (v_g1 >> 2u));
44948
      v_b0 = ((uint32_t)((31u & (v_color >> 43u))));
44949
      v_b1 = ((uint32_t)(v_b0 + WUFFS_ETC2__DIFFS[(7u & (v_color >> 40u))]));
44950
      if ((v_b1 >> 5u) != 0u) {
44951
        wuffs_etc2__decoder__decode_planar_mode(self, v_color, (16u * v_bi));
44952
        v_bi += 1u;
44953
        continue;
44954
      }
44955
      v_b0 = (((uint32_t)(v_b0 << 3u)) | (v_b0 >> 2u));
44956
      v_b1 = (((uint32_t)(v_b1 << 3u)) | (v_b1 >> 2u));
44957
    }
44958
    v_flip = ((v_color & 4294967296u) != 0u);
44959
    wuffs_etc2__decoder__decode_half_block(self,
44960
        ((uint32_t)(v_color)),
44961
        (16u * v_bi),
44962
        ((uint32_t)(((v_color >> 37u) & 7u))),
44963
        v_r0,
44964
        v_g0,
44965
        v_b0,
44966
        v_flip,
44967
        v_tran,
44968
        false);
44969
    wuffs_etc2__decoder__decode_half_block(self,
44970
        ((uint32_t)(v_color)),
44971
        (16u * v_bi),
44972
        ((uint32_t)(((v_color >> 34u) & 7u))),
44973
        v_r1,
44974
        v_g1,
44975
        v_b1,
44976
        v_flip,
44977
        v_tran,
44978
        true);
44979
    v_bi += 1u;
44980
  }
44981
  return wuffs_base__make_empty_struct();
44982
}
44983
44984
// -------- func etc2.decoder.decode_t_mode
44985
44986
WUFFS_BASE__GENERATED_C_CODE
44987
static wuffs_base__empty_struct
44988
wuffs_etc2__decoder__decode_t_mode(
44989
    wuffs_etc2__decoder* self,
44990
    uint64_t a_bits,
44991
    uint32_t a_offset,
44992
    bool a_transparent) {
44993
  uint8_t v_r[4] = {0};
44994
  uint8_t v_g[4] = {0};
44995
  uint8_t v_b[4] = {0};
44996
  uint8_t v_a[4] = {0};
44997
  uint32_t v_which = 0;
44998
  uint32_t v_delta = 0;
44999
  uint32_t v_y = 0;
45000
  uint32_t v_x = 0;
45001
  uint32_t v_x4y = 0;
45002
  uint32_t v_index = 0;
45003
  uint32_t v_o = 0;
45004
45005
  v_r[0u] = ((uint8_t)(((uint8_t)((12u & (a_bits >> 57u)))) | ((uint8_t)((3u & (a_bits >> 56u))))));
45006
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
45007
  v_g[0u] = ((uint8_t)((15u & (a_bits >> 52u))));
45008
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
45009
  v_b[0u] = ((uint8_t)((15u & (a_bits >> 48u))));
45010
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
45011
  v_a[0u] = 255u;
45012
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 44u))));
45013
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
45014
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 40u))));
45015
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
45016
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 36u))));
45017
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
45018
  v_a[2u] = 255u;
45019
  v_which = (((uint32_t)((6u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
45020
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
45021
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
45022
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
45023
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
45024
  v_a[1u] = 255u;
45025
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
45026
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
45027
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
45028
  v_a[3u] = 255u;
45029
  if (a_transparent) {
45030
    v_r[2u] = 0u;
45031
    v_g[2u] = 0u;
45032
    v_b[2u] = 0u;
45033
    v_a[2u] = 0u;
45034
  }
45035
  while (v_y < 4u) {
45036
    v_x = 0u;
45037
    while (v_x < 4u) {
45038
      v_x4y = ((v_x * 4u) | v_y);
45039
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
45040
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
45041
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
45042
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
45043
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
45044
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
45045
      v_x += 1u;
45046
    }
45047
    v_y += 1u;
45048
  }
45049
  return wuffs_base__make_empty_struct();
45050
}
45051
45052
// -------- func etc2.decoder.decode_h_mode
45053
45054
WUFFS_BASE__GENERATED_C_CODE
45055
static wuffs_base__empty_struct
45056
wuffs_etc2__decoder__decode_h_mode(
45057
    wuffs_etc2__decoder* self,
45058
    uint64_t a_bits,
45059
    uint32_t a_offset,
45060
    bool a_transparent) {
45061
  uint8_t v_r[4] = {0};
45062
  uint8_t v_g[4] = {0};
45063
  uint8_t v_b[4] = {0};
45064
  uint8_t v_a[4] = {0};
45065
  uint32_t v_rgb0 = 0;
45066
  uint32_t v_rgb2 = 0;
45067
  uint32_t v_which = 0;
45068
  uint32_t v_delta = 0;
45069
  uint32_t v_y = 0;
45070
  uint32_t v_x = 0;
45071
  uint32_t v_x4y = 0;
45072
  uint32_t v_index = 0;
45073
  uint32_t v_o = 0;
45074
45075
  v_r[0u] = ((uint8_t)((15u & (a_bits >> 59u))));
45076
  v_r[0u] = ((uint8_t)(((uint8_t)(v_r[0u] << 4u)) | v_r[0u]));
45077
  v_g[0u] = ((uint8_t)(((uint8_t)((14u & (a_bits >> 55u)))) | ((uint8_t)((1u & (a_bits >> 52u))))));
45078
  v_g[0u] = ((uint8_t)(((uint8_t)(v_g[0u] << 4u)) | v_g[0u]));
45079
  v_b[0u] = ((uint8_t)(((uint8_t)((8u & (a_bits >> 48u)))) | ((uint8_t)((7u & (a_bits >> 47u))))));
45080
  v_b[0u] = ((uint8_t)(((uint8_t)(v_b[0u] << 4u)) | v_b[0u]));
45081
  v_r[2u] = ((uint8_t)((15u & (a_bits >> 43u))));
45082
  v_r[2u] = ((uint8_t)(((uint8_t)(v_r[2u] << 4u)) | v_r[2u]));
45083
  v_g[2u] = ((uint8_t)((15u & (a_bits >> 39u))));
45084
  v_g[2u] = ((uint8_t)(((uint8_t)(v_g[2u] << 4u)) | v_g[2u]));
45085
  v_b[2u] = ((uint8_t)((15u & (a_bits >> 35u))));
45086
  v_b[2u] = ((uint8_t)(((uint8_t)(v_b[2u] << 4u)) | v_b[2u]));
45087
  v_rgb0 = ((((uint32_t)(v_r[0u])) << 16u) | (((uint32_t)(v_g[0u])) << 8u) | (((uint32_t)(v_b[0u])) << 0u));
45088
  v_rgb2 = ((((uint32_t)(v_r[2u])) << 16u) | (((uint32_t)(v_g[2u])) << 8u) | (((uint32_t)(v_b[2u])) << 0u));
45089
  v_which = (((uint32_t)((4u & (a_bits >> 32u)))) | ((uint32_t)((2u & (a_bits >> 31u)))));
45090
  if (v_rgb0 >= v_rgb2) {
45091
    v_which |= 1u;
45092
  }
45093
  v_delta = ((uint32_t)(WUFFS_ETC2__T_H_MODIFIERS[v_which]));
45094
  v_r[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) - v_delta)) & 1023u)];
45095
  v_g[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) - v_delta)) & 1023u)];
45096
  v_b[1u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) - v_delta)) & 1023u)];
45097
  v_a[1u] = 255u;
45098
  v_r[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[0u])) + v_delta)) & 1023u)];
45099
  v_g[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[0u])) + v_delta)) & 1023u)];
45100
  v_b[0u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[0u])) + v_delta)) & 1023u)];
45101
  v_a[0u] = 255u;
45102
  v_r[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) - v_delta)) & 1023u)];
45103
  v_g[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) - v_delta)) & 1023u)];
45104
  v_b[3u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) - v_delta)) & 1023u)];
45105
  v_a[3u] = 255u;
45106
  v_r[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_r[2u])) + v_delta)) & 1023u)];
45107
  v_g[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_g[2u])) + v_delta)) & 1023u)];
45108
  v_b[2u] = WUFFS_ETC2__CLAMP[(((uint32_t)(((uint32_t)(v_b[2u])) + v_delta)) & 1023u)];
45109
  v_a[2u] = 255u;
45110
  if (a_transparent) {
45111
    v_r[2u] = 0u;
45112
    v_g[2u] = 0u;
45113
    v_b[2u] = 0u;
45114
    v_a[2u] = 0u;
45115
  }
45116
  while (v_y < 4u) {
45117
    v_x = 0u;
45118
    while (v_x < 4u) {
45119
      v_x4y = ((v_x * 4u) | v_y);
45120
      v_index = (((uint32_t)(((a_bits >> v_x4y) & 1u))) | ((uint32_t)(((a_bits >> (v_x4y + 15u)) & 2u))));
45121
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
45122
      self->private_data.f_buffer[(v_o + 0u)] = v_b[v_index];
45123
      self->private_data.f_buffer[(v_o + 1u)] = v_g[v_index];
45124
      self->private_data.f_buffer[(v_o + 2u)] = v_r[v_index];
45125
      self->private_data.f_buffer[(v_o + 3u)] = v_a[v_index];
45126
      v_x += 1u;
45127
    }
45128
    v_y += 1u;
45129
  }
45130
  return wuffs_base__make_empty_struct();
45131
}
45132
45133
// -------- func etc2.decoder.decode_planar_mode
45134
45135
WUFFS_BASE__GENERATED_C_CODE
45136
static wuffs_base__empty_struct
45137
wuffs_etc2__decoder__decode_planar_mode(
45138
    wuffs_etc2__decoder* self,
45139
    uint64_t a_bits,
45140
    uint32_t a_offset) {
45141
  uint32_t v_ro = 0;
45142
  uint32_t v_go = 0;
45143
  uint32_t v_bo = 0;
45144
  uint32_t v_rh = 0;
45145
  uint32_t v_gh = 0;
45146
  uint32_t v_bh = 0;
45147
  uint32_t v_rv = 0;
45148
  uint32_t v_gv = 0;
45149
  uint32_t v_bv = 0;
45150
  uint32_t v_y = 0;
45151
  uint32_t v_x = 0;
45152
  uint32_t v_o = 0;
45153
  uint32_t v_rp = 0;
45154
  uint32_t v_gp = 0;
45155
  uint32_t v_bp = 0;
45156
45157
  v_ro = ((uint32_t)((63u & (a_bits >> 57u))));
45158
  v_ro = (((uint32_t)(v_ro << 2u)) | (v_ro >> 4u));
45159
  v_go = (((uint32_t)((64u & (a_bits >> 50u)))) | ((uint32_t)((63u & (a_bits >> 49u)))));
45160
  v_go = (((uint32_t)(v_go << 1u)) | (v_go >> 6u));
45161
  v_bo = (((uint32_t)((32u & (a_bits >> 43u)))) | ((uint32_t)((24u & (a_bits >> 40u)))) | ((uint32_t)((7u & (a_bits >> 39u)))));
45162
  v_bo = (((uint32_t)(v_bo << 2u)) | (v_bo >> 4u));
45163
  v_rh = (((uint32_t)((62u & (a_bits >> 33u)))) | ((uint32_t)((1u & (a_bits >> 32u)))));
45164
  v_rh = (((uint32_t)(v_rh << 2u)) | (v_rh >> 4u));
45165
  v_gh = ((uint32_t)((127u & (a_bits >> 25u))));
45166
  v_gh = (((uint32_t)(v_gh << 1u)) | (v_gh >> 6u));
45167
  v_bh = ((uint32_t)((63u & (a_bits >> 19u))));
45168
  v_bh = (((uint32_t)(v_bh << 2u)) | (v_bh >> 4u));
45169
  v_rv = ((uint32_t)((63u & (a_bits >> 13u))));
45170
  v_rv = (((uint32_t)(v_rv << 2u)) | (v_rv >> 4u));
45171
  v_gv = ((uint32_t)((127u & (a_bits >> 6u))));
45172
  v_gv = (((uint32_t)(v_gv << 1u)) | (v_gv >> 6u));
45173
  v_bv = ((uint32_t)((63u & (a_bits >> 0u))));
45174
  v_bv = (((uint32_t)(v_bv << 2u)) | (v_bv >> 4u));
45175
  v_rh -= v_ro;
45176
  v_gh -= v_go;
45177
  v_bh -= v_bo;
45178
  v_rv -= v_ro;
45179
  v_gv -= v_go;
45180
  v_bv -= v_bo;
45181
  v_ro *= 4u;
45182
  v_go *= 4u;
45183
  v_bo *= 4u;
45184
  while (v_y < 4u) {
45185
    v_x = 0u;
45186
    while (v_x < 4u) {
45187
      v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
45188
      v_bp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_bh)) + ((uint32_t)(v_y * v_bv)))) + v_bo));
45189
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_bp + 2u)) / 4u) & 1023u)];
45190
      v_gp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_gh)) + ((uint32_t)(v_y * v_gv)))) + v_go));
45191
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_gp + 2u)) / 4u) & 1023u)];
45192
      v_rp = ((uint32_t)(((uint32_t)(((uint32_t)(v_x * v_rh)) + ((uint32_t)(v_y * v_rv)))) + v_ro));
45193
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[((((uint32_t)(v_rp + 2u)) / 4u) & 1023u)];
45194
      v_x += 1u;
45195
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
45196
    }
45197
    v_y += 1u;
45198
  }
45199
  return wuffs_base__make_empty_struct();
45200
}
45201
45202
// -------- func etc2.decoder.decode_half_block
45203
45204
WUFFS_BASE__GENERATED_C_CODE
45205
static wuffs_base__empty_struct
45206
wuffs_etc2__decoder__decode_half_block(
45207
    wuffs_etc2__decoder* self,
45208
    uint32_t a_bits,
45209
    uint32_t a_offset,
45210
    uint32_t a_which,
45211
    uint32_t a_r,
45212
    uint32_t a_g,
45213
    uint32_t a_b,
45214
    bool a_flip,
45215
    bool a_transparent,
45216
    bool a_second) {
45217
  uint32_t v_which = 0;
45218
  uint32_t v_x0 = 0;
45219
  uint32_t v_y0 = 0;
45220
  uint32_t v_x = 0;
45221
  uint32_t v_y = 0;
45222
  uint32_t v_i = 0;
45223
  uint32_t v_x4y = 0;
45224
  uint32_t v_index = 0;
45225
  uint32_t v_modif = 0;
45226
  uint32_t v_o = 0;
45227
45228
  v_which = a_which;
45229
  if (a_transparent) {
45230
    v_which |= 8u;
45231
  }
45232
  if ( ! a_second) {
45233
  } else if (a_flip) {
45234
    v_y0 = 2u;
45235
  } else {
45236
    v_x0 = 2u;
45237
  }
45238
  while (v_i < 8u) {
45239
    if (a_flip) {
45240
      v_x = ((v_x0 + (v_i / 2u)) & 3u);
45241
      v_y = (v_y0 + (v_i & 1u));
45242
    } else {
45243
      v_x = (v_x0 + (v_i / 4u));
45244
      v_y = ((v_y0 + v_i) & 3u);
45245
    }
45246
    v_x4y = ((v_x * 4u) | v_y);
45247
    v_index = (((a_bits >> v_x4y) & 1u) | ((a_bits >> (v_x4y + 15u)) & 2u));
45248
    v_modif = WUFFS_ETC2__MODIFIERS[v_which][v_index];
45249
    v_o = (a_offset + (v_x * 4u) + (v_y * 1024u));
45250
    if (a_transparent && (v_index == 2u)) {
45251
      self->private_data.f_buffer[(v_o + 0u)] = 0u;
45252
      self->private_data.f_buffer[(v_o + 1u)] = 0u;
45253
      self->private_data.f_buffer[(v_o + 2u)] = 0u;
45254
      self->private_data.f_buffer[(v_o + 3u)] = 0u;
45255
    } else {
45256
      self->private_data.f_buffer[(v_o + 0u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_b + v_modif)) & 1023u)];
45257
      self->private_data.f_buffer[(v_o + 1u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_g + v_modif)) & 1023u)];
45258
      self->private_data.f_buffer[(v_o + 2u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(a_r + v_modif)) & 1023u)];
45259
      self->private_data.f_buffer[(v_o + 3u)] = 255u;
45260
    }
45261
    v_i += 1u;
45262
  }
45263
  return wuffs_base__make_empty_struct();
45264
}
45265
45266
// -------- func etc2.decoder.from_alphas_to_buffer
45267
45268
WUFFS_BASE__GENERATED_C_CODE
45269
static wuffs_base__empty_struct
45270
wuffs_etc2__decoder__from_alphas_to_buffer(
45271
    wuffs_etc2__decoder* self) {
45272
  uint32_t v_bi = 0;
45273
  uint64_t v_alpha = 0;
45274
  uint32_t v_a0 = 0;
45275
  uint32_t v_multiplier = 0;
45276
  uint32_t v_which = 0;
45277
  uint32_t v_offset = 0;
45278
  uint32_t v_y = 0;
45279
  uint32_t v_x = 0;
45280
  uint32_t v_shift = 0;
45281
  uint32_t v_delta = 0;
45282
  uint32_t v_o = 0;
45283
45284
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
45285
    v_alpha = self->private_data.f_colors[0u][v_bi];
45286
    v_a0 = ((uint32_t)((v_alpha >> 56u)));
45287
    v_multiplier = ((uint32_t)(((v_alpha >> 52u) & 15u)));
45288
    v_which = ((uint32_t)(((v_alpha >> 48u) & 15u)));
45289
    v_offset = (16u * v_bi);
45290
    v_y = 0u;
45291
    while (v_y < 4u) {
45292
      v_x = 0u;
45293
      while (v_x < 4u) {
45294
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
45295
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_alpha >> v_shift))]));
45296
        v_o = (v_offset + (v_x * 4u) + (v_y * 1024u));
45297
        self->private_data.f_buffer[(v_o + 3u)] = WUFFS_ETC2__CLAMP[(((uint32_t)(v_a0 + v_delta)) & 1023u)];
45298
        v_x += 1u;
45299
      }
45300
      v_y += 1u;
45301
    }
45302
    v_bi += 1u;
45303
  }
45304
  return wuffs_base__make_empty_struct();
45305
}
45306
45307
// -------- func etc2.decoder.from_colors_to_buffer_r11u
45308
45309
WUFFS_BASE__GENERATED_C_CODE
45310
static wuffs_base__empty_struct
45311
wuffs_etc2__decoder__from_colors_to_buffer_r11u(
45312
    wuffs_etc2__decoder* self) {
45313
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 1u, 2u, 0u);
45314
  return wuffs_base__make_empty_struct();
45315
}
45316
45317
// -------- func etc2.decoder.from_colors_to_buffer_r11s
45318
45319
WUFFS_BASE__GENERATED_C_CODE
45320
static wuffs_base__empty_struct
45321
wuffs_etc2__decoder__from_colors_to_buffer_r11s(
45322
    wuffs_etc2__decoder* self) {
45323
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 1u, 2u, 0u);
45324
  return wuffs_base__make_empty_struct();
45325
}
45326
45327
// -------- func etc2.decoder.from_colors_to_buffer_rg11u
45328
45329
WUFFS_BASE__GENERATED_C_CODE
45330
static wuffs_base__empty_struct
45331
wuffs_etc2__decoder__from_colors_to_buffer_rg11u(
45332
    wuffs_etc2__decoder* self) {
45333
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 0u, 8u, 4u);
45334
  wuffs_etc2__decoder__from_colors_to_buffer_unsigned(self, 1u, 8u, 2u);
45335
  return wuffs_base__make_empty_struct();
45336
}
45337
45338
// -------- func etc2.decoder.from_colors_to_buffer_rg11s
45339
45340
WUFFS_BASE__GENERATED_C_CODE
45341
static wuffs_base__empty_struct
45342
wuffs_etc2__decoder__from_colors_to_buffer_rg11s(
45343
    wuffs_etc2__decoder* self) {
45344
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 0u, 8u, 4u);
45345
  wuffs_etc2__decoder__from_colors_to_buffer_signed(self, 1u, 8u, 2u);
45346
  return wuffs_base__make_empty_struct();
45347
}
45348
45349
// -------- func etc2.decoder.from_colors_to_buffer_unsigned
45350
45351
WUFFS_BASE__GENERATED_C_CODE
45352
static wuffs_base__empty_struct
45353
wuffs_etc2__decoder__from_colors_to_buffer_unsigned(
45354
    wuffs_etc2__decoder* self,
45355
    uint32_t a_input,
45356
    uint32_t a_dst_bytes_per_pixel,
45357
    uint32_t a_offset_adjustment) {
45358
  uint32_t v_nbb = 0;
45359
  uint32_t v_bi = 0;
45360
  uint64_t v_color = 0;
45361
  uint32_t v_c0 = 0;
45362
  uint32_t v_multiplier = 0;
45363
  uint32_t v_which = 0;
45364
  uint32_t v_offset = 0;
45365
  uint32_t v_y = 0;
45366
  uint32_t v_x = 0;
45367
  uint32_t v_shift = 0;
45368
  uint32_t v_delta = 0;
45369
  uint32_t v_c11 = 0;
45370
  uint32_t v_c16 = 0;
45371
  uint32_t v_o = 0;
45372
45373
  v_nbb = wuffs_base__u32__min(self->private_impl.f_num_buffered_blocks, 32u);
45374
  while (v_bi < v_nbb) {
45375
    v_color = self->private_data.f_colors[a_input][v_bi];
45376
    v_c0 = ((((uint32_t)((v_color >> 56u))) * 8u) + 4u);
45377
    v_multiplier = ((uint32_t)(((v_color >> 52u) & 15u)));
45378
    v_multiplier *= 8u;
45379
    if (v_multiplier == 0u) {
45380
      v_multiplier = 1u;
45381
    }
45382
    v_which = ((uint32_t)(((v_color >> 48u) & 15u)));
45383
    v_offset = ((4u * a_dst_bytes_per_pixel * v_bi) + a_offset_adjustment);
45384
    v_y = 0u;
45385
    while (v_y < 4u) {
45386
      v_x = 0u;
45387
      while (v_x < 4u) {
45388
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
45389
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_color >> v_shift))]));
45390
        v_c11 = ((uint32_t)(v_c0 + v_delta));
45391
        if (v_c11 >= 2147483648u) {
45392
          v_c11 = 0u;
45393
        } else if (v_c11 > 2047u) {
45394
          v_c11 = 2047u;
45395
        }
45396
        v_c16 = ((v_c11 << 5u) | (v_c11 >> 6u));
45397
        v_o = (v_offset + (v_x * a_dst_bytes_per_pixel) + (v_y * 1024u));
45398
        self->private_data.f_buffer[(v_o + 0u)] = ((uint8_t)((v_c16 >> 0u)));
45399
        self->private_data.f_buffer[(v_o + 1u)] = ((uint8_t)((v_c16 >> 8u)));
45400
        v_x += 1u;
45401
      }
45402
      v_y += 1u;
45403
    }
45404
    v_bi += 1u;
45405
  }
45406
  return wuffs_base__make_empty_struct();
45407
}
45408
45409
// -------- func etc2.decoder.from_colors_to_buffer_signed
45410
45411
WUFFS_BASE__GENERATED_C_CODE
45412
static wuffs_base__empty_struct
45413
wuffs_etc2__decoder__from_colors_to_buffer_signed(
45414
    wuffs_etc2__decoder* self,
45415
    uint32_t a_input,
45416
    uint32_t a_dst_bytes_per_pixel,
45417
    uint32_t a_offset_adjustment) {
45418
  uint32_t v_nbb = 0;
45419
  uint32_t v_bi = 0;
45420
  uint64_t v_color = 0;
45421
  uint32_t v_c0 = 0;
45422
  uint32_t v_multiplier = 0;
45423
  uint32_t v_which = 0;
45424
  uint32_t v_offset = 0;
45425
  uint32_t v_y = 0;
45426
  uint32_t v_x = 0;
45427
  uint32_t v_shift = 0;
45428
  uint32_t v_delta = 0;
45429
  uint32_t v_c11 = 0;
45430
  uint32_t v_c16 = 0;
45431
  uint32_t v_o = 0;
45432
45433
  v_nbb = wuffs_base__u32__min(self->private_impl.f_num_buffered_blocks, 32u);
45434
  while (v_bi < v_nbb) {
45435
    v_color = self->private_data.f_colors[a_input][v_bi];
45436
    v_c0 = (((uint32_t)((v_color >> 56u))) * 8u);
45437
    if (v_c0 < 1024u) {
45438
    } else if (v_c0 == 1024u) {
45439
      v_c0 = 4294966280u;
45440
    } else {
45441
      v_c0 -= 2048u;
45442
    }
45443
    v_multiplier = ((uint32_t)(((v_color >> 52u) & 15u)));
45444
    v_multiplier *= 8u;
45445
    if (v_multiplier == 0u) {
45446
      v_multiplier = 1u;
45447
    }
45448
    v_which = ((uint32_t)(((v_color >> 48u) & 15u)));
45449
    v_offset = ((4u * a_dst_bytes_per_pixel * v_bi) + a_offset_adjustment);
45450
    v_y = 0u;
45451
    while (v_y < 4u) {
45452
      v_x = 0u;
45453
      while (v_x < 4u) {
45454
        v_shift = ((((v_x ^ 3u) * 4u) | (v_y ^ 3u)) * 3u);
45455
        v_delta = ((uint32_t)(v_multiplier * WUFFS_ETC2__ALPHA_MODIFIERS[v_which][(7u & (v_color >> v_shift))]));
45456
        v_c11 = ((uint32_t)(v_c0 + v_delta));
45457
        if (v_c11 <= 1023u) {
45458
        } else if (v_c11 < 2147483648u) {
45459
          v_c11 = 1023u;
45460
        } else if (v_c11 < 4294966273u) {
45461
          v_c11 = 4294966273u;
45462
        }
45463
        if (v_c11 < 2147483648u) {
45464
          v_c16 = (((uint32_t)(v_c11 << 5u)) | (v_c11 >> 5u));
45465
        } else {
45466
          v_c11 = ((uint32_t)(0u - v_c11));
45467
          v_c16 = (((uint32_t)(v_c11 << 5u)) | (v_c11 >> 5u));
45468
          v_c16 = ((uint32_t)(0u - v_c16));
45469
        }
45470
        v_c16 ^= 32768u;
45471
        v_o = (v_offset + (v_x * a_dst_bytes_per_pixel) + (v_y * 1024u));
45472
        self->private_data.f_buffer[(v_o + 0u)] = ((uint8_t)((v_c16 >> 0u)));
45473
        self->private_data.f_buffer[(v_o + 1u)] = ((uint8_t)((v_c16 >> 8u)));
45474
        v_x += 1u;
45475
      }
45476
      v_y += 1u;
45477
    }
45478
    v_bi += 1u;
45479
  }
45480
  return wuffs_base__make_empty_struct();
45481
}
45482
45483
// -------- func etc2.decoder.from_buffer_to_dst
45484
45485
WUFFS_BASE__GENERATED_C_CODE
45486
static wuffs_base__status
45487
wuffs_etc2__decoder__from_buffer_to_dst(
45488
    wuffs_etc2__decoder* self,
45489
    wuffs_base__pixel_buffer* a_dst) {
45490
  uint32_t v_src_bytes_per_pixel = 0;
45491
  wuffs_base__pixel_format v_dst_pixfmt = {0};
45492
  uint32_t v_dst_bits_per_pixel = 0;
45493
  uint32_t v_dst_bytes_per_pixel = 0;
45494
  uint64_t v_dst_bytes_per_row = 0;
45495
  wuffs_base__table_u8 v_tab = {0};
45496
  uint32_t v_bi = 0;
45497
  uint32_t v_rem_x = 0;
45498
  uint32_t v_dy = 0;
45499
  wuffs_base__slice_u8 v_dst = {0};
45500
  wuffs_base__slice_u8 v_src = {0};
45501
  uint32_t v_si = 0;
45502
  uint32_t v_sj = 0;
45503
  uint64_t v_i = 0;
45504
  uint32_t v_num_src_pixels = 0;
45505
45506
  if (self->private_impl.f_pixfmt == 536870923u) {
45507
    v_src_bytes_per_pixel = 2u;
45508
  } else if (self->private_impl.f_pixfmt == 2164308923u) {
45509
    v_src_bytes_per_pixel = 8u;
45510
  } else {
45511
    v_src_bytes_per_pixel = 4u;
45512
  }
45513
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
45514
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
45515
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
45516
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
45517
  }
45518
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
45519
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
45520
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
45521
  while (v_bi < self->private_impl.f_num_buffered_blocks) {
45522
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
45523
      self->private_impl.f_dst_x = 0u;
45524
      self->private_impl.f_dst_y += 4u;
45525
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
45526
        break;
45527
      }
45528
      v_rem_x = self->private_impl.f_width;
45529
    } else {
45530
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
45531
    }
45532
    v_dy = 0u;
45533
    while (v_dy < 4u) {
45534
      if (v_src_bytes_per_pixel == 4u) {
45535
        v_si = ((1024u * v_dy) + (16u * v_bi));
45536
        v_sj = ((1024u * v_dy) + 1024u);
45537
      } else if (v_src_bytes_per_pixel < 4u) {
45538
        v_si = ((1024u * v_dy) + (8u * v_bi));
45539
        v_sj = ((1024u * v_dy) + 256u);
45540
      } else {
45541
        v_si = ((1024u * v_dy) + (32u * (v_bi & 31u)));
45542
        v_sj = ((1024u * v_dy) + 1024u);
45543
      }
45544
      if (v_si < v_sj) {
45545
        v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_si, v_sj);
45546
      }
45547
      if (((uint64_t)((v_src_bytes_per_pixel * v_rem_x))) < ((uint64_t)(v_src.len))) {
45548
        v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((v_src_bytes_per_pixel * v_rem_x))));
45549
      }
45550
      if (((uint32_t)(self->private_impl.f_dst_y + v_dy)) >= self->private_impl.f_height) {
45551
        break;
45552
      }
45553
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, ((uint32_t)(self->private_impl.f_dst_y + v_dy)));
45554
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
45555
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
45556
      }
45557
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
45558
      if (v_i < ((uint64_t)(v_dst.len))) {
45559
        wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), v_src);
45560
      }
45561
      v_dy += 1u;
45562
    }
45563
    v_num_src_pixels = (((uint32_t)(((uint64_t)(v_src.len)))) / v_src_bytes_per_pixel);
45564
    self->private_impl.f_dst_x += v_num_src_pixels;
45565
    v_bi += (((uint32_t)(v_num_src_pixels + 3u)) / 4u);
45566
  }
45567
  return wuffs_base__make_status(NULL);
45568
}
45569
45570
// -------- func etc2.decoder.frame_dirty_rect
45571
45572
WUFFS_BASE__GENERATED_C_CODE
45573
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
45574
wuffs_etc2__decoder__frame_dirty_rect(
45575
    const wuffs_etc2__decoder* self) {
45576
  if (!self) {
45577
    return wuffs_base__utility__empty_rect_ie_u32();
45578
  }
45579
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45580
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45581
    return wuffs_base__utility__empty_rect_ie_u32();
45582
  }
45583
45584
  return wuffs_base__utility__make_rect_ie_u32(
45585
      0u,
45586
      0u,
45587
      self->private_impl.f_width,
45588
      self->private_impl.f_height);
45589
}
45590
45591
// -------- func etc2.decoder.num_animation_loops
45592
45593
WUFFS_BASE__GENERATED_C_CODE
45594
WUFFS_BASE__MAYBE_STATIC uint32_t
45595
wuffs_etc2__decoder__num_animation_loops(
45596
    const wuffs_etc2__decoder* self) {
45597
  if (!self) {
45598
    return 0;
45599
  }
45600
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45601
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45602
    return 0;
45603
  }
45604
45605
  return 0u;
45606
}
45607
45608
// -------- func etc2.decoder.num_decoded_frame_configs
45609
45610
WUFFS_BASE__GENERATED_C_CODE
45611
WUFFS_BASE__MAYBE_STATIC uint64_t
45612
wuffs_etc2__decoder__num_decoded_frame_configs(
45613
    const wuffs_etc2__decoder* self) {
45614
  if (!self) {
45615
    return 0;
45616
  }
45617
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45618
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45619
    return 0;
45620
  }
45621
45622
  if (self->private_impl.f_call_sequence > 32u) {
45623
    return 1u;
45624
  }
45625
  return 0u;
45626
}
45627
45628
// -------- func etc2.decoder.num_decoded_frames
45629
45630
WUFFS_BASE__GENERATED_C_CODE
45631
WUFFS_BASE__MAYBE_STATIC uint64_t
45632
wuffs_etc2__decoder__num_decoded_frames(
45633
    const wuffs_etc2__decoder* self) {
45634
  if (!self) {
45635
    return 0;
45636
  }
45637
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45638
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45639
    return 0;
45640
  }
45641
45642
  if (self->private_impl.f_call_sequence > 64u) {
45643
    return 1u;
45644
  }
45645
  return 0u;
45646
}
45647
45648
// -------- func etc2.decoder.restart_frame
45649
45650
WUFFS_BASE__GENERATED_C_CODE
45651
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45652
wuffs_etc2__decoder__restart_frame(
45653
    wuffs_etc2__decoder* self,
45654
    uint64_t a_index,
45655
    uint64_t a_io_position) {
45656
  if (!self) {
45657
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45658
  }
45659
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45660
    return wuffs_base__make_status(
45661
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45662
        ? wuffs_base__error__disabled_by_previous_error
45663
        : wuffs_base__error__initialize_not_called);
45664
  }
45665
45666
  if (self->private_impl.f_call_sequence < 32u) {
45667
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
45668
  }
45669
  if ((a_index != 0u) || (a_io_position != 16u)) {
45670
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45671
  }
45672
  self->private_impl.f_call_sequence = 40u;
45673
  return wuffs_base__make_status(NULL);
45674
}
45675
45676
// -------- func etc2.decoder.set_report_metadata
45677
45678
WUFFS_BASE__GENERATED_C_CODE
45679
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
45680
wuffs_etc2__decoder__set_report_metadata(
45681
    wuffs_etc2__decoder* self,
45682
    uint32_t a_fourcc,
45683
    bool a_report) {
45684
  return wuffs_base__make_empty_struct();
45685
}
45686
45687
// -------- func etc2.decoder.tell_me_more
45688
45689
WUFFS_BASE__GENERATED_C_CODE
45690
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
45691
wuffs_etc2__decoder__tell_me_more(
45692
    wuffs_etc2__decoder* self,
45693
    wuffs_base__io_buffer* a_dst,
45694
    wuffs_base__more_information* a_minfo,
45695
    wuffs_base__io_buffer* a_src) {
45696
  if (!self) {
45697
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45698
  }
45699
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
45700
    return wuffs_base__make_status(
45701
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
45702
        ? wuffs_base__error__disabled_by_previous_error
45703
        : wuffs_base__error__initialize_not_called);
45704
  }
45705
  if (!a_dst || !a_src) {
45706
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45707
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
45708
  }
45709
  if ((self->private_impl.active_coroutine != 0) &&
45710
      (self->private_impl.active_coroutine != 4)) {
45711
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45712
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
45713
  }
45714
  self->private_impl.active_coroutine = 0;
45715
  wuffs_base__status status = wuffs_base__make_status(NULL);
45716
45717
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
45718
  goto exit;
45719
45720
  goto ok;
45721
  ok:
45722
  goto exit;
45723
  exit:
45724
  if (wuffs_base__status__is_error(&status)) {
45725
    self->private_impl.magic = WUFFS_BASE__DISABLED;
45726
  }
45727
  return status;
45728
}
45729
45730
// -------- func etc2.decoder.workbuf_len
45731
45732
WUFFS_BASE__GENERATED_C_CODE
45733
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
45734
wuffs_etc2__decoder__workbuf_len(
45735
    const wuffs_etc2__decoder* self) {
45736
  if (!self) {
45737
    return wuffs_base__utility__empty_range_ii_u64();
45738
  }
45739
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
45740
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
45741
    return wuffs_base__utility__empty_range_ii_u64();
45742
  }
45743
45744
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
45745
}
45746
45747
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
45748
45749
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
45750
45751
// ---------------- Status Codes Implementations
45752
45753
const char wuffs_gif__error__bad_lzw_code[] = "#gif: bad LZW code";
45754
const char wuffs_gif__error__bad_extension_label[] = "#gif: bad extension label";
45755
const char wuffs_gif__error__bad_frame_size[] = "#gif: bad frame size";
45756
const char wuffs_gif__error__bad_graphic_control[] = "#gif: bad graphic control";
45757
const char wuffs_gif__error__bad_header[] = "#gif: bad header";
45758
const char wuffs_gif__error__bad_literal_width[] = "#gif: bad literal width";
45759
const char wuffs_gif__error__bad_palette[] = "#gif: bad palette";
45760
const char wuffs_gif__error__truncated_input[] = "#gif: truncated input";
45761
const char wuffs_gif__error__internal_error_inconsistent_i_o[] = "#gif: internal error: inconsistent I/O";
45762
45763
// ---------------- Private Consts
45764
45765
static const uint32_t
45766
WUFFS_GIF__INTERLACE_START[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
45767
  4294967295u, 1u, 2u, 4u, 0u,
45768
};
45769
45770
static const uint8_t
45771
WUFFS_GIF__INTERLACE_DELTA[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
45772
  1u, 2u, 4u, 8u, 8u,
45773
};
45774
45775
static const uint8_t
45776
WUFFS_GIF__INTERLACE_COUNT[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
45777
  0u, 1u, 2u, 4u, 8u,
45778
};
45779
45780
static const uint8_t
45781
WUFFS_GIF__ANIMEXTS1DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
45782
  65u, 78u, 73u, 77u, 69u, 88u, 84u, 83u,
45783
  49u, 46u, 48u,
45784
};
45785
45786
static const uint8_t
45787
WUFFS_GIF__NETSCAPE2DOT0[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
45788
  78u, 69u, 84u, 83u, 67u, 65u, 80u, 69u,
45789
  50u, 46u, 48u,
45790
};
45791
45792
static const uint8_t
45793
WUFFS_GIF__ICCRGBG1012[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
45794
  73u, 67u, 67u, 82u, 71u, 66u, 71u, 49u,
45795
  48u, 49u, 50u,
45796
};
45797
45798
static const uint8_t
45799
WUFFS_GIF__XMPDATAXMP[11] WUFFS_BASE__POTENTIALLY_UNUSED = {
45800
  88u, 77u, 80u, 32u, 68u, 97u, 116u, 97u,
45801
  88u, 77u, 80u,
45802
};
45803
45804
#define WUFFS_GIF__QUIRKS_BASE 983928832u
45805
45806
#define WUFFS_GIF__QUIRKS_COUNT 7u
45807
45808
// ---------------- Private Initializer Prototypes
45809
45810
// ---------------- Private Function Prototypes
45811
45812
WUFFS_BASE__GENERATED_C_CODE
45813
static wuffs_base__status
45814
wuffs_gif__decoder__do_decode_image_config(
45815
    wuffs_gif__decoder* self,
45816
    wuffs_base__image_config* a_dst,
45817
    wuffs_base__io_buffer* a_src);
45818
45819
WUFFS_BASE__GENERATED_C_CODE
45820
static wuffs_base__status
45821
wuffs_gif__decoder__do_tell_me_more(
45822
    wuffs_gif__decoder* self,
45823
    wuffs_base__io_buffer* a_dst,
45824
    wuffs_base__more_information* a_minfo,
45825
    wuffs_base__io_buffer* a_src);
45826
45827
WUFFS_BASE__GENERATED_C_CODE
45828
static wuffs_base__status
45829
wuffs_gif__decoder__do_decode_frame_config(
45830
    wuffs_gif__decoder* self,
45831
    wuffs_base__frame_config* a_dst,
45832
    wuffs_base__io_buffer* a_src);
45833
45834
WUFFS_BASE__GENERATED_C_CODE
45835
static wuffs_base__status
45836
wuffs_gif__decoder__skip_frame(
45837
    wuffs_gif__decoder* self,
45838
    wuffs_base__io_buffer* a_src);
45839
45840
WUFFS_BASE__GENERATED_C_CODE
45841
static wuffs_base__status
45842
wuffs_gif__decoder__do_decode_frame(
45843
    wuffs_gif__decoder* self,
45844
    wuffs_base__pixel_buffer* a_dst,
45845
    wuffs_base__io_buffer* a_src,
45846
    wuffs_base__pixel_blend a_blend,
45847
    wuffs_base__slice_u8 a_workbuf,
45848
    wuffs_base__decode_frame_options* a_opts);
45849
45850
WUFFS_BASE__GENERATED_C_CODE
45851
static wuffs_base__empty_struct
45852
wuffs_gif__decoder__reset_gc(
45853
    wuffs_gif__decoder* self);
45854
45855
WUFFS_BASE__GENERATED_C_CODE
45856
static wuffs_base__status
45857
wuffs_gif__decoder__decode_up_to_id_part1(
45858
    wuffs_gif__decoder* self,
45859
    wuffs_base__io_buffer* a_src);
45860
45861
WUFFS_BASE__GENERATED_C_CODE
45862
static wuffs_base__status
45863
wuffs_gif__decoder__decode_header(
45864
    wuffs_gif__decoder* self,
45865
    wuffs_base__io_buffer* a_src);
45866
45867
WUFFS_BASE__GENERATED_C_CODE
45868
static wuffs_base__status
45869
wuffs_gif__decoder__decode_lsd(
45870
    wuffs_gif__decoder* self,
45871
    wuffs_base__io_buffer* a_src);
45872
45873
WUFFS_BASE__GENERATED_C_CODE
45874
static wuffs_base__status
45875
wuffs_gif__decoder__decode_extension(
45876
    wuffs_gif__decoder* self,
45877
    wuffs_base__io_buffer* a_src);
45878
45879
WUFFS_BASE__GENERATED_C_CODE
45880
static wuffs_base__status
45881
wuffs_gif__decoder__skip_blocks(
45882
    wuffs_gif__decoder* self,
45883
    wuffs_base__io_buffer* a_src);
45884
45885
WUFFS_BASE__GENERATED_C_CODE
45886
static wuffs_base__status
45887
wuffs_gif__decoder__decode_ae(
45888
    wuffs_gif__decoder* self,
45889
    wuffs_base__io_buffer* a_src);
45890
45891
WUFFS_BASE__GENERATED_C_CODE
45892
static wuffs_base__status
45893
wuffs_gif__decoder__decode_gc(
45894
    wuffs_gif__decoder* self,
45895
    wuffs_base__io_buffer* a_src);
45896
45897
WUFFS_BASE__GENERATED_C_CODE
45898
static wuffs_base__status
45899
wuffs_gif__decoder__decode_id_part0(
45900
    wuffs_gif__decoder* self,
45901
    wuffs_base__io_buffer* a_src);
45902
45903
WUFFS_BASE__GENERATED_C_CODE
45904
static wuffs_base__status
45905
wuffs_gif__decoder__decode_id_part1(
45906
    wuffs_gif__decoder* self,
45907
    wuffs_base__pixel_buffer* a_dst,
45908
    wuffs_base__io_buffer* a_src,
45909
    wuffs_base__pixel_blend a_blend);
45910
45911
WUFFS_BASE__GENERATED_C_CODE
45912
static wuffs_base__status
45913
wuffs_gif__decoder__decode_id_part2(
45914
    wuffs_gif__decoder* self,
45915
    wuffs_base__pixel_buffer* a_dst,
45916
    wuffs_base__io_buffer* a_src,
45917
    wuffs_base__slice_u8 a_workbuf);
45918
45919
WUFFS_BASE__GENERATED_C_CODE
45920
static wuffs_base__status
45921
wuffs_gif__decoder__copy_to_image_buffer(
45922
    wuffs_gif__decoder* self,
45923
    wuffs_base__pixel_buffer* a_pb,
45924
    wuffs_base__slice_u8 a_src);
45925
45926
WUFFS_BASE__GENERATED_C_CODE
45927
static wuffs_base__empty_struct
45928
wuffs_gif__decoder__lzw_init(
45929
    wuffs_gif__decoder* self);
45930
45931
WUFFS_BASE__GENERATED_C_CODE
45932
static wuffs_base__empty_struct
45933
wuffs_gif__decoder__lzw_read_from(
45934
    wuffs_gif__decoder* self,
45935
    wuffs_base__io_buffer* a_src);
45936
45937
// ---------------- VTables
45938
45939
const wuffs_base__image_decoder__func_ptrs
45940
wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder = {
45941
  (wuffs_base__status(*)(void*,
45942
      wuffs_base__pixel_buffer*,
45943
      wuffs_base__io_buffer*,
45944
      wuffs_base__pixel_blend,
45945
      wuffs_base__slice_u8,
45946
      wuffs_base__decode_frame_options*))(&wuffs_gif__decoder__decode_frame),
45947
  (wuffs_base__status(*)(void*,
45948
      wuffs_base__frame_config*,
45949
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_frame_config),
45950
  (wuffs_base__status(*)(void*,
45951
      wuffs_base__image_config*,
45952
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__decode_image_config),
45953
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_gif__decoder__frame_dirty_rect),
45954
  (uint64_t(*)(const void*,
45955
      uint32_t))(&wuffs_gif__decoder__get_quirk),
45956
  (uint32_t(*)(const void*))(&wuffs_gif__decoder__num_animation_loops),
45957
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frame_configs),
45958
  (uint64_t(*)(const void*))(&wuffs_gif__decoder__num_decoded_frames),
45959
  (wuffs_base__status(*)(void*,
45960
      uint64_t,
45961
      uint64_t))(&wuffs_gif__decoder__restart_frame),
45962
  (wuffs_base__status(*)(void*,
45963
      uint32_t,
45964
      uint64_t))(&wuffs_gif__decoder__set_quirk),
45965
  (wuffs_base__empty_struct(*)(void*,
45966
      uint32_t,
45967
      bool))(&wuffs_gif__decoder__set_report_metadata),
45968
  (wuffs_base__status(*)(void*,
45969
      wuffs_base__io_buffer*,
45970
      wuffs_base__more_information*,
45971
      wuffs_base__io_buffer*))(&wuffs_gif__decoder__tell_me_more),
45972
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gif__decoder__workbuf_len),
45973
};
45974
45975
// ---------------- Initializer Implementations
45976
45977
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
45978
wuffs_gif__decoder__initialize(
45979
    wuffs_gif__decoder* self,
45980
    size_t sizeof_star_self,
45981
    uint64_t wuffs_version,
45982
    uint32_t options){
45983
  if (!self) {
45984
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
45985
  }
45986
  if (sizeof(*self) != sizeof_star_self) {
45987
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
45988
  }
45989
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
45990
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
45991
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
45992
  }
45993
45994
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
45995
    // The whole point of this if-check is to detect an uninitialized *self.
45996
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
45997
#if !defined(__clang__) && defined(__GNUC__)
45998
#pragma GCC diagnostic push
45999
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
46000
#endif
46001
    if (self->private_impl.magic != 0) {
46002
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
46003
    }
46004
#if !defined(__clang__) && defined(__GNUC__)
46005
#pragma GCC diagnostic pop
46006
#endif
46007
  } else {
46008
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
46009
      memset(self, 0, sizeof(*self));
46010
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
46011
    } else {
46012
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
46013
    }
46014
  }
46015
46016
  self->private_impl.magic = WUFFS_BASE__MAGIC;
46017
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
46018
      wuffs_base__image_decoder__vtable_name;
46019
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
46020
      (const void*)(&wuffs_gif__decoder__func_ptrs_for__wuffs_base__image_decoder);
46021
  return wuffs_base__make_status(NULL);
46022
}
46023
46024
wuffs_gif__decoder*
46025
wuffs_gif__decoder__alloc(void) {
46026
  wuffs_gif__decoder* x =
46027
      (wuffs_gif__decoder*)(calloc(1, sizeof(wuffs_gif__decoder)));
46028
  if (!x) {
46029
    return NULL;
46030
  }
46031
  if (wuffs_gif__decoder__initialize(
46032
      x, sizeof(wuffs_gif__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
46033
    free(x);
46034
    return NULL;
46035
  }
46036
  return x;
46037
}
46038
46039
size_t
46040
sizeof__wuffs_gif__decoder(void) {
46041
  return sizeof(wuffs_gif__decoder);
46042
}
46043
46044
// ---------------- Function Implementations
46045
46046
// -------- func gif.decoder.get_quirk
46047
46048
WUFFS_BASE__GENERATED_C_CODE
46049
WUFFS_BASE__MAYBE_STATIC uint64_t
46050
wuffs_gif__decoder__get_quirk(
46051
    const wuffs_gif__decoder* self,
46052
    uint32_t a_key) {
46053
  if (!self) {
46054
    return 0;
46055
  }
46056
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46057
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46058
    return 0;
46059
  }
46060
46061
  uint32_t v_key = 0;
46062
46063
  if (a_key >= 983928832u) {
46064
    v_key = (a_key - 983928832u);
46065
    if (v_key < 7u) {
46066
      if (self->private_impl.f_quirks[v_key]) {
46067
        return 1u;
46068
      }
46069
    }
46070
  }
46071
  return 0u;
46072
}
46073
46074
// -------- func gif.decoder.set_quirk
46075
46076
WUFFS_BASE__GENERATED_C_CODE
46077
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46078
wuffs_gif__decoder__set_quirk(
46079
    wuffs_gif__decoder* self,
46080
    uint32_t a_key,
46081
    uint64_t a_value) {
46082
  if (!self) {
46083
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46084
  }
46085
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46086
    return wuffs_base__make_status(
46087
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46088
        ? wuffs_base__error__disabled_by_previous_error
46089
        : wuffs_base__error__initialize_not_called);
46090
  }
46091
46092
  if ((self->private_impl.f_call_sequence == 0u) && (a_key >= 983928832u)) {
46093
    a_key -= 983928832u;
46094
    if (a_key < 7u) {
46095
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
46096
      return wuffs_base__make_status(NULL);
46097
    }
46098
  }
46099
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
46100
}
46101
46102
// -------- func gif.decoder.decode_image_config
46103
46104
WUFFS_BASE__GENERATED_C_CODE
46105
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46106
wuffs_gif__decoder__decode_image_config(
46107
    wuffs_gif__decoder* self,
46108
    wuffs_base__image_config* a_dst,
46109
    wuffs_base__io_buffer* a_src) {
46110
  if (!self) {
46111
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46112
  }
46113
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46114
    return wuffs_base__make_status(
46115
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46116
        ? wuffs_base__error__disabled_by_previous_error
46117
        : wuffs_base__error__initialize_not_called);
46118
  }
46119
  if (!a_src) {
46120
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46121
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46122
  }
46123
  if ((self->private_impl.active_coroutine != 0) &&
46124
      (self->private_impl.active_coroutine != 1)) {
46125
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46126
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
46127
  }
46128
  self->private_impl.active_coroutine = 0;
46129
  wuffs_base__status status = wuffs_base__make_status(NULL);
46130
46131
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
46132
46133
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
46134
  switch (coro_susp_point) {
46135
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46136
46137
    while (true) {
46138
      {
46139
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_image_config(self, a_dst, a_src);
46140
        v_status = t_0;
46141
      }
46142
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
46143
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
46144
        goto exit;
46145
      }
46146
      status = v_status;
46147
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
46148
    }
46149
46150
    ok:
46151
    self->private_impl.p_decode_image_config = 0;
46152
    goto exit;
46153
  }
46154
46155
  goto suspend;
46156
  suspend:
46157
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46158
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
46159
46160
  goto exit;
46161
  exit:
46162
  if (wuffs_base__status__is_error(&status)) {
46163
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46164
  }
46165
  return status;
46166
}
46167
46168
// -------- func gif.decoder.do_decode_image_config
46169
46170
WUFFS_BASE__GENERATED_C_CODE
46171
static wuffs_base__status
46172
wuffs_gif__decoder__do_decode_image_config(
46173
    wuffs_gif__decoder* self,
46174
    wuffs_base__image_config* a_dst,
46175
    wuffs_base__io_buffer* a_src) {
46176
  wuffs_base__status status = wuffs_base__make_status(NULL);
46177
46178
  bool v_ffio = false;
46179
46180
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
46181
  switch (coro_susp_point) {
46182
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46183
46184
    if (self->private_impl.f_call_sequence != 0u) {
46185
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
46186
      goto exit;
46187
    } else if ( ! self->private_impl.f_seen_header) {
46188
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46189
      status = wuffs_gif__decoder__decode_header(self, a_src);
46190
      if (status.repr) {
46191
        goto suspend;
46192
      }
46193
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46194
      status = wuffs_gif__decoder__decode_lsd(self, a_src);
46195
      if (status.repr) {
46196
        goto suspend;
46197
      }
46198
      self->private_impl.f_seen_header = true;
46199
    }
46200
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46201
    status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
46202
    if (status.repr) {
46203
      goto suspend;
46204
    }
46205
    v_ffio =  ! self->private_impl.f_gc_has_transparent_index;
46206
    if ( ! self->private_impl.f_quirks[2u]) {
46207
      v_ffio = (v_ffio &&
46208
          (self->private_impl.f_frame_rect_x0 == 0u) &&
46209
          (self->private_impl.f_frame_rect_y0 == 0u) &&
46210
          (self->private_impl.f_frame_rect_x1 == self->private_impl.f_width) &&
46211
          (self->private_impl.f_frame_rect_y1 == self->private_impl.f_height));
46212
    } else if (v_ffio) {
46213
      self->private_impl.f_black_color_u32_argb_premul = 4278190080u;
46214
    }
46215
    if (self->private_impl.f_background_color_u32_argb_premul == 77u) {
46216
      self->private_impl.f_background_color_u32_argb_premul = self->private_impl.f_black_color_u32_argb_premul;
46217
    }
46218
    if (a_dst != NULL) {
46219
      wuffs_base__image_config__set(
46220
          a_dst,
46221
          2198077448u,
46222
          0u,
46223
          self->private_impl.f_width,
46224
          self->private_impl.f_height,
46225
          self->private_impl.f_frame_config_io_position,
46226
          v_ffio);
46227
    }
46228
    if (self->private_impl.f_call_sequence == 0u) {
46229
      self->private_impl.f_call_sequence = 32u;
46230
    }
46231
46232
    goto ok;
46233
    ok:
46234
    self->private_impl.p_do_decode_image_config = 0;
46235
    goto exit;
46236
  }
46237
46238
  goto suspend;
46239
  suspend:
46240
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46241
46242
  goto exit;
46243
  exit:
46244
  return status;
46245
}
46246
46247
// -------- func gif.decoder.set_report_metadata
46248
46249
WUFFS_BASE__GENERATED_C_CODE
46250
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
46251
wuffs_gif__decoder__set_report_metadata(
46252
    wuffs_gif__decoder* self,
46253
    uint32_t a_fourcc,
46254
    bool a_report) {
46255
  if (!self) {
46256
    return wuffs_base__make_empty_struct();
46257
  }
46258
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46259
    return wuffs_base__make_empty_struct();
46260
  }
46261
46262
  if (a_fourcc == 1229144912u) {
46263
    self->private_impl.f_report_metadata_iccp = a_report;
46264
  } else if (a_fourcc == 1481461792u) {
46265
    self->private_impl.f_report_metadata_xmp = a_report;
46266
  }
46267
  return wuffs_base__make_empty_struct();
46268
}
46269
46270
// -------- func gif.decoder.tell_me_more
46271
46272
WUFFS_BASE__GENERATED_C_CODE
46273
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46274
wuffs_gif__decoder__tell_me_more(
46275
    wuffs_gif__decoder* self,
46276
    wuffs_base__io_buffer* a_dst,
46277
    wuffs_base__more_information* a_minfo,
46278
    wuffs_base__io_buffer* a_src) {
46279
  if (!self) {
46280
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46281
  }
46282
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46283
    return wuffs_base__make_status(
46284
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46285
        ? wuffs_base__error__disabled_by_previous_error
46286
        : wuffs_base__error__initialize_not_called);
46287
  }
46288
  if (!a_dst || !a_src) {
46289
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46290
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46291
  }
46292
  if ((self->private_impl.active_coroutine != 0) &&
46293
      (self->private_impl.active_coroutine != 2)) {
46294
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46295
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
46296
  }
46297
  self->private_impl.active_coroutine = 0;
46298
  wuffs_base__status status = wuffs_base__make_status(NULL);
46299
46300
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
46301
46302
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
46303
  switch (coro_susp_point) {
46304
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46305
46306
    while (true) {
46307
      {
46308
        wuffs_base__status t_0 = wuffs_gif__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
46309
        v_status = t_0;
46310
      }
46311
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
46312
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
46313
        goto exit;
46314
      }
46315
      status = v_status;
46316
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
46317
    }
46318
46319
    ok:
46320
    self->private_impl.p_tell_me_more = 0;
46321
    goto exit;
46322
  }
46323
46324
  goto suspend;
46325
  suspend:
46326
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46327
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
46328
46329
  goto exit;
46330
  exit:
46331
  if (wuffs_base__status__is_error(&status)) {
46332
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46333
  }
46334
  return status;
46335
}
46336
46337
// -------- func gif.decoder.do_tell_me_more
46338
46339
WUFFS_BASE__GENERATED_C_CODE
46340
static wuffs_base__status
46341
wuffs_gif__decoder__do_tell_me_more(
46342
    wuffs_gif__decoder* self,
46343
    wuffs_base__io_buffer* a_dst,
46344
    wuffs_base__more_information* a_minfo,
46345
    wuffs_base__io_buffer* a_src) {
46346
  wuffs_base__status status = wuffs_base__make_status(NULL);
46347
46348
  uint64_t v_chunk_length = 0;
46349
46350
  const uint8_t* iop_a_src = NULL;
46351
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46352
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46353
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46354
  if (a_src && a_src->data.ptr) {
46355
    io0_a_src = a_src->data.ptr;
46356
    io1_a_src = io0_a_src + a_src->meta.ri;
46357
    iop_a_src = io1_a_src;
46358
    io2_a_src = io0_a_src + a_src->meta.wi;
46359
  }
46360
46361
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
46362
  switch (coro_susp_point) {
46363
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46364
46365
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
46366
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
46367
      goto exit;
46368
    }
46369
    if (self->private_impl.f_metadata_fourcc == 0u) {
46370
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
46371
      goto exit;
46372
    }
46373
    while (true) {
46374
      while (true) {
46375
        if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_io_position) {
46376
          if (a_minfo != NULL) {
46377
            wuffs_base__more_information__set(a_minfo,
46378
                2u,
46379
                0u,
46380
                self->private_impl.f_metadata_io_position,
46381
                0u,
46382
                0u);
46383
          }
46384
          status = wuffs_base__make_status(wuffs_base__suspension__mispositioned_read);
46385
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
46386
          continue;
46387
        }
46388
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
46389
          if (a_minfo != NULL) {
46390
            wuffs_base__more_information__set(a_minfo,
46391
                0u,
46392
                0u,
46393
                0u,
46394
                0u,
46395
                0u);
46396
          }
46397
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46398
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
46399
          continue;
46400
        }
46401
        break;
46402
      }
46403
      v_chunk_length = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
46404
      if (v_chunk_length <= 0u) {
46405
        iop_a_src += 1u;
46406
        break;
46407
      }
46408
      if (self->private_impl.f_metadata_fourcc == 1481461792u) {
46409
        v_chunk_length += 1u;
46410
      } else {
46411
        iop_a_src += 1u;
46412
      }
46413
      self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))), v_chunk_length);
46414
      if (a_minfo != NULL) {
46415
        wuffs_base__more_information__set(a_minfo,
46416
            3u,
46417
            self->private_impl.f_metadata_fourcc,
46418
            0u,
46419
            wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))),
46420
            self->private_impl.f_metadata_io_position);
46421
      }
46422
      status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
46423
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
46424
    }
46425
    if (a_minfo != NULL) {
46426
      wuffs_base__more_information__set(a_minfo,
46427
          3u,
46428
          self->private_impl.f_metadata_fourcc,
46429
          0u,
46430
          self->private_impl.f_metadata_io_position,
46431
          self->private_impl.f_metadata_io_position);
46432
    }
46433
    self->private_impl.f_call_sequence &= 239u;
46434
    self->private_impl.f_metadata_fourcc = 0u;
46435
    self->private_impl.f_metadata_io_position = 0u;
46436
    status = wuffs_base__make_status(NULL);
46437
    goto ok;
46438
46439
    ok:
46440
    self->private_impl.p_do_tell_me_more = 0;
46441
    goto exit;
46442
  }
46443
46444
  goto suspend;
46445
  suspend:
46446
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46447
46448
  goto exit;
46449
  exit:
46450
  if (a_src && a_src->data.ptr) {
46451
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46452
  }
46453
46454
  return status;
46455
}
46456
46457
// -------- func gif.decoder.num_animation_loops
46458
46459
WUFFS_BASE__GENERATED_C_CODE
46460
WUFFS_BASE__MAYBE_STATIC uint32_t
46461
wuffs_gif__decoder__num_animation_loops(
46462
    const wuffs_gif__decoder* self) {
46463
  if (!self) {
46464
    return 0;
46465
  }
46466
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46467
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46468
    return 0;
46469
  }
46470
46471
  if (self->private_impl.f_seen_num_animation_loops_value) {
46472
    return self->private_impl.f_num_animation_loops_value;
46473
  }
46474
  if (self->private_impl.f_num_decoded_frame_configs_value > 1u) {
46475
    return 1u;
46476
  }
46477
  return 0u;
46478
}
46479
46480
// -------- func gif.decoder.num_decoded_frame_configs
46481
46482
WUFFS_BASE__GENERATED_C_CODE
46483
WUFFS_BASE__MAYBE_STATIC uint64_t
46484
wuffs_gif__decoder__num_decoded_frame_configs(
46485
    const wuffs_gif__decoder* self) {
46486
  if (!self) {
46487
    return 0;
46488
  }
46489
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46490
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46491
    return 0;
46492
  }
46493
46494
  return self->private_impl.f_num_decoded_frame_configs_value;
46495
}
46496
46497
// -------- func gif.decoder.num_decoded_frames
46498
46499
WUFFS_BASE__GENERATED_C_CODE
46500
WUFFS_BASE__MAYBE_STATIC uint64_t
46501
wuffs_gif__decoder__num_decoded_frames(
46502
    const wuffs_gif__decoder* self) {
46503
  if (!self) {
46504
    return 0;
46505
  }
46506
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46507
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46508
    return 0;
46509
  }
46510
46511
  return self->private_impl.f_num_decoded_frames_value;
46512
}
46513
46514
// -------- func gif.decoder.frame_dirty_rect
46515
46516
WUFFS_BASE__GENERATED_C_CODE
46517
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
46518
wuffs_gif__decoder__frame_dirty_rect(
46519
    const wuffs_gif__decoder* self) {
46520
  if (!self) {
46521
    return wuffs_base__utility__empty_rect_ie_u32();
46522
  }
46523
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46524
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46525
    return wuffs_base__utility__empty_rect_ie_u32();
46526
  }
46527
46528
  return wuffs_base__utility__make_rect_ie_u32(
46529
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
46530
      wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
46531
      wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
46532
      wuffs_base__u32__min(self->private_impl.f_dirty_max_excl_y, self->private_impl.f_height));
46533
}
46534
46535
// -------- func gif.decoder.workbuf_len
46536
46537
WUFFS_BASE__GENERATED_C_CODE
46538
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
46539
wuffs_gif__decoder__workbuf_len(
46540
    const wuffs_gif__decoder* self) {
46541
  if (!self) {
46542
    return wuffs_base__utility__empty_range_ii_u64();
46543
  }
46544
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
46545
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
46546
    return wuffs_base__utility__empty_range_ii_u64();
46547
  }
46548
46549
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
46550
}
46551
46552
// -------- func gif.decoder.restart_frame
46553
46554
WUFFS_BASE__GENERATED_C_CODE
46555
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46556
wuffs_gif__decoder__restart_frame(
46557
    wuffs_gif__decoder* self,
46558
    uint64_t a_index,
46559
    uint64_t a_io_position) {
46560
  if (!self) {
46561
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46562
  }
46563
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46564
    return wuffs_base__make_status(
46565
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46566
        ? wuffs_base__error__disabled_by_previous_error
46567
        : wuffs_base__error__initialize_not_called);
46568
  }
46569
46570
  if (self->private_impl.f_call_sequence < 32u) {
46571
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
46572
  } else if (a_io_position == 0u) {
46573
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46574
  }
46575
  self->private_impl.f_delayed_num_decoded_frames = false;
46576
  self->private_impl.f_frame_config_io_position = a_io_position;
46577
  self->private_impl.f_num_decoded_frame_configs_value = a_index;
46578
  self->private_impl.f_num_decoded_frames_value = a_index;
46579
  wuffs_gif__decoder__reset_gc(self);
46580
  self->private_impl.f_call_sequence = 40u;
46581
  return wuffs_base__make_status(NULL);
46582
}
46583
46584
// -------- func gif.decoder.decode_frame_config
46585
46586
WUFFS_BASE__GENERATED_C_CODE
46587
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46588
wuffs_gif__decoder__decode_frame_config(
46589
    wuffs_gif__decoder* self,
46590
    wuffs_base__frame_config* a_dst,
46591
    wuffs_base__io_buffer* a_src) {
46592
  if (!self) {
46593
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46594
  }
46595
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46596
    return wuffs_base__make_status(
46597
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46598
        ? wuffs_base__error__disabled_by_previous_error
46599
        : wuffs_base__error__initialize_not_called);
46600
  }
46601
  if (!a_src) {
46602
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46603
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46604
  }
46605
  if ((self->private_impl.active_coroutine != 0) &&
46606
      (self->private_impl.active_coroutine != 3)) {
46607
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46608
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
46609
  }
46610
  self->private_impl.active_coroutine = 0;
46611
  wuffs_base__status status = wuffs_base__make_status(NULL);
46612
46613
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
46614
46615
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
46616
  switch (coro_susp_point) {
46617
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46618
46619
    while (true) {
46620
      {
46621
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame_config(self, a_dst, a_src);
46622
        v_status = t_0;
46623
      }
46624
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
46625
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
46626
        goto exit;
46627
      }
46628
      status = v_status;
46629
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
46630
    }
46631
46632
    ok:
46633
    self->private_impl.p_decode_frame_config = 0;
46634
    goto exit;
46635
  }
46636
46637
  goto suspend;
46638
  suspend:
46639
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46640
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
46641
46642
  goto exit;
46643
  exit:
46644
  if (wuffs_base__status__is_error(&status)) {
46645
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46646
  }
46647
  return status;
46648
}
46649
46650
// -------- func gif.decoder.do_decode_frame_config
46651
46652
WUFFS_BASE__GENERATED_C_CODE
46653
static wuffs_base__status
46654
wuffs_gif__decoder__do_decode_frame_config(
46655
    wuffs_gif__decoder* self,
46656
    wuffs_base__frame_config* a_dst,
46657
    wuffs_base__io_buffer* a_src) {
46658
  wuffs_base__status status = wuffs_base__make_status(NULL);
46659
46660
  uint32_t v_background_color = 0;
46661
  uint8_t v_flags = 0;
46662
46663
  const uint8_t* iop_a_src = NULL;
46664
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46665
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46666
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46667
  if (a_src && a_src->data.ptr) {
46668
    io0_a_src = a_src->data.ptr;
46669
    io1_a_src = io0_a_src + a_src->meta.ri;
46670
    iop_a_src = io1_a_src;
46671
    io2_a_src = io0_a_src + a_src->meta.wi;
46672
  }
46673
46674
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
46675
  if (coro_susp_point) {
46676
    v_background_color = self->private_data.s_do_decode_frame_config.v_background_color;
46677
  }
46678
  switch (coro_susp_point) {
46679
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46680
46681
    self->private_impl.f_dirty_max_excl_y = 0u;
46682
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
46683
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
46684
      goto exit;
46685
    } else if (self->private_impl.f_call_sequence == 32u) {
46686
    } else if (self->private_impl.f_call_sequence < 32u) {
46687
      if (a_src) {
46688
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46689
      }
46690
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46691
      status = wuffs_gif__decoder__do_decode_image_config(self, NULL, a_src);
46692
      if (a_src) {
46693
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
46694
      }
46695
      if (status.repr) {
46696
        goto suspend;
46697
      }
46698
    } else if (self->private_impl.f_call_sequence == 40u) {
46699
      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)))) {
46700
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
46701
        goto exit;
46702
      }
46703
    } else if (self->private_impl.f_call_sequence == 64u) {
46704
      if (a_src) {
46705
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46706
      }
46707
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46708
      status = wuffs_gif__decoder__skip_frame(self, a_src);
46709
      if (a_src) {
46710
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
46711
      }
46712
      if (status.repr) {
46713
        goto suspend;
46714
      }
46715
      if (self->private_impl.f_call_sequence >= 96u) {
46716
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
46717
        goto ok;
46718
      }
46719
    } else {
46720
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
46721
      goto ok;
46722
    }
46723
    if ((self->private_impl.f_num_decoded_frame_configs_value > 0u) || (self->private_impl.f_call_sequence == 40u)) {
46724
      if (a_src) {
46725
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46726
      }
46727
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46728
      status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
46729
      if (a_src) {
46730
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
46731
      }
46732
      if (status.repr) {
46733
        goto suspend;
46734
      }
46735
      if (self->private_impl.f_call_sequence >= 96u) {
46736
        status = wuffs_base__make_status(wuffs_base__note__end_of_data);
46737
        goto ok;
46738
      }
46739
    }
46740
    v_background_color = self->private_impl.f_black_color_u32_argb_premul;
46741
    if ( ! self->private_impl.f_gc_has_transparent_index) {
46742
      v_background_color = self->private_impl.f_background_color_u32_argb_premul;
46743
      if (self->private_impl.f_quirks[1u] && (self->private_impl.f_num_decoded_frame_configs_value == 0u)) {
46744
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
46745
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46746
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
46747
        }
46748
        v_flags = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
46749
        if (((uint8_t)(v_flags & 128u)) != 0u) {
46750
          v_background_color = self->private_impl.f_black_color_u32_argb_premul;
46751
        }
46752
      }
46753
    }
46754
    if (a_dst != NULL) {
46755
      wuffs_base__frame_config__set(
46756
          a_dst,
46757
          wuffs_base__utility__make_rect_ie_u32(
46758
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x0, self->private_impl.f_width),
46759
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y0, self->private_impl.f_height),
46760
          wuffs_base__u32__min(self->private_impl.f_frame_rect_x1, self->private_impl.f_width),
46761
          wuffs_base__u32__min(self->private_impl.f_frame_rect_y1, self->private_impl.f_height)),
46762
          ((wuffs_base__flicks)(self->private_impl.f_gc_duration)),
46763
          self->private_impl.f_num_decoded_frame_configs_value,
46764
          self->private_impl.f_frame_config_io_position,
46765
          self->private_impl.f_gc_disposal,
46766
          ! self->private_impl.f_gc_has_transparent_index,
46767
          false,
46768
          v_background_color);
46769
    }
46770
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
46771
    self->private_impl.f_call_sequence = 64u;
46772
46773
    ok:
46774
    self->private_impl.p_do_decode_frame_config = 0;
46775
    goto exit;
46776
  }
46777
46778
  goto suspend;
46779
  suspend:
46780
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46781
  self->private_data.s_do_decode_frame_config.v_background_color = v_background_color;
46782
46783
  goto exit;
46784
  exit:
46785
  if (a_src && a_src->data.ptr) {
46786
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46787
  }
46788
46789
  return status;
46790
}
46791
46792
// -------- func gif.decoder.skip_frame
46793
46794
WUFFS_BASE__GENERATED_C_CODE
46795
static wuffs_base__status
46796
wuffs_gif__decoder__skip_frame(
46797
    wuffs_gif__decoder* self,
46798
    wuffs_base__io_buffer* a_src) {
46799
  wuffs_base__status status = wuffs_base__make_status(NULL);
46800
46801
  uint8_t v_flags = 0;
46802
  uint8_t v_lw = 0;
46803
46804
  const uint8_t* iop_a_src = NULL;
46805
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46806
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46807
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
46808
  if (a_src && a_src->data.ptr) {
46809
    io0_a_src = a_src->data.ptr;
46810
    io1_a_src = io0_a_src + a_src->meta.ri;
46811
    iop_a_src = io1_a_src;
46812
    io2_a_src = io0_a_src + a_src->meta.wi;
46813
  }
46814
46815
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
46816
  switch (coro_susp_point) {
46817
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46818
46819
    {
46820
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46821
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46822
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46823
        goto suspend;
46824
      }
46825
      uint8_t t_0 = *iop_a_src++;
46826
      v_flags = t_0;
46827
    }
46828
    if (((uint8_t)(v_flags & 128u)) != 0u) {
46829
      self->private_data.s_skip_frame.scratch = (((uint32_t)(3u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
46830
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46831
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
46832
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
46833
        iop_a_src = io2_a_src;
46834
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46835
        goto suspend;
46836
      }
46837
      iop_a_src += self->private_data.s_skip_frame.scratch;
46838
    }
46839
    {
46840
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
46841
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
46842
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
46843
        goto suspend;
46844
      }
46845
      uint8_t t_1 = *iop_a_src++;
46846
      v_lw = t_1;
46847
    }
46848
    if (v_lw > 8u) {
46849
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
46850
      goto exit;
46851
    }
46852
    if (a_src) {
46853
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46854
    }
46855
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
46856
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
46857
    if (a_src) {
46858
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
46859
    }
46860
    if (status.repr) {
46861
      goto suspend;
46862
    }
46863
    if (self->private_impl.f_quirks[0u]) {
46864
      self->private_impl.f_delayed_num_decoded_frames = true;
46865
    } else {
46866
      wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
46867
    }
46868
    wuffs_gif__decoder__reset_gc(self);
46869
    self->private_impl.f_call_sequence = 32u;
46870
46871
    goto ok;
46872
    ok:
46873
    self->private_impl.p_skip_frame = 0;
46874
    goto exit;
46875
  }
46876
46877
  goto suspend;
46878
  suspend:
46879
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46880
46881
  goto exit;
46882
  exit:
46883
  if (a_src && a_src->data.ptr) {
46884
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
46885
  }
46886
46887
  return status;
46888
}
46889
46890
// -------- func gif.decoder.decode_frame
46891
46892
WUFFS_BASE__GENERATED_C_CODE
46893
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
46894
wuffs_gif__decoder__decode_frame(
46895
    wuffs_gif__decoder* self,
46896
    wuffs_base__pixel_buffer* a_dst,
46897
    wuffs_base__io_buffer* a_src,
46898
    wuffs_base__pixel_blend a_blend,
46899
    wuffs_base__slice_u8 a_workbuf,
46900
    wuffs_base__decode_frame_options* a_opts) {
46901
  if (!self) {
46902
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
46903
  }
46904
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
46905
    return wuffs_base__make_status(
46906
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
46907
        ? wuffs_base__error__disabled_by_previous_error
46908
        : wuffs_base__error__initialize_not_called);
46909
  }
46910
  if (!a_dst || !a_src) {
46911
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46912
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
46913
  }
46914
  if ((self->private_impl.active_coroutine != 0) &&
46915
      (self->private_impl.active_coroutine != 4)) {
46916
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46917
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
46918
  }
46919
  self->private_impl.active_coroutine = 0;
46920
  wuffs_base__status status = wuffs_base__make_status(NULL);
46921
46922
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
46923
46924
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
46925
  switch (coro_susp_point) {
46926
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46927
46928
    while (true) {
46929
      {
46930
        wuffs_base__status t_0 = wuffs_gif__decoder__do_decode_frame(self,
46931
            a_dst,
46932
            a_src,
46933
            a_blend,
46934
            a_workbuf,
46935
            a_opts);
46936
        v_status = t_0;
46937
      }
46938
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
46939
        status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
46940
        goto exit;
46941
      }
46942
      status = v_status;
46943
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
46944
    }
46945
46946
    ok:
46947
    self->private_impl.p_decode_frame = 0;
46948
    goto exit;
46949
  }
46950
46951
  goto suspend;
46952
  suspend:
46953
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
46954
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
46955
46956
  goto exit;
46957
  exit:
46958
  if (wuffs_base__status__is_error(&status)) {
46959
    self->private_impl.magic = WUFFS_BASE__DISABLED;
46960
  }
46961
  return status;
46962
}
46963
46964
// -------- func gif.decoder.do_decode_frame
46965
46966
WUFFS_BASE__GENERATED_C_CODE
46967
static wuffs_base__status
46968
wuffs_gif__decoder__do_decode_frame(
46969
    wuffs_gif__decoder* self,
46970
    wuffs_base__pixel_buffer* a_dst,
46971
    wuffs_base__io_buffer* a_src,
46972
    wuffs_base__pixel_blend a_blend,
46973
    wuffs_base__slice_u8 a_workbuf,
46974
    wuffs_base__decode_frame_options* a_opts) {
46975
  wuffs_base__status status = wuffs_base__make_status(NULL);
46976
46977
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
46978
  switch (coro_susp_point) {
46979
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
46980
46981
    if (self->private_impl.f_call_sequence == 64u) {
46982
    } else if (self->private_impl.f_call_sequence < 64u) {
46983
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
46984
      status = wuffs_gif__decoder__do_decode_frame_config(self, NULL, a_src);
46985
      if (status.repr) {
46986
        goto suspend;
46987
      }
46988
    } else {
46989
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
46990
      goto ok;
46991
    }
46992
    if (self->private_impl.f_quirks[5u] && ((self->private_impl.f_frame_rect_x0 == self->private_impl.f_frame_rect_x1) || (self->private_impl.f_frame_rect_y0 == self->private_impl.f_frame_rect_y1))) {
46993
      status = wuffs_base__make_status(wuffs_gif__error__bad_frame_size);
46994
      goto exit;
46995
    }
46996
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
46997
    status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src, a_blend);
46998
    if (status.repr) {
46999
      goto suspend;
47000
    }
47001
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47002
    status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf);
47003
    if (status.repr) {
47004
      goto suspend;
47005
    }
47006
    wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47007
    wuffs_gif__decoder__reset_gc(self);
47008
    self->private_impl.f_call_sequence = 32u;
47009
47010
    ok:
47011
    self->private_impl.p_do_decode_frame = 0;
47012
    goto exit;
47013
  }
47014
47015
  goto suspend;
47016
  suspend:
47017
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47018
47019
  goto exit;
47020
  exit:
47021
  return status;
47022
}
47023
47024
// -------- func gif.decoder.reset_gc
47025
47026
WUFFS_BASE__GENERATED_C_CODE
47027
static wuffs_base__empty_struct
47028
wuffs_gif__decoder__reset_gc(
47029
    wuffs_gif__decoder* self) {
47030
  self->private_impl.f_gc_has_transparent_index = false;
47031
  self->private_impl.f_gc_transparent_index = 0u;
47032
  self->private_impl.f_gc_disposal = 0u;
47033
  self->private_impl.f_gc_duration = 0u;
47034
  return wuffs_base__make_empty_struct();
47035
}
47036
47037
// -------- func gif.decoder.decode_up_to_id_part1
47038
47039
WUFFS_BASE__GENERATED_C_CODE
47040
static wuffs_base__status
47041
wuffs_gif__decoder__decode_up_to_id_part1(
47042
    wuffs_gif__decoder* self,
47043
    wuffs_base__io_buffer* a_src) {
47044
  wuffs_base__status status = wuffs_base__make_status(NULL);
47045
47046
  uint8_t v_block_type = 0;
47047
47048
  const uint8_t* iop_a_src = NULL;
47049
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47050
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47051
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47052
  if (a_src && a_src->data.ptr) {
47053
    io0_a_src = a_src->data.ptr;
47054
    io1_a_src = io0_a_src + a_src->meta.ri;
47055
    iop_a_src = io1_a_src;
47056
    io2_a_src = io0_a_src + a_src->meta.wi;
47057
  }
47058
47059
  uint32_t coro_susp_point = self->private_impl.p_decode_up_to_id_part1;
47060
  switch (coro_susp_point) {
47061
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47062
47063
    if ((self->private_impl.f_frame_config_io_position == 0u) || (self->private_impl.f_num_decoded_frame_configs_value > 0u)) {
47064
      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)));
47065
    }
47066
    while (true) {
47067
      {
47068
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47069
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47070
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47071
          goto suspend;
47072
        }
47073
        uint8_t t_0 = *iop_a_src++;
47074
        v_block_type = t_0;
47075
      }
47076
      if (v_block_type == 33u) {
47077
        if (a_src) {
47078
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47079
        }
47080
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47081
        status = wuffs_gif__decoder__decode_extension(self, a_src);
47082
        if (a_src) {
47083
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
47084
        }
47085
        if (status.repr) {
47086
          goto suspend;
47087
        }
47088
      } else if (v_block_type == 44u) {
47089
        if (self->private_impl.f_delayed_num_decoded_frames) {
47090
          self->private_impl.f_delayed_num_decoded_frames = false;
47091
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47092
        }
47093
        if (a_src) {
47094
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47095
        }
47096
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47097
        status = wuffs_gif__decoder__decode_id_part0(self, a_src);
47098
        if (a_src) {
47099
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
47100
        }
47101
        if (status.repr) {
47102
          goto suspend;
47103
        }
47104
        break;
47105
      } else {
47106
        if (self->private_impl.f_delayed_num_decoded_frames) {
47107
          self->private_impl.f_delayed_num_decoded_frames = false;
47108
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
47109
        }
47110
        self->private_impl.f_call_sequence = 96u;
47111
        break;
47112
      }
47113
    }
47114
47115
    goto ok;
47116
    ok:
47117
    self->private_impl.p_decode_up_to_id_part1 = 0;
47118
    goto exit;
47119
  }
47120
47121
  goto suspend;
47122
  suspend:
47123
  self->private_impl.p_decode_up_to_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47124
47125
  goto exit;
47126
  exit:
47127
  if (a_src && a_src->data.ptr) {
47128
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47129
  }
47130
47131
  return status;
47132
}
47133
47134
// -------- func gif.decoder.decode_header
47135
47136
WUFFS_BASE__GENERATED_C_CODE
47137
static wuffs_base__status
47138
wuffs_gif__decoder__decode_header(
47139
    wuffs_gif__decoder* self,
47140
    wuffs_base__io_buffer* a_src) {
47141
  wuffs_base__status status = wuffs_base__make_status(NULL);
47142
47143
  uint64_t v_c48 = 0;
47144
47145
  const uint8_t* iop_a_src = NULL;
47146
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47147
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47148
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47149
  if (a_src && a_src->data.ptr) {
47150
    io0_a_src = a_src->data.ptr;
47151
    io1_a_src = io0_a_src + a_src->meta.ri;
47152
    iop_a_src = io1_a_src;
47153
    io2_a_src = io0_a_src + a_src->meta.wi;
47154
  }
47155
47156
  uint32_t coro_susp_point = self->private_impl.p_decode_header;
47157
  switch (coro_susp_point) {
47158
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47159
47160
    {
47161
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47162
      uint64_t t_0;
47163
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
47164
        t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
47165
        iop_a_src += 6;
47166
      } else {
47167
        self->private_data.s_decode_header.scratch = 0;
47168
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47169
        while (true) {
47170
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47171
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47172
            goto suspend;
47173
          }
47174
          uint64_t* scratch = &self->private_data.s_decode_header.scratch;
47175
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
47176
          *scratch <<= 8;
47177
          *scratch >>= 8;
47178
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
47179
          if (num_bits_0 == 40) {
47180
            t_0 = ((uint64_t)(*scratch));
47181
            break;
47182
          }
47183
          num_bits_0 += 8u;
47184
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
47185
        }
47186
      }
47187
      v_c48 = t_0;
47188
    }
47189
    if ((v_c48 != 106889795225927u) && (v_c48 != 106898385160519u)) {
47190
      status = wuffs_base__make_status(wuffs_gif__error__bad_header);
47191
      goto exit;
47192
    }
47193
47194
    goto ok;
47195
    ok:
47196
    self->private_impl.p_decode_header = 0;
47197
    goto exit;
47198
  }
47199
47200
  goto suspend;
47201
  suspend:
47202
  self->private_impl.p_decode_header = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47203
47204
  goto exit;
47205
  exit:
47206
  if (a_src && a_src->data.ptr) {
47207
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47208
  }
47209
47210
  return status;
47211
}
47212
47213
// -------- func gif.decoder.decode_lsd
47214
47215
WUFFS_BASE__GENERATED_C_CODE
47216
static wuffs_base__status
47217
wuffs_gif__decoder__decode_lsd(
47218
    wuffs_gif__decoder* self,
47219
    wuffs_base__io_buffer* a_src) {
47220
  wuffs_base__status status = wuffs_base__make_status(NULL);
47221
47222
  uint8_t v_flags = 0;
47223
  uint8_t v_background_color_index = 0;
47224
  uint32_t v_num_palette_entries = 0;
47225
  uint32_t v_i = 0;
47226
  uint32_t v_j = 0;
47227
  uint32_t v_argb = 0;
47228
47229
  const uint8_t* iop_a_src = NULL;
47230
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47231
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47232
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47233
  if (a_src && a_src->data.ptr) {
47234
    io0_a_src = a_src->data.ptr;
47235
    io1_a_src = io0_a_src + a_src->meta.ri;
47236
    iop_a_src = io1_a_src;
47237
    io2_a_src = io0_a_src + a_src->meta.wi;
47238
  }
47239
47240
  uint32_t coro_susp_point = self->private_impl.p_decode_lsd;
47241
  if (coro_susp_point) {
47242
    v_flags = self->private_data.s_decode_lsd.v_flags;
47243
    v_background_color_index = self->private_data.s_decode_lsd.v_background_color_index;
47244
    v_num_palette_entries = self->private_data.s_decode_lsd.v_num_palette_entries;
47245
    v_i = self->private_data.s_decode_lsd.v_i;
47246
  }
47247
  switch (coro_susp_point) {
47248
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47249
47250
    {
47251
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47252
      uint32_t t_0;
47253
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47254
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
47255
        iop_a_src += 2;
47256
      } else {
47257
        self->private_data.s_decode_lsd.scratch = 0;
47258
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47259
        while (true) {
47260
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47261
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47262
            goto suspend;
47263
          }
47264
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
47265
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
47266
          *scratch <<= 8;
47267
          *scratch >>= 8;
47268
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
47269
          if (num_bits_0 == 8) {
47270
            t_0 = ((uint32_t)(*scratch));
47271
            break;
47272
          }
47273
          num_bits_0 += 8u;
47274
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
47275
        }
47276
      }
47277
      self->private_impl.f_width = t_0;
47278
    }
47279
    {
47280
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47281
      uint32_t t_1;
47282
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47283
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
47284
        iop_a_src += 2;
47285
      } else {
47286
        self->private_data.s_decode_lsd.scratch = 0;
47287
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47288
        while (true) {
47289
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47290
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47291
            goto suspend;
47292
          }
47293
          uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
47294
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
47295
          *scratch <<= 8;
47296
          *scratch >>= 8;
47297
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
47298
          if (num_bits_1 == 8) {
47299
            t_1 = ((uint32_t)(*scratch));
47300
            break;
47301
          }
47302
          num_bits_1 += 8u;
47303
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
47304
        }
47305
      }
47306
      self->private_impl.f_height = t_1;
47307
    }
47308
    {
47309
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
47310
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47311
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47312
        goto suspend;
47313
      }
47314
      uint8_t t_2 = *iop_a_src++;
47315
      v_flags = t_2;
47316
    }
47317
    {
47318
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
47319
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47320
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47321
        goto suspend;
47322
      }
47323
      uint8_t t_3 = *iop_a_src++;
47324
      v_background_color_index = t_3;
47325
    }
47326
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
47327
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47328
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47329
      goto suspend;
47330
    }
47331
    iop_a_src++;
47332
    v_i = 0u;
47333
    self->private_impl.f_has_global_palette = (((uint8_t)(v_flags & 128u)) != 0u);
47334
    if (self->private_impl.f_has_global_palette) {
47335
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
47336
      while (v_i < v_num_palette_entries) {
47337
        {
47338
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
47339
          uint32_t t_4;
47340
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
47341
            t_4 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
47342
            iop_a_src += 3;
47343
          } else {
47344
            self->private_data.s_decode_lsd.scratch = 0;
47345
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
47346
            while (true) {
47347
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47348
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47349
                goto suspend;
47350
              }
47351
              uint64_t* scratch = &self->private_data.s_decode_lsd.scratch;
47352
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
47353
              *scratch >>= 8;
47354
              *scratch <<= 8;
47355
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
47356
              if (num_bits_4 == 16) {
47357
                t_4 = ((uint32_t)(*scratch >> 40));
47358
                break;
47359
              }
47360
              num_bits_4 += 8u;
47361
              *scratch |= ((uint64_t)(num_bits_4));
47362
            }
47363
          }
47364
          v_argb = t_4;
47365
        }
47366
        v_argb |= 4278190080u;
47367
        self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
47368
        self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
47369
        self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
47370
        self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
47371
        v_i += 1u;
47372
      }
47373
      if (self->private_impl.f_quirks[2u]) {
47374
        if ((v_background_color_index != 0u) && (((uint32_t)(v_background_color_index)) < v_num_palette_entries)) {
47375
          v_j = (4u * ((uint32_t)(v_background_color_index)));
47376
          self->private_impl.f_background_color_u32_argb_premul = ((((uint32_t)(self->private_data.f_palettes[0u][(v_j + 0u)])) << 0u) |
47377
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 1u)])) << 8u) |
47378
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 2u)])) << 16u) |
47379
              (((uint32_t)(self->private_data.f_palettes[0u][(v_j + 3u)])) << 24u));
47380
        } else {
47381
          self->private_impl.f_background_color_u32_argb_premul = 77u;
47382
        }
47383
      }
47384
    }
47385
    while (v_i < 256u) {
47386
      self->private_data.f_palettes[0u][((4u * v_i) + 0u)] = 0u;
47387
      self->private_data.f_palettes[0u][((4u * v_i) + 1u)] = 0u;
47388
      self->private_data.f_palettes[0u][((4u * v_i) + 2u)] = 0u;
47389
      self->private_data.f_palettes[0u][((4u * v_i) + 3u)] = 255u;
47390
      v_i += 1u;
47391
    }
47392
47393
    goto ok;
47394
    ok:
47395
    self->private_impl.p_decode_lsd = 0;
47396
    goto exit;
47397
  }
47398
47399
  goto suspend;
47400
  suspend:
47401
  self->private_impl.p_decode_lsd = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47402
  self->private_data.s_decode_lsd.v_flags = v_flags;
47403
  self->private_data.s_decode_lsd.v_background_color_index = v_background_color_index;
47404
  self->private_data.s_decode_lsd.v_num_palette_entries = v_num_palette_entries;
47405
  self->private_data.s_decode_lsd.v_i = v_i;
47406
47407
  goto exit;
47408
  exit:
47409
  if (a_src && a_src->data.ptr) {
47410
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47411
  }
47412
47413
  return status;
47414
}
47415
47416
// -------- func gif.decoder.decode_extension
47417
47418
WUFFS_BASE__GENERATED_C_CODE
47419
static wuffs_base__status
47420
wuffs_gif__decoder__decode_extension(
47421
    wuffs_gif__decoder* self,
47422
    wuffs_base__io_buffer* a_src) {
47423
  wuffs_base__status status = wuffs_base__make_status(NULL);
47424
47425
  uint8_t v_label = 0;
47426
47427
  const uint8_t* iop_a_src = NULL;
47428
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47429
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47430
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47431
  if (a_src && a_src->data.ptr) {
47432
    io0_a_src = a_src->data.ptr;
47433
    io1_a_src = io0_a_src + a_src->meta.ri;
47434
    iop_a_src = io1_a_src;
47435
    io2_a_src = io0_a_src + a_src->meta.wi;
47436
  }
47437
47438
  uint32_t coro_susp_point = self->private_impl.p_decode_extension;
47439
  switch (coro_susp_point) {
47440
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47441
47442
    {
47443
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47444
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47445
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47446
        goto suspend;
47447
      }
47448
      uint8_t t_0 = *iop_a_src++;
47449
      v_label = t_0;
47450
    }
47451
    if (v_label == 249u) {
47452
      if (a_src) {
47453
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47454
      }
47455
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47456
      status = wuffs_gif__decoder__decode_gc(self, a_src);
47457
      if (a_src) {
47458
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
47459
      }
47460
      if (status.repr) {
47461
        goto suspend;
47462
      }
47463
      status = wuffs_base__make_status(NULL);
47464
      goto ok;
47465
    } else if (v_label == 255u) {
47466
      if (a_src) {
47467
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47468
      }
47469
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47470
      status = wuffs_gif__decoder__decode_ae(self, a_src);
47471
      if (a_src) {
47472
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
47473
      }
47474
      if (status.repr) {
47475
        goto suspend;
47476
      }
47477
      status = wuffs_base__make_status(NULL);
47478
      goto ok;
47479
    }
47480
    if (a_src) {
47481
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47482
    }
47483
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47484
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
47485
    if (a_src) {
47486
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
47487
    }
47488
    if (status.repr) {
47489
      goto suspend;
47490
    }
47491
47492
    ok:
47493
    self->private_impl.p_decode_extension = 0;
47494
    goto exit;
47495
  }
47496
47497
  goto suspend;
47498
  suspend:
47499
  self->private_impl.p_decode_extension = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47500
47501
  goto exit;
47502
  exit:
47503
  if (a_src && a_src->data.ptr) {
47504
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47505
  }
47506
47507
  return status;
47508
}
47509
47510
// -------- func gif.decoder.skip_blocks
47511
47512
WUFFS_BASE__GENERATED_C_CODE
47513
static wuffs_base__status
47514
wuffs_gif__decoder__skip_blocks(
47515
    wuffs_gif__decoder* self,
47516
    wuffs_base__io_buffer* a_src) {
47517
  wuffs_base__status status = wuffs_base__make_status(NULL);
47518
47519
  uint8_t v_block_size = 0;
47520
47521
  const uint8_t* iop_a_src = NULL;
47522
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47523
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47524
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47525
  if (a_src && a_src->data.ptr) {
47526
    io0_a_src = a_src->data.ptr;
47527
    io1_a_src = io0_a_src + a_src->meta.ri;
47528
    iop_a_src = io1_a_src;
47529
    io2_a_src = io0_a_src + a_src->meta.wi;
47530
  }
47531
47532
  uint32_t coro_susp_point = self->private_impl.p_skip_blocks;
47533
  switch (coro_susp_point) {
47534
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47535
47536
    while (true) {
47537
      {
47538
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47539
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47540
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47541
          goto suspend;
47542
        }
47543
        uint8_t t_0 = *iop_a_src++;
47544
        v_block_size = t_0;
47545
      }
47546
      if (v_block_size == 0u) {
47547
        status = wuffs_base__make_status(NULL);
47548
        goto ok;
47549
      }
47550
      self->private_data.s_skip_blocks.scratch = ((uint32_t)(v_block_size));
47551
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47552
      if (self->private_data.s_skip_blocks.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47553
        self->private_data.s_skip_blocks.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47554
        iop_a_src = io2_a_src;
47555
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47556
        goto suspend;
47557
      }
47558
      iop_a_src += self->private_data.s_skip_blocks.scratch;
47559
    }
47560
47561
    ok:
47562
    self->private_impl.p_skip_blocks = 0;
47563
    goto exit;
47564
  }
47565
47566
  goto suspend;
47567
  suspend:
47568
  self->private_impl.p_skip_blocks = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47569
47570
  goto exit;
47571
  exit:
47572
  if (a_src && a_src->data.ptr) {
47573
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47574
  }
47575
47576
  return status;
47577
}
47578
47579
// -------- func gif.decoder.decode_ae
47580
47581
WUFFS_BASE__GENERATED_C_CODE
47582
static wuffs_base__status
47583
wuffs_gif__decoder__decode_ae(
47584
    wuffs_gif__decoder* self,
47585
    wuffs_base__io_buffer* a_src) {
47586
  wuffs_base__status status = wuffs_base__make_status(NULL);
47587
47588
  uint8_t v_c8 = 0;
47589
  uint8_t v_block_size = 0;
47590
  bool v_is_animexts = false;
47591
  bool v_is_netscape = false;
47592
  bool v_is_iccp = false;
47593
  bool v_is_xmp = false;
47594
47595
  const uint8_t* iop_a_src = NULL;
47596
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47597
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47598
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47599
  if (a_src && a_src->data.ptr) {
47600
    io0_a_src = a_src->data.ptr;
47601
    io1_a_src = io0_a_src + a_src->meta.ri;
47602
    iop_a_src = io1_a_src;
47603
    io2_a_src = io0_a_src + a_src->meta.wi;
47604
  }
47605
47606
  uint32_t coro_susp_point = self->private_impl.p_decode_ae;
47607
  if (coro_susp_point) {
47608
    v_block_size = self->private_data.s_decode_ae.v_block_size;
47609
    v_is_animexts = self->private_data.s_decode_ae.v_is_animexts;
47610
    v_is_netscape = self->private_data.s_decode_ae.v_is_netscape;
47611
    v_is_iccp = self->private_data.s_decode_ae.v_is_iccp;
47612
    v_is_xmp = self->private_data.s_decode_ae.v_is_xmp;
47613
  }
47614
  switch (coro_susp_point) {
47615
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47616
47617
    do {
47618
      if (self->private_impl.f_metadata_fourcc != 0u) {
47619
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
47620
        goto ok;
47621
      }
47622
      {
47623
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47624
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47625
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47626
          goto suspend;
47627
        }
47628
        uint8_t t_0 = *iop_a_src++;
47629
        v_block_size = t_0;
47630
      }
47631
      if (v_block_size == 0u) {
47632
        status = wuffs_base__make_status(NULL);
47633
        goto ok;
47634
      }
47635
      if (v_block_size != 11u) {
47636
        self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
47637
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47638
        if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47639
          self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47640
          iop_a_src = io2_a_src;
47641
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47642
          goto suspend;
47643
        }
47644
        iop_a_src += self->private_data.s_decode_ae.scratch;
47645
        break;
47646
      }
47647
      v_is_animexts = true;
47648
      v_is_netscape = true;
47649
      v_is_iccp = true;
47650
      v_is_xmp = true;
47651
      v_block_size = 0u;
47652
      while (v_block_size < 11u) {
47653
        {
47654
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47655
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47656
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47657
            goto suspend;
47658
          }
47659
          uint8_t t_1 = *iop_a_src++;
47660
          v_c8 = t_1;
47661
        }
47662
        v_is_animexts = (v_is_animexts && (v_c8 == WUFFS_GIF__ANIMEXTS1DOT0[v_block_size]));
47663
        v_is_netscape = (v_is_netscape && (v_c8 == WUFFS_GIF__NETSCAPE2DOT0[v_block_size]));
47664
        v_is_iccp = (v_is_iccp && (v_c8 == WUFFS_GIF__ICCRGBG1012[v_block_size]));
47665
        v_is_xmp = (v_is_xmp && (v_c8 == WUFFS_GIF__XMPDATAXMP[v_block_size]));
47666
#if defined(__GNUC__)
47667
#pragma GCC diagnostic push
47668
#pragma GCC diagnostic ignored "-Wconversion"
47669
#endif
47670
        v_block_size += 1u;
47671
#if defined(__GNUC__)
47672
#pragma GCC diagnostic pop
47673
#endif
47674
      }
47675
      if (v_is_animexts || v_is_netscape) {
47676
        {
47677
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47678
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47679
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47680
            goto suspend;
47681
          }
47682
          uint8_t t_2 = *iop_a_src++;
47683
          v_block_size = t_2;
47684
        }
47685
        if (v_block_size != 3u) {
47686
          self->private_data.s_decode_ae.scratch = ((uint32_t)(v_block_size));
47687
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
47688
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47689
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47690
            iop_a_src = io2_a_src;
47691
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47692
            goto suspend;
47693
          }
47694
          iop_a_src += self->private_data.s_decode_ae.scratch;
47695
          break;
47696
        }
47697
        {
47698
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
47699
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47700
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47701
            goto suspend;
47702
          }
47703
          uint8_t t_3 = *iop_a_src++;
47704
          v_c8 = t_3;
47705
        }
47706
        if (v_c8 != 1u) {
47707
          self->private_data.s_decode_ae.scratch = 2u;
47708
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
47709
          if (self->private_data.s_decode_ae.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
47710
            self->private_data.s_decode_ae.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
47711
            iop_a_src = io2_a_src;
47712
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47713
            goto suspend;
47714
          }
47715
          iop_a_src += self->private_data.s_decode_ae.scratch;
47716
          break;
47717
        }
47718
        {
47719
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
47720
          uint32_t t_4;
47721
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47722
            t_4 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
47723
            iop_a_src += 2;
47724
          } else {
47725
            self->private_data.s_decode_ae.scratch = 0;
47726
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
47727
            while (true) {
47728
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47729
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47730
                goto suspend;
47731
              }
47732
              uint64_t* scratch = &self->private_data.s_decode_ae.scratch;
47733
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
47734
              *scratch <<= 8;
47735
              *scratch >>= 8;
47736
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
47737
              if (num_bits_4 == 8) {
47738
                t_4 = ((uint32_t)(*scratch));
47739
                break;
47740
              }
47741
              num_bits_4 += 8u;
47742
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
47743
            }
47744
          }
47745
          self->private_impl.f_num_animation_loops_value = t_4;
47746
        }
47747
        self->private_impl.f_seen_num_animation_loops_value = true;
47748
        if ((0u < self->private_impl.f_num_animation_loops_value) && (self->private_impl.f_num_animation_loops_value <= 65535u)) {
47749
          self->private_impl.f_num_animation_loops_value += 1u;
47750
        }
47751
      } else if (self->private_impl.f_call_sequence >= 32u) {
47752
      } else if (v_is_iccp && self->private_impl.f_report_metadata_iccp) {
47753
        self->private_impl.f_metadata_fourcc = 1229144912u;
47754
        self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)));
47755
        self->private_impl.f_call_sequence = 16u;
47756
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
47757
        goto ok;
47758
      } else if (v_is_xmp && self->private_impl.f_report_metadata_xmp) {
47759
        self->private_impl.f_metadata_fourcc = 1481461792u;
47760
        self->private_impl.f_metadata_io_position = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)));
47761
        self->private_impl.f_call_sequence = 16u;
47762
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
47763
        goto ok;
47764
      }
47765
    } while (0);
47766
    if (a_src) {
47767
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47768
    }
47769
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
47770
    status = wuffs_gif__decoder__skip_blocks(self, a_src);
47771
    if (a_src) {
47772
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
47773
    }
47774
    if (status.repr) {
47775
      goto suspend;
47776
    }
47777
47778
    ok:
47779
    self->private_impl.p_decode_ae = 0;
47780
    goto exit;
47781
  }
47782
47783
  goto suspend;
47784
  suspend:
47785
  self->private_impl.p_decode_ae = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47786
  self->private_data.s_decode_ae.v_block_size = v_block_size;
47787
  self->private_data.s_decode_ae.v_is_animexts = v_is_animexts;
47788
  self->private_data.s_decode_ae.v_is_netscape = v_is_netscape;
47789
  self->private_data.s_decode_ae.v_is_iccp = v_is_iccp;
47790
  self->private_data.s_decode_ae.v_is_xmp = v_is_xmp;
47791
47792
  goto exit;
47793
  exit:
47794
  if (a_src && a_src->data.ptr) {
47795
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47796
  }
47797
47798
  return status;
47799
}
47800
47801
// -------- func gif.decoder.decode_gc
47802
47803
WUFFS_BASE__GENERATED_C_CODE
47804
static wuffs_base__status
47805
wuffs_gif__decoder__decode_gc(
47806
    wuffs_gif__decoder* self,
47807
    wuffs_base__io_buffer* a_src) {
47808
  wuffs_base__status status = wuffs_base__make_status(NULL);
47809
47810
  uint8_t v_c8 = 0;
47811
  uint8_t v_flags = 0;
47812
  uint16_t v_gc_duration_centiseconds = 0;
47813
47814
  const uint8_t* iop_a_src = NULL;
47815
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47816
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47817
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47818
  if (a_src && a_src->data.ptr) {
47819
    io0_a_src = a_src->data.ptr;
47820
    io1_a_src = io0_a_src + a_src->meta.ri;
47821
    iop_a_src = io1_a_src;
47822
    io2_a_src = io0_a_src + a_src->meta.wi;
47823
  }
47824
47825
  uint32_t coro_susp_point = self->private_impl.p_decode_gc;
47826
  switch (coro_susp_point) {
47827
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47828
47829
    {
47830
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47831
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47832
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47833
        goto suspend;
47834
      }
47835
      uint8_t t_0 = *iop_a_src++;
47836
      v_c8 = t_0;
47837
    }
47838
    if (v_c8 != 4u) {
47839
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
47840
      goto exit;
47841
    }
47842
    {
47843
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47844
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47845
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47846
        goto suspend;
47847
      }
47848
      uint8_t t_1 = *iop_a_src++;
47849
      v_flags = t_1;
47850
    }
47851
    self->private_impl.f_gc_has_transparent_index = (((uint8_t)(v_flags & 1u)) != 0u);
47852
    v_flags = ((uint8_t)(((uint8_t)(v_flags >> 2u)) & 7u));
47853
    if (v_flags == 2u) {
47854
      self->private_impl.f_gc_disposal = 1u;
47855
    } else if ((v_flags == 3u) || (v_flags == 4u)) {
47856
      self->private_impl.f_gc_disposal = 2u;
47857
    } else {
47858
      self->private_impl.f_gc_disposal = 0u;
47859
    }
47860
    {
47861
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47862
      uint16_t t_2;
47863
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47864
        t_2 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
47865
        iop_a_src += 2;
47866
      } else {
47867
        self->private_data.s_decode_gc.scratch = 0;
47868
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47869
        while (true) {
47870
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47871
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47872
            goto suspend;
47873
          }
47874
          uint64_t* scratch = &self->private_data.s_decode_gc.scratch;
47875
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
47876
          *scratch <<= 8;
47877
          *scratch >>= 8;
47878
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
47879
          if (num_bits_2 == 8) {
47880
            t_2 = ((uint16_t)(*scratch));
47881
            break;
47882
          }
47883
          num_bits_2 += 8u;
47884
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
47885
        }
47886
      }
47887
      v_gc_duration_centiseconds = t_2;
47888
    }
47889
    self->private_impl.f_gc_duration = (((uint64_t)(v_gc_duration_centiseconds)) * 7056000u);
47890
    {
47891
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
47892
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47893
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47894
        goto suspend;
47895
      }
47896
      uint8_t t_3 = *iop_a_src++;
47897
      self->private_impl.f_gc_transparent_index = t_3;
47898
    }
47899
    {
47900
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
47901
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47902
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47903
        goto suspend;
47904
      }
47905
      uint8_t t_4 = *iop_a_src++;
47906
      v_c8 = t_4;
47907
    }
47908
    if (v_c8 != 0u) {
47909
      status = wuffs_base__make_status(wuffs_gif__error__bad_graphic_control);
47910
      goto exit;
47911
    }
47912
47913
    goto ok;
47914
    ok:
47915
    self->private_impl.p_decode_gc = 0;
47916
    goto exit;
47917
  }
47918
47919
  goto suspend;
47920
  suspend:
47921
  self->private_impl.p_decode_gc = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
47922
47923
  goto exit;
47924
  exit:
47925
  if (a_src && a_src->data.ptr) {
47926
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
47927
  }
47928
47929
  return status;
47930
}
47931
47932
// -------- func gif.decoder.decode_id_part0
47933
47934
WUFFS_BASE__GENERATED_C_CODE
47935
static wuffs_base__status
47936
wuffs_gif__decoder__decode_id_part0(
47937
    wuffs_gif__decoder* self,
47938
    wuffs_base__io_buffer* a_src) {
47939
  wuffs_base__status status = wuffs_base__make_status(NULL);
47940
47941
  const uint8_t* iop_a_src = NULL;
47942
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47943
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47944
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
47945
  if (a_src && a_src->data.ptr) {
47946
    io0_a_src = a_src->data.ptr;
47947
    io1_a_src = io0_a_src + a_src->meta.ri;
47948
    iop_a_src = io1_a_src;
47949
    io2_a_src = io0_a_src + a_src->meta.wi;
47950
  }
47951
47952
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part0;
47953
  switch (coro_susp_point) {
47954
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
47955
47956
    {
47957
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
47958
      uint32_t t_0;
47959
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47960
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
47961
        iop_a_src += 2;
47962
      } else {
47963
        self->private_data.s_decode_id_part0.scratch = 0;
47964
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
47965
        while (true) {
47966
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47967
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47968
            goto suspend;
47969
          }
47970
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
47971
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
47972
          *scratch <<= 8;
47973
          *scratch >>= 8;
47974
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
47975
          if (num_bits_0 == 8) {
47976
            t_0 = ((uint32_t)(*scratch));
47977
            break;
47978
          }
47979
          num_bits_0 += 8u;
47980
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
47981
        }
47982
      }
47983
      self->private_impl.f_frame_rect_x0 = t_0;
47984
    }
47985
    {
47986
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
47987
      uint32_t t_1;
47988
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
47989
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
47990
        iop_a_src += 2;
47991
      } else {
47992
        self->private_data.s_decode_id_part0.scratch = 0;
47993
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
47994
        while (true) {
47995
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
47996
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
47997
            goto suspend;
47998
          }
47999
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48000
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
48001
          *scratch <<= 8;
48002
          *scratch >>= 8;
48003
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
48004
          if (num_bits_1 == 8) {
48005
            t_1 = ((uint32_t)(*scratch));
48006
            break;
48007
          }
48008
          num_bits_1 += 8u;
48009
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
48010
        }
48011
      }
48012
      self->private_impl.f_frame_rect_y0 = t_1;
48013
    }
48014
    {
48015
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48016
      uint32_t t_2;
48017
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48018
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48019
        iop_a_src += 2;
48020
      } else {
48021
        self->private_data.s_decode_id_part0.scratch = 0;
48022
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48023
        while (true) {
48024
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48025
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48026
            goto suspend;
48027
          }
48028
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48029
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
48030
          *scratch <<= 8;
48031
          *scratch >>= 8;
48032
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
48033
          if (num_bits_2 == 8) {
48034
            t_2 = ((uint32_t)(*scratch));
48035
            break;
48036
          }
48037
          num_bits_2 += 8u;
48038
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
48039
        }
48040
      }
48041
      self->private_impl.f_frame_rect_x1 = t_2;
48042
    }
48043
    self->private_impl.f_frame_rect_x1 += self->private_impl.f_frame_rect_x0;
48044
    {
48045
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
48046
      uint32_t t_3;
48047
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
48048
        t_3 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
48049
        iop_a_src += 2;
48050
      } else {
48051
        self->private_data.s_decode_id_part0.scratch = 0;
48052
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
48053
        while (true) {
48054
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48055
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48056
            goto suspend;
48057
          }
48058
          uint64_t* scratch = &self->private_data.s_decode_id_part0.scratch;
48059
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
48060
          *scratch <<= 8;
48061
          *scratch >>= 8;
48062
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
48063
          if (num_bits_3 == 8) {
48064
            t_3 = ((uint32_t)(*scratch));
48065
            break;
48066
          }
48067
          num_bits_3 += 8u;
48068
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
48069
        }
48070
      }
48071
      self->private_impl.f_frame_rect_y1 = t_3;
48072
    }
48073
    self->private_impl.f_frame_rect_y1 += self->private_impl.f_frame_rect_y0;
48074
    self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
48075
    self->private_impl.f_dst_y = self->private_impl.f_frame_rect_y0;
48076
    if ((self->private_impl.f_num_decoded_frame_configs_value == 0u) &&  ! self->private_impl.f_quirks[4u]) {
48077
      self->private_impl.f_width = wuffs_base__u32__max(self->private_impl.f_width, self->private_impl.f_frame_rect_x1);
48078
      self->private_impl.f_height = wuffs_base__u32__max(self->private_impl.f_height, self->private_impl.f_frame_rect_y1);
48079
    }
48080
48081
    goto ok;
48082
    ok:
48083
    self->private_impl.p_decode_id_part0 = 0;
48084
    goto exit;
48085
  }
48086
48087
  goto suspend;
48088
  suspend:
48089
  self->private_impl.p_decode_id_part0 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48090
48091
  goto exit;
48092
  exit:
48093
  if (a_src && a_src->data.ptr) {
48094
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48095
  }
48096
48097
  return status;
48098
}
48099
48100
// -------- func gif.decoder.decode_id_part1
48101
48102
WUFFS_BASE__GENERATED_C_CODE
48103
static wuffs_base__status
48104
wuffs_gif__decoder__decode_id_part1(
48105
    wuffs_gif__decoder* self,
48106
    wuffs_base__pixel_buffer* a_dst,
48107
    wuffs_base__io_buffer* a_src,
48108
    wuffs_base__pixel_blend a_blend) {
48109
  wuffs_base__status status = wuffs_base__make_status(NULL);
48110
48111
  uint8_t v_flags = 0;
48112
  uint8_t v_which_palette = 0;
48113
  uint32_t v_num_palette_entries = 0;
48114
  uint32_t v_i = 0;
48115
  uint32_t v_argb = 0;
48116
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
48117
  uint8_t v_lw = 0;
48118
48119
  const uint8_t* iop_a_src = NULL;
48120
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48121
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48122
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48123
  if (a_src && a_src->data.ptr) {
48124
    io0_a_src = a_src->data.ptr;
48125
    io1_a_src = io0_a_src + a_src->meta.ri;
48126
    iop_a_src = io1_a_src;
48127
    io2_a_src = io0_a_src + a_src->meta.wi;
48128
  }
48129
48130
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part1;
48131
  if (coro_susp_point) {
48132
    v_which_palette = self->private_data.s_decode_id_part1.v_which_palette;
48133
    v_num_palette_entries = self->private_data.s_decode_id_part1.v_num_palette_entries;
48134
    v_i = self->private_data.s_decode_id_part1.v_i;
48135
  }
48136
  switch (coro_susp_point) {
48137
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48138
48139
    {
48140
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48141
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48142
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48143
        goto suspend;
48144
      }
48145
      uint8_t t_0 = *iop_a_src++;
48146
      v_flags = t_0;
48147
    }
48148
    if (((uint8_t)(v_flags & 64u)) != 0u) {
48149
      self->private_impl.f_interlace = 4u;
48150
    } else {
48151
      self->private_impl.f_interlace = 0u;
48152
    }
48153
    v_which_palette = 1u;
48154
    if (((uint8_t)(v_flags & 128u)) != 0u) {
48155
      v_num_palette_entries = (((uint32_t)(1u)) << ((uint8_t)(1u + ((uint8_t)(v_flags & 7u)))));
48156
      v_i = 0u;
48157
      while (v_i < v_num_palette_entries) {
48158
        {
48159
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
48160
          uint32_t t_1;
48161
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
48162
            t_1 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
48163
            iop_a_src += 3;
48164
          } else {
48165
            self->private_data.s_decode_id_part1.scratch = 0;
48166
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48167
            while (true) {
48168
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48169
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48170
                goto suspend;
48171
              }
48172
              uint64_t* scratch = &self->private_data.s_decode_id_part1.scratch;
48173
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
48174
              *scratch >>= 8;
48175
              *scratch <<= 8;
48176
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
48177
              if (num_bits_1 == 16) {
48178
                t_1 = ((uint32_t)(*scratch >> 40));
48179
                break;
48180
              }
48181
              num_bits_1 += 8u;
48182
              *scratch |= ((uint64_t)(num_bits_1));
48183
            }
48184
          }
48185
          v_argb = t_1;
48186
        }
48187
        v_argb |= 4278190080u;
48188
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
48189
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
48190
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
48191
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
48192
        v_i += 1u;
48193
      }
48194
      while (v_i < 256u) {
48195
        self->private_data.f_palettes[1u][((4u * v_i) + 0u)] = 0u;
48196
        self->private_data.f_palettes[1u][((4u * v_i) + 1u)] = 0u;
48197
        self->private_data.f_palettes[1u][((4u * v_i) + 2u)] = 0u;
48198
        self->private_data.f_palettes[1u][((4u * v_i) + 3u)] = 255u;
48199
        v_i += 1u;
48200
      }
48201
    } else if (self->private_impl.f_quirks[6u] &&  ! self->private_impl.f_has_global_palette) {
48202
      status = wuffs_base__make_status(wuffs_gif__error__bad_palette);
48203
      goto exit;
48204
    } else if (self->private_impl.f_gc_has_transparent_index) {
48205
      wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_palettes[1u], 1024), wuffs_base__make_slice_u8(self->private_data.f_palettes[0u], 1024));
48206
    } else {
48207
      v_which_palette = 0u;
48208
    }
48209
    if (self->private_impl.f_gc_has_transparent_index) {
48210
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 0u)] = 0u;
48211
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 1u)] = 0u;
48212
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 2u)] = 0u;
48213
      self->private_data.f_palettes[1u][((4u * ((uint32_t)(self->private_impl.f_gc_transparent_index))) + 3u)] = 0u;
48214
    }
48215
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
48216
        wuffs_base__pixel_buffer__pixel_format(a_dst),
48217
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
48218
        wuffs_base__utility__make_pixel_format(2198077448u),
48219
        wuffs_base__make_slice_u8(self->private_data.f_palettes[v_which_palette], 1024),
48220
        a_blend);
48221
    if ( ! wuffs_base__status__is_ok(&v_status)) {
48222
      status = v_status;
48223
      if (wuffs_base__status__is_error(&status)) {
48224
        goto exit;
48225
      } else if (wuffs_base__status__is_suspension(&status)) {
48226
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
48227
        goto exit;
48228
      }
48229
      goto ok;
48230
    }
48231
    if (self->private_impl.f_ignored_but_affects_benchmarks) {
48232
    }
48233
    {
48234
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48235
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48236
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48237
        goto suspend;
48238
      }
48239
      uint8_t t_2 = *iop_a_src++;
48240
      v_lw = t_2;
48241
    }
48242
    if (v_lw > 8u) {
48243
      status = wuffs_base__make_status(wuffs_gif__error__bad_literal_width);
48244
      goto exit;
48245
    }
48246
    self->private_impl.f_lzw_pending_literal_width_plus_one = ((uint32_t)(((uint8_t)(1u + v_lw))));
48247
    self->private_impl.f_ignored_but_affects_benchmarks = true;
48248
48249
    ok:
48250
    self->private_impl.p_decode_id_part1 = 0;
48251
    goto exit;
48252
  }
48253
48254
  goto suspend;
48255
  suspend:
48256
  self->private_impl.p_decode_id_part1 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48257
  self->private_data.s_decode_id_part1.v_which_palette = v_which_palette;
48258
  self->private_data.s_decode_id_part1.v_num_palette_entries = v_num_palette_entries;
48259
  self->private_data.s_decode_id_part1.v_i = v_i;
48260
48261
  goto exit;
48262
  exit:
48263
  if (a_src && a_src->data.ptr) {
48264
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48265
  }
48266
48267
  return status;
48268
}
48269
48270
// -------- func gif.decoder.decode_id_part2
48271
48272
WUFFS_BASE__GENERATED_C_CODE
48273
static wuffs_base__status
48274
wuffs_gif__decoder__decode_id_part2(
48275
    wuffs_gif__decoder* self,
48276
    wuffs_base__pixel_buffer* a_dst,
48277
    wuffs_base__io_buffer* a_src,
48278
    wuffs_base__slice_u8 a_workbuf) {
48279
  wuffs_base__status status = wuffs_base__make_status(NULL);
48280
48281
  uint64_t v_block_size = 0;
48282
  bool v_need_block_size = false;
48283
  uint32_t v_n_copied = 0;
48284
  uint64_t v_n_compressed = 0;
48285
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
48286
  wuffs_base__io_buffer* v_r = &u_r;
48287
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48288
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48289
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48290
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48291
  uint64_t v_mark = 0;
48292
  wuffs_base__status v_copy_status = wuffs_base__make_status(NULL);
48293
48294
  const uint8_t* iop_a_src = NULL;
48295
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48296
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48297
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48298
  if (a_src && a_src->data.ptr) {
48299
    io0_a_src = a_src->data.ptr;
48300
    io1_a_src = io0_a_src + a_src->meta.ri;
48301
    iop_a_src = io1_a_src;
48302
    io2_a_src = io0_a_src + a_src->meta.wi;
48303
  }
48304
48305
  uint32_t coro_susp_point = self->private_impl.p_decode_id_part2;
48306
  if (coro_susp_point) {
48307
    v_block_size = self->private_data.s_decode_id_part2.v_block_size;
48308
    v_need_block_size = self->private_data.s_decode_id_part2.v_need_block_size;
48309
  }
48310
  switch (coro_susp_point) {
48311
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
48312
48313
    wuffs_gif__decoder__lzw_init(self);
48314
    v_need_block_size = true;
48315
    label__outer__continue:;
48316
    while (true) {
48317
      if (v_need_block_size) {
48318
        v_need_block_size = false;
48319
        {
48320
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
48321
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
48322
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48323
            goto suspend;
48324
          }
48325
          uint64_t t_0 = *iop_a_src++;
48326
          v_block_size = t_0;
48327
        }
48328
      }
48329
      if (v_block_size == 0u) {
48330
        break;
48331
      }
48332
      while (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
48333
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48334
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
48335
      }
48336
      if (self->private_impl.f_compressed_ri == self->private_impl.f_compressed_wi) {
48337
        self->private_impl.f_compressed_ri = 0u;
48338
        self->private_impl.f_compressed_wi = 0u;
48339
      }
48340
      while (self->private_impl.f_compressed_wi <= 3841u) {
48341
        v_n_compressed = wuffs_base__u64__min(v_block_size, ((uint64_t)(io2_a_src - iop_a_src)));
48342
        if (v_n_compressed <= 0u) {
48343
          break;
48344
        }
48345
        v_n_copied = wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
48346
            &iop_a_src, io2_a_src,((uint32_t)(v_n_compressed)), wuffs_base__make_slice_u8_ij(self->private_data.f_compressed, self->private_impl.f_compressed_wi, 4096));
48347
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_wi, ((uint64_t)(v_n_copied)));
48348
        wuffs_private_impl__u64__sat_sub_indirect(&v_block_size, ((uint64_t)(v_n_copied)));
48349
        if (v_block_size > 0u) {
48350
          break;
48351
        }
48352
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
48353
          v_need_block_size = true;
48354
          break;
48355
        }
48356
        v_block_size = ((uint64_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src)));
48357
        iop_a_src += 1u;
48358
      }
48359
      while (true) {
48360
        if ((self->private_impl.f_compressed_ri > self->private_impl.f_compressed_wi) || (self->private_impl.f_compressed_wi > 4096u)) {
48361
          status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
48362
          goto exit;
48363
        }
48364
        {
48365
          wuffs_base__io_buffer* o_0_v_r = v_r;
48366
          const uint8_t* o_0_iop_v_r = iop_v_r;
48367
          const uint8_t* o_0_io0_v_r = io0_v_r;
48368
          const uint8_t* o_0_io1_v_r = io1_v_r;
48369
          const uint8_t* o_0_io2_v_r = io2_v_r;
48370
          v_r = wuffs_private_impl__io_reader__set(
48371
              &u_r,
48372
              &iop_v_r,
48373
              &io0_v_r,
48374
              &io1_v_r,
48375
              &io2_v_r,
48376
              wuffs_base__make_slice_u8_ij(self->private_data.f_compressed,
48377
              self->private_impl.f_compressed_ri,
48378
              self->private_impl.f_compressed_wi),
48379
              0u);
48380
          v_mark = ((uint64_t)(iop_v_r - io0_v_r));
48381
          u_r.meta.ri = ((size_t)(iop_v_r - u_r.data.ptr));
48382
          wuffs_gif__decoder__lzw_read_from(self, v_r);
48383
          iop_v_r = u_r.data.ptr + u_r.meta.ri;
48384
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_ri, wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_v_r - io0_v_r))));
48385
          v_r = o_0_v_r;
48386
          iop_v_r = o_0_iop_v_r;
48387
          io0_v_r = o_0_io0_v_r;
48388
          io1_v_r = o_0_io1_v_r;
48389
          io2_v_r = o_0_io2_v_r;
48390
        }
48391
        if (self->private_impl.f_lzw_output_ri < self->private_impl.f_lzw_output_wi) {
48392
          v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(self, a_dst, wuffs_base__make_slice_u8_ij(self->private_data.f_lzw_output,
48393
              self->private_impl.f_lzw_output_ri,
48394
              self->private_impl.f_lzw_output_wi));
48395
          if (wuffs_base__status__is_error(&v_copy_status)) {
48396
            status = v_copy_status;
48397
            goto exit;
48398
          }
48399
          self->private_impl.f_lzw_output_ri = 0u;
48400
          self->private_impl.f_lzw_output_wi = 0u;
48401
        }
48402
        if (self->private_impl.f_lzw_read_from_return_value == 0u) {
48403
          self->private_impl.f_ignored_but_affects_benchmarks = false;
48404
          if (v_need_block_size || (v_block_size > 0u)) {
48405
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
48406
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
48407
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48408
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48409
              iop_a_src = io2_a_src;
48410
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48411
              goto suspend;
48412
            }
48413
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
48414
            if (a_src) {
48415
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48416
            }
48417
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
48418
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
48419
            if (a_src) {
48420
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
48421
            }
48422
            if (status.repr) {
48423
              goto suspend;
48424
            }
48425
          }
48426
          goto label__outer__break;
48427
        } else if (self->private_impl.f_lzw_read_from_return_value == 1u) {
48428
          continue;
48429
        } else if (self->private_impl.f_lzw_read_from_return_value == 2u) {
48430
          goto label__outer__continue;
48431
        } else if (self->private_impl.f_quirks[3u] && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) && (self->private_impl.f_interlace == 0u)) {
48432
          if (v_need_block_size || (v_block_size > 0u)) {
48433
            self->private_data.s_decode_id_part2.scratch = ((uint32_t)(v_block_size));
48434
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
48435
            if (self->private_data.s_decode_id_part2.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
48436
              self->private_data.s_decode_id_part2.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
48437
              iop_a_src = io2_a_src;
48438
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
48439
              goto suspend;
48440
            }
48441
            iop_a_src += self->private_data.s_decode_id_part2.scratch;
48442
            if (a_src) {
48443
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48444
            }
48445
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
48446
            status = wuffs_gif__decoder__skip_blocks(self, a_src);
48447
            if (a_src) {
48448
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
48449
            }
48450
            if (status.repr) {
48451
              goto suspend;
48452
            }
48453
          }
48454
          goto label__outer__break;
48455
        } else if (self->private_impl.f_lzw_read_from_return_value == 3u) {
48456
          status = wuffs_base__make_status(wuffs_gif__error__truncated_input);
48457
          goto exit;
48458
        } else if (self->private_impl.f_lzw_read_from_return_value == 4u) {
48459
          status = wuffs_base__make_status(wuffs_gif__error__bad_lzw_code);
48460
          goto exit;
48461
        }
48462
        status = wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
48463
        goto exit;
48464
      }
48465
    }
48466
    label__outer__break:;
48467
    self->private_impl.f_compressed_ri = 0u;
48468
    self->private_impl.f_compressed_wi = 0u;
48469
    if ((self->private_impl.f_dst_y < self->private_impl.f_frame_rect_y1) && (self->private_impl.f_frame_rect_x0 != self->private_impl.f_frame_rect_x1) && (self->private_impl.f_frame_rect_y0 != self->private_impl.f_frame_rect_y1)) {
48470
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
48471
      goto exit;
48472
    }
48473
48474
    ok:
48475
    self->private_impl.p_decode_id_part2 = 0;
48476
    goto exit;
48477
  }
48478
48479
  goto suspend;
48480
  suspend:
48481
  self->private_impl.p_decode_id_part2 = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
48482
  self->private_data.s_decode_id_part2.v_block_size = v_block_size;
48483
  self->private_data.s_decode_id_part2.v_need_block_size = v_need_block_size;
48484
48485
  goto exit;
48486
  exit:
48487
  if (a_src && a_src->data.ptr) {
48488
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48489
  }
48490
48491
  return status;
48492
}
48493
48494
// -------- func gif.decoder.copy_to_image_buffer
48495
48496
WUFFS_BASE__GENERATED_C_CODE
48497
static wuffs_base__status
48498
wuffs_gif__decoder__copy_to_image_buffer(
48499
    wuffs_gif__decoder* self,
48500
    wuffs_base__pixel_buffer* a_pb,
48501
    wuffs_base__slice_u8 a_src) {
48502
  wuffs_base__slice_u8 v_dst = {0};
48503
  wuffs_base__slice_u8 v_src = {0};
48504
  uint64_t v_width_in_bytes = 0;
48505
  uint64_t v_n = 0;
48506
  uint64_t v_src_ri = 0;
48507
  wuffs_base__pixel_format v_pixfmt = {0};
48508
  uint32_t v_bytes_per_pixel = 0;
48509
  uint32_t v_bits_per_pixel = 0;
48510
  wuffs_base__table_u8 v_tab = {0};
48511
  uint64_t v_i = 0;
48512
  uint64_t v_j = 0;
48513
  uint32_t v_replicate_y0 = 0;
48514
  uint32_t v_replicate_y1 = 0;
48515
  wuffs_base__slice_u8 v_replicate_dst = {0};
48516
  wuffs_base__slice_u8 v_replicate_src = {0};
48517
48518
  v_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_pb);
48519
  v_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_pixfmt);
48520
  if ((v_bits_per_pixel & 7u) != 0u) {
48521
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
48522
  }
48523
  v_bytes_per_pixel = (v_bits_per_pixel >> 3u);
48524
  v_width_in_bytes = ((uint64_t)((self->private_impl.f_width * v_bytes_per_pixel)));
48525
  v_tab = wuffs_base__pixel_buffer__plane(a_pb, 0u);
48526
  while (v_src_ri < ((uint64_t)(a_src.len))) {
48527
    v_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_ri);
48528
    if (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1) {
48529
      if (self->private_impl.f_quirks[3u]) {
48530
        return wuffs_base__make_status(NULL);
48531
      }
48532
      return wuffs_base__make_status(wuffs_base__error__too_much_data);
48533
    }
48534
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
48535
    if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
48536
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, 0u);
48537
    } else if (v_width_in_bytes < ((uint64_t)(v_dst.len))) {
48538
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_width_in_bytes);
48539
    }
48540
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_bytes_per_pixel)));
48541
    if (v_i < ((uint64_t)(v_dst.len))) {
48542
      v_j = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * ((uint64_t)(v_bytes_per_pixel)));
48543
      if ((v_i <= v_j) && (v_j <= ((uint64_t)(v_dst.len)))) {
48544
        v_dst = wuffs_base__slice_u8__subslice_ij(v_dst, v_i, v_j);
48545
      } else {
48546
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
48547
      }
48548
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024), v_src);
48549
      wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
48550
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
48551
      self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u));
48552
    }
48553
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
48554
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
48555
      if (self->private_impl.f_interlace == 0u) {
48556
        wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, 1u);
48557
        continue;
48558
      }
48559
      if ((self->private_impl.f_num_decoded_frames_value == 0u) &&  ! self->private_impl.f_gc_has_transparent_index && (self->private_impl.f_interlace > 1u)) {
48560
        v_replicate_src = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
48561
        v_replicate_y0 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, 1u);
48562
        v_replicate_y1 = wuffs_base__u32__sat_add(self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_COUNT[self->private_impl.f_interlace])));
48563
        v_replicate_y1 = wuffs_base__u32__min(v_replicate_y1, self->private_impl.f_frame_rect_y1);
48564
        while (v_replicate_y0 < v_replicate_y1) {
48565
          v_replicate_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_replicate_y0);
48566
          wuffs_private_impl__slice_u8__copy_from_slice(v_replicate_dst, v_replicate_src);
48567
          v_replicate_y0 += 1u;
48568
        }
48569
        self->private_impl.f_dirty_max_excl_y = wuffs_base__u32__max(self->private_impl.f_dirty_max_excl_y, v_replicate_y1);
48570
      }
48571
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
48572
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
48573
#if defined(__GNUC__)
48574
#pragma GCC diagnostic push
48575
#pragma GCC diagnostic ignored "-Wconversion"
48576
#endif
48577
        self->private_impl.f_interlace -= 1u;
48578
#if defined(__GNUC__)
48579
#pragma GCC diagnostic pop
48580
#endif
48581
        self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]);
48582
      }
48583
      continue;
48584
    }
48585
    if (((uint64_t)(a_src.len)) == v_src_ri) {
48586
      break;
48587
    } else if (((uint64_t)(a_src.len)) < v_src_ri) {
48588
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
48589
    }
48590
    v_n = ((uint64_t)((self->private_impl.f_frame_rect_x1 - self->private_impl.f_dst_x)));
48591
    v_n = wuffs_base__u64__min(v_n, (((uint64_t)(a_src.len)) - v_src_ri));
48592
    wuffs_private_impl__u64__sat_add_indirect(&v_src_ri, v_n);
48593
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
48594
    if (self->private_impl.f_frame_rect_x1 <= self->private_impl.f_dst_x) {
48595
      self->private_impl.f_dst_x = self->private_impl.f_frame_rect_x0;
48596
      wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_y, ((uint32_t)(WUFFS_GIF__INTERLACE_DELTA[self->private_impl.f_interlace])));
48597
      while ((self->private_impl.f_interlace > 0u) && (self->private_impl.f_dst_y >= self->private_impl.f_frame_rect_y1)) {
48598
#if defined(__GNUC__)
48599
#pragma GCC diagnostic push
48600
#pragma GCC diagnostic ignored "-Wconversion"
48601
#endif
48602
        self->private_impl.f_interlace -= 1u;
48603
#if defined(__GNUC__)
48604
#pragma GCC diagnostic pop
48605
#endif
48606
        self->private_impl.f_dst_y = wuffs_base__u32__sat_add(self->private_impl.f_frame_rect_y0, WUFFS_GIF__INTERLACE_START[self->private_impl.f_interlace]);
48607
      }
48608
      continue;
48609
    }
48610
    if (v_src_ri != ((uint64_t)(a_src.len))) {
48611
      return wuffs_base__make_status(wuffs_gif__error__internal_error_inconsistent_i_o);
48612
    }
48613
    break;
48614
  }
48615
  return wuffs_base__make_status(NULL);
48616
}
48617
48618
// -------- func gif.decoder.lzw_init
48619
48620
WUFFS_BASE__GENERATED_C_CODE
48621
static wuffs_base__empty_struct
48622
wuffs_gif__decoder__lzw_init(
48623
    wuffs_gif__decoder* self) {
48624
  uint32_t v_i = 0;
48625
48626
  self->private_impl.f_lzw_literal_width = 8u;
48627
  if (self->private_impl.f_lzw_pending_literal_width_plus_one > 0u) {
48628
    self->private_impl.f_lzw_literal_width = (self->private_impl.f_lzw_pending_literal_width_plus_one - 1u);
48629
  }
48630
  self->private_impl.f_lzw_clear_code = (((uint32_t)(1u)) << self->private_impl.f_lzw_literal_width);
48631
  self->private_impl.f_lzw_end_code = (self->private_impl.f_lzw_clear_code + 1u);
48632
  self->private_impl.f_lzw_save_code = self->private_impl.f_lzw_end_code;
48633
  self->private_impl.f_lzw_prev_code = self->private_impl.f_lzw_end_code;
48634
  self->private_impl.f_lzw_width = (self->private_impl.f_lzw_literal_width + 1u);
48635
  self->private_impl.f_lzw_bits = 0u;
48636
  self->private_impl.f_lzw_n_bits = 0u;
48637
  self->private_impl.f_lzw_output_ri = 0u;
48638
  self->private_impl.f_lzw_output_wi = 0u;
48639
  v_i = 0u;
48640
  while (v_i < self->private_impl.f_lzw_clear_code) {
48641
    self->private_data.f_lzw_lm1s[v_i] = 0u;
48642
    self->private_data.f_lzw_suffixes[v_i][0u] = ((uint8_t)(v_i));
48643
    v_i += 1u;
48644
  }
48645
  return wuffs_base__make_empty_struct();
48646
}
48647
48648
// -------- func gif.decoder.lzw_read_from
48649
48650
WUFFS_BASE__GENERATED_C_CODE
48651
static wuffs_base__empty_struct
48652
wuffs_gif__decoder__lzw_read_from(
48653
    wuffs_gif__decoder* self,
48654
    wuffs_base__io_buffer* a_src) {
48655
  uint32_t v_clear_code = 0;
48656
  uint32_t v_end_code = 0;
48657
  uint32_t v_save_code = 0;
48658
  uint32_t v_prev_code = 0;
48659
  uint32_t v_width = 0;
48660
  uint32_t v_bits = 0;
48661
  uint32_t v_n_bits = 0;
48662
  uint32_t v_output_wi = 0;
48663
  uint32_t v_code = 0;
48664
  uint32_t v_c = 0;
48665
  uint32_t v_o = 0;
48666
  uint32_t v_steps = 0;
48667
  uint8_t v_first_byte = 0;
48668
  uint16_t v_lm1_b = 0;
48669
  uint16_t v_lm1_a = 0;
48670
48671
  const uint8_t* iop_a_src = NULL;
48672
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48673
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48674
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
48675
  if (a_src && a_src->data.ptr) {
48676
    io0_a_src = a_src->data.ptr;
48677
    io1_a_src = io0_a_src + a_src->meta.ri;
48678
    iop_a_src = io1_a_src;
48679
    io2_a_src = io0_a_src + a_src->meta.wi;
48680
  }
48681
48682
  v_clear_code = self->private_impl.f_lzw_clear_code;
48683
  v_end_code = self->private_impl.f_lzw_end_code;
48684
  v_save_code = self->private_impl.f_lzw_save_code;
48685
  v_prev_code = self->private_impl.f_lzw_prev_code;
48686
  v_width = self->private_impl.f_lzw_width;
48687
  v_bits = self->private_impl.f_lzw_bits;
48688
  v_n_bits = self->private_impl.f_lzw_n_bits;
48689
  v_output_wi = self->private_impl.f_lzw_output_wi;
48690
  while (true) {
48691
    if (v_n_bits < v_width) {
48692
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
48693
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
48694
        iop_a_src += ((31u - v_n_bits) >> 3u);
48695
        v_n_bits |= 24u;
48696
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
48697
        if (a_src && a_src->meta.closed) {
48698
          self->private_impl.f_lzw_read_from_return_value = 3u;
48699
        } else {
48700
          self->private_impl.f_lzw_read_from_return_value = 2u;
48701
        }
48702
        break;
48703
      } else {
48704
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
48705
        iop_a_src += 1u;
48706
        v_n_bits += 8u;
48707
        if (v_n_bits >= v_width) {
48708
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
48709
          if (a_src && a_src->meta.closed) {
48710
            self->private_impl.f_lzw_read_from_return_value = 3u;
48711
          } else {
48712
            self->private_impl.f_lzw_read_from_return_value = 2u;
48713
          }
48714
          break;
48715
        } else {
48716
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
48717
          iop_a_src += 1u;
48718
          v_n_bits += 8u;
48719
          if (v_n_bits < v_width) {
48720
            self->private_impl.f_lzw_read_from_return_value = 5u;
48721
            break;
48722
          }
48723
        }
48724
      }
48725
    }
48726
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
48727
    v_bits >>= v_width;
48728
    v_n_bits -= v_width;
48729
    if (v_code < v_clear_code) {
48730
      self->private_data.f_lzw_output[v_output_wi] = ((uint8_t)(v_code));
48731
      v_output_wi = ((v_output_wi + 1u) & 8191u);
48732
      if (v_save_code <= 4095u) {
48733
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
48734
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_a;
48735
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
48736
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
48737
          memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code]));
48738
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
48739
        } else {
48740
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
48741
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
48742
        }
48743
        v_save_code += 1u;
48744
        if (v_width < 12u) {
48745
          v_width += (1u & (v_save_code >> v_width));
48746
        }
48747
        v_prev_code = v_code;
48748
      }
48749
    } else if (v_code <= v_end_code) {
48750
      if (v_code == v_end_code) {
48751
        self->private_impl.f_lzw_read_from_return_value = 0u;
48752
        break;
48753
      }
48754
      v_save_code = v_end_code;
48755
      v_prev_code = v_end_code;
48756
      v_width = (self->private_impl.f_lzw_literal_width + 1u);
48757
    } else if (v_code <= v_save_code) {
48758
      v_c = v_code;
48759
      if (v_code == v_save_code) {
48760
        v_c = v_prev_code;
48761
      }
48762
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) & 4294967288u)) & 8191u);
48763
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lzw_lm1s[v_c]))) & 8191u);
48764
      v_steps = (((uint32_t)(self->private_data.f_lzw_lm1s[v_c])) >> 3u);
48765
      while (true) {
48766
        memcpy((self->private_data.f_lzw_output)+(v_o), (self->private_data.f_lzw_suffixes[v_c]), 8u);
48767
        if (v_steps <= 0u) {
48768
          break;
48769
        }
48770
        v_steps -= 1u;
48771
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
48772
        v_c = ((uint32_t)(self->private_impl.f_lzw_prefixes[v_c]));
48773
      }
48774
      v_first_byte = self->private_data.f_lzw_suffixes[v_c][0u];
48775
      if (v_code == v_save_code) {
48776
        self->private_data.f_lzw_output[v_output_wi] = v_first_byte;
48777
        v_output_wi = ((v_output_wi + 1u) & 8191u);
48778
      }
48779
      if (v_save_code <= 4095u) {
48780
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lzw_lm1s[v_prev_code] + 1u)) & 4095u));
48781
        self->private_data.f_lzw_lm1s[v_save_code] = v_lm1_b;
48782
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
48783
          self->private_impl.f_lzw_prefixes[v_save_code] = self->private_impl.f_lzw_prefixes[v_prev_code];
48784
          memcpy(self->private_data.f_lzw_suffixes[v_save_code],self->private_data.f_lzw_suffixes[v_prev_code], sizeof(self->private_data.f_lzw_suffixes[v_save_code]));
48785
          self->private_data.f_lzw_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
48786
        } else {
48787
          self->private_impl.f_lzw_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
48788
          self->private_data.f_lzw_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
48789
        }
48790
        v_save_code += 1u;
48791
        if (v_width < 12u) {
48792
          v_width += (1u & (v_save_code >> v_width));
48793
        }
48794
        v_prev_code = v_code;
48795
      }
48796
    } else {
48797
      self->private_impl.f_lzw_read_from_return_value = 4u;
48798
      break;
48799
    }
48800
    if (v_output_wi > 4095u) {
48801
      self->private_impl.f_lzw_read_from_return_value = 1u;
48802
      break;
48803
    }
48804
  }
48805
  if (self->private_impl.f_lzw_read_from_return_value != 2u) {
48806
    while (v_n_bits >= 8u) {
48807
      v_n_bits -= 8u;
48808
      if (iop_a_src > io1_a_src) {
48809
        iop_a_src--;
48810
      } else {
48811
        self->private_impl.f_lzw_read_from_return_value = 5u;
48812
        break;
48813
      }
48814
    }
48815
  }
48816
  self->private_impl.f_lzw_save_code = v_save_code;
48817
  self->private_impl.f_lzw_prev_code = v_prev_code;
48818
  self->private_impl.f_lzw_width = v_width;
48819
  self->private_impl.f_lzw_bits = v_bits;
48820
  self->private_impl.f_lzw_n_bits = v_n_bits;
48821
  self->private_impl.f_lzw_output_wi = v_output_wi;
48822
  if (a_src && a_src->data.ptr) {
48823
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
48824
  }
48825
48826
  return wuffs_base__make_empty_struct();
48827
}
48828
48829
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
48830
48831
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
48832
48833
// ---------------- Status Codes Implementations
48834
48835
const char wuffs_gzip__error__bad_checksum[] = "#gzip: bad checksum";
48836
const char wuffs_gzip__error__bad_compression_method[] = "#gzip: bad compression method";
48837
const char wuffs_gzip__error__bad_encoding_flags[] = "#gzip: bad encoding flags";
48838
const char wuffs_gzip__error__bad_header[] = "#gzip: bad header";
48839
const char wuffs_gzip__error__truncated_input[] = "#gzip: truncated input";
48840
48841
// ---------------- Private Consts
48842
48843
// ---------------- Private Initializer Prototypes
48844
48845
// ---------------- Private Function Prototypes
48846
48847
WUFFS_BASE__GENERATED_C_CODE
48848
static wuffs_base__status
48849
wuffs_gzip__decoder__do_transform_io(
48850
    wuffs_gzip__decoder* self,
48851
    wuffs_base__io_buffer* a_dst,
48852
    wuffs_base__io_buffer* a_src,
48853
    wuffs_base__slice_u8 a_workbuf);
48854
48855
// ---------------- VTables
48856
48857
const wuffs_base__io_transformer__func_ptrs
48858
wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
48859
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_gzip__decoder__dst_history_retain_length),
48860
  (uint64_t(*)(const void*,
48861
      uint32_t))(&wuffs_gzip__decoder__get_quirk),
48862
  (wuffs_base__status(*)(void*,
48863
      uint32_t,
48864
      uint64_t))(&wuffs_gzip__decoder__set_quirk),
48865
  (wuffs_base__status(*)(void*,
48866
      wuffs_base__io_buffer*,
48867
      wuffs_base__io_buffer*,
48868
      wuffs_base__slice_u8))(&wuffs_gzip__decoder__transform_io),
48869
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_gzip__decoder__workbuf_len),
48870
};
48871
48872
// ---------------- Initializer Implementations
48873
48874
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
48875
wuffs_gzip__decoder__initialize(
48876
    wuffs_gzip__decoder* self,
48877
    size_t sizeof_star_self,
48878
    uint64_t wuffs_version,
48879
    uint32_t options){
48880
  if (!self) {
48881
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
48882
  }
48883
  if (sizeof(*self) != sizeof_star_self) {
48884
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
48885
  }
48886
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
48887
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
48888
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
48889
  }
48890
48891
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
48892
    // The whole point of this if-check is to detect an uninitialized *self.
48893
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
48894
#if !defined(__clang__) && defined(__GNUC__)
48895
#pragma GCC diagnostic push
48896
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
48897
#endif
48898
    if (self->private_impl.magic != 0) {
48899
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
48900
    }
48901
#if !defined(__clang__) && defined(__GNUC__)
48902
#pragma GCC diagnostic pop
48903
#endif
48904
  } else {
48905
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
48906
      memset(self, 0, sizeof(*self));
48907
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
48908
    } else {
48909
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
48910
    }
48911
  }
48912
48913
  {
48914
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
48915
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
48916
    if (z.repr) {
48917
      return z;
48918
    }
48919
  }
48920
  {
48921
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
48922
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
48923
    if (z.repr) {
48924
      return z;
48925
    }
48926
  }
48927
  self->private_impl.magic = WUFFS_BASE__MAGIC;
48928
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
48929
      wuffs_base__io_transformer__vtable_name;
48930
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
48931
      (const void*)(&wuffs_gzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
48932
  return wuffs_base__make_status(NULL);
48933
}
48934
48935
wuffs_gzip__decoder*
48936
wuffs_gzip__decoder__alloc(void) {
48937
  wuffs_gzip__decoder* x =
48938
      (wuffs_gzip__decoder*)(calloc(1, sizeof(wuffs_gzip__decoder)));
48939
  if (!x) {
48940
    return NULL;
48941
  }
48942
  if (wuffs_gzip__decoder__initialize(
48943
      x, sizeof(wuffs_gzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
48944
    free(x);
48945
    return NULL;
48946
  }
48947
  return x;
48948
}
48949
48950
size_t
48951
sizeof__wuffs_gzip__decoder(void) {
48952
  return sizeof(wuffs_gzip__decoder);
48953
}
48954
48955
// ---------------- Function Implementations
48956
48957
// -------- func gzip.decoder.get_quirk
48958
48959
WUFFS_BASE__GENERATED_C_CODE
48960
WUFFS_BASE__MAYBE_STATIC uint64_t
48961
wuffs_gzip__decoder__get_quirk(
48962
    const wuffs_gzip__decoder* self,
48963
    uint32_t a_key) {
48964
  if (!self) {
48965
    return 0;
48966
  }
48967
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
48968
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
48969
    return 0;
48970
  }
48971
48972
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
48973
    return 1u;
48974
  }
48975
  return 0u;
48976
}
48977
48978
// -------- func gzip.decoder.set_quirk
48979
48980
WUFFS_BASE__GENERATED_C_CODE
48981
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
48982
wuffs_gzip__decoder__set_quirk(
48983
    wuffs_gzip__decoder* self,
48984
    uint32_t a_key,
48985
    uint64_t a_value) {
48986
  if (!self) {
48987
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
48988
  }
48989
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
48990
    return wuffs_base__make_status(
48991
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
48992
        ? wuffs_base__error__disabled_by_previous_error
48993
        : wuffs_base__error__initialize_not_called);
48994
  }
48995
48996
  if (a_key == 1u) {
48997
    self->private_impl.f_ignore_checksum = (a_value > 0u);
48998
    return wuffs_base__make_status(NULL);
48999
  }
49000
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
49001
}
49002
49003
// -------- func gzip.decoder.dst_history_retain_length
49004
49005
WUFFS_BASE__GENERATED_C_CODE
49006
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
49007
wuffs_gzip__decoder__dst_history_retain_length(
49008
    const wuffs_gzip__decoder* self) {
49009
  if (!self) {
49010
    return wuffs_base__utility__make_optional_u63(false, 0u);
49011
  }
49012
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49013
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49014
    return wuffs_base__utility__make_optional_u63(false, 0u);
49015
  }
49016
49017
  return wuffs_base__utility__make_optional_u63(true, 0u);
49018
}
49019
49020
// -------- func gzip.decoder.workbuf_len
49021
49022
WUFFS_BASE__GENERATED_C_CODE
49023
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
49024
wuffs_gzip__decoder__workbuf_len(
49025
    const wuffs_gzip__decoder* self) {
49026
  if (!self) {
49027
    return wuffs_base__utility__empty_range_ii_u64();
49028
  }
49029
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49030
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49031
    return wuffs_base__utility__empty_range_ii_u64();
49032
  }
49033
49034
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
49035
}
49036
49037
// -------- func gzip.decoder.transform_io
49038
49039
WUFFS_BASE__GENERATED_C_CODE
49040
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
49041
wuffs_gzip__decoder__transform_io(
49042
    wuffs_gzip__decoder* self,
49043
    wuffs_base__io_buffer* a_dst,
49044
    wuffs_base__io_buffer* a_src,
49045
    wuffs_base__slice_u8 a_workbuf) {
49046
  if (!self) {
49047
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49048
  }
49049
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
49050
    return wuffs_base__make_status(
49051
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
49052
        ? wuffs_base__error__disabled_by_previous_error
49053
        : wuffs_base__error__initialize_not_called);
49054
  }
49055
  if (!a_dst || !a_src) {
49056
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49057
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
49058
  }
49059
  if ((self->private_impl.active_coroutine != 0) &&
49060
      (self->private_impl.active_coroutine != 1)) {
49061
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49062
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
49063
  }
49064
  self->private_impl.active_coroutine = 0;
49065
  wuffs_base__status status = wuffs_base__make_status(NULL);
49066
49067
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
49068
49069
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
49070
  switch (coro_susp_point) {
49071
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49072
49073
    while (true) {
49074
      {
49075
        wuffs_base__status t_0 = wuffs_gzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
49076
        v_status = t_0;
49077
      }
49078
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
49079
        status = wuffs_base__make_status(wuffs_gzip__error__truncated_input);
49080
        goto exit;
49081
      }
49082
      status = v_status;
49083
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
49084
    }
49085
49086
    ok:
49087
    self->private_impl.p_transform_io = 0;
49088
    goto exit;
49089
  }
49090
49091
  goto suspend;
49092
  suspend:
49093
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49094
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
49095
49096
  goto exit;
49097
  exit:
49098
  if (wuffs_base__status__is_error(&status)) {
49099
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49100
  }
49101
  return status;
49102
}
49103
49104
// -------- func gzip.decoder.do_transform_io
49105
49106
WUFFS_BASE__GENERATED_C_CODE
49107
static wuffs_base__status
49108
wuffs_gzip__decoder__do_transform_io(
49109
    wuffs_gzip__decoder* self,
49110
    wuffs_base__io_buffer* a_dst,
49111
    wuffs_base__io_buffer* a_src,
49112
    wuffs_base__slice_u8 a_workbuf) {
49113
  wuffs_base__status status = wuffs_base__make_status(NULL);
49114
49115
  uint8_t v_c8 = 0;
49116
  uint8_t v_flags = 0;
49117
  uint16_t v_xlen = 0;
49118
  uint64_t v_mark = 0;
49119
  uint32_t v_checksum_have = 0;
49120
  uint32_t v_decoded_length_have = 0;
49121
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
49122
  uint32_t v_checksum_want = 0;
49123
  uint32_t v_decoded_length_want = 0;
49124
49125
  uint8_t* iop_a_dst = NULL;
49126
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49127
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49128
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49129
  if (a_dst && a_dst->data.ptr) {
49130
    io0_a_dst = a_dst->data.ptr;
49131
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
49132
    iop_a_dst = io1_a_dst;
49133
    io2_a_dst = io0_a_dst + a_dst->data.len;
49134
    if (a_dst->meta.closed) {
49135
      io2_a_dst = iop_a_dst;
49136
    }
49137
  }
49138
  const uint8_t* iop_a_src = NULL;
49139
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49140
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49141
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49142
  if (a_src && a_src->data.ptr) {
49143
    io0_a_src = a_src->data.ptr;
49144
    io1_a_src = io0_a_src + a_src->meta.ri;
49145
    iop_a_src = io1_a_src;
49146
    io2_a_src = io0_a_src + a_src->meta.wi;
49147
  }
49148
49149
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
49150
  if (coro_susp_point) {
49151
    v_flags = self->private_data.s_do_transform_io.v_flags;
49152
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
49153
    v_decoded_length_have = self->private_data.s_do_transform_io.v_decoded_length_have;
49154
    v_checksum_want = self->private_data.s_do_transform_io.v_checksum_want;
49155
  }
49156
  switch (coro_susp_point) {
49157
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49158
49159
    {
49160
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
49161
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49162
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49163
        goto suspend;
49164
      }
49165
      uint8_t t_0 = *iop_a_src++;
49166
      v_c8 = t_0;
49167
    }
49168
    if (v_c8 != 31u) {
49169
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
49170
      goto exit;
49171
    }
49172
    {
49173
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
49174
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49175
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49176
        goto suspend;
49177
      }
49178
      uint8_t t_1 = *iop_a_src++;
49179
      v_c8 = t_1;
49180
    }
49181
    if (v_c8 != 139u) {
49182
      status = wuffs_base__make_status(wuffs_gzip__error__bad_header);
49183
      goto exit;
49184
    }
49185
    {
49186
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
49187
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49188
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49189
        goto suspend;
49190
      }
49191
      uint8_t t_2 = *iop_a_src++;
49192
      v_c8 = t_2;
49193
    }
49194
    if (v_c8 != 8u) {
49195
      status = wuffs_base__make_status(wuffs_gzip__error__bad_compression_method);
49196
      goto exit;
49197
    }
49198
    {
49199
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
49200
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49201
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49202
        goto suspend;
49203
      }
49204
      uint8_t t_3 = *iop_a_src++;
49205
      v_flags = t_3;
49206
    }
49207
    self->private_data.s_do_transform_io.scratch = 6u;
49208
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
49209
    if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
49210
      self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
49211
      iop_a_src = io2_a_src;
49212
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49213
      goto suspend;
49214
    }
49215
    iop_a_src += self->private_data.s_do_transform_io.scratch;
49216
    if (((uint8_t)(v_flags & 4u)) != 0u) {
49217
      {
49218
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
49219
        uint16_t t_4;
49220
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
49221
          t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
49222
          iop_a_src += 2;
49223
        } else {
49224
          self->private_data.s_do_transform_io.scratch = 0;
49225
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
49226
          while (true) {
49227
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49228
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49229
              goto suspend;
49230
            }
49231
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
49232
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
49233
            *scratch <<= 8;
49234
            *scratch >>= 8;
49235
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
49236
            if (num_bits_4 == 8) {
49237
              t_4 = ((uint16_t)(*scratch));
49238
              break;
49239
            }
49240
            num_bits_4 += 8u;
49241
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
49242
          }
49243
        }
49244
        v_xlen = t_4;
49245
      }
49246
      self->private_data.s_do_transform_io.scratch = ((uint32_t)(v_xlen));
49247
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
49248
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
49249
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
49250
        iop_a_src = io2_a_src;
49251
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49252
        goto suspend;
49253
      }
49254
      iop_a_src += self->private_data.s_do_transform_io.scratch;
49255
    }
49256
    if (((uint8_t)(v_flags & 8u)) != 0u) {
49257
      while (true) {
49258
        {
49259
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
49260
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49261
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49262
            goto suspend;
49263
          }
49264
          uint8_t t_5 = *iop_a_src++;
49265
          v_c8 = t_5;
49266
        }
49267
        if (v_c8 == 0u) {
49268
          break;
49269
        }
49270
      }
49271
    }
49272
    if (((uint8_t)(v_flags & 16u)) != 0u) {
49273
      while (true) {
49274
        {
49275
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
49276
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49277
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49278
            goto suspend;
49279
          }
49280
          uint8_t t_6 = *iop_a_src++;
49281
          v_c8 = t_6;
49282
        }
49283
        if (v_c8 == 0u) {
49284
          break;
49285
        }
49286
      }
49287
    }
49288
    if (((uint8_t)(v_flags & 2u)) != 0u) {
49289
      self->private_data.s_do_transform_io.scratch = 2u;
49290
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
49291
      if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
49292
        self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
49293
        iop_a_src = io2_a_src;
49294
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49295
        goto suspend;
49296
      }
49297
      iop_a_src += self->private_data.s_do_transform_io.scratch;
49298
    }
49299
    if (((uint8_t)(v_flags & 224u)) != 0u) {
49300
      status = wuffs_base__make_status(wuffs_gzip__error__bad_encoding_flags);
49301
      goto exit;
49302
    }
49303
    while (true) {
49304
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
49305
      {
49306
        if (a_dst) {
49307
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
49308
        }
49309
        if (a_src) {
49310
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49311
        }
49312
        wuffs_base__status t_7 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
49313
        v_status = t_7;
49314
        if (a_dst) {
49315
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
49316
        }
49317
        if (a_src) {
49318
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
49319
        }
49320
      }
49321
      if ( ! self->private_impl.f_ignore_checksum) {
49322
        v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
49323
        v_decoded_length_have += ((uint32_t)(wuffs_private_impl__io__count_since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)))));
49324
      }
49325
      if (wuffs_base__status__is_ok(&v_status)) {
49326
        break;
49327
      }
49328
      status = v_status;
49329
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
49330
    }
49331
    {
49332
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
49333
      uint32_t t_8;
49334
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
49335
        t_8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
49336
        iop_a_src += 4;
49337
      } else {
49338
        self->private_data.s_do_transform_io.scratch = 0;
49339
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
49340
        while (true) {
49341
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49342
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49343
            goto suspend;
49344
          }
49345
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
49346
          uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
49347
          *scratch <<= 8;
49348
          *scratch >>= 8;
49349
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
49350
          if (num_bits_8 == 24) {
49351
            t_8 = ((uint32_t)(*scratch));
49352
            break;
49353
          }
49354
          num_bits_8 += 8u;
49355
          *scratch |= ((uint64_t)(num_bits_8)) << 56;
49356
        }
49357
      }
49358
      v_checksum_want = t_8;
49359
    }
49360
    {
49361
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
49362
      uint32_t t_9;
49363
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
49364
        t_9 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
49365
        iop_a_src += 4;
49366
      } else {
49367
        self->private_data.s_do_transform_io.scratch = 0;
49368
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
49369
        while (true) {
49370
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49371
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49372
            goto suspend;
49373
          }
49374
          uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
49375
          uint32_t num_bits_9 = ((uint32_t)(*scratch >> 56));
49376
          *scratch <<= 8;
49377
          *scratch >>= 8;
49378
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_9;
49379
          if (num_bits_9 == 24) {
49380
            t_9 = ((uint32_t)(*scratch));
49381
            break;
49382
          }
49383
          num_bits_9 += 8u;
49384
          *scratch |= ((uint64_t)(num_bits_9)) << 56;
49385
        }
49386
      }
49387
      v_decoded_length_want = t_9;
49388
    }
49389
    if ( ! self->private_impl.f_ignore_checksum && ((v_checksum_have != v_checksum_want) || (v_decoded_length_have != v_decoded_length_want))) {
49390
      status = wuffs_base__make_status(wuffs_gzip__error__bad_checksum);
49391
      goto exit;
49392
    }
49393
49394
    ok:
49395
    self->private_impl.p_do_transform_io = 0;
49396
    goto exit;
49397
  }
49398
49399
  goto suspend;
49400
  suspend:
49401
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49402
  self->private_data.s_do_transform_io.v_flags = v_flags;
49403
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
49404
  self->private_data.s_do_transform_io.v_decoded_length_have = v_decoded_length_have;
49405
  self->private_data.s_do_transform_io.v_checksum_want = v_checksum_want;
49406
49407
  goto exit;
49408
  exit:
49409
  if (a_dst && a_dst->data.ptr) {
49410
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
49411
  }
49412
  if (a_src && a_src->data.ptr) {
49413
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
49414
  }
49415
49416
  return status;
49417
}
49418
49419
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GZIP)
49420
49421
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
49422
49423
// ---------------- Status Codes Implementations
49424
49425
const char wuffs_handsum__error__bad_header[] = "#handsum: bad header";
49426
const char wuffs_handsum__error__truncated_input[] = "#handsum: truncated input";
49427
const char wuffs_handsum__error__unsupported_handsum_file[] = "#handsum: unsupported Handsum file";
49428
49429
// ---------------- Private Consts
49430
49431
static const uint8_t
49432
WUFFS_HANDSUM__CLAMP_7[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
49433
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
49434
  7u, 7u, 7u, 7u, 7u, 7u, 7u, 7u,
49435
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49436
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49437
};
49438
49439
static const uint8_t
49440
WUFFS_HANDSUM__CLAMP_15[64] WUFFS_BASE__POTENTIALLY_UNUSED = {
49441
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
49442
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
49443
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
49444
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
49445
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49446
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49447
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49448
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49449
};
49450
49451
static const uint8_t
49452
WUFFS_HANDSUM__ZIGZAG[15] WUFFS_BASE__POTENTIALLY_UNUSED = {
49453
  0u, 1u, 8u, 16u, 9u, 2u, 3u, 10u,
49454
  17u, 24u, 32u, 25u, 18u, 11u, 4u,
49455
};
49456
49457
static const uint8_t
49458
WUFFS_HANDSUM__SMOOTHING_PAIRS[56] WUFFS_BASE__POTENTIALLY_UNUSED = {
49459
  7u, 8u, 23u, 24u, 39u, 40u, 55u, 56u,
49460
  71u, 72u, 87u, 88u, 103u, 104u, 112u, 128u,
49461
  113u, 129u, 114u, 130u, 115u, 131u, 116u, 132u,
49462
  117u, 133u, 118u, 134u, 121u, 137u, 122u, 138u,
49463
  123u, 139u, 124u, 140u, 125u, 141u, 126u, 142u,
49464
  127u, 143u, 151u, 152u, 167u, 168u, 183u, 184u,
49465
  199u, 200u, 215u, 216u, 231u, 232u, 247u, 248u,
49466
};
49467
49468
#define WUFFS_HANDSUM__FIXED_POINT_HALF 32768u
49469
49470
#define WUFFS_HANDSUM__FIXED_POINT_INV_2_SQRT_2 23170u
49471
49472
static const uint32_t
49473
WUFFS_HANDSUM__COSINES[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
49474
  65536u, 64276u, 60547u, 54491u, 46340u, 36409u, 25079u, 12785u,
49475
  0u, 4294954511u, 4294942217u, 4294930887u, 4294920956u, 4294912805u, 4294906749u, 4294903020u,
49476
  4294901760u, 4294903020u, 4294906749u, 4294912805u, 4294920956u, 4294930887u, 4294942217u, 4294954511u,
49477
  0u, 12785u, 25079u, 36409u, 46340u, 54491u, 60547u, 64276u,
49478
};
49479
49480
static const uint8_t
49481
WUFFS_HANDSUM__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
49482
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
49483
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
49484
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
49485
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
49486
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
49487
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
49488
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
49489
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
49490
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
49491
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
49492
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
49493
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
49494
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
49495
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
49496
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
49497
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
49498
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49499
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49500
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49501
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49502
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49503
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49504
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49505
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49506
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49507
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49508
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49509
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49510
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49511
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49512
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49513
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49514
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49515
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49516
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49517
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49518
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49519
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49520
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49521
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49522
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49523
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49524
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49525
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49526
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49527
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49528
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49529
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49530
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49531
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49532
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49533
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49534
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49535
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49536
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49537
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49538
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49539
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49540
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49541
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49542
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49543
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49544
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49545
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
49546
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49547
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49548
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49549
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49550
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49551
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49552
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49553
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49554
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49555
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49556
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49557
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49558
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49559
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49560
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49561
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49562
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49563
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49564
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49565
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49566
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49567
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49568
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49569
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49570
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49571
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49572
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49573
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49574
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49575
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49576
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49577
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49578
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49579
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49580
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49581
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49582
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49583
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49584
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49585
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49586
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49587
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49588
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49589
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49590
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49591
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49592
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49593
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
49594
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
49595
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
49596
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
49597
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
49598
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
49599
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
49600
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
49601
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
49602
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
49603
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
49604
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
49605
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
49606
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
49607
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
49608
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
49609
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
49610
};
49611
49612
// ---------------- Private Initializer Prototypes
49613
49614
// ---------------- Private Function Prototypes
49615
49616
WUFFS_BASE__GENERATED_C_CODE
49617
static wuffs_base__status
49618
wuffs_handsum__decoder__do_decode_image_config(
49619
    wuffs_handsum__decoder* self,
49620
    wuffs_base__image_config* a_dst,
49621
    wuffs_base__io_buffer* a_src);
49622
49623
WUFFS_BASE__GENERATED_C_CODE
49624
static wuffs_base__status
49625
wuffs_handsum__decoder__do_decode_frame_config(
49626
    wuffs_handsum__decoder* self,
49627
    wuffs_base__frame_config* a_dst,
49628
    wuffs_base__io_buffer* a_src);
49629
49630
WUFFS_BASE__GENERATED_C_CODE
49631
static wuffs_base__status
49632
wuffs_handsum__decoder__do_decode_frame(
49633
    wuffs_handsum__decoder* self,
49634
    wuffs_base__pixel_buffer* a_dst,
49635
    wuffs_base__io_buffer* a_src,
49636
    wuffs_base__pixel_blend a_blend,
49637
    wuffs_base__slice_u8 a_workbuf,
49638
    wuffs_base__decode_frame_options* a_opts);
49639
49640
WUFFS_BASE__GENERATED_C_CODE
49641
static wuffs_base__empty_struct
49642
wuffs_handsum__decoder__decode_block(
49643
    wuffs_handsum__decoder* self,
49644
    uint32_t a_which,
49645
    uint32_t a_y_offset,
49646
    uint32_t a_x_offset);
49647
49648
WUFFS_BASE__GENERATED_C_CODE
49649
static wuffs_base__empty_struct
49650
wuffs_handsum__decoder__decode_coeffs(
49651
    wuffs_handsum__decoder* self);
49652
49653
WUFFS_BASE__GENERATED_C_CODE
49654
static wuffs_base__empty_struct
49655
wuffs_handsum__decoder__smooth_luma_block_seams(
49656
    wuffs_handsum__decoder* self);
49657
49658
WUFFS_BASE__GENERATED_C_CODE
49659
static wuffs_base__empty_struct
49660
wuffs_handsum__decoder__upsample_chroma(
49661
    wuffs_handsum__decoder* self);
49662
49663
WUFFS_BASE__GENERATED_C_CODE
49664
static wuffs_base__empty_struct
49665
wuffs_handsum__decoder__upsample_bgr(
49666
    wuffs_handsum__decoder* self);
49667
49668
WUFFS_BASE__GENERATED_C_CODE
49669
static wuffs_base__empty_struct
49670
wuffs_handsum__decoder__convert_ycc_to_bgr(
49671
    wuffs_handsum__decoder* self);
49672
49673
WUFFS_BASE__GENERATED_C_CODE
49674
static wuffs_base__empty_struct
49675
wuffs_handsum__decoder__scale_1d_horizontal(
49676
    wuffs_handsum__decoder* self);
49677
49678
WUFFS_BASE__GENERATED_C_CODE
49679
static wuffs_base__empty_struct
49680
wuffs_handsum__decoder__scale_1d_vertical(
49681
    wuffs_handsum__decoder* self);
49682
49683
WUFFS_BASE__GENERATED_C_CODE
49684
static wuffs_base__status
49685
wuffs_handsum__decoder__from_pixels_to_dst(
49686
    wuffs_handsum__decoder* self,
49687
    wuffs_base__pixel_buffer* a_dst,
49688
    uint32_t a_which);
49689
49690
// ---------------- VTables
49691
49692
const wuffs_base__image_decoder__func_ptrs
49693
wuffs_handsum__decoder__func_ptrs_for__wuffs_base__image_decoder = {
49694
  (wuffs_base__status(*)(void*,
49695
      wuffs_base__pixel_buffer*,
49696
      wuffs_base__io_buffer*,
49697
      wuffs_base__pixel_blend,
49698
      wuffs_base__slice_u8,
49699
      wuffs_base__decode_frame_options*))(&wuffs_handsum__decoder__decode_frame),
49700
  (wuffs_base__status(*)(void*,
49701
      wuffs_base__frame_config*,
49702
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__decode_frame_config),
49703
  (wuffs_base__status(*)(void*,
49704
      wuffs_base__image_config*,
49705
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__decode_image_config),
49706
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_handsum__decoder__frame_dirty_rect),
49707
  (uint64_t(*)(const void*,
49708
      uint32_t))(&wuffs_handsum__decoder__get_quirk),
49709
  (uint32_t(*)(const void*))(&wuffs_handsum__decoder__num_animation_loops),
49710
  (uint64_t(*)(const void*))(&wuffs_handsum__decoder__num_decoded_frame_configs),
49711
  (uint64_t(*)(const void*))(&wuffs_handsum__decoder__num_decoded_frames),
49712
  (wuffs_base__status(*)(void*,
49713
      uint64_t,
49714
      uint64_t))(&wuffs_handsum__decoder__restart_frame),
49715
  (wuffs_base__status(*)(void*,
49716
      uint32_t,
49717
      uint64_t))(&wuffs_handsum__decoder__set_quirk),
49718
  (wuffs_base__empty_struct(*)(void*,
49719
      uint32_t,
49720
      bool))(&wuffs_handsum__decoder__set_report_metadata),
49721
  (wuffs_base__status(*)(void*,
49722
      wuffs_base__io_buffer*,
49723
      wuffs_base__more_information*,
49724
      wuffs_base__io_buffer*))(&wuffs_handsum__decoder__tell_me_more),
49725
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_handsum__decoder__workbuf_len),
49726
};
49727
49728
// ---------------- Initializer Implementations
49729
49730
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
49731
wuffs_handsum__decoder__initialize(
49732
    wuffs_handsum__decoder* self,
49733
    size_t sizeof_star_self,
49734
    uint64_t wuffs_version,
49735
    uint32_t options){
49736
  if (!self) {
49737
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49738
  }
49739
  if (sizeof(*self) != sizeof_star_self) {
49740
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
49741
  }
49742
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
49743
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
49744
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
49745
  }
49746
49747
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
49748
    // The whole point of this if-check is to detect an uninitialized *self.
49749
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
49750
#if !defined(__clang__) && defined(__GNUC__)
49751
#pragma GCC diagnostic push
49752
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
49753
#endif
49754
    if (self->private_impl.magic != 0) {
49755
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
49756
    }
49757
#if !defined(__clang__) && defined(__GNUC__)
49758
#pragma GCC diagnostic pop
49759
#endif
49760
  } else {
49761
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
49762
      memset(self, 0, sizeof(*self));
49763
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
49764
    } else {
49765
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
49766
    }
49767
  }
49768
49769
  self->private_impl.magic = WUFFS_BASE__MAGIC;
49770
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
49771
      wuffs_base__image_decoder__vtable_name;
49772
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
49773
      (const void*)(&wuffs_handsum__decoder__func_ptrs_for__wuffs_base__image_decoder);
49774
  return wuffs_base__make_status(NULL);
49775
}
49776
49777
wuffs_handsum__decoder*
49778
wuffs_handsum__decoder__alloc(void) {
49779
  wuffs_handsum__decoder* x =
49780
      (wuffs_handsum__decoder*)(calloc(1, sizeof(wuffs_handsum__decoder)));
49781
  if (!x) {
49782
    return NULL;
49783
  }
49784
  if (wuffs_handsum__decoder__initialize(
49785
      x, sizeof(wuffs_handsum__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
49786
    free(x);
49787
    return NULL;
49788
  }
49789
  return x;
49790
}
49791
49792
size_t
49793
sizeof__wuffs_handsum__decoder(void) {
49794
  return sizeof(wuffs_handsum__decoder);
49795
}
49796
49797
// ---------------- Function Implementations
49798
49799
// -------- func handsum.decoder.get_quirk
49800
49801
WUFFS_BASE__GENERATED_C_CODE
49802
WUFFS_BASE__MAYBE_STATIC uint64_t
49803
wuffs_handsum__decoder__get_quirk(
49804
    const wuffs_handsum__decoder* self,
49805
    uint32_t a_key) {
49806
  if (!self) {
49807
    return 0;
49808
  }
49809
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
49810
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
49811
    return 0;
49812
  }
49813
49814
  return 0u;
49815
}
49816
49817
// -------- func handsum.decoder.set_quirk
49818
49819
WUFFS_BASE__GENERATED_C_CODE
49820
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
49821
wuffs_handsum__decoder__set_quirk(
49822
    wuffs_handsum__decoder* self,
49823
    uint32_t a_key,
49824
    uint64_t a_value) {
49825
  if (!self) {
49826
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49827
  }
49828
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
49829
    return wuffs_base__make_status(
49830
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
49831
        ? wuffs_base__error__disabled_by_previous_error
49832
        : wuffs_base__error__initialize_not_called);
49833
  }
49834
49835
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
49836
}
49837
49838
// -------- func handsum.decoder.decode_image_config
49839
49840
WUFFS_BASE__GENERATED_C_CODE
49841
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
49842
wuffs_handsum__decoder__decode_image_config(
49843
    wuffs_handsum__decoder* self,
49844
    wuffs_base__image_config* a_dst,
49845
    wuffs_base__io_buffer* a_src) {
49846
  if (!self) {
49847
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
49848
  }
49849
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
49850
    return wuffs_base__make_status(
49851
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
49852
        ? wuffs_base__error__disabled_by_previous_error
49853
        : wuffs_base__error__initialize_not_called);
49854
  }
49855
  if (!a_src) {
49856
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49857
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
49858
  }
49859
  if ((self->private_impl.active_coroutine != 0) &&
49860
      (self->private_impl.active_coroutine != 1)) {
49861
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49862
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
49863
  }
49864
  self->private_impl.active_coroutine = 0;
49865
  wuffs_base__status status = wuffs_base__make_status(NULL);
49866
49867
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
49868
49869
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
49870
  switch (coro_susp_point) {
49871
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49872
49873
    while (true) {
49874
      {
49875
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_image_config(self, a_dst, a_src);
49876
        v_status = t_0;
49877
      }
49878
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
49879
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
49880
        goto exit;
49881
      }
49882
      status = v_status;
49883
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
49884
    }
49885
49886
    ok:
49887
    self->private_impl.p_decode_image_config = 0;
49888
    goto exit;
49889
  }
49890
49891
  goto suspend;
49892
  suspend:
49893
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
49894
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
49895
49896
  goto exit;
49897
  exit:
49898
  if (wuffs_base__status__is_error(&status)) {
49899
    self->private_impl.magic = WUFFS_BASE__DISABLED;
49900
  }
49901
  return status;
49902
}
49903
49904
// -------- func handsum.decoder.do_decode_image_config
49905
49906
WUFFS_BASE__GENERATED_C_CODE
49907
static wuffs_base__status
49908
wuffs_handsum__decoder__do_decode_image_config(
49909
    wuffs_handsum__decoder* self,
49910
    wuffs_base__image_config* a_dst,
49911
    wuffs_base__io_buffer* a_src) {
49912
  wuffs_base__status status = wuffs_base__make_status(NULL);
49913
49914
  uint32_t v_c32 = 0;
49915
49916
  const uint8_t* iop_a_src = NULL;
49917
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49918
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49919
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
49920
  if (a_src && a_src->data.ptr) {
49921
    io0_a_src = a_src->data.ptr;
49922
    io1_a_src = io0_a_src + a_src->meta.ri;
49923
    iop_a_src = io1_a_src;
49924
    io2_a_src = io0_a_src + a_src->meta.wi;
49925
  }
49926
49927
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
49928
  switch (coro_susp_point) {
49929
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
49930
49931
    if (self->private_impl.f_call_sequence != 0u) {
49932
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
49933
      goto exit;
49934
    }
49935
    {
49936
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
49937
      uint32_t t_0;
49938
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
49939
        t_0 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
49940
        iop_a_src += 2;
49941
      } else {
49942
        self->private_data.s_do_decode_image_config.scratch = 0;
49943
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
49944
        while (true) {
49945
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49946
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49947
            goto suspend;
49948
          }
49949
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
49950
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
49951
          *scratch <<= 8;
49952
          *scratch >>= 8;
49953
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
49954
          if (num_bits_0 == 8) {
49955
            t_0 = ((uint32_t)(*scratch));
49956
            break;
49957
          }
49958
          num_bits_0 += 8u;
49959
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
49960
        }
49961
      }
49962
      v_c32 = t_0;
49963
    }
49964
    if (v_c32 != 55294u) {
49965
      status = wuffs_base__make_status(wuffs_handsum__error__bad_header);
49966
      goto exit;
49967
    }
49968
    {
49969
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
49970
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
49971
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
49972
        goto suspend;
49973
      }
49974
      uint32_t t_1 = *iop_a_src++;
49975
      v_c32 = t_1;
49976
    }
49977
    if ((v_c32 & 192u) != 0u) {
49978
      status = wuffs_base__make_status(wuffs_handsum__error__unsupported_handsum_file);
49979
      goto exit;
49980
    }
49981
    if ((v_c32 & 32u) == 0u) {
49982
      self->private_impl.f_width = 32u;
49983
      self->private_impl.f_height = ((v_c32 & 31u) + 1u);
49984
    } else {
49985
      self->private_impl.f_width = ((v_c32 & 31u) + 1u);
49986
      self->private_impl.f_height = 32u;
49987
    }
49988
    if (a_dst != NULL) {
49989
      wuffs_base__image_config__set(
49990
          a_dst,
49991
          2415954056u,
49992
          0u,
49993
          self->private_impl.f_width,
49994
          self->private_impl.f_height,
49995
          3u,
49996
          true);
49997
    }
49998
    self->private_impl.f_call_sequence = 32u;
49999
50000
    goto ok;
50001
    ok:
50002
    self->private_impl.p_do_decode_image_config = 0;
50003
    goto exit;
50004
  }
50005
50006
  goto suspend;
50007
  suspend:
50008
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50009
50010
  goto exit;
50011
  exit:
50012
  if (a_src && a_src->data.ptr) {
50013
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50014
  }
50015
50016
  return status;
50017
}
50018
50019
// -------- func handsum.decoder.decode_frame_config
50020
50021
WUFFS_BASE__GENERATED_C_CODE
50022
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50023
wuffs_handsum__decoder__decode_frame_config(
50024
    wuffs_handsum__decoder* self,
50025
    wuffs_base__frame_config* a_dst,
50026
    wuffs_base__io_buffer* a_src) {
50027
  if (!self) {
50028
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50029
  }
50030
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50031
    return wuffs_base__make_status(
50032
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50033
        ? wuffs_base__error__disabled_by_previous_error
50034
        : wuffs_base__error__initialize_not_called);
50035
  }
50036
  if (!a_src) {
50037
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50038
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50039
  }
50040
  if ((self->private_impl.active_coroutine != 0) &&
50041
      (self->private_impl.active_coroutine != 2)) {
50042
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50043
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50044
  }
50045
  self->private_impl.active_coroutine = 0;
50046
  wuffs_base__status status = wuffs_base__make_status(NULL);
50047
50048
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50049
50050
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
50051
  switch (coro_susp_point) {
50052
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50053
50054
    while (true) {
50055
      {
50056
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_frame_config(self, a_dst, a_src);
50057
        v_status = t_0;
50058
      }
50059
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
50060
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
50061
        goto exit;
50062
      }
50063
      status = v_status;
50064
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
50065
    }
50066
50067
    ok:
50068
    self->private_impl.p_decode_frame_config = 0;
50069
    goto exit;
50070
  }
50071
50072
  goto suspend;
50073
  suspend:
50074
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50075
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
50076
50077
  goto exit;
50078
  exit:
50079
  if (wuffs_base__status__is_error(&status)) {
50080
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50081
  }
50082
  return status;
50083
}
50084
50085
// -------- func handsum.decoder.do_decode_frame_config
50086
50087
WUFFS_BASE__GENERATED_C_CODE
50088
static wuffs_base__status
50089
wuffs_handsum__decoder__do_decode_frame_config(
50090
    wuffs_handsum__decoder* self,
50091
    wuffs_base__frame_config* a_dst,
50092
    wuffs_base__io_buffer* a_src) {
50093
  wuffs_base__status status = wuffs_base__make_status(NULL);
50094
50095
  const uint8_t* iop_a_src = NULL;
50096
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50097
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50098
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50099
  if (a_src && a_src->data.ptr) {
50100
    io0_a_src = a_src->data.ptr;
50101
    io1_a_src = io0_a_src + a_src->meta.ri;
50102
    iop_a_src = io1_a_src;
50103
    io2_a_src = io0_a_src + a_src->meta.wi;
50104
  }
50105
50106
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
50107
  switch (coro_susp_point) {
50108
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50109
50110
    if (self->private_impl.f_call_sequence == 32u) {
50111
    } else if (self->private_impl.f_call_sequence < 32u) {
50112
      if (a_src) {
50113
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50114
      }
50115
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50116
      status = wuffs_handsum__decoder__do_decode_image_config(self, NULL, a_src);
50117
      if (a_src) {
50118
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
50119
      }
50120
      if (status.repr) {
50121
        goto suspend;
50122
      }
50123
    } else if (self->private_impl.f_call_sequence == 40u) {
50124
      if (3u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
50125
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
50126
        goto exit;
50127
      }
50128
    } else if (self->private_impl.f_call_sequence == 64u) {
50129
      self->private_impl.f_call_sequence = 96u;
50130
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
50131
      goto ok;
50132
    } else {
50133
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
50134
      goto ok;
50135
    }
50136
    if (a_dst != NULL) {
50137
      wuffs_base__frame_config__set(
50138
          a_dst,
50139
          wuffs_base__utility__make_rect_ie_u32(
50140
          0u,
50141
          0u,
50142
          self->private_impl.f_width,
50143
          self->private_impl.f_height),
50144
          ((wuffs_base__flicks)(0u)),
50145
          0u,
50146
          3u,
50147
          0u,
50148
          true,
50149
          false,
50150
          4278190080u);
50151
    }
50152
    self->private_impl.f_call_sequence = 64u;
50153
50154
    ok:
50155
    self->private_impl.p_do_decode_frame_config = 0;
50156
    goto exit;
50157
  }
50158
50159
  goto suspend;
50160
  suspend:
50161
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50162
50163
  goto exit;
50164
  exit:
50165
  if (a_src && a_src->data.ptr) {
50166
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50167
  }
50168
50169
  return status;
50170
}
50171
50172
// -------- func handsum.decoder.decode_frame
50173
50174
WUFFS_BASE__GENERATED_C_CODE
50175
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50176
wuffs_handsum__decoder__decode_frame(
50177
    wuffs_handsum__decoder* self,
50178
    wuffs_base__pixel_buffer* a_dst,
50179
    wuffs_base__io_buffer* a_src,
50180
    wuffs_base__pixel_blend a_blend,
50181
    wuffs_base__slice_u8 a_workbuf,
50182
    wuffs_base__decode_frame_options* a_opts) {
50183
  if (!self) {
50184
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50185
  }
50186
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50187
    return wuffs_base__make_status(
50188
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50189
        ? wuffs_base__error__disabled_by_previous_error
50190
        : wuffs_base__error__initialize_not_called);
50191
  }
50192
  if (!a_dst || !a_src) {
50193
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50194
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50195
  }
50196
  if ((self->private_impl.active_coroutine != 0) &&
50197
      (self->private_impl.active_coroutine != 3)) {
50198
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50199
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50200
  }
50201
  self->private_impl.active_coroutine = 0;
50202
  wuffs_base__status status = wuffs_base__make_status(NULL);
50203
50204
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50205
50206
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
50207
  switch (coro_susp_point) {
50208
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50209
50210
    while (true) {
50211
      {
50212
        wuffs_base__status t_0 = wuffs_handsum__decoder__do_decode_frame(self,
50213
            a_dst,
50214
            a_src,
50215
            a_blend,
50216
            a_workbuf,
50217
            a_opts);
50218
        v_status = t_0;
50219
      }
50220
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
50221
        status = wuffs_base__make_status(wuffs_handsum__error__truncated_input);
50222
        goto exit;
50223
      }
50224
      status = v_status;
50225
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
50226
    }
50227
50228
    ok:
50229
    self->private_impl.p_decode_frame = 0;
50230
    goto exit;
50231
  }
50232
50233
  goto suspend;
50234
  suspend:
50235
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50236
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
50237
50238
  goto exit;
50239
  exit:
50240
  if (wuffs_base__status__is_error(&status)) {
50241
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50242
  }
50243
  return status;
50244
}
50245
50246
// -------- func handsum.decoder.do_decode_frame
50247
50248
WUFFS_BASE__GENERATED_C_CODE
50249
static wuffs_base__status
50250
wuffs_handsum__decoder__do_decode_frame(
50251
    wuffs_handsum__decoder* self,
50252
    wuffs_base__pixel_buffer* a_dst,
50253
    wuffs_base__io_buffer* a_src,
50254
    wuffs_base__pixel_blend a_blend,
50255
    wuffs_base__slice_u8 a_workbuf,
50256
    wuffs_base__decode_frame_options* a_opts) {
50257
  wuffs_base__status status = wuffs_base__make_status(NULL);
50258
50259
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
50260
  uint32_t v_num_read = 0;
50261
  uint32_t v_which = 0;
50262
50263
  const uint8_t* iop_a_src = NULL;
50264
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50265
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50266
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
50267
  if (a_src && a_src->data.ptr) {
50268
    io0_a_src = a_src->data.ptr;
50269
    io1_a_src = io0_a_src + a_src->meta.ri;
50270
    iop_a_src = io1_a_src;
50271
    io2_a_src = io0_a_src + a_src->meta.wi;
50272
  }
50273
50274
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
50275
  if (coro_susp_point) {
50276
    v_num_read = self->private_data.s_do_decode_frame.v_num_read;
50277
  }
50278
  switch (coro_susp_point) {
50279
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
50280
50281
    if (self->private_impl.f_call_sequence == 64u) {
50282
    } else if (self->private_impl.f_call_sequence < 64u) {
50283
      if (a_src) {
50284
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50285
      }
50286
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
50287
      status = wuffs_handsum__decoder__do_decode_frame_config(self, NULL, a_src);
50288
      if (a_src) {
50289
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
50290
      }
50291
      if (status.repr) {
50292
        goto suspend;
50293
      }
50294
    } else {
50295
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
50296
      goto ok;
50297
    }
50298
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
50299
        wuffs_base__pixel_buffer__pixel_format(a_dst),
50300
        wuffs_base__pixel_buffer__palette(a_dst),
50301
        wuffs_base__utility__make_pixel_format(2415954056u),
50302
        wuffs_base__utility__empty_slice_u8(),
50303
        a_blend);
50304
    if ( ! wuffs_base__status__is_ok(&v_status)) {
50305
      status = v_status;
50306
      if (wuffs_base__status__is_error(&status)) {
50307
        goto exit;
50308
      } else if (wuffs_base__status__is_suspension(&status)) {
50309
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
50310
        goto exit;
50311
      }
50312
      goto ok;
50313
    }
50314
    while (v_num_read < 45u) {
50315
      v_num_read += wuffs_private_impl__io_reader__limited_copy_u32_to_slice(
50316
          &iop_a_src, io2_a_src,(45u - v_num_read), wuffs_base__make_slice_u8_ij(self->private_data.f_bits, v_num_read, 64));
50317
      if (v_num_read < 45u) {
50318
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
50319
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
50320
      }
50321
    }
50322
    self->private_impl.f_bit_offset = 0u;
50323
    wuffs_handsum__decoder__decode_block(self, 0u, 0u, 0u);
50324
    wuffs_handsum__decoder__decode_block(self, 0u, 0u, 32u);
50325
    wuffs_handsum__decoder__decode_block(self, 0u, 8u, 0u);
50326
    wuffs_handsum__decoder__decode_block(self, 0u, 8u, 32u);
50327
    wuffs_handsum__decoder__decode_block(self, 1u, 0u, 1u);
50328
    wuffs_handsum__decoder__decode_block(self, 1u, 0u, 2u);
50329
    wuffs_handsum__decoder__smooth_luma_block_seams(self);
50330
    wuffs_handsum__decoder__upsample_chroma(self);
50331
    wuffs_handsum__decoder__convert_ycc_to_bgr(self);
50332
    wuffs_handsum__decoder__upsample_bgr(self);
50333
    v_which = 1u;
50334
    if (self->private_impl.f_width < 32u) {
50335
      v_which = 0u;
50336
      wuffs_handsum__decoder__scale_1d_horizontal(self);
50337
    } else if (self->private_impl.f_height < 32u) {
50338
      v_which = 0u;
50339
      wuffs_handsum__decoder__scale_1d_vertical(self);
50340
    }
50341
    v_status = wuffs_handsum__decoder__from_pixels_to_dst(self, a_dst, v_which);
50342
    if ( ! wuffs_base__status__is_ok(&v_status)) {
50343
      status = v_status;
50344
      if (wuffs_base__status__is_error(&status)) {
50345
        goto exit;
50346
      } else if (wuffs_base__status__is_suspension(&status)) {
50347
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
50348
        goto exit;
50349
      }
50350
      goto ok;
50351
    }
50352
    self->private_impl.f_call_sequence = 96u;
50353
50354
    ok:
50355
    self->private_impl.p_do_decode_frame = 0;
50356
    goto exit;
50357
  }
50358
50359
  goto suspend;
50360
  suspend:
50361
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
50362
  self->private_data.s_do_decode_frame.v_num_read = v_num_read;
50363
50364
  goto exit;
50365
  exit:
50366
  if (a_src && a_src->data.ptr) {
50367
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
50368
  }
50369
50370
  return status;
50371
}
50372
50373
// -------- func handsum.decoder.decode_block
50374
50375
WUFFS_BASE__GENERATED_C_CODE
50376
static wuffs_base__empty_struct
50377
wuffs_handsum__decoder__decode_block(
50378
    wuffs_handsum__decoder* self,
50379
    uint32_t a_which,
50380
    uint32_t a_y_offset,
50381
    uint32_t a_x_offset) {
50382
  uint32_t v_y = 0;
50383
  uint32_t v_x = 0;
50384
  uint32_t v_v = 0;
50385
  uint32_t v_u = 0;
50386
  uint64_t v_alphas_sum_32 = 0;
50387
  uint64_t v_half_alpha_v_16 = 0;
50388
  uint64_t v_half_alpha_u_16 = 0;
50389
  uint64_t v_alphas_16 = 0;
50390
  uint64_t v_c_32 = 0;
50391
  uint64_t v_c_16 = 0;
50392
  uint64_t v_result_0 = 0;
50393
50394
  wuffs_handsum__decoder__decode_coeffs(self);
50395
  v_y = 0u;
50396
  while (v_y < 8u) {
50397
    v_x = 0u;
50398
    while (v_x < 8u) {
50399
      v_alphas_sum_32 = 0u;
50400
      v_v = 0u;
50401
      while (v_v < 5u) {
50402
        v_half_alpha_v_16 = ((uint64_t)(23170u));
50403
        if (v_v != 0u) {
50404
          v_half_alpha_v_16 = ((uint64_t)(32768u));
50405
        }
50406
        v_u = 0u;
50407
        while (v_u < 5u) {
50408
          v_half_alpha_u_16 = ((uint64_t)(23170u));
50409
          if (v_u != 0u) {
50410
            v_half_alpha_u_16 = ((uint64_t)(32768u));
50411
          }
50412
          v_alphas_16 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(((uint64_t)(v_half_alpha_v_16 * v_half_alpha_u_16)) + 32768u)), 16u);
50413
          v_c_32 = ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(WUFFS_HANDSUM__COSINES[((((2u * v_x) + 1u) * v_u) & 31u)]) * wuffs_base__utility__sign_extend_convert_u32_u64(WUFFS_HANDSUM__COSINES[((((2u * v_y) + 1u) * v_v) & 31u)])));
50414
          v_c_16 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(v_c_32 + 32768u)), 16u);
50415
          v_alphas_sum_32 += ((uint64_t)(((uint64_t)(v_alphas_16 * v_c_16)) * wuffs_base__utility__sign_extend_convert_u16_u64(self->private_impl.f_coeffs[((8u * v_v) + v_u)])));
50416
          v_u += 1u;
50417
        }
50418
        v_v += 1u;
50419
      }
50420
      v_result_0 = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(v_alphas_sum_32 + 2147483648u)), 32u);
50421
      self->private_data.f_buffers[a_which][(a_y_offset + v_y)][(a_x_offset + (4u * v_x))] = WUFFS_HANDSUM__BIAS_AND_CLAMP[(v_result_0 & 1023u)];
50422
      v_x += 1u;
50423
    }
50424
    v_y += 1u;
50425
  }
50426
  return wuffs_base__make_empty_struct();
50427
}
50428
50429
// -------- func handsum.decoder.decode_coeffs
50430
50431
WUFFS_BASE__GENERATED_C_CODE
50432
static wuffs_base__empty_struct
50433
wuffs_handsum__decoder__decode_coeffs(
50434
    wuffs_handsum__decoder* self) {
50435
  uint32_t v_bo = 0;
50436
  uint8_t v_nibble = 0;
50437
  uint32_t v_i = 0;
50438
50439
  v_bo = ((uint32_t)(self->private_impl.f_bit_offset));
50440
  v_nibble = ((uint8_t)(((uint8_t)(self->private_data.f_bits[((v_bo >> 3u) & 63u)] >> (v_bo & 4u))) & 15u));
50441
  self->private_impl.f_coeffs[0u] = ((uint16_t)(((uint16_t)(((uint16_t)(v_nibble)) - 8u)) * 128u));
50442
  v_bo += 4u;
50443
  v_i = 1u;
50444
  while (v_i < 15u) {
50445
    v_nibble = ((uint8_t)(((uint8_t)(self->private_data.f_bits[((v_bo >> 3u) & 63u)] >> (v_bo & 4u))) & 15u));
50446
    self->private_impl.f_coeffs[WUFFS_HANDSUM__ZIGZAG[v_i]] = ((uint16_t)(((uint16_t)(((uint16_t)(v_nibble)) - 8u)) * 16u));
50447
    v_bo += 4u;
50448
    v_i += 1u;
50449
  }
50450
  self->private_impl.f_bit_offset = ((uint16_t)(v_bo));
50451
  return wuffs_base__make_empty_struct();
50452
}
50453
50454
// -------- func handsum.decoder.smooth_luma_block_seams
50455
50456
WUFFS_BASE__GENERATED_C_CODE
50457
static wuffs_base__empty_struct
50458
wuffs_handsum__decoder__smooth_luma_block_seams(
50459
    wuffs_handsum__decoder* self) {
50460
  uint32_t v_i = 0;
50461
  uint8_t v_p0 = 0;
50462
  uint8_t v_p1 = 0;
50463
  uint32_t v_y0 = 0;
50464
  uint32_t v_y1 = 0;
50465
  uint32_t v_x0 = 0;
50466
  uint32_t v_x1 = 0;
50467
  uint32_t v_v0 = 0;
50468
  uint32_t v_v1 = 0;
50469
  uint32_t v_w0 = 0;
50470
  uint32_t v_w1 = 0;
50471
  uint32_t v_v77 = 0;
50472
  uint32_t v_v78 = 0;
50473
  uint32_t v_v88 = 0;
50474
  uint32_t v_v87 = 0;
50475
  uint32_t v_w77 = 0;
50476
  uint32_t v_w78 = 0;
50477
  uint32_t v_w88 = 0;
50478
  uint32_t v_w87 = 0;
50479
50480
  v_i = 0u;
50481
  while (v_i <= 54u) {
50482
    v_p0 = WUFFS_HANDSUM__SMOOTHING_PAIRS[(v_i + 0u)];
50483
    v_p1 = WUFFS_HANDSUM__SMOOTHING_PAIRS[(v_i + 1u)];
50484
    v_y0 = ((uint32_t)(((uint8_t)(v_p0 >> 4u))));
50485
    v_y1 = ((uint32_t)(((uint8_t)(v_p1 >> 4u))));
50486
    v_x0 = ((uint32_t)(((uint8_t)(v_p0 & 15u))));
50487
    v_x1 = ((uint32_t)(((uint8_t)(v_p1 & 15u))));
50488
    v_v0 = ((uint32_t)(self->private_data.f_buffers[0u][v_y0][(v_x0 * 4u)]));
50489
    v_v1 = ((uint32_t)(self->private_data.f_buffers[0u][v_y1][(v_x1 * 4u)]));
50490
    v_w0 = (((3u * v_v0) + v_v1 + 2u) / 4u);
50491
    v_w1 = (((3u * v_v1) + v_v0 + 2u) / 4u);
50492
    self->private_data.f_buffers[0u][v_y0][(v_x0 * 4u)] = ((uint8_t)(v_w0));
50493
    self->private_data.f_buffers[0u][v_y1][(v_x1 * 4u)] = ((uint8_t)(v_w1));
50494
    v_i += 2u;
50495
  }
50496
  v_v77 = ((uint32_t)(self->private_data.f_buffers[0u][7u][28u]));
50497
  v_v78 = ((uint32_t)(self->private_data.f_buffers[0u][7u][32u]));
50498
  v_v88 = ((uint32_t)(self->private_data.f_buffers[0u][8u][32u]));
50499
  v_v87 = ((uint32_t)(self->private_data.f_buffers[0u][8u][28u]));
50500
  v_w77 = (((9u * v_v77) +
50501
      (3u * v_v78) +
50502
      v_v88 +
50503
      (3u * v_v87) +
50504
      8u) / 16u);
50505
  v_w78 = (((9u * v_v78) +
50506
      (3u * v_v88) +
50507
      v_v87 +
50508
      (3u * v_v77) +
50509
      8u) / 16u);
50510
  v_w88 = (((9u * v_v88) +
50511
      (3u * v_v87) +
50512
      v_v77 +
50513
      (3u * v_v78) +
50514
      8u) / 16u);
50515
  v_w87 = (((9u * v_v87) +
50516
      (3u * v_v77) +
50517
      v_v78 +
50518
      (3u * v_v88) +
50519
      8u) / 16u);
50520
  self->private_data.f_buffers[0u][7u][28u] = ((uint8_t)(v_w77));
50521
  self->private_data.f_buffers[0u][7u][32u] = ((uint8_t)(v_w78));
50522
  self->private_data.f_buffers[0u][8u][32u] = ((uint8_t)(v_w88));
50523
  self->private_data.f_buffers[0u][8u][28u] = ((uint8_t)(v_w87));
50524
  return wuffs_base__make_empty_struct();
50525
}
50526
50527
// -------- func handsum.decoder.upsample_chroma
50528
50529
WUFFS_BASE__GENERATED_C_CODE
50530
static wuffs_base__empty_struct
50531
wuffs_handsum__decoder__upsample_chroma(
50532
    wuffs_handsum__decoder* self) {
50533
  uint32_t v_y = 0;
50534
  uint32_t v_dy = 0;
50535
  uint32_t v_y0 = 0;
50536
  uint32_t v_y1 = 0;
50537
  uint32_t v_x = 0;
50538
  uint32_t v_dx = 0;
50539
  uint32_t v_x0 = 0;
50540
  uint32_t v_x1 = 0;
50541
50542
  v_y = 0u;
50543
  while (v_y < 16u) {
50544
    v_dy = ((uint32_t)(((v_y & 1u) * 2u) - 1u));
50545
    v_y0 = (v_y >> 1u);
50546
    v_y1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_7[(((uint32_t)(v_y0 + v_dy)) & 31u)]));
50547
    v_x = 0u;
50548
    while (v_x < 16u) {
50549
      v_dx = ((uint32_t)(((v_x & 1u) * 2u) - 1u));
50550
      v_x0 = (v_x >> 1u);
50551
      v_x1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_7[(((uint32_t)(v_x0 + v_dx)) & 31u)]));
50552
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x0) + 1u)])) * 9u) +
50553
          (((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x1) + 1u)])) * 3u) +
50554
          (((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x0) + 1u)])) * 3u) +
50555
          ((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x1) + 1u)])) +
50556
          8u) / 16u)));
50557
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x0) + 2u)])) * 9u) +
50558
          (((uint32_t)(self->private_data.f_buffers[1u][v_y0][((4u * v_x1) + 2u)])) * 3u) +
50559
          (((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x0) + 2u)])) * 3u) +
50560
          ((uint32_t)(self->private_data.f_buffers[1u][v_y1][((4u * v_x1) + 2u)])) +
50561
          8u) / 16u)));
50562
      v_x += 1u;
50563
    }
50564
    v_y += 1u;
50565
  }
50566
  return wuffs_base__make_empty_struct();
50567
}
50568
50569
// -------- func handsum.decoder.upsample_bgr
50570
50571
WUFFS_BASE__GENERATED_C_CODE
50572
static wuffs_base__empty_struct
50573
wuffs_handsum__decoder__upsample_bgr(
50574
    wuffs_handsum__decoder* self) {
50575
  uint32_t v_y = 0;
50576
  uint32_t v_dy = 0;
50577
  uint32_t v_y0 = 0;
50578
  uint32_t v_y1 = 0;
50579
  uint32_t v_x = 0;
50580
  uint32_t v_dx = 0;
50581
  uint32_t v_x0 = 0;
50582
  uint32_t v_x1 = 0;
50583
50584
  v_y = 0u;
50585
  while (v_y < 32u) {
50586
    v_dy = ((uint32_t)(((v_y & 1u) * 2u) - 1u));
50587
    v_y0 = (v_y >> 1u);
50588
    v_y1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_15[(((uint32_t)(v_y0 + v_dy)) & 63u)]));
50589
    v_x = 0u;
50590
    while (v_x < 32u) {
50591
      v_dx = ((uint32_t)(((v_x & 1u) * 2u) - 1u));
50592
      v_x0 = (v_x >> 1u);
50593
      v_x1 = ((uint32_t)(WUFFS_HANDSUM__CLAMP_15[(((uint32_t)(v_x0 + v_dx)) & 63u)]));
50594
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 0u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 0u)])) * 9u) +
50595
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 0u)])) * 3u) +
50596
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 0u)])) * 3u) +
50597
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 0u)])) +
50598
          8u) / 16u)));
50599
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 1u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 1u)])) * 9u) +
50600
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 1u)])) * 3u) +
50601
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 1u)])) * 3u) +
50602
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 1u)])) +
50603
          8u) / 16u)));
50604
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 2u)] = ((uint8_t)((((((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x0) + 2u)])) * 9u) +
50605
          (((uint32_t)(self->private_data.f_buffers[0u][v_y0][((4u * v_x1) + 2u)])) * 3u) +
50606
          (((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x0) + 2u)])) * 3u) +
50607
          ((uint32_t)(self->private_data.f_buffers[0u][v_y1][((4u * v_x1) + 2u)])) +
50608
          8u) / 16u)));
50609
      self->private_data.f_buffers[1u][v_y][((4u * v_x) + 3u)] = 255u;
50610
      v_x += 1u;
50611
    }
50612
    v_y += 1u;
50613
  }
50614
  return wuffs_base__make_empty_struct();
50615
}
50616
50617
// -------- func handsum.decoder.convert_ycc_to_bgr
50618
50619
WUFFS_BASE__GENERATED_C_CODE
50620
static wuffs_base__empty_struct
50621
wuffs_handsum__decoder__convert_ycc_to_bgr(
50622
    wuffs_handsum__decoder* self) {
50623
  uint32_t v_y = 0;
50624
  uint32_t v_x = 0;
50625
  uint32_t v_yy1 = 0;
50626
  uint32_t v_cb1 = 0;
50627
  uint32_t v_cr1 = 0;
50628
  uint32_t v_r = 0;
50629
  uint32_t v_g = 0;
50630
  uint32_t v_b = 0;
50631
50632
  v_y = 0u;
50633
  while (v_y < 16u) {
50634
    v_x = 0u;
50635
    while (v_x < 16u) {
50636
      v_yy1 = (((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 0u)])) * 65793u);
50637
      v_cb1 = ((uint32_t)(((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)])) - 128u));
50638
      v_cr1 = ((uint32_t)(((uint32_t)(self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)])) - 128u));
50639
      v_r = ((uint32_t)(v_yy1 + ((uint32_t)(91881u * v_cr1))));
50640
      if ((v_r & 4278190080u) == 0u) {
50641
        v_r >>= 16u;
50642
      } else {
50643
        v_r = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_r, 31u));
50644
      }
50645
      v_g = ((uint32_t)(v_yy1 - ((uint32_t)(((uint32_t)(22554u * v_cb1)) + ((uint32_t)(46802u * v_cr1))))));
50646
      if ((v_g & 4278190080u) == 0u) {
50647
        v_g >>= 16u;
50648
      } else {
50649
        v_g = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_g, 31u));
50650
      }
50651
      v_b = ((uint32_t)(v_yy1 + ((uint32_t)(116130u * v_cb1))));
50652
      if ((v_b & 4278190080u) == 0u) {
50653
        v_b >>= 16u;
50654
      } else {
50655
        v_b = (4294967295u ^ wuffs_base__utility__sign_extend_rshift_u32(v_b, 31u));
50656
      }
50657
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 0u)] = ((uint8_t)(v_b));
50658
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 1u)] = ((uint8_t)(v_g));
50659
      self->private_data.f_buffers[0u][v_y][((4u * v_x) + 2u)] = ((uint8_t)(v_r));
50660
      v_x += 1u;
50661
    }
50662
    v_y += 1u;
50663
  }
50664
  return wuffs_base__make_empty_struct();
50665
}
50666
50667
// -------- func handsum.decoder.scale_1d_horizontal
50668
50669
WUFFS_BASE__GENERATED_C_CODE
50670
static wuffs_base__empty_struct
50671
wuffs_handsum__decoder__scale_1d_horizontal(
50672
    wuffs_handsum__decoder* self) {
50673
  uint32_t v_y = 0;
50674
  uint32_t v_dstx = 0;
50675
  uint32_t v_srcx = 0;
50676
  uint32_t v_acc0 = 0;
50677
  uint32_t v_acc1 = 0;
50678
  uint32_t v_acc2 = 0;
50679
  uint32_t v_s0 = 0;
50680
  uint32_t v_s1 = 0;
50681
  uint32_t v_s2 = 0;
50682
  uint32_t v_remainder = 0;
50683
  uint32_t v_partial = 0;
50684
50685
  v_y = 0u;
50686
  while (v_y < 32u) {
50687
    v_dstx = 0u;
50688
    v_srcx = 0u;
50689
    v_acc0 = 0u;
50690
    v_acc1 = 0u;
50691
    v_acc2 = 0u;
50692
    v_remainder = 32u;
50693
    while (v_srcx < 32u) {
50694
      v_s0 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 0u)]));
50695
      v_s1 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 1u)]));
50696
      v_s2 = ((uint32_t)(self->private_data.f_buffers[1u][v_y][((4u * v_srcx) + 2u)]));
50697
      if (v_remainder > self->private_impl.f_width) {
50698
        v_remainder -= self->private_impl.f_width;
50699
        v_acc0 += (self->private_impl.f_width * v_s0);
50700
        v_acc1 += (self->private_impl.f_width * v_s1);
50701
        v_acc2 += (self->private_impl.f_width * v_s2);
50702
      } else {
50703
        v_acc0 += (v_remainder * v_s0);
50704
        v_acc1 += (v_remainder * v_s1);
50705
        v_acc2 += (v_remainder * v_s2);
50706
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 0u)] = ((uint8_t)((((uint32_t)(v_acc0 + 16u)) / 32u)));
50707
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 1u)] = ((uint8_t)((((uint32_t)(v_acc1 + 16u)) / 32u)));
50708
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 2u)] = ((uint8_t)((((uint32_t)(v_acc2 + 16u)) / 32u)));
50709
        self->private_data.f_buffers[0u][v_y][((4u * v_dstx) + 3u)] = 255u;
50710
        v_dstx = ((v_dstx + 1u) & 31u);
50711
        v_partial = (self->private_impl.f_width - v_remainder);
50712
        v_acc0 = (v_partial * v_s0);
50713
        v_acc1 = (v_partial * v_s1);
50714
        v_acc2 = (v_partial * v_s2);
50715
        v_remainder = (32u - v_partial);
50716
      }
50717
      v_srcx += 1u;
50718
    }
50719
    v_y += 1u;
50720
  }
50721
  return wuffs_base__make_empty_struct();
50722
}
50723
50724
// -------- func handsum.decoder.scale_1d_vertical
50725
50726
WUFFS_BASE__GENERATED_C_CODE
50727
static wuffs_base__empty_struct
50728
wuffs_handsum__decoder__scale_1d_vertical(
50729
    wuffs_handsum__decoder* self) {
50730
  uint32_t v_x = 0;
50731
  uint32_t v_dsty = 0;
50732
  uint32_t v_srcy = 0;
50733
  uint32_t v_acc0 = 0;
50734
  uint32_t v_acc1 = 0;
50735
  uint32_t v_acc2 = 0;
50736
  uint32_t v_s0 = 0;
50737
  uint32_t v_s1 = 0;
50738
  uint32_t v_s2 = 0;
50739
  uint32_t v_remainder = 0;
50740
  uint32_t v_partial = 0;
50741
50742
  v_x = 0u;
50743
  while (v_x < 32u) {
50744
    v_dsty = 0u;
50745
    v_srcy = 0u;
50746
    v_acc0 = 0u;
50747
    v_acc1 = 0u;
50748
    v_acc2 = 0u;
50749
    v_remainder = 32u;
50750
    while (v_srcy < 32u) {
50751
      v_s0 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 0u)]));
50752
      v_s1 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 1u)]));
50753
      v_s2 = ((uint32_t)(self->private_data.f_buffers[1u][v_srcy][((4u * v_x) + 2u)]));
50754
      if (v_remainder > self->private_impl.f_height) {
50755
        v_remainder -= self->private_impl.f_height;
50756
        v_acc0 += (self->private_impl.f_height * v_s0);
50757
        v_acc1 += (self->private_impl.f_height * v_s1);
50758
        v_acc2 += (self->private_impl.f_height * v_s2);
50759
      } else {
50760
        v_acc0 += (v_remainder * v_s0);
50761
        v_acc1 += (v_remainder * v_s1);
50762
        v_acc2 += (v_remainder * v_s2);
50763
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 0u)] = ((uint8_t)((((uint32_t)(v_acc0 + 16u)) / 32u)));
50764
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 1u)] = ((uint8_t)((((uint32_t)(v_acc1 + 16u)) / 32u)));
50765
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 2u)] = ((uint8_t)((((uint32_t)(v_acc2 + 16u)) / 32u)));
50766
        self->private_data.f_buffers[0u][v_dsty][((4u * v_x) + 3u)] = 255u;
50767
        v_dsty = ((v_dsty + 1u) & 31u);
50768
        v_partial = (self->private_impl.f_height - v_remainder);
50769
        v_acc0 = (v_partial * v_s0);
50770
        v_acc1 = (v_partial * v_s1);
50771
        v_acc2 = (v_partial * v_s2);
50772
        v_remainder = (32u - v_partial);
50773
      }
50774
      v_srcy += 1u;
50775
    }
50776
    v_x += 1u;
50777
  }
50778
  return wuffs_base__make_empty_struct();
50779
}
50780
50781
// -------- func handsum.decoder.from_pixels_to_dst
50782
50783
WUFFS_BASE__GENERATED_C_CODE
50784
static wuffs_base__status
50785
wuffs_handsum__decoder__from_pixels_to_dst(
50786
    wuffs_handsum__decoder* self,
50787
    wuffs_base__pixel_buffer* a_dst,
50788
    uint32_t a_which) {
50789
  wuffs_base__pixel_format v_dst_pixfmt = {0};
50790
  uint32_t v_dst_bits_per_pixel = 0;
50791
  uint32_t v_dst_bytes_per_pixel = 0;
50792
  uint64_t v_dst_bytes_per_row = 0;
50793
  wuffs_base__table_u8 v_tab = {0};
50794
  uint32_t v_y = 0;
50795
  wuffs_base__slice_u8 v_dst = {0};
50796
  wuffs_base__slice_u8 v_src = {0};
50797
50798
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
50799
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
50800
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
50801
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
50802
  }
50803
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
50804
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
50805
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
50806
  while (v_y < self->private_impl.f_height) {
50807
    v_src = wuffs_base__make_slice_u8(self->private_data.f_buffers[a_which][v_y], (self->private_impl.f_width * 4u));
50808
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
50809
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
50810
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
50811
    }
50812
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), v_src);
50813
    v_y += 1u;
50814
  }
50815
  return wuffs_base__make_status(NULL);
50816
}
50817
50818
// -------- func handsum.decoder.frame_dirty_rect
50819
50820
WUFFS_BASE__GENERATED_C_CODE
50821
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
50822
wuffs_handsum__decoder__frame_dirty_rect(
50823
    const wuffs_handsum__decoder* self) {
50824
  if (!self) {
50825
    return wuffs_base__utility__empty_rect_ie_u32();
50826
  }
50827
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50828
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50829
    return wuffs_base__utility__empty_rect_ie_u32();
50830
  }
50831
50832
  return wuffs_base__utility__make_rect_ie_u32(
50833
      0u,
50834
      0u,
50835
      self->private_impl.f_width,
50836
      self->private_impl.f_height);
50837
}
50838
50839
// -------- func handsum.decoder.num_animation_loops
50840
50841
WUFFS_BASE__GENERATED_C_CODE
50842
WUFFS_BASE__MAYBE_STATIC uint32_t
50843
wuffs_handsum__decoder__num_animation_loops(
50844
    const wuffs_handsum__decoder* self) {
50845
  if (!self) {
50846
    return 0;
50847
  }
50848
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50849
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50850
    return 0;
50851
  }
50852
50853
  return 0u;
50854
}
50855
50856
// -------- func handsum.decoder.num_decoded_frame_configs
50857
50858
WUFFS_BASE__GENERATED_C_CODE
50859
WUFFS_BASE__MAYBE_STATIC uint64_t
50860
wuffs_handsum__decoder__num_decoded_frame_configs(
50861
    const wuffs_handsum__decoder* self) {
50862
  if (!self) {
50863
    return 0;
50864
  }
50865
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50866
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50867
    return 0;
50868
  }
50869
50870
  if (self->private_impl.f_call_sequence > 32u) {
50871
    return 1u;
50872
  }
50873
  return 0u;
50874
}
50875
50876
// -------- func handsum.decoder.num_decoded_frames
50877
50878
WUFFS_BASE__GENERATED_C_CODE
50879
WUFFS_BASE__MAYBE_STATIC uint64_t
50880
wuffs_handsum__decoder__num_decoded_frames(
50881
    const wuffs_handsum__decoder* self) {
50882
  if (!self) {
50883
    return 0;
50884
  }
50885
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50886
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50887
    return 0;
50888
  }
50889
50890
  if (self->private_impl.f_call_sequence > 64u) {
50891
    return 1u;
50892
  }
50893
  return 0u;
50894
}
50895
50896
// -------- func handsum.decoder.restart_frame
50897
50898
WUFFS_BASE__GENERATED_C_CODE
50899
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50900
wuffs_handsum__decoder__restart_frame(
50901
    wuffs_handsum__decoder* self,
50902
    uint64_t a_index,
50903
    uint64_t a_io_position) {
50904
  if (!self) {
50905
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50906
  }
50907
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50908
    return wuffs_base__make_status(
50909
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50910
        ? wuffs_base__error__disabled_by_previous_error
50911
        : wuffs_base__error__initialize_not_called);
50912
  }
50913
50914
  if (self->private_impl.f_call_sequence < 32u) {
50915
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
50916
  }
50917
  if ((a_index != 0u) || (a_io_position != 3u)) {
50918
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50919
  }
50920
  self->private_impl.f_call_sequence = 40u;
50921
  return wuffs_base__make_status(NULL);
50922
}
50923
50924
// -------- func handsum.decoder.set_report_metadata
50925
50926
WUFFS_BASE__GENERATED_C_CODE
50927
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
50928
wuffs_handsum__decoder__set_report_metadata(
50929
    wuffs_handsum__decoder* self,
50930
    uint32_t a_fourcc,
50931
    bool a_report) {
50932
  return wuffs_base__make_empty_struct();
50933
}
50934
50935
// -------- func handsum.decoder.tell_me_more
50936
50937
WUFFS_BASE__GENERATED_C_CODE
50938
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
50939
wuffs_handsum__decoder__tell_me_more(
50940
    wuffs_handsum__decoder* self,
50941
    wuffs_base__io_buffer* a_dst,
50942
    wuffs_base__more_information* a_minfo,
50943
    wuffs_base__io_buffer* a_src) {
50944
  if (!self) {
50945
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
50946
  }
50947
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
50948
    return wuffs_base__make_status(
50949
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
50950
        ? wuffs_base__error__disabled_by_previous_error
50951
        : wuffs_base__error__initialize_not_called);
50952
  }
50953
  if (!a_dst || !a_src) {
50954
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50955
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
50956
  }
50957
  if ((self->private_impl.active_coroutine != 0) &&
50958
      (self->private_impl.active_coroutine != 4)) {
50959
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50960
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
50961
  }
50962
  self->private_impl.active_coroutine = 0;
50963
  wuffs_base__status status = wuffs_base__make_status(NULL);
50964
50965
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
50966
  goto exit;
50967
50968
  goto ok;
50969
  ok:
50970
  goto exit;
50971
  exit:
50972
  if (wuffs_base__status__is_error(&status)) {
50973
    self->private_impl.magic = WUFFS_BASE__DISABLED;
50974
  }
50975
  return status;
50976
}
50977
50978
// -------- func handsum.decoder.workbuf_len
50979
50980
WUFFS_BASE__GENERATED_C_CODE
50981
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
50982
wuffs_handsum__decoder__workbuf_len(
50983
    const wuffs_handsum__decoder* self) {
50984
  if (!self) {
50985
    return wuffs_base__utility__empty_range_ii_u64();
50986
  }
50987
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
50988
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
50989
    return wuffs_base__utility__empty_range_ii_u64();
50990
  }
50991
50992
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
50993
}
50994
50995
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
50996
50997
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
50998
50999
// ---------------- Status Codes Implementations
51000
51001
const char wuffs_jpeg__error__bad_dht_marker[] = "#jpeg: bad DHT marker";
51002
const char wuffs_jpeg__error__bad_dqt_marker[] = "#jpeg: bad DQT marker";
51003
const char wuffs_jpeg__error__bad_dri_marker[] = "#jpeg: bad DRI marker";
51004
const char wuffs_jpeg__error__bad_sof_marker[] = "#jpeg: bad SOF marker";
51005
const char wuffs_jpeg__error__bad_sos_marker[] = "#jpeg: bad SOS marker";
51006
const char wuffs_jpeg__error__bad_header[] = "#jpeg: bad header";
51007
const char wuffs_jpeg__error__bad_marker[] = "#jpeg: bad marker";
51008
const char wuffs_jpeg__error__bad_scan_count[] = "#jpeg: bad scan count";
51009
const char wuffs_jpeg__error__missing_huffman_table[] = "#jpeg: missing Huffman table";
51010
const char wuffs_jpeg__error__missing_quantization_table[] = "#jpeg: missing Quantization table";
51011
const char wuffs_jpeg__error__rejected_progressive_jpeg[] = "#jpeg: rejected progressive JPEG";
51012
const char wuffs_jpeg__error__short_sos_bitstream[] = "#jpeg: short SOS bitstream";
51013
const char wuffs_jpeg__error__truncated_input[] = "#jpeg: truncated input";
51014
const char wuffs_jpeg__error__unsupported_arithmetic_coding[] = "#jpeg: unsupported arithmetic coding";
51015
const char wuffs_jpeg__error__unsupported_color_model[] = "#jpeg: unsupported color model";
51016
const char wuffs_jpeg__error__unsupported_fractional_sampling[] = "#jpeg: unsupported fractional sampling";
51017
const char wuffs_jpeg__error__unsupported_hierarchical_coding[] = "#jpeg: unsupported hierarchical coding";
51018
const char wuffs_jpeg__error__unsupported_implicit_height[] = "#jpeg: unsupported implicit height";
51019
const char wuffs_jpeg__error__unsupported_lossless_coding[] = "#jpeg: unsupported lossless coding";
51020
const char wuffs_jpeg__error__unsupported_marker[] = "#jpeg: unsupported marker";
51021
const char wuffs_jpeg__error__unsupported_precision_12_bits[] = "#jpeg: unsupported precision (12 bits)";
51022
const char wuffs_jpeg__error__unsupported_precision_16_bits[] = "#jpeg: unsupported precision (16 bits)";
51023
const char wuffs_jpeg__error__unsupported_precision[] = "#jpeg: unsupported precision";
51024
const char wuffs_jpeg__error__unsupported_scan_count[] = "#jpeg: unsupported scan count";
51025
const char wuffs_jpeg__error__internal_error_inconsistent_decoder_state[] = "#jpeg: internal error: inconsistent decoder state";
51026
51027
// ---------------- Private Consts
51028
51029
static const uint8_t
51030
WUFFS_JPEG__UNZIG[80] WUFFS_BASE__POTENTIALLY_UNUSED = {
51031
  0u, 0u, 1u, 8u, 16u, 9u, 2u, 3u,
51032
  10u, 17u, 24u, 32u, 25u, 18u, 11u, 4u,
51033
  5u, 12u, 19u, 26u, 33u, 40u, 48u, 41u,
51034
  34u, 27u, 20u, 13u, 6u, 7u, 14u, 21u,
51035
  28u, 35u, 42u, 49u, 56u, 57u, 50u, 43u,
51036
  36u, 29u, 22u, 15u, 23u, 30u, 37u, 44u,
51037
  51u, 58u, 59u, 52u, 45u, 38u, 31u, 39u,
51038
  46u, 53u, 60u, 61u, 54u, 47u, 55u, 62u,
51039
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
51040
  63u, 63u, 63u, 63u, 63u, 63u, 63u, 63u,
51041
};
51042
51043
static const uint8_t
51044
WUFFS_JPEG__BIAS_AND_CLAMP[1024] WUFFS_BASE__POTENTIALLY_UNUSED = {
51045
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
51046
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
51047
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
51048
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
51049
  160u, 161u, 162u, 163u, 164u, 165u, 166u, 167u,
51050
  168u, 169u, 170u, 171u, 172u, 173u, 174u, 175u,
51051
  176u, 177u, 178u, 179u, 180u, 181u, 182u, 183u,
51052
  184u, 185u, 186u, 187u, 188u, 189u, 190u, 191u,
51053
  192u, 193u, 194u, 195u, 196u, 197u, 198u, 199u,
51054
  200u, 201u, 202u, 203u, 204u, 205u, 206u, 207u,
51055
  208u, 209u, 210u, 211u, 212u, 213u, 214u, 215u,
51056
  216u, 217u, 218u, 219u, 220u, 221u, 222u, 223u,
51057
  224u, 225u, 226u, 227u, 228u, 229u, 230u, 231u,
51058
  232u, 233u, 234u, 235u, 236u, 237u, 238u, 239u,
51059
  240u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
51060
  248u, 249u, 250u, 251u, 252u, 253u, 254u, 255u,
51061
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51062
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51063
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51064
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51065
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51066
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51067
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51068
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51069
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51070
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51071
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51072
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51073
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51074
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51075
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51076
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51077
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51078
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51079
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51080
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51081
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51082
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51083
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51084
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51085
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51086
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51087
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51088
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51089
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51090
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51091
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51092
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51093
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51094
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51095
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51096
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51097
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51098
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51099
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51100
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51101
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51102
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51103
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51104
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51105
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51106
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51107
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51108
  255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u,
51109
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51110
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51111
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51112
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51113
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51114
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51115
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51116
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51117
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51118
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51119
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51120
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51121
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51122
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51123
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51124
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51125
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51126
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51127
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51128
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51129
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51130
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51131
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51132
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51133
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51134
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51135
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51136
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51137
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51138
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51139
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51140
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51141
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51142
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51143
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51144
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51145
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51146
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51147
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51148
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51149
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51150
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51151
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51152
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51153
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51154
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51155
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51156
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
51157
  0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u,
51158
  8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u,
51159
  16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u,
51160
  24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u,
51161
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
51162
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
51163
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
51164
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
51165
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
51166
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
51167
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
51168
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
51169
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
51170
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
51171
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
51172
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 127u,
51173
};
51174
51175
static const uint16_t
51176
WUFFS_JPEG__EXTEND[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
51177
  0u, 65535u, 65533u, 65529u, 65521u, 65505u, 65473u, 65409u,
51178
  65281u, 65025u, 64513u, 63489u, 61441u, 57345u, 49153u, 32769u,
51179
};
51180
51181
static const uint8_t
51182
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
51183
  0u, 0u, 1u, 5u, 1u, 1u, 1u, 1u,
51184
  1u, 1u, 0u, 0u, 0u, 0u, 0u, 0u,
51185
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
51186
  7u, 8u, 9u, 10u, 11u,
51187
};
51188
51189
static const uint8_t
51190
WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA[29] WUFFS_BASE__POTENTIALLY_UNUSED = {
51191
  1u, 0u, 3u, 1u, 1u, 1u, 1u, 1u,
51192
  1u, 1u, 1u, 1u, 0u, 0u, 0u, 0u,
51193
  0u, 0u, 1u, 2u, 3u, 4u, 5u, 6u,
51194
  7u, 8u, 9u, 10u, 11u,
51195
};
51196
51197
static const uint8_t
51198
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
51199
  16u, 0u, 2u, 1u, 3u, 3u, 2u, 4u,
51200
  3u, 5u, 5u, 4u, 4u, 0u, 0u, 1u,
51201
  125u, 1u, 2u, 3u, 0u, 4u, 17u, 5u,
51202
  18u, 33u, 49u, 65u, 6u, 19u, 81u, 97u,
51203
  7u, 34u, 113u, 20u, 50u, 129u, 145u, 161u,
51204
  8u, 35u, 66u, 177u, 193u, 21u, 82u, 209u,
51205
  240u, 36u, 51u, 98u, 114u, 130u, 9u, 10u,
51206
  22u, 23u, 24u, 25u, 26u, 37u, 38u, 39u,
51207
  40u, 41u, 42u, 52u, 53u, 54u, 55u, 56u,
51208
  57u, 58u, 67u, 68u, 69u, 70u, 71u, 72u,
51209
  73u, 74u, 83u, 84u, 85u, 86u, 87u, 88u,
51210
  89u, 90u, 99u, 100u, 101u, 102u, 103u, 104u,
51211
  105u, 106u, 115u, 116u, 117u, 118u, 119u, 120u,
51212
  121u, 122u, 131u, 132u, 133u, 134u, 135u, 136u,
51213
  137u, 138u, 146u, 147u, 148u, 149u, 150u, 151u,
51214
  152u, 153u, 154u, 162u, 163u, 164u, 165u, 166u,
51215
  167u, 168u, 169u, 170u, 178u, 179u, 180u, 181u,
51216
  182u, 183u, 184u, 185u, 186u, 194u, 195u, 196u,
51217
  197u, 198u, 199u, 200u, 201u, 202u, 210u, 211u,
51218
  212u, 213u, 214u, 215u, 216u, 217u, 218u, 225u,
51219
  226u, 227u, 228u, 229u, 230u, 231u, 232u, 233u,
51220
  234u, 241u, 242u, 243u, 244u, 245u, 246u, 247u,
51221
  248u, 249u, 250u,
51222
};
51223
51224
static const uint8_t
51225
WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA[179] WUFFS_BASE__POTENTIALLY_UNUSED = {
51226
  17u, 0u, 2u, 1u, 2u, 4u, 4u, 3u,
51227
  4u, 7u, 5u, 4u, 4u, 0u, 1u, 2u,
51228
  119u, 0u, 1u, 2u, 3u, 17u, 4u, 5u,
51229
  33u, 49u, 6u, 18u, 65u, 81u, 7u, 97u,
51230
  113u, 19u, 34u, 50u, 129u, 8u, 20u, 66u,
51231
  145u, 161u, 177u, 193u, 9u, 35u, 51u, 82u,
51232
  240u, 21u, 98u, 114u, 209u, 10u, 22u, 36u,
51233
  52u, 225u, 37u, 241u, 23u, 24u, 25u, 26u,
51234
  38u, 39u, 40u, 41u, 42u, 53u, 54u, 55u,
51235
  56u, 57u, 58u, 67u, 68u, 69u, 70u, 71u,
51236
  72u, 73u, 74u, 83u, 84u, 85u, 86u, 87u,
51237
  88u, 89u, 90u, 99u, 100u, 101u, 102u, 103u,
51238
  104u, 105u, 106u, 115u, 116u, 117u, 118u, 119u,
51239
  120u, 121u, 122u, 130u, 131u, 132u, 133u, 134u,
51240
  135u, 136u, 137u, 138u, 146u, 147u, 148u, 149u,
51241
  150u, 151u, 152u, 153u, 154u, 162u, 163u, 164u,
51242
  165u, 166u, 167u, 168u, 169u, 170u, 178u, 179u,
51243
  180u, 181u, 182u, 183u, 184u, 185u, 186u, 194u,
51244
  195u, 196u, 197u, 198u, 199u, 200u, 201u, 202u,
51245
  210u, 211u, 212u, 213u, 214u, 215u, 216u, 217u,
51246
  218u, 226u, 227u, 228u, 229u, 230u, 231u, 232u,
51247
  233u, 234u, 242u, 243u, 244u, 245u, 246u, 247u,
51248
  248u, 249u, 250u,
51249
};
51250
51251
#define WUFFS_JPEG__QUIRKS_BASE 1162824704u
51252
51253
// ---------------- Private Initializer Prototypes
51254
51255
// ---------------- Private Function Prototypes
51256
51257
WUFFS_BASE__GENERATED_C_CODE
51258
static wuffs_base__empty_struct
51259
wuffs_jpeg__decoder__decode_idct(
51260
    wuffs_jpeg__decoder* self,
51261
    wuffs_base__slice_u8 a_dst_buffer,
51262
    uint64_t a_dst_stride,
51263
    uint32_t a_q);
51264
51265
WUFFS_BASE__GENERATED_C_CODE
51266
static wuffs_base__empty_struct
51267
wuffs_jpeg__decoder__decode_idct__choosy_default(
51268
    wuffs_jpeg__decoder* self,
51269
    wuffs_base__slice_u8 a_dst_buffer,
51270
    uint64_t a_dst_stride,
51271
    uint32_t a_q);
51272
51273
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
51274
WUFFS_BASE__GENERATED_C_CODE
51275
static wuffs_base__empty_struct
51276
wuffs_jpeg__decoder__decode_idct_x86_avx2(
51277
    wuffs_jpeg__decoder* self,
51278
    wuffs_base__slice_u8 a_dst_buffer,
51279
    uint64_t a_dst_stride,
51280
    uint32_t a_q);
51281
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
51282
51283
WUFFS_BASE__GENERATED_C_CODE
51284
static wuffs_base__status
51285
wuffs_jpeg__decoder__do_decode_image_config(
51286
    wuffs_jpeg__decoder* self,
51287
    wuffs_base__image_config* a_dst,
51288
    wuffs_base__io_buffer* a_src);
51289
51290
WUFFS_BASE__GENERATED_C_CODE
51291
static wuffs_base__status
51292
wuffs_jpeg__decoder__decode_dqt(
51293
    wuffs_jpeg__decoder* self,
51294
    wuffs_base__io_buffer* a_src);
51295
51296
WUFFS_BASE__GENERATED_C_CODE
51297
static wuffs_base__status
51298
wuffs_jpeg__decoder__decode_dri(
51299
    wuffs_jpeg__decoder* self,
51300
    wuffs_base__io_buffer* a_src);
51301
51302
WUFFS_BASE__GENERATED_C_CODE
51303
static wuffs_base__status
51304
wuffs_jpeg__decoder__decode_appn(
51305
    wuffs_jpeg__decoder* self,
51306
    wuffs_base__io_buffer* a_src,
51307
    uint8_t a_marker);
51308
51309
WUFFS_BASE__GENERATED_C_CODE
51310
static wuffs_base__status
51311
wuffs_jpeg__decoder__decode_sof(
51312
    wuffs_jpeg__decoder* self,
51313
    wuffs_base__io_buffer* a_src);
51314
51315
WUFFS_BASE__GENERATED_C_CODE
51316
static uint32_t
51317
wuffs_jpeg__decoder__quantize_dimension(
51318
    const wuffs_jpeg__decoder* self,
51319
    uint32_t a_width,
51320
    uint8_t a_h,
51321
    uint8_t a_max_incl_h);
51322
51323
WUFFS_BASE__GENERATED_C_CODE
51324
static wuffs_base__status
51325
wuffs_jpeg__decoder__do_decode_frame_config(
51326
    wuffs_jpeg__decoder* self,
51327
    wuffs_base__frame_config* a_dst,
51328
    wuffs_base__io_buffer* a_src);
51329
51330
WUFFS_BASE__GENERATED_C_CODE
51331
static wuffs_base__status
51332
wuffs_jpeg__decoder__do_decode_frame(
51333
    wuffs_jpeg__decoder* self,
51334
    wuffs_base__pixel_buffer* a_dst,
51335
    wuffs_base__io_buffer* a_src,
51336
    wuffs_base__pixel_blend a_blend,
51337
    wuffs_base__slice_u8 a_workbuf,
51338
    wuffs_base__decode_frame_options* a_opts);
51339
51340
WUFFS_BASE__GENERATED_C_CODE
51341
static wuffs_base__status
51342
wuffs_jpeg__decoder__decode_dht(
51343
    wuffs_jpeg__decoder* self,
51344
    wuffs_base__io_buffer* a_src);
51345
51346
WUFFS_BASE__GENERATED_C_CODE
51347
static bool
51348
wuffs_jpeg__decoder__calculate_huff_tables(
51349
    wuffs_jpeg__decoder* self,
51350
    uint8_t a_tc4_th,
51351
    uint32_t a_total_count);
51352
51353
WUFFS_BASE__GENERATED_C_CODE
51354
static wuffs_base__status
51355
wuffs_jpeg__decoder__decode_sos(
51356
    wuffs_jpeg__decoder* self,
51357
    wuffs_base__pixel_buffer* a_dst,
51358
    wuffs_base__io_buffer* a_src,
51359
    wuffs_base__slice_u8 a_workbuf);
51360
51361
WUFFS_BASE__GENERATED_C_CODE
51362
static wuffs_base__status
51363
wuffs_jpeg__decoder__prepare_scan(
51364
    wuffs_jpeg__decoder* self,
51365
    wuffs_base__io_buffer* a_src);
51366
51367
WUFFS_BASE__GENERATED_C_CODE
51368
static wuffs_base__status
51369
wuffs_jpeg__decoder__use_default_huffman_table(
51370
    wuffs_jpeg__decoder* self,
51371
    uint8_t a_tc4_th);
51372
51373
WUFFS_BASE__GENERATED_C_CODE
51374
static wuffs_base__empty_struct
51375
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
51376
    wuffs_jpeg__decoder* self);
51377
51378
WUFFS_BASE__GENERATED_C_CODE
51379
static bool
51380
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
51381
    wuffs_jpeg__decoder* self);
51382
51383
WUFFS_BASE__GENERATED_C_CODE
51384
static wuffs_base__empty_struct
51385
wuffs_jpeg__decoder__fill_bitstream(
51386
    wuffs_jpeg__decoder* self,
51387
    wuffs_base__io_buffer* a_src);
51388
51389
WUFFS_BASE__GENERATED_C_CODE
51390
static wuffs_base__empty_struct
51391
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
51392
    wuffs_jpeg__decoder* self,
51393
    uint32_t a_mx,
51394
    uint32_t a_my,
51395
    wuffs_base__slice_u8 a_workbuf,
51396
    uint32_t a_csel);
51397
51398
WUFFS_BASE__GENERATED_C_CODE
51399
static wuffs_base__empty_struct
51400
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
51401
    wuffs_jpeg__decoder* self,
51402
    uint32_t a_mx,
51403
    uint32_t a_my,
51404
    wuffs_base__slice_u8 a_workbuf,
51405
    uint32_t a_csel);
51406
51407
WUFFS_BASE__GENERATED_C_CODE
51408
static wuffs_base__empty_struct
51409
wuffs_jpeg__decoder__load_mcu_blocks(
51410
    wuffs_jpeg__decoder* self,
51411
    uint32_t a_mx,
51412
    uint32_t a_my,
51413
    wuffs_base__slice_u8 a_workbuf);
51414
51415
WUFFS_BASE__GENERATED_C_CODE
51416
static wuffs_base__empty_struct
51417
wuffs_jpeg__decoder__save_mcu_blocks(
51418
    wuffs_jpeg__decoder* self,
51419
    uint32_t a_mx,
51420
    uint32_t a_my,
51421
    wuffs_base__slice_u8 a_workbuf);
51422
51423
WUFFS_BASE__GENERATED_C_CODE
51424
static wuffs_base__status
51425
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
51426
    wuffs_jpeg__decoder* self,
51427
    wuffs_base__io_buffer* a_src);
51428
51429
WUFFS_BASE__GENERATED_C_CODE
51430
static wuffs_base__empty_struct
51431
wuffs_jpeg__decoder__apply_progressive_idct(
51432
    wuffs_jpeg__decoder* self,
51433
    wuffs_base__slice_u8 a_workbuf);
51434
51435
WUFFS_BASE__GENERATED_C_CODE
51436
static wuffs_base__status
51437
wuffs_jpeg__decoder__swizzle_gray(
51438
    wuffs_jpeg__decoder* self,
51439
    wuffs_base__pixel_buffer* a_dst,
51440
    wuffs_base__slice_u8 a_workbuf,
51441
    uint32_t a_x0,
51442
    uint32_t a_x1,
51443
    uint32_t a_y0,
51444
    uint32_t a_y1,
51445
    uint64_t a_stride);
51446
51447
WUFFS_BASE__GENERATED_C_CODE
51448
static wuffs_base__status
51449
wuffs_jpeg__decoder__swizzle_colorful(
51450
    wuffs_jpeg__decoder* self,
51451
    wuffs_base__pixel_buffer* a_dst,
51452
    wuffs_base__slice_u8 a_workbuf,
51453
    uint32_t a_x0,
51454
    uint32_t a_x1,
51455
    uint32_t a_y0,
51456
    uint32_t a_y1);
51457
51458
WUFFS_BASE__GENERATED_C_CODE
51459
static bool
51460
wuffs_jpeg__decoder__top_left_quants_has_zero(
51461
    const wuffs_jpeg__decoder* self,
51462
    uint32_t a_q);
51463
51464
WUFFS_BASE__GENERATED_C_CODE
51465
static wuffs_base__empty_struct
51466
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
51467
    wuffs_jpeg__decoder* self,
51468
    uint32_t a_mx,
51469
    uint32_t a_my,
51470
    wuffs_base__slice_u8 a_workbuf,
51471
    uint32_t a_csel);
51472
51473
WUFFS_BASE__GENERATED_C_CODE
51474
static uint32_t
51475
wuffs_jpeg__decoder__decode_mcu(
51476
    wuffs_jpeg__decoder* self,
51477
    wuffs_base__pixel_buffer* a_dst,
51478
    wuffs_base__slice_u8 a_workbuf,
51479
    uint32_t a_mx,
51480
    uint32_t a_my);
51481
51482
WUFFS_BASE__GENERATED_C_CODE
51483
static uint32_t
51484
wuffs_jpeg__decoder__decode_mcu__choosy_default(
51485
    wuffs_jpeg__decoder* self,
51486
    wuffs_base__pixel_buffer* a_dst,
51487
    wuffs_base__slice_u8 a_workbuf,
51488
    uint32_t a_mx,
51489
    uint32_t a_my);
51490
51491
WUFFS_BASE__GENERATED_C_CODE
51492
static uint32_t
51493
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
51494
    wuffs_jpeg__decoder* self,
51495
    wuffs_base__pixel_buffer* a_dst,
51496
    wuffs_base__slice_u8 a_workbuf,
51497
    uint32_t a_mx,
51498
    uint32_t a_my);
51499
51500
WUFFS_BASE__GENERATED_C_CODE
51501
static uint32_t
51502
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
51503
    wuffs_jpeg__decoder* self,
51504
    wuffs_base__pixel_buffer* a_dst,
51505
    wuffs_base__slice_u8 a_workbuf,
51506
    uint32_t a_mx,
51507
    uint32_t a_my);
51508
51509
WUFFS_BASE__GENERATED_C_CODE
51510
static uint32_t
51511
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
51512
    wuffs_jpeg__decoder* self,
51513
    wuffs_base__pixel_buffer* a_dst,
51514
    wuffs_base__slice_u8 a_workbuf,
51515
    uint32_t a_mx,
51516
    uint32_t a_my);
51517
51518
WUFFS_BASE__GENERATED_C_CODE
51519
static uint32_t
51520
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
51521
    wuffs_jpeg__decoder* self,
51522
    wuffs_base__pixel_buffer* a_dst,
51523
    wuffs_base__slice_u8 a_workbuf,
51524
    uint32_t a_mx,
51525
    uint32_t a_my);
51526
51527
// ---------------- VTables
51528
51529
const wuffs_base__image_decoder__func_ptrs
51530
wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder = {
51531
  (wuffs_base__status(*)(void*,
51532
      wuffs_base__pixel_buffer*,
51533
      wuffs_base__io_buffer*,
51534
      wuffs_base__pixel_blend,
51535
      wuffs_base__slice_u8,
51536
      wuffs_base__decode_frame_options*))(&wuffs_jpeg__decoder__decode_frame),
51537
  (wuffs_base__status(*)(void*,
51538
      wuffs_base__frame_config*,
51539
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_frame_config),
51540
  (wuffs_base__status(*)(void*,
51541
      wuffs_base__image_config*,
51542
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__decode_image_config),
51543
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_jpeg__decoder__frame_dirty_rect),
51544
  (uint64_t(*)(const void*,
51545
      uint32_t))(&wuffs_jpeg__decoder__get_quirk),
51546
  (uint32_t(*)(const void*))(&wuffs_jpeg__decoder__num_animation_loops),
51547
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frame_configs),
51548
  (uint64_t(*)(const void*))(&wuffs_jpeg__decoder__num_decoded_frames),
51549
  (wuffs_base__status(*)(void*,
51550
      uint64_t,
51551
      uint64_t))(&wuffs_jpeg__decoder__restart_frame),
51552
  (wuffs_base__status(*)(void*,
51553
      uint32_t,
51554
      uint64_t))(&wuffs_jpeg__decoder__set_quirk),
51555
  (wuffs_base__empty_struct(*)(void*,
51556
      uint32_t,
51557
      bool))(&wuffs_jpeg__decoder__set_report_metadata),
51558
  (wuffs_base__status(*)(void*,
51559
      wuffs_base__io_buffer*,
51560
      wuffs_base__more_information*,
51561
      wuffs_base__io_buffer*))(&wuffs_jpeg__decoder__tell_me_more),
51562
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_jpeg__decoder__workbuf_len),
51563
};
51564
51565
// ---------------- Initializer Implementations
51566
51567
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
51568
wuffs_jpeg__decoder__initialize(
51569
    wuffs_jpeg__decoder* self,
51570
    size_t sizeof_star_self,
51571
    uint64_t wuffs_version,
51572
    uint32_t options){
51573
  if (!self) {
51574
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
51575
  }
51576
  if (sizeof(*self) != sizeof_star_self) {
51577
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
51578
  }
51579
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
51580
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
51581
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
51582
  }
51583
51584
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
51585
    // The whole point of this if-check is to detect an uninitialized *self.
51586
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
51587
#if !defined(__clang__) && defined(__GNUC__)
51588
#pragma GCC diagnostic push
51589
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
51590
#endif
51591
    if (self->private_impl.magic != 0) {
51592
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
51593
    }
51594
#if !defined(__clang__) && defined(__GNUC__)
51595
#pragma GCC diagnostic pop
51596
#endif
51597
  } else {
51598
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
51599
      memset(self, 0, sizeof(*self));
51600
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
51601
    } else {
51602
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
51603
    }
51604
  }
51605
51606
  self->private_impl.choosy_decode_idct = &wuffs_jpeg__decoder__decode_idct__choosy_default;
51607
  self->private_impl.choosy_load_mcu_blocks_for_single_component = &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default;
51608
  self->private_impl.choosy_decode_mcu = &wuffs_jpeg__decoder__decode_mcu__choosy_default;
51609
51610
  self->private_impl.magic = WUFFS_BASE__MAGIC;
51611
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
51612
      wuffs_base__image_decoder__vtable_name;
51613
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
51614
      (const void*)(&wuffs_jpeg__decoder__func_ptrs_for__wuffs_base__image_decoder);
51615
  return wuffs_base__make_status(NULL);
51616
}
51617
51618
wuffs_jpeg__decoder*
51619
wuffs_jpeg__decoder__alloc(void) {
51620
  wuffs_jpeg__decoder* x =
51621
      (wuffs_jpeg__decoder*)(calloc(1, sizeof(wuffs_jpeg__decoder)));
51622
  if (!x) {
51623
    return NULL;
51624
  }
51625
  if (wuffs_jpeg__decoder__initialize(
51626
      x, sizeof(wuffs_jpeg__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
51627
    free(x);
51628
    return NULL;
51629
  }
51630
  return x;
51631
}
51632
51633
size_t
51634
sizeof__wuffs_jpeg__decoder(void) {
51635
  return sizeof(wuffs_jpeg__decoder);
51636
}
51637
51638
// ---------------- Function Implementations
51639
51640
// -------- func jpeg.decoder.decode_idct
51641
51642
WUFFS_BASE__GENERATED_C_CODE
51643
static wuffs_base__empty_struct
51644
wuffs_jpeg__decoder__decode_idct(
51645
    wuffs_jpeg__decoder* self,
51646
    wuffs_base__slice_u8 a_dst_buffer,
51647
    uint64_t a_dst_stride,
51648
    uint32_t a_q) {
51649
  return (*self->private_impl.choosy_decode_idct)(self, a_dst_buffer, a_dst_stride, a_q);
51650
}
51651
51652
WUFFS_BASE__GENERATED_C_CODE
51653
static wuffs_base__empty_struct
51654
wuffs_jpeg__decoder__decode_idct__choosy_default(
51655
    wuffs_jpeg__decoder* self,
51656
    wuffs_base__slice_u8 a_dst_buffer,
51657
    uint64_t a_dst_stride,
51658
    uint32_t a_q) {
51659
  uint32_t v_bq0 = 0;
51660
  uint32_t v_bq2 = 0;
51661
  uint32_t v_bq4 = 0;
51662
  uint32_t v_bq6 = 0;
51663
  uint32_t v_ca = 0;
51664
  uint32_t v_cb2 = 0;
51665
  uint32_t v_cb6 = 0;
51666
  uint32_t v_ccp = 0;
51667
  uint32_t v_ccm = 0;
51668
  uint32_t v_cd0 = 0;
51669
  uint32_t v_cd1 = 0;
51670
  uint32_t v_cd2 = 0;
51671
  uint32_t v_cd3 = 0;
51672
  uint32_t v_bq1 = 0;
51673
  uint32_t v_bq3 = 0;
51674
  uint32_t v_bq5 = 0;
51675
  uint32_t v_bq7 = 0;
51676
  uint32_t v_ci51 = 0;
51677
  uint32_t v_ci53 = 0;
51678
  uint32_t v_ci71 = 0;
51679
  uint32_t v_ci73 = 0;
51680
  uint32_t v_cj = 0;
51681
  uint32_t v_ck1 = 0;
51682
  uint32_t v_ck3 = 0;
51683
  uint32_t v_ck5 = 0;
51684
  uint32_t v_ck7 = 0;
51685
  uint32_t v_cl51 = 0;
51686
  uint32_t v_cl73 = 0;
51687
  uint32_t v_in0 = 0;
51688
  uint32_t v_in2 = 0;
51689
  uint32_t v_in4 = 0;
51690
  uint32_t v_in6 = 0;
51691
  uint32_t v_ra = 0;
51692
  uint32_t v_rb2 = 0;
51693
  uint32_t v_rb6 = 0;
51694
  uint32_t v_rcp = 0;
51695
  uint32_t v_rcm = 0;
51696
  uint32_t v_rd0 = 0;
51697
  uint32_t v_rd1 = 0;
51698
  uint32_t v_rd2 = 0;
51699
  uint32_t v_rd3 = 0;
51700
  uint32_t v_in1 = 0;
51701
  uint32_t v_in3 = 0;
51702
  uint32_t v_in5 = 0;
51703
  uint32_t v_in7 = 0;
51704
  uint32_t v_ri51 = 0;
51705
  uint32_t v_ri53 = 0;
51706
  uint32_t v_ri71 = 0;
51707
  uint32_t v_ri73 = 0;
51708
  uint32_t v_rj = 0;
51709
  uint32_t v_rk1 = 0;
51710
  uint32_t v_rk3 = 0;
51711
  uint32_t v_rk5 = 0;
51712
  uint32_t v_rk7 = 0;
51713
  uint32_t v_rl51 = 0;
51714
  uint32_t v_rl73 = 0;
51715
  uint32_t v_intermediate[64] = {0};
51716
51717
  if (8u > a_dst_stride) {
51718
    return wuffs_base__make_empty_struct();
51719
  }
51720
  if (0u == (self->private_data.f_mcu_blocks[0u][8u] |
51721
      self->private_data.f_mcu_blocks[0u][16u] |
51722
      self->private_data.f_mcu_blocks[0u][24u] |
51723
      self->private_data.f_mcu_blocks[0u][32u] |
51724
      self->private_data.f_mcu_blocks[0u][40u] |
51725
      self->private_data.f_mcu_blocks[0u][48u] |
51726
      self->private_data.f_mcu_blocks[0u][56u])) {
51727
    v_intermediate[0u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u])))) << 2u));
51728
    v_intermediate[8u] = v_intermediate[0u];
51729
    v_intermediate[16u] = v_intermediate[0u];
51730
    v_intermediate[24u] = v_intermediate[0u];
51731
    v_intermediate[32u] = v_intermediate[0u];
51732
    v_intermediate[40u] = v_intermediate[0u];
51733
    v_intermediate[48u] = v_intermediate[0u];
51734
    v_intermediate[56u] = v_intermediate[0u];
51735
  } else {
51736
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][16u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][16u]))));
51737
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][48u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][48u]))));
51738
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
51739
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
51740
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
51741
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][0u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][0u]))));
51742
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][32u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][32u]))));
51743
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
51744
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
51745
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
51746
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
51747
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
51748
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
51749
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][8u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][8u]))));
51750
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][24u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][24u]))));
51751
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][40u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][40u]))));
51752
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][56u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][56u]))));
51753
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
51754
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
51755
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
51756
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
51757
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
51758
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
51759
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
51760
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
51761
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
51762
    v_ci51 *= 4294964100u;
51763
    v_ci53 *= 4294946301u;
51764
    v_ci71 *= 4294959923u;
51765
    v_ci73 *= 4294951227u;
51766
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
51767
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
51768
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
51769
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
51770
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
51771
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
51772
    v_intermediate[0u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
51773
    v_intermediate[56u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
51774
    v_intermediate[8u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
51775
    v_intermediate[48u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
51776
    v_intermediate[16u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
51777
    v_intermediate[40u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
51778
    v_intermediate[24u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
51779
    v_intermediate[32u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
51780
  }
51781
  if (0u == (self->private_data.f_mcu_blocks[0u][9u] |
51782
      self->private_data.f_mcu_blocks[0u][17u] |
51783
      self->private_data.f_mcu_blocks[0u][25u] |
51784
      self->private_data.f_mcu_blocks[0u][33u] |
51785
      self->private_data.f_mcu_blocks[0u][41u] |
51786
      self->private_data.f_mcu_blocks[0u][49u] |
51787
      self->private_data.f_mcu_blocks[0u][57u])) {
51788
    v_intermediate[1u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u])))) << 2u));
51789
    v_intermediate[9u] = v_intermediate[1u];
51790
    v_intermediate[17u] = v_intermediate[1u];
51791
    v_intermediate[25u] = v_intermediate[1u];
51792
    v_intermediate[33u] = v_intermediate[1u];
51793
    v_intermediate[41u] = v_intermediate[1u];
51794
    v_intermediate[49u] = v_intermediate[1u];
51795
    v_intermediate[57u] = v_intermediate[1u];
51796
  } else {
51797
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][17u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][17u]))));
51798
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][49u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][49u]))));
51799
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
51800
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
51801
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
51802
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][1u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][1u]))));
51803
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][33u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][33u]))));
51804
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
51805
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
51806
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
51807
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
51808
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
51809
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
51810
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][9u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][9u]))));
51811
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][25u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][25u]))));
51812
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][41u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][41u]))));
51813
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][57u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][57u]))));
51814
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
51815
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
51816
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
51817
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
51818
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
51819
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
51820
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
51821
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
51822
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
51823
    v_ci51 *= 4294964100u;
51824
    v_ci53 *= 4294946301u;
51825
    v_ci71 *= 4294959923u;
51826
    v_ci73 *= 4294951227u;
51827
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
51828
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
51829
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
51830
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
51831
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
51832
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
51833
    v_intermediate[1u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
51834
    v_intermediate[57u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
51835
    v_intermediate[9u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
51836
    v_intermediate[49u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
51837
    v_intermediate[17u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
51838
    v_intermediate[41u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
51839
    v_intermediate[25u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
51840
    v_intermediate[33u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
51841
  }
51842
  if (0u == (self->private_data.f_mcu_blocks[0u][10u] |
51843
      self->private_data.f_mcu_blocks[0u][18u] |
51844
      self->private_data.f_mcu_blocks[0u][26u] |
51845
      self->private_data.f_mcu_blocks[0u][34u] |
51846
      self->private_data.f_mcu_blocks[0u][42u] |
51847
      self->private_data.f_mcu_blocks[0u][50u] |
51848
      self->private_data.f_mcu_blocks[0u][58u])) {
51849
    v_intermediate[2u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u])))) << 2u));
51850
    v_intermediate[10u] = v_intermediate[2u];
51851
    v_intermediate[18u] = v_intermediate[2u];
51852
    v_intermediate[26u] = v_intermediate[2u];
51853
    v_intermediate[34u] = v_intermediate[2u];
51854
    v_intermediate[42u] = v_intermediate[2u];
51855
    v_intermediate[50u] = v_intermediate[2u];
51856
    v_intermediate[58u] = v_intermediate[2u];
51857
  } else {
51858
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][18u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][18u]))));
51859
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][50u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][50u]))));
51860
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
51861
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
51862
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
51863
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][2u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][2u]))));
51864
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][34u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][34u]))));
51865
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
51866
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
51867
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
51868
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
51869
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
51870
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
51871
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][10u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][10u]))));
51872
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][26u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][26u]))));
51873
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][42u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][42u]))));
51874
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][58u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][58u]))));
51875
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
51876
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
51877
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
51878
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
51879
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
51880
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
51881
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
51882
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
51883
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
51884
    v_ci51 *= 4294964100u;
51885
    v_ci53 *= 4294946301u;
51886
    v_ci71 *= 4294959923u;
51887
    v_ci73 *= 4294951227u;
51888
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
51889
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
51890
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
51891
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
51892
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
51893
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
51894
    v_intermediate[2u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
51895
    v_intermediate[58u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
51896
    v_intermediate[10u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
51897
    v_intermediate[50u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
51898
    v_intermediate[18u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
51899
    v_intermediate[42u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
51900
    v_intermediate[26u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
51901
    v_intermediate[34u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
51902
  }
51903
  if (0u == (self->private_data.f_mcu_blocks[0u][11u] |
51904
      self->private_data.f_mcu_blocks[0u][19u] |
51905
      self->private_data.f_mcu_blocks[0u][27u] |
51906
      self->private_data.f_mcu_blocks[0u][35u] |
51907
      self->private_data.f_mcu_blocks[0u][43u] |
51908
      self->private_data.f_mcu_blocks[0u][51u] |
51909
      self->private_data.f_mcu_blocks[0u][59u])) {
51910
    v_intermediate[3u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u])))) << 2u));
51911
    v_intermediate[11u] = v_intermediate[3u];
51912
    v_intermediate[19u] = v_intermediate[3u];
51913
    v_intermediate[27u] = v_intermediate[3u];
51914
    v_intermediate[35u] = v_intermediate[3u];
51915
    v_intermediate[43u] = v_intermediate[3u];
51916
    v_intermediate[51u] = v_intermediate[3u];
51917
    v_intermediate[59u] = v_intermediate[3u];
51918
  } else {
51919
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][19u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][19u]))));
51920
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][51u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][51u]))));
51921
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
51922
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
51923
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
51924
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][3u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][3u]))));
51925
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][35u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][35u]))));
51926
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
51927
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
51928
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
51929
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
51930
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
51931
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
51932
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][11u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][11u]))));
51933
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][27u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][27u]))));
51934
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][43u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][43u]))));
51935
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][59u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][59u]))));
51936
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
51937
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
51938
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
51939
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
51940
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
51941
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
51942
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
51943
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
51944
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
51945
    v_ci51 *= 4294964100u;
51946
    v_ci53 *= 4294946301u;
51947
    v_ci71 *= 4294959923u;
51948
    v_ci73 *= 4294951227u;
51949
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
51950
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
51951
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
51952
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
51953
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
51954
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
51955
    v_intermediate[3u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
51956
    v_intermediate[59u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
51957
    v_intermediate[11u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
51958
    v_intermediate[51u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
51959
    v_intermediate[19u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
51960
    v_intermediate[43u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
51961
    v_intermediate[27u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
51962
    v_intermediate[35u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
51963
  }
51964
  if (0u == (self->private_data.f_mcu_blocks[0u][12u] |
51965
      self->private_data.f_mcu_blocks[0u][20u] |
51966
      self->private_data.f_mcu_blocks[0u][28u] |
51967
      self->private_data.f_mcu_blocks[0u][36u] |
51968
      self->private_data.f_mcu_blocks[0u][44u] |
51969
      self->private_data.f_mcu_blocks[0u][52u] |
51970
      self->private_data.f_mcu_blocks[0u][60u])) {
51971
    v_intermediate[4u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u])))) << 2u));
51972
    v_intermediate[12u] = v_intermediate[4u];
51973
    v_intermediate[20u] = v_intermediate[4u];
51974
    v_intermediate[28u] = v_intermediate[4u];
51975
    v_intermediate[36u] = v_intermediate[4u];
51976
    v_intermediate[44u] = v_intermediate[4u];
51977
    v_intermediate[52u] = v_intermediate[4u];
51978
    v_intermediate[60u] = v_intermediate[4u];
51979
  } else {
51980
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][20u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][20u]))));
51981
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][52u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][52u]))));
51982
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
51983
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
51984
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
51985
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][4u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][4u]))));
51986
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][36u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][36u]))));
51987
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
51988
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
51989
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
51990
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
51991
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
51992
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
51993
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][12u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][12u]))));
51994
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][28u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][28u]))));
51995
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][44u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][44u]))));
51996
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][60u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][60u]))));
51997
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
51998
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
51999
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52000
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52001
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52002
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52003
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52004
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52005
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52006
    v_ci51 *= 4294964100u;
52007
    v_ci53 *= 4294946301u;
52008
    v_ci71 *= 4294959923u;
52009
    v_ci73 *= 4294951227u;
52010
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52011
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52012
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52013
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52014
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52015
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52016
    v_intermediate[4u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52017
    v_intermediate[60u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52018
    v_intermediate[12u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52019
    v_intermediate[52u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52020
    v_intermediate[20u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52021
    v_intermediate[44u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52022
    v_intermediate[28u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52023
    v_intermediate[36u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52024
  }
52025
  if (0u == (self->private_data.f_mcu_blocks[0u][13u] |
52026
      self->private_data.f_mcu_blocks[0u][21u] |
52027
      self->private_data.f_mcu_blocks[0u][29u] |
52028
      self->private_data.f_mcu_blocks[0u][37u] |
52029
      self->private_data.f_mcu_blocks[0u][45u] |
52030
      self->private_data.f_mcu_blocks[0u][53u] |
52031
      self->private_data.f_mcu_blocks[0u][61u])) {
52032
    v_intermediate[5u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u])))) << 2u));
52033
    v_intermediate[13u] = v_intermediate[5u];
52034
    v_intermediate[21u] = v_intermediate[5u];
52035
    v_intermediate[29u] = v_intermediate[5u];
52036
    v_intermediate[37u] = v_intermediate[5u];
52037
    v_intermediate[45u] = v_intermediate[5u];
52038
    v_intermediate[53u] = v_intermediate[5u];
52039
    v_intermediate[61u] = v_intermediate[5u];
52040
  } else {
52041
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][21u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][21u]))));
52042
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][53u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][53u]))));
52043
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52044
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52045
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52046
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][5u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][5u]))));
52047
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][37u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][37u]))));
52048
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52049
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52050
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52051
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52052
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52053
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52054
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][13u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][13u]))));
52055
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][29u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][29u]))));
52056
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][45u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][45u]))));
52057
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][61u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][61u]))));
52058
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52059
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52060
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52061
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52062
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52063
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52064
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52065
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52066
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52067
    v_ci51 *= 4294964100u;
52068
    v_ci53 *= 4294946301u;
52069
    v_ci71 *= 4294959923u;
52070
    v_ci73 *= 4294951227u;
52071
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52072
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52073
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52074
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52075
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52076
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52077
    v_intermediate[5u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52078
    v_intermediate[61u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52079
    v_intermediate[13u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52080
    v_intermediate[53u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52081
    v_intermediate[21u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52082
    v_intermediate[45u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52083
    v_intermediate[29u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52084
    v_intermediate[37u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52085
  }
52086
  if (0u == (self->private_data.f_mcu_blocks[0u][14u] |
52087
      self->private_data.f_mcu_blocks[0u][22u] |
52088
      self->private_data.f_mcu_blocks[0u][30u] |
52089
      self->private_data.f_mcu_blocks[0u][38u] |
52090
      self->private_data.f_mcu_blocks[0u][46u] |
52091
      self->private_data.f_mcu_blocks[0u][54u] |
52092
      self->private_data.f_mcu_blocks[0u][62u])) {
52093
    v_intermediate[6u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u])))) << 2u));
52094
    v_intermediate[14u] = v_intermediate[6u];
52095
    v_intermediate[22u] = v_intermediate[6u];
52096
    v_intermediate[30u] = v_intermediate[6u];
52097
    v_intermediate[38u] = v_intermediate[6u];
52098
    v_intermediate[46u] = v_intermediate[6u];
52099
    v_intermediate[54u] = v_intermediate[6u];
52100
    v_intermediate[62u] = v_intermediate[6u];
52101
  } else {
52102
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][22u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][22u]))));
52103
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][54u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][54u]))));
52104
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52105
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52106
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52107
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][6u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][6u]))));
52108
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][38u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][38u]))));
52109
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52110
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52111
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52112
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52113
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52114
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52115
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][14u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][14u]))));
52116
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][30u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][30u]))));
52117
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][46u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][46u]))));
52118
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][62u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][62u]))));
52119
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52120
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52121
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52122
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52123
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52124
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52125
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52126
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52127
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52128
    v_ci51 *= 4294964100u;
52129
    v_ci53 *= 4294946301u;
52130
    v_ci71 *= 4294959923u;
52131
    v_ci73 *= 4294951227u;
52132
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52133
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52134
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52135
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52136
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52137
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52138
    v_intermediate[6u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52139
    v_intermediate[62u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52140
    v_intermediate[14u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52141
    v_intermediate[54u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52142
    v_intermediate[22u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52143
    v_intermediate[46u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52144
    v_intermediate[30u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52145
    v_intermediate[38u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52146
  }
52147
  if (0u == (self->private_data.f_mcu_blocks[0u][15u] |
52148
      self->private_data.f_mcu_blocks[0u][23u] |
52149
      self->private_data.f_mcu_blocks[0u][31u] |
52150
      self->private_data.f_mcu_blocks[0u][39u] |
52151
      self->private_data.f_mcu_blocks[0u][47u] |
52152
      self->private_data.f_mcu_blocks[0u][55u] |
52153
      self->private_data.f_mcu_blocks[0u][63u])) {
52154
    v_intermediate[7u] = ((uint32_t)(((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u])))) << 2u));
52155
    v_intermediate[15u] = v_intermediate[7u];
52156
    v_intermediate[23u] = v_intermediate[7u];
52157
    v_intermediate[31u] = v_intermediate[7u];
52158
    v_intermediate[39u] = v_intermediate[7u];
52159
    v_intermediate[47u] = v_intermediate[7u];
52160
    v_intermediate[55u] = v_intermediate[7u];
52161
    v_intermediate[63u] = v_intermediate[7u];
52162
  } else {
52163
    v_bq2 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][23u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][23u]))));
52164
    v_bq6 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][55u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][55u]))));
52165
    v_ca = ((uint32_t)(((uint32_t)(v_bq2 + v_bq6)) * 4433u));
52166
    v_cb2 = ((uint32_t)(v_ca + ((uint32_t)(v_bq2 * 6270u))));
52167
    v_cb6 = ((uint32_t)(v_ca - ((uint32_t)(v_bq6 * 15137u))));
52168
    v_bq0 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][7u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][7u]))));
52169
    v_bq4 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][39u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][39u]))));
52170
    v_ccp = ((uint32_t)(((uint32_t)(v_bq0 + v_bq4)) << 13u));
52171
    v_ccm = ((uint32_t)(((uint32_t)(v_bq0 - v_bq4)) << 13u));
52172
    v_cd0 = ((uint32_t)(v_ccp + v_cb2));
52173
    v_cd1 = ((uint32_t)(v_ccm + v_cb6));
52174
    v_cd2 = ((uint32_t)(v_ccm - v_cb6));
52175
    v_cd3 = ((uint32_t)(v_ccp - v_cb2));
52176
    v_bq1 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][15u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][15u]))));
52177
    v_bq3 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][31u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][31u]))));
52178
    v_bq5 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][47u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][47u]))));
52179
    v_bq7 = ((uint32_t)(wuffs_base__utility__sign_extend_convert_u16_u32(self->private_data.f_mcu_blocks[0u][63u]) * ((uint32_t)(self->private_impl.f_quant_tables[a_q][63u]))));
52180
    v_ci51 = ((uint32_t)(v_bq5 + v_bq1));
52181
    v_ci53 = ((uint32_t)(v_bq5 + v_bq3));
52182
    v_ci71 = ((uint32_t)(v_bq7 + v_bq1));
52183
    v_ci73 = ((uint32_t)(v_bq7 + v_bq3));
52184
    v_cj = ((uint32_t)(((uint32_t)(v_ci73 + v_ci51)) * 9633u));
52185
    v_ck1 = ((uint32_t)(v_bq1 * 12299u));
52186
    v_ck3 = ((uint32_t)(v_bq3 * 25172u));
52187
    v_ck5 = ((uint32_t)(v_bq5 * 16819u));
52188
    v_ck7 = ((uint32_t)(v_bq7 * 2446u));
52189
    v_ci51 *= 4294964100u;
52190
    v_ci53 *= 4294946301u;
52191
    v_ci71 *= 4294959923u;
52192
    v_ci73 *= 4294951227u;
52193
    v_cl51 = ((uint32_t)(v_ci51 + v_cj));
52194
    v_cl73 = ((uint32_t)(v_ci73 + v_cj));
52195
    v_ck1 += ((uint32_t)(v_ci71 + v_cl51));
52196
    v_ck3 += ((uint32_t)(v_ci53 + v_cl73));
52197
    v_ck5 += ((uint32_t)(v_ci53 + v_cl51));
52198
    v_ck7 += ((uint32_t)(v_ci71 + v_cl73));
52199
    v_intermediate[7u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 + v_ck1)) + 1024u)), 11u);
52200
    v_intermediate[63u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd0 - v_ck1)) + 1024u)), 11u);
52201
    v_intermediate[15u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 + v_ck3)) + 1024u)), 11u);
52202
    v_intermediate[55u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd1 - v_ck3)) + 1024u)), 11u);
52203
    v_intermediate[23u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 + v_ck5)) + 1024u)), 11u);
52204
    v_intermediate[47u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd2 - v_ck5)) + 1024u)), 11u);
52205
    v_intermediate[31u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 + v_ck7)) + 1024u)), 11u);
52206
    v_intermediate[39u] = wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(((uint32_t)(v_cd3 - v_ck7)) + 1024u)), 11u);
52207
  }
52208
  if (0u == (v_intermediate[1u] |
52209
      v_intermediate[2u] |
52210
      v_intermediate[3u] |
52211
      v_intermediate[4u] |
52212
      v_intermediate[5u] |
52213
      v_intermediate[6u] |
52214
      v_intermediate[7u])) {
52215
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52216
      return wuffs_base__make_empty_struct();
52217
    }
52218
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[0u] + 16u)) >> 5u) & 1023u)];
52219
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52220
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52221
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52222
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52223
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52224
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52225
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52226
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52227
  } else {
52228
    v_in2 = v_intermediate[2u];
52229
    v_in6 = v_intermediate[6u];
52230
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52231
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52232
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52233
    v_in0 = v_intermediate[0u];
52234
    v_in4 = v_intermediate[4u];
52235
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52236
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52237
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52238
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52239
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52240
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52241
    v_in1 = v_intermediate[1u];
52242
    v_in3 = v_intermediate[3u];
52243
    v_in5 = v_intermediate[5u];
52244
    v_in7 = v_intermediate[7u];
52245
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52246
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52247
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52248
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52249
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52250
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52251
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52252
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52253
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52254
    v_ri51 *= 4294964100u;
52255
    v_ri53 *= 4294946301u;
52256
    v_ri71 *= 4294959923u;
52257
    v_ri73 *= 4294951227u;
52258
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52259
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52260
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52261
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52262
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52263
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52264
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52265
      return wuffs_base__make_empty_struct();
52266
    }
52267
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52268
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52269
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52270
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52271
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52272
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52273
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52274
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52275
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52276
  }
52277
  if (0u == (v_intermediate[9u] |
52278
      v_intermediate[10u] |
52279
      v_intermediate[11u] |
52280
      v_intermediate[12u] |
52281
      v_intermediate[13u] |
52282
      v_intermediate[14u] |
52283
      v_intermediate[15u])) {
52284
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52285
      return wuffs_base__make_empty_struct();
52286
    }
52287
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[8u] + 16u)) >> 5u) & 1023u)];
52288
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52289
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52290
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52291
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52292
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52293
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52294
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52295
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52296
  } else {
52297
    v_in2 = v_intermediate[10u];
52298
    v_in6 = v_intermediate[14u];
52299
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52300
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52301
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52302
    v_in0 = v_intermediate[8u];
52303
    v_in4 = v_intermediate[12u];
52304
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52305
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52306
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52307
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52308
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52309
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52310
    v_in1 = v_intermediate[9u];
52311
    v_in3 = v_intermediate[11u];
52312
    v_in5 = v_intermediate[13u];
52313
    v_in7 = v_intermediate[15u];
52314
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52315
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52316
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52317
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52318
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52319
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52320
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52321
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52322
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52323
    v_ri51 *= 4294964100u;
52324
    v_ri53 *= 4294946301u;
52325
    v_ri71 *= 4294959923u;
52326
    v_ri73 *= 4294951227u;
52327
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52328
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52329
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52330
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52331
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52332
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52333
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52334
      return wuffs_base__make_empty_struct();
52335
    }
52336
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52337
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52338
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52339
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52340
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52341
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52342
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52343
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52344
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52345
  }
52346
  if (0u == (v_intermediate[17u] |
52347
      v_intermediate[18u] |
52348
      v_intermediate[19u] |
52349
      v_intermediate[20u] |
52350
      v_intermediate[21u] |
52351
      v_intermediate[22u] |
52352
      v_intermediate[23u])) {
52353
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52354
      return wuffs_base__make_empty_struct();
52355
    }
52356
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[16u] + 16u)) >> 5u) & 1023u)];
52357
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52358
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52359
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52360
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52361
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52362
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52363
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52364
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52365
  } else {
52366
    v_in2 = v_intermediate[18u];
52367
    v_in6 = v_intermediate[22u];
52368
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52369
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52370
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52371
    v_in0 = v_intermediate[16u];
52372
    v_in4 = v_intermediate[20u];
52373
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52374
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52375
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52376
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52377
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52378
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52379
    v_in1 = v_intermediate[17u];
52380
    v_in3 = v_intermediate[19u];
52381
    v_in5 = v_intermediate[21u];
52382
    v_in7 = v_intermediate[23u];
52383
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52384
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52385
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52386
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52387
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52388
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52389
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52390
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52391
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52392
    v_ri51 *= 4294964100u;
52393
    v_ri53 *= 4294946301u;
52394
    v_ri71 *= 4294959923u;
52395
    v_ri73 *= 4294951227u;
52396
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52397
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52398
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52399
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52400
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52401
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52402
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52403
      return wuffs_base__make_empty_struct();
52404
    }
52405
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52406
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52407
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52408
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52409
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52410
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52411
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52412
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52413
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52414
  }
52415
  if (0u == (v_intermediate[25u] |
52416
      v_intermediate[26u] |
52417
      v_intermediate[27u] |
52418
      v_intermediate[28u] |
52419
      v_intermediate[29u] |
52420
      v_intermediate[30u] |
52421
      v_intermediate[31u])) {
52422
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52423
      return wuffs_base__make_empty_struct();
52424
    }
52425
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[24u] + 16u)) >> 5u) & 1023u)];
52426
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52427
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52428
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52429
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52430
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52431
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52432
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52433
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52434
  } else {
52435
    v_in2 = v_intermediate[26u];
52436
    v_in6 = v_intermediate[30u];
52437
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52438
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52439
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52440
    v_in0 = v_intermediate[24u];
52441
    v_in4 = v_intermediate[28u];
52442
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52443
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52444
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52445
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52446
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52447
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52448
    v_in1 = v_intermediate[25u];
52449
    v_in3 = v_intermediate[27u];
52450
    v_in5 = v_intermediate[29u];
52451
    v_in7 = v_intermediate[31u];
52452
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52453
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52454
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52455
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52456
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52457
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52458
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52459
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52460
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52461
    v_ri51 *= 4294964100u;
52462
    v_ri53 *= 4294946301u;
52463
    v_ri71 *= 4294959923u;
52464
    v_ri73 *= 4294951227u;
52465
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52466
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52467
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52468
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52469
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52470
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52471
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52472
      return wuffs_base__make_empty_struct();
52473
    }
52474
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52475
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52476
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52477
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52478
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52479
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52480
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52481
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52482
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52483
  }
52484
  if (0u == (v_intermediate[33u] |
52485
      v_intermediate[34u] |
52486
      v_intermediate[35u] |
52487
      v_intermediate[36u] |
52488
      v_intermediate[37u] |
52489
      v_intermediate[38u] |
52490
      v_intermediate[39u])) {
52491
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52492
      return wuffs_base__make_empty_struct();
52493
    }
52494
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[32u] + 16u)) >> 5u) & 1023u)];
52495
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52496
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52497
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52498
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52499
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52500
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52501
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52502
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52503
  } else {
52504
    v_in2 = v_intermediate[34u];
52505
    v_in6 = v_intermediate[38u];
52506
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52507
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52508
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52509
    v_in0 = v_intermediate[32u];
52510
    v_in4 = v_intermediate[36u];
52511
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52512
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52513
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52514
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52515
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52516
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52517
    v_in1 = v_intermediate[33u];
52518
    v_in3 = v_intermediate[35u];
52519
    v_in5 = v_intermediate[37u];
52520
    v_in7 = v_intermediate[39u];
52521
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52522
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52523
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52524
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52525
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52526
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52527
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52528
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52529
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52530
    v_ri51 *= 4294964100u;
52531
    v_ri53 *= 4294946301u;
52532
    v_ri71 *= 4294959923u;
52533
    v_ri73 *= 4294951227u;
52534
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52535
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52536
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52537
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52538
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52539
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52540
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52541
      return wuffs_base__make_empty_struct();
52542
    }
52543
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52544
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52545
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52546
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52547
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52548
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52549
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52550
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52551
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52552
  }
52553
  if (0u == (v_intermediate[41u] |
52554
      v_intermediate[42u] |
52555
      v_intermediate[43u] |
52556
      v_intermediate[44u] |
52557
      v_intermediate[45u] |
52558
      v_intermediate[46u] |
52559
      v_intermediate[47u])) {
52560
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52561
      return wuffs_base__make_empty_struct();
52562
    }
52563
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[40u] + 16u)) >> 5u) & 1023u)];
52564
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52565
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52566
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52567
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52568
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52569
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52570
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52571
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52572
  } else {
52573
    v_in2 = v_intermediate[42u];
52574
    v_in6 = v_intermediate[46u];
52575
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52576
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52577
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52578
    v_in0 = v_intermediate[40u];
52579
    v_in4 = v_intermediate[44u];
52580
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52581
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52582
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52583
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52584
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52585
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52586
    v_in1 = v_intermediate[41u];
52587
    v_in3 = v_intermediate[43u];
52588
    v_in5 = v_intermediate[45u];
52589
    v_in7 = v_intermediate[47u];
52590
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52591
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52592
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52593
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52594
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52595
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52596
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52597
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52598
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52599
    v_ri51 *= 4294964100u;
52600
    v_ri53 *= 4294946301u;
52601
    v_ri71 *= 4294959923u;
52602
    v_ri73 *= 4294951227u;
52603
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52604
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52605
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52606
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52607
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52608
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52609
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52610
      return wuffs_base__make_empty_struct();
52611
    }
52612
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52613
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52614
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52615
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52616
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52617
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52618
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52619
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52620
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52621
  }
52622
  if (0u == (v_intermediate[49u] |
52623
      v_intermediate[50u] |
52624
      v_intermediate[51u] |
52625
      v_intermediate[52u] |
52626
      v_intermediate[53u] |
52627
      v_intermediate[54u] |
52628
      v_intermediate[55u])) {
52629
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52630
      return wuffs_base__make_empty_struct();
52631
    }
52632
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[48u] + 16u)) >> 5u) & 1023u)];
52633
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52634
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52635
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52636
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52637
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52638
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52639
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52640
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52641
  } else {
52642
    v_in2 = v_intermediate[50u];
52643
    v_in6 = v_intermediate[54u];
52644
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52645
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52646
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52647
    v_in0 = v_intermediate[48u];
52648
    v_in4 = v_intermediate[52u];
52649
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52650
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52651
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52652
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52653
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52654
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52655
    v_in1 = v_intermediate[49u];
52656
    v_in3 = v_intermediate[51u];
52657
    v_in5 = v_intermediate[53u];
52658
    v_in7 = v_intermediate[55u];
52659
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52660
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52661
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52662
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52663
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52664
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52665
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52666
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52667
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52668
    v_ri51 *= 4294964100u;
52669
    v_ri53 *= 4294946301u;
52670
    v_ri71 *= 4294959923u;
52671
    v_ri73 *= 4294951227u;
52672
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52673
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52674
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52675
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52676
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52677
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52678
    if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
52679
      return wuffs_base__make_empty_struct();
52680
    }
52681
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52682
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52683
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52684
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52685
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52686
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52687
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52688
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52689
    a_dst_buffer = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
52690
  }
52691
  if (0u == (v_intermediate[57u] |
52692
      v_intermediate[58u] |
52693
      v_intermediate[59u] |
52694
      v_intermediate[60u] |
52695
      v_intermediate[61u] |
52696
      v_intermediate[62u] |
52697
      v_intermediate[63u])) {
52698
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
52699
      return wuffs_base__make_empty_struct();
52700
    }
52701
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(v_intermediate[56u] + 16u)) >> 5u) & 1023u)];
52702
    a_dst_buffer.ptr[1u] = a_dst_buffer.ptr[0u];
52703
    a_dst_buffer.ptr[2u] = a_dst_buffer.ptr[0u];
52704
    a_dst_buffer.ptr[3u] = a_dst_buffer.ptr[0u];
52705
    a_dst_buffer.ptr[4u] = a_dst_buffer.ptr[0u];
52706
    a_dst_buffer.ptr[5u] = a_dst_buffer.ptr[0u];
52707
    a_dst_buffer.ptr[6u] = a_dst_buffer.ptr[0u];
52708
    a_dst_buffer.ptr[7u] = a_dst_buffer.ptr[0u];
52709
  } else {
52710
    v_in2 = v_intermediate[58u];
52711
    v_in6 = v_intermediate[62u];
52712
    v_ra = ((uint32_t)(((uint32_t)(v_in2 + v_in6)) * 4433u));
52713
    v_rb2 = ((uint32_t)(v_ra + ((uint32_t)(v_in2 * 6270u))));
52714
    v_rb6 = ((uint32_t)(v_ra - ((uint32_t)(v_in6 * 15137u))));
52715
    v_in0 = v_intermediate[56u];
52716
    v_in4 = v_intermediate[60u];
52717
    v_rcp = ((uint32_t)(((uint32_t)(v_in0 + v_in4)) << 13u));
52718
    v_rcm = ((uint32_t)(((uint32_t)(v_in0 - v_in4)) << 13u));
52719
    v_rd0 = ((uint32_t)(v_rcp + v_rb2));
52720
    v_rd1 = ((uint32_t)(v_rcm + v_rb6));
52721
    v_rd2 = ((uint32_t)(v_rcm - v_rb6));
52722
    v_rd3 = ((uint32_t)(v_rcp - v_rb2));
52723
    v_in1 = v_intermediate[57u];
52724
    v_in3 = v_intermediate[59u];
52725
    v_in5 = v_intermediate[61u];
52726
    v_in7 = v_intermediate[63u];
52727
    v_ri51 = ((uint32_t)(v_in5 + v_in1));
52728
    v_ri53 = ((uint32_t)(v_in5 + v_in3));
52729
    v_ri71 = ((uint32_t)(v_in7 + v_in1));
52730
    v_ri73 = ((uint32_t)(v_in7 + v_in3));
52731
    v_rj = ((uint32_t)(((uint32_t)(v_ri73 + v_ri51)) * 9633u));
52732
    v_rk1 = ((uint32_t)(v_in1 * 12299u));
52733
    v_rk3 = ((uint32_t)(v_in3 * 25172u));
52734
    v_rk5 = ((uint32_t)(v_in5 * 16819u));
52735
    v_rk7 = ((uint32_t)(v_in7 * 2446u));
52736
    v_ri51 *= 4294964100u;
52737
    v_ri53 *= 4294946301u;
52738
    v_ri71 *= 4294959923u;
52739
    v_ri73 *= 4294951227u;
52740
    v_rl51 = ((uint32_t)(v_ri51 + v_rj));
52741
    v_rl73 = ((uint32_t)(v_ri73 + v_rj));
52742
    v_rk1 += ((uint32_t)(v_ri71 + v_rl51));
52743
    v_rk3 += ((uint32_t)(v_ri53 + v_rl73));
52744
    v_rk5 += ((uint32_t)(v_ri53 + v_rl51));
52745
    v_rk7 += ((uint32_t)(v_ri71 + v_rl73));
52746
    if (8u > ((uint64_t)(a_dst_buffer.len))) {
52747
      return wuffs_base__make_empty_struct();
52748
    }
52749
    a_dst_buffer.ptr[0u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 + v_rk1)) + 131072u)) >> 18u) & 1023u)];
52750
    a_dst_buffer.ptr[7u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd0 - v_rk1)) + 131072u)) >> 18u) & 1023u)];
52751
    a_dst_buffer.ptr[1u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 + v_rk3)) + 131072u)) >> 18u) & 1023u)];
52752
    a_dst_buffer.ptr[6u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd1 - v_rk3)) + 131072u)) >> 18u) & 1023u)];
52753
    a_dst_buffer.ptr[2u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 + v_rk5)) + 131072u)) >> 18u) & 1023u)];
52754
    a_dst_buffer.ptr[5u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd2 - v_rk5)) + 131072u)) >> 18u) & 1023u)];
52755
    a_dst_buffer.ptr[3u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 + v_rk7)) + 131072u)) >> 18u) & 1023u)];
52756
    a_dst_buffer.ptr[4u] = WUFFS_JPEG__BIAS_AND_CLAMP[((((uint32_t)(((uint32_t)(v_rd3 - v_rk7)) + 131072u)) >> 18u) & 1023u)];
52757
  }
52758
  return wuffs_base__make_empty_struct();
52759
}
52760
52761
// โ€ผ WUFFS MULTI-FILE SECTION +x86_avx2
52762
// -------- func jpeg.decoder.decode_idct_x86_avx2
52763
52764
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
52765
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2,avx2")
52766
WUFFS_BASE__GENERATED_C_CODE
52767
static wuffs_base__empty_struct
52768
wuffs_jpeg__decoder__decode_idct_x86_avx2(
52769
    wuffs_jpeg__decoder* self,
52770
    wuffs_base__slice_u8 a_dst_buffer,
52771
    uint64_t a_dst_stride,
52772
    uint32_t a_q) {
52773
  __m256i v_k_0000 = {0};
52774
  __m256i v_k_8080 = {0};
52775
  __m256i v_k_0000_0002 = {0};
52776
  __m256i v_k_0001_FFFF = {0};
52777
  __m256i v_k_0400_0000 = {0};
52778
  __m256i v_k_29CF_1151_D630_1151 = {0};
52779
  __m256i v_k_E333_133E_ADFD_1051 = {0};
52780
  __m256i v_k_E6DC_25A1_1925_25A1 = {0};
52781
  __m256i v_k_ECC1_E333_EFB0_ADFD = {0};
52782
  __m128i v_az_coeffs = {0};
52783
  __m256i v_az_ah00 = {0};
52784
  __m256i v_az_ad00 = {0};
52785
  __m256i v_az_eh00 = {0};
52786
  __m256i v_az_adeh = {0};
52787
  __m256i v_rows01 = {0};
52788
  __m256i v_rows23 = {0};
52789
  __m256i v_rows45 = {0};
52790
  __m256i v_rows67 = {0};
52791
  __m256i v_quants01 = {0};
52792
  __m256i v_quants23 = {0};
52793
  __m256i v_quants45 = {0};
52794
  __m256i v_quants67 = {0};
52795
  __m256i v_rows04 = {0};
52796
  __m256i v_rows31 = {0};
52797
  __m256i v_rows26 = {0};
52798
  __m256i v_rows75 = {0};
52799
  __m256i v_fp_rows62 = {0};
52800
  __m256i v_fp_bq2662ad = {0};
52801
  __m256i v_fp_bq2662eh = {0};
52802
  __m256i v_fp_cb26ad = {0};
52803
  __m256i v_fp_cb26eh = {0};
52804
  __m256i v_fp_rows40pos = {0};
52805
  __m256i v_fp_rows04neg = {0};
52806
  __m256i v_fp_rows0pm4 = {0};
52807
  __m256i v_fp_ccpmad = {0};
52808
  __m256i v_fp_ccpmeh = {0};
52809
  __m256i v_fp_cd01ad = {0};
52810
  __m256i v_fp_cd01eh = {0};
52811
  __m256i v_fp_cd32ad = {0};
52812
  __m256i v_fp_cd32eh = {0};
52813
  __m256i v_fp_sums7351 = {0};
52814
  __m256i v_fp_sums5173 = {0};
52815
  __m256i v_fp_ci73515173ad = {0};
52816
  __m256i v_fp_ci73515173eh = {0};
52817
  __m256i v_fp_cl7351ad = {0};
52818
  __m256i v_fp_cl7351eh = {0};
52819
  __m256i v_fp_rows13 = {0};
52820
  __m256i v_fp_bq7153ad = {0};
52821
  __m256i v_fp_bq7153eh = {0};
52822
  __m256i v_fp_ck75ad = {0};
52823
  __m256i v_fp_ck75eh = {0};
52824
  __m256i v_fp_cl5173ad = {0};
52825
  __m256i v_fp_cl5173eh = {0};
52826
  __m256i v_fp_ck13ad = {0};
52827
  __m256i v_fp_ck13eh = {0};
52828
  __m256i v_intermediate01ad = {0};
52829
  __m256i v_intermediate01eh = {0};
52830
  __m256i v_intermediate01 = {0};
52831
  __m256i v_intermediate32ad = {0};
52832
  __m256i v_intermediate32eh = {0};
52833
  __m256i v_intermediate32 = {0};
52834
  __m256i v_intermediate45ad = {0};
52835
  __m256i v_intermediate45eh = {0};
52836
  __m256i v_intermediate45 = {0};
52837
  __m256i v_intermediate76ad = {0};
52838
  __m256i v_intermediate76eh = {0};
52839
  __m256i v_intermediate76 = {0};
52840
  __m256i v_ita0a1e0e1 = {0};
52841
  __m256i v_ita2a3e2e3 = {0};
52842
  __m256i v_ita4a5e4e5 = {0};
52843
  __m256i v_ita6a7e6e7 = {0};
52844
  __m256i v_ita0c0e0g0 = {0};
52845
  __m256i v_ita1c1e1g1 = {0};
52846
  __m256i v_ita4c4e4g4 = {0};
52847
  __m256i v_ita5c5e5g5 = {0};
52848
  __m256i v_ita0b0e0f0 = {0};
52849
  __m256i v_ita4b4e4f4 = {0};
52850
  __m256i v_itc0d0g0h0 = {0};
52851
  __m256i v_itc4d4g4h4 = {0};
52852
  __m256i v_intermediateae = {0};
52853
  __m256i v_intermediatebf = {0};
52854
  __m256i v_intermediatecg = {0};
52855
  __m256i v_intermediatedh = {0};
52856
  __m256i v_intermediatedb = {0};
52857
  __m256i v_intermediatehf = {0};
52858
  __m256i v_sp_cols62 = {0};
52859
  __m256i v_sp_bq2662ad = {0};
52860
  __m256i v_sp_bq2662eh = {0};
52861
  __m256i v_sp_rb26ad = {0};
52862
  __m256i v_sp_rb26eh = {0};
52863
  __m256i v_sp_cols40pos = {0};
52864
  __m256i v_sp_cols04neg = {0};
52865
  __m256i v_sp_cols0pm4 = {0};
52866
  __m256i v_sp_rcpmad = {0};
52867
  __m256i v_sp_rcpmeh = {0};
52868
  __m256i v_sp_rd01ad = {0};
52869
  __m256i v_sp_rd01eh = {0};
52870
  __m256i v_sp_rd32ad = {0};
52871
  __m256i v_sp_rd32eh = {0};
52872
  __m256i v_sp_sums7351 = {0};
52873
  __m256i v_sp_sums5173 = {0};
52874
  __m256i v_sp_ri73515173ad = {0};
52875
  __m256i v_sp_ri73515173eh = {0};
52876
  __m256i v_sp_rl7351ad = {0};
52877
  __m256i v_sp_rl7351eh = {0};
52878
  __m256i v_sp_cols13 = {0};
52879
  __m256i v_sp_bq7153ad = {0};
52880
  __m256i v_sp_bq7153eh = {0};
52881
  __m256i v_sp_rk75ad = {0};
52882
  __m256i v_sp_rk75eh = {0};
52883
  __m256i v_sp_rl5173ad = {0};
52884
  __m256i v_sp_rl5173eh = {0};
52885
  __m256i v_sp_rk13ad = {0};
52886
  __m256i v_sp_rk13eh = {0};
52887
  __m256i v_final01ad = {0};
52888
  __m256i v_final01eh = {0};
52889
  __m256i v_final01 = {0};
52890
  __m256i v_final32ad = {0};
52891
  __m256i v_final32eh = {0};
52892
  __m256i v_final32 = {0};
52893
  __m256i v_final45ad = {0};
52894
  __m256i v_final45eh = {0};
52895
  __m256i v_final45 = {0};
52896
  __m256i v_final76ad = {0};
52897
  __m256i v_final76eh = {0};
52898
  __m256i v_final76 = {0};
52899
  __m256i v_fta0a1e0e1 = {0};
52900
  __m256i v_fta2a3e2e3 = {0};
52901
  __m256i v_fta4a5e4e5 = {0};
52902
  __m256i v_fta6a7e6e7 = {0};
52903
  __m256i v_fta0c0e0g0 = {0};
52904
  __m256i v_fta1c1e1g1 = {0};
52905
  __m256i v_fta4c4e4g4 = {0};
52906
  __m256i v_fta5c5e5g5 = {0};
52907
  __m256i v_fta0b0e0f0 = {0};
52908
  __m256i v_ftc0d0g0h0 = {0};
52909
  __m256i v_fta4b4e4f4 = {0};
52910
  __m256i v_ftc4d4g4h4 = {0};
52911
  __m256i v_finalae = {0};
52912
  __m256i v_finalbf = {0};
52913
  __m256i v_finalcg = {0};
52914
  __m256i v_finaldh = {0};
52915
  __m256i v_final0145 = {0};
52916
  __m256i v_final2367 = {0};
52917
  uint64_t v_final0 = 0;
52918
  uint64_t v_final1 = 0;
52919
  uint64_t v_final2 = 0;
52920
  uint64_t v_final3 = 0;
52921
  uint64_t v_final4 = 0;
52922
  uint64_t v_final5 = 0;
52923
  uint64_t v_final6 = 0;
52924
  uint64_t v_final7 = 0;
52925
  wuffs_base__slice_u8 v_remaining = {0};
52926
52927
  if (8u > a_dst_stride) {
52928
    return wuffs_base__make_empty_struct();
52929
  }
52930
  v_k_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u), (int16_t)(0u));
52931
  v_k_8080 = _mm256_set_epi16((int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u), (int16_t)(32896u));
52932
  v_k_0000_0002 = _mm256_set_epi16((int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u), (int16_t)(2u), (int16_t)(0u));
52933
  v_k_0001_FFFF = _mm256_set_epi16((int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(65535u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u), (int16_t)(1u));
52934
  v_k_0400_0000 = _mm256_set_epi16((int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u), (int16_t)(0u), (int16_t)(1024u));
52935
  v_k_29CF_1151_D630_1151 = _mm256_set_epi16((int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(54832u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u), (int16_t)(4433u), (int16_t)(10703u));
52936
  v_k_E333_133E_ADFD_1051 = _mm256_set_epi16((int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4177u), (int16_t)(44541u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u), (int16_t)(4926u), (int16_t)(58163u));
52937
  v_k_E6DC_25A1_1925_25A1 = _mm256_set_epi16((int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(6437u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u), (int16_t)(9633u), (int16_t)(59100u));
52938
  v_k_ECC1_E333_EFB0_ADFD = _mm256_set_epi16((int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(44541u), (int16_t)(61360u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u), (int16_t)(58163u), (int16_t)(60609u));
52939
  do {
52940
    if (0u == (wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)) | wuffs_base__peek_u64le__no_bounds_check((const uint8_t*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u)))) {
52941
      v_az_coeffs = _mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_or_si128(_mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 8u)), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 24u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 40u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u))), _mm_lddqu_si128((const __m128i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 56u)));
52942
      if (0u == ((uint64_t)(_mm_cvtsi128_si64(_mm_packs_epi16(v_az_coeffs, v_az_coeffs))))) {
52943
        v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
52944
        v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
52945
        v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
52946
        v_az_ah00 = _mm256_slli_epi16(v_rows01, (int32_t)(2u));
52947
        v_az_ad00 = _mm256_unpacklo_epi16(v_az_ah00, v_az_ah00);
52948
        v_az_eh00 = _mm256_unpackhi_epi16(v_az_ah00, v_az_ah00);
52949
        v_az_adeh = _mm256_inserti128_si256(v_az_ad00, _mm256_castsi256_si128(v_az_eh00), (int32_t)(1u));
52950
        v_intermediateae = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(0u));
52951
        v_intermediatebf = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(85u));
52952
        v_intermediatecg = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(170u));
52953
        v_intermediatedh = _mm256_shuffle_epi32(v_az_adeh, (int32_t)(255u));
52954
        break;
52955
      }
52956
    }
52957
    v_rows01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 0u));
52958
    v_rows23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 16u));
52959
    v_rows45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 32u));
52960
    v_rows67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_data.f_mcu_blocks[0u] + 48u));
52961
    v_quants01 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 0u));
52962
    v_quants23 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 16u));
52963
    v_quants45 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 32u));
52964
    v_quants67 = _mm256_lddqu_si256((const __m256i*)(const void*)(self->private_impl.f_quant_tables[a_q] + 48u));
52965
    v_rows01 = _mm256_mullo_epi16(v_rows01, v_quants01);
52966
    v_rows23 = _mm256_mullo_epi16(v_rows23, v_quants23);
52967
    v_rows45 = _mm256_mullo_epi16(v_rows45, v_quants45);
52968
    v_rows67 = _mm256_mullo_epi16(v_rows67, v_quants67);
52969
    v_rows04 = _mm256_permute2x128_si256(v_rows01, v_rows45, (int32_t)(32u));
52970
    v_rows31 = _mm256_permute2x128_si256(v_rows23, v_rows01, (int32_t)(49u));
52971
    v_rows26 = _mm256_permute2x128_si256(v_rows23, v_rows67, (int32_t)(32u));
52972
    v_rows75 = _mm256_permute2x128_si256(v_rows67, v_rows45, (int32_t)(49u));
52973
    v_fp_rows62 = _mm256_permute2x128_si256(v_rows26, v_rows26, (int32_t)(1u));
52974
    v_fp_bq2662ad = _mm256_unpacklo_epi16(v_rows26, v_fp_rows62);
52975
    v_fp_bq2662eh = _mm256_unpackhi_epi16(v_rows26, v_fp_rows62);
52976
    v_fp_cb26ad = _mm256_madd_epi16(v_fp_bq2662ad, v_k_29CF_1151_D630_1151);
52977
    v_fp_cb26eh = _mm256_madd_epi16(v_fp_bq2662eh, v_k_29CF_1151_D630_1151);
52978
    v_fp_rows40pos = _mm256_permute2x128_si256(v_rows04, v_rows04, (int32_t)(1u));
52979
    v_fp_rows04neg = _mm256_sign_epi16(v_rows04, v_k_0001_FFFF);
52980
    v_fp_rows0pm4 = _mm256_add_epi16(v_fp_rows40pos, v_fp_rows04neg);
52981
    v_fp_ccpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
52982
    v_fp_ccpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_fp_rows0pm4), (int32_t)(3u));
52983
    v_fp_cd01ad = _mm256_add_epi32(v_fp_ccpmad, v_fp_cb26ad);
52984
    v_fp_cd01eh = _mm256_add_epi32(v_fp_ccpmeh, v_fp_cb26eh);
52985
    v_fp_cd32ad = _mm256_sub_epi32(v_fp_ccpmad, v_fp_cb26ad);
52986
    v_fp_cd32eh = _mm256_sub_epi32(v_fp_ccpmeh, v_fp_cb26eh);
52987
    v_fp_sums7351 = _mm256_add_epi16(v_rows75, v_rows31);
52988
    v_fp_sums5173 = _mm256_permute2x128_si256(v_fp_sums7351, v_fp_sums7351, (int32_t)(1u));
52989
    v_fp_ci73515173ad = _mm256_unpacklo_epi16(v_fp_sums7351, v_fp_sums5173);
52990
    v_fp_ci73515173eh = _mm256_unpackhi_epi16(v_fp_sums7351, v_fp_sums5173);
52991
    v_fp_cl7351ad = _mm256_madd_epi16(v_fp_ci73515173ad, v_k_E6DC_25A1_1925_25A1);
52992
    v_fp_cl7351eh = _mm256_madd_epi16(v_fp_ci73515173eh, v_k_E6DC_25A1_1925_25A1);
52993
    v_fp_rows13 = _mm256_permute2x128_si256(v_rows31, v_rows31, (int32_t)(1u));
52994
    v_fp_bq7153ad = _mm256_unpacklo_epi16(v_rows75, v_fp_rows13);
52995
    v_fp_bq7153eh = _mm256_unpackhi_epi16(v_rows75, v_fp_rows13);
52996
    v_fp_ck75ad = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351ad);
52997
    v_fp_ck75eh = _mm256_add_epi32(_mm256_madd_epi16(v_fp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_fp_cl7351eh);
52998
    v_fp_cl5173ad = _mm256_permute2x128_si256(v_fp_cl7351ad, v_fp_cl7351ad, (int32_t)(1u));
52999
    v_fp_cl5173eh = _mm256_permute2x128_si256(v_fp_cl7351eh, v_fp_cl7351eh, (int32_t)(1u));
53000
    v_fp_ck13ad = _mm256_add_epi32(v_fp_cl5173ad, _mm256_madd_epi16(v_fp_bq7153ad, v_k_E333_133E_ADFD_1051));
53001
    v_fp_ck13eh = _mm256_add_epi32(v_fp_cl5173eh, _mm256_madd_epi16(v_fp_bq7153eh, v_k_E333_133E_ADFD_1051));
53002
    v_intermediate01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
53003
    v_intermediate01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
53004
    v_intermediate01 = _mm256_packs_epi32(v_intermediate01ad, v_intermediate01eh);
53005
    v_intermediate32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
53006
    v_intermediate32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
53007
    v_intermediate32 = _mm256_packs_epi32(v_intermediate32ad, v_intermediate32eh);
53008
    v_intermediate45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32ad, v_fp_ck75ad), v_k_0400_0000), (int32_t)(11u));
53009
    v_intermediate45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd32eh, v_fp_ck75eh), v_k_0400_0000), (int32_t)(11u));
53010
    v_intermediate45 = _mm256_packs_epi32(v_intermediate45ad, v_intermediate45eh);
53011
    v_intermediate76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01ad, v_fp_ck13ad), v_k_0400_0000), (int32_t)(11u));
53012
    v_intermediate76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_fp_cd01eh, v_fp_ck13eh), v_k_0400_0000), (int32_t)(11u));
53013
    v_intermediate76 = _mm256_packs_epi32(v_intermediate76ad, v_intermediate76eh);
53014
    v_ita0a1e0e1 = _mm256_permute4x64_epi64(v_intermediate01, (int32_t)(216u));
53015
    v_ita2a3e2e3 = _mm256_permute4x64_epi64(v_intermediate32, (int32_t)(114u));
53016
    v_ita4a5e4e5 = _mm256_permute4x64_epi64(v_intermediate45, (int32_t)(216u));
53017
    v_ita6a7e6e7 = _mm256_permute4x64_epi64(v_intermediate76, (int32_t)(114u));
53018
    v_ita0c0e0g0 = _mm256_unpacklo_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
53019
    v_ita1c1e1g1 = _mm256_unpackhi_epi16(v_ita0a1e0e1, v_ita2a3e2e3);
53020
    v_ita4c4e4g4 = _mm256_unpacklo_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
53021
    v_ita5c5e5g5 = _mm256_unpackhi_epi16(v_ita4a5e4e5, v_ita6a7e6e7);
53022
    v_ita0b0e0f0 = _mm256_unpacklo_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
53023
    v_itc0d0g0h0 = _mm256_unpackhi_epi16(v_ita0c0e0g0, v_ita1c1e1g1);
53024
    v_ita4b4e4f4 = _mm256_unpacklo_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
53025
    v_itc4d4g4h4 = _mm256_unpackhi_epi16(v_ita4c4e4g4, v_ita5c5e5g5);
53026
    v_intermediateae = _mm256_unpacklo_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
53027
    v_intermediatebf = _mm256_unpackhi_epi64(v_ita0b0e0f0, v_ita4b4e4f4);
53028
    v_intermediatecg = _mm256_unpacklo_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
53029
    v_intermediatedh = _mm256_unpackhi_epi64(v_itc0d0g0h0, v_itc4d4g4h4);
53030
  } while (0);
53031
  v_intermediatedb = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(32u));
53032
  v_intermediatehf = _mm256_permute2x128_si256(v_intermediatedh, v_intermediatebf, (int32_t)(49u));
53033
  v_sp_cols62 = _mm256_permute2x128_si256(v_intermediatecg, v_intermediatecg, (int32_t)(1u));
53034
  v_sp_bq2662ad = _mm256_unpacklo_epi16(v_intermediatecg, v_sp_cols62);
53035
  v_sp_bq2662eh = _mm256_unpackhi_epi16(v_intermediatecg, v_sp_cols62);
53036
  v_sp_rb26ad = _mm256_madd_epi16(v_sp_bq2662ad, v_k_29CF_1151_D630_1151);
53037
  v_sp_rb26eh = _mm256_madd_epi16(v_sp_bq2662eh, v_k_29CF_1151_D630_1151);
53038
  v_sp_cols40pos = _mm256_permute2x128_si256(v_intermediateae, v_intermediateae, (int32_t)(1u));
53039
  v_sp_cols04neg = _mm256_sign_epi16(v_intermediateae, v_k_0001_FFFF);
53040
  v_sp_cols0pm4 = _mm256_add_epi16(v_sp_cols40pos, v_sp_cols04neg);
53041
  v_sp_rcpmad = _mm256_srai_epi32(_mm256_unpacklo_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
53042
  v_sp_rcpmeh = _mm256_srai_epi32(_mm256_unpackhi_epi16(v_k_0000, v_sp_cols0pm4), (int32_t)(3u));
53043
  v_sp_rd01ad = _mm256_add_epi32(v_sp_rcpmad, v_sp_rb26ad);
53044
  v_sp_rd01eh = _mm256_add_epi32(v_sp_rcpmeh, v_sp_rb26eh);
53045
  v_sp_rd32ad = _mm256_sub_epi32(v_sp_rcpmad, v_sp_rb26ad);
53046
  v_sp_rd32eh = _mm256_sub_epi32(v_sp_rcpmeh, v_sp_rb26eh);
53047
  v_sp_sums7351 = _mm256_add_epi16(v_intermediatehf, v_intermediatedb);
53048
  v_sp_sums5173 = _mm256_permute2x128_si256(v_sp_sums7351, v_sp_sums7351, (int32_t)(1u));
53049
  v_sp_ri73515173ad = _mm256_unpacklo_epi16(v_sp_sums7351, v_sp_sums5173);
53050
  v_sp_ri73515173eh = _mm256_unpackhi_epi16(v_sp_sums7351, v_sp_sums5173);
53051
  v_sp_rl7351ad = _mm256_madd_epi16(v_sp_ri73515173ad, v_k_E6DC_25A1_1925_25A1);
53052
  v_sp_rl7351eh = _mm256_madd_epi16(v_sp_ri73515173eh, v_k_E6DC_25A1_1925_25A1);
53053
  v_sp_cols13 = _mm256_permute2x128_si256(v_intermediatedb, v_intermediatedb, (int32_t)(1u));
53054
  v_sp_bq7153ad = _mm256_unpacklo_epi16(v_intermediatehf, v_sp_cols13);
53055
  v_sp_bq7153eh = _mm256_unpackhi_epi16(v_intermediatehf, v_sp_cols13);
53056
  v_sp_rk75ad = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153ad, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351ad);
53057
  v_sp_rk75eh = _mm256_add_epi32(_mm256_madd_epi16(v_sp_bq7153eh, v_k_ECC1_E333_EFB0_ADFD), v_sp_rl7351eh);
53058
  v_sp_rl5173ad = _mm256_permute2x128_si256(v_sp_rl7351ad, v_sp_rl7351ad, (int32_t)(1u));
53059
  v_sp_rl5173eh = _mm256_permute2x128_si256(v_sp_rl7351eh, v_sp_rl7351eh, (int32_t)(1u));
53060
  v_sp_rk13ad = _mm256_add_epi32(v_sp_rl5173ad, _mm256_madd_epi16(v_sp_bq7153ad, v_k_E333_133E_ADFD_1051));
53061
  v_sp_rk13eh = _mm256_add_epi32(v_sp_rl5173eh, _mm256_madd_epi16(v_sp_bq7153eh, v_k_E333_133E_ADFD_1051));
53062
  v_final01ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
53063
  v_final01eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
53064
  v_final01 = _mm256_packs_epi32(v_final01ad, v_final01eh);
53065
  v_final32ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
53066
  v_final32eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_add_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
53067
  v_final32 = _mm256_packs_epi32(v_final32ad, v_final32eh);
53068
  v_final45ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32ad, v_sp_rk75ad), v_k_0000_0002), (int32_t)(18u));
53069
  v_final45eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd32eh, v_sp_rk75eh), v_k_0000_0002), (int32_t)(18u));
53070
  v_final45 = _mm256_packs_epi32(v_final45ad, v_final45eh);
53071
  v_final76ad = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01ad, v_sp_rk13ad), v_k_0000_0002), (int32_t)(18u));
53072
  v_final76eh = _mm256_srai_epi32(_mm256_add_epi32(_mm256_sub_epi32(v_sp_rd01eh, v_sp_rk13eh), v_k_0000_0002), (int32_t)(18u));
53073
  v_final76 = _mm256_packs_epi32(v_final76ad, v_final76eh);
53074
  v_fta0a1e0e1 = _mm256_permute4x64_epi64(v_final01, (int32_t)(216u));
53075
  v_fta2a3e2e3 = _mm256_permute4x64_epi64(v_final32, (int32_t)(114u));
53076
  v_fta4a5e4e5 = _mm256_permute4x64_epi64(v_final45, (int32_t)(216u));
53077
  v_fta6a7e6e7 = _mm256_permute4x64_epi64(v_final76, (int32_t)(114u));
53078
  v_fta0c0e0g0 = _mm256_unpacklo_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
53079
  v_fta1c1e1g1 = _mm256_unpackhi_epi16(v_fta0a1e0e1, v_fta2a3e2e3);
53080
  v_fta4c4e4g4 = _mm256_unpacklo_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
53081
  v_fta5c5e5g5 = _mm256_unpackhi_epi16(v_fta4a5e4e5, v_fta6a7e6e7);
53082
  v_fta0b0e0f0 = _mm256_unpacklo_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
53083
  v_ftc0d0g0h0 = _mm256_unpackhi_epi16(v_fta0c0e0g0, v_fta1c1e1g1);
53084
  v_fta4b4e4f4 = _mm256_unpacklo_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
53085
  v_ftc4d4g4h4 = _mm256_unpackhi_epi16(v_fta4c4e4g4, v_fta5c5e5g5);
53086
  v_finalae = _mm256_unpacklo_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
53087
  v_finalbf = _mm256_unpackhi_epi64(v_fta0b0e0f0, v_fta4b4e4f4);
53088
  v_finalcg = _mm256_unpacklo_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
53089
  v_finaldh = _mm256_unpackhi_epi64(v_ftc0d0g0h0, v_ftc4d4g4h4);
53090
  v_final0145 = _mm256_add_epi8(_mm256_packs_epi16(v_finalae, v_finalbf), v_k_8080);
53091
  v_final2367 = _mm256_add_epi8(_mm256_packs_epi16(v_finalcg, v_finaldh), v_k_8080);
53092
  v_final0 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(0u))));
53093
  v_final1 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(1u))));
53094
  v_final2 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(0u))));
53095
  v_final3 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(1u))));
53096
  v_final4 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(2u))));
53097
  v_final5 = ((uint64_t)(_mm256_extract_epi64(v_final0145, (int32_t)(3u))));
53098
  v_final6 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(2u))));
53099
  v_final7 = ((uint64_t)(_mm256_extract_epi64(v_final2367, (int32_t)(3u))));
53100
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53101
    return wuffs_base__make_empty_struct();
53102
  }
53103
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53104
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final0);
53105
  a_dst_buffer = v_remaining;
53106
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53107
    return wuffs_base__make_empty_struct();
53108
  }
53109
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53110
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final1);
53111
  a_dst_buffer = v_remaining;
53112
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53113
    return wuffs_base__make_empty_struct();
53114
  }
53115
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53116
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final2);
53117
  a_dst_buffer = v_remaining;
53118
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53119
    return wuffs_base__make_empty_struct();
53120
  }
53121
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53122
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final3);
53123
  a_dst_buffer = v_remaining;
53124
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53125
    return wuffs_base__make_empty_struct();
53126
  }
53127
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53128
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final4);
53129
  a_dst_buffer = v_remaining;
53130
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53131
    return wuffs_base__make_empty_struct();
53132
  }
53133
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53134
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final5);
53135
  a_dst_buffer = v_remaining;
53136
  if (a_dst_stride > ((uint64_t)(a_dst_buffer.len))) {
53137
    return wuffs_base__make_empty_struct();
53138
  }
53139
  v_remaining = wuffs_base__slice_u8__subslice_i(a_dst_buffer, a_dst_stride);
53140
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final6);
53141
  a_dst_buffer = v_remaining;
53142
  if (8u > ((uint64_t)(a_dst_buffer.len))) {
53143
    return wuffs_base__make_empty_struct();
53144
  }
53145
  wuffs_base__poke_u64le__no_bounds_check(a_dst_buffer.ptr, v_final7);
53146
  return wuffs_base__make_empty_struct();
53147
}
53148
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
53149
// โ€ผ WUFFS MULTI-FILE SECTION -x86_avx2
53150
53151
// -------- func jpeg.decoder.get_quirk
53152
53153
WUFFS_BASE__GENERATED_C_CODE
53154
WUFFS_BASE__MAYBE_STATIC uint64_t
53155
wuffs_jpeg__decoder__get_quirk(
53156
    const wuffs_jpeg__decoder* self,
53157
    uint32_t a_key) {
53158
  if (!self) {
53159
    return 0;
53160
  }
53161
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
53162
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
53163
    return 0;
53164
  }
53165
53166
  if (a_key == 2u) {
53167
    if (self->private_impl.f_use_lower_quality) {
53168
      return 18446744073709551615u;
53169
    }
53170
  } else if (a_key == 1162824704u) {
53171
    if (self->private_impl.f_reject_progressive_jpegs) {
53172
      return 1u;
53173
    }
53174
  }
53175
  return 0u;
53176
}
53177
53178
// -------- func jpeg.decoder.set_quirk
53179
53180
WUFFS_BASE__GENERATED_C_CODE
53181
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
53182
wuffs_jpeg__decoder__set_quirk(
53183
    wuffs_jpeg__decoder* self,
53184
    uint32_t a_key,
53185
    uint64_t a_value) {
53186
  if (!self) {
53187
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
53188
  }
53189
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
53190
    return wuffs_base__make_status(
53191
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
53192
        ? wuffs_base__error__disabled_by_previous_error
53193
        : wuffs_base__error__initialize_not_called);
53194
  }
53195
53196
  if (a_key == 2u) {
53197
    self->private_impl.f_use_lower_quality = (a_value >= 9223372036854775808u);
53198
    return wuffs_base__make_status(NULL);
53199
  } else if (a_key == 1162824704u) {
53200
    self->private_impl.f_reject_progressive_jpegs = (a_value != 0u);
53201
    return wuffs_base__make_status(NULL);
53202
  }
53203
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
53204
}
53205
53206
// -------- func jpeg.decoder.decode_image_config
53207
53208
WUFFS_BASE__GENERATED_C_CODE
53209
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
53210
wuffs_jpeg__decoder__decode_image_config(
53211
    wuffs_jpeg__decoder* self,
53212
    wuffs_base__image_config* a_dst,
53213
    wuffs_base__io_buffer* a_src) {
53214
  if (!self) {
53215
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
53216
  }
53217
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
53218
    return wuffs_base__make_status(
53219
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
53220
        ? wuffs_base__error__disabled_by_previous_error
53221
        : wuffs_base__error__initialize_not_called);
53222
  }
53223
  if (!a_src) {
53224
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53225
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
53226
  }
53227
  if ((self->private_impl.active_coroutine != 0) &&
53228
      (self->private_impl.active_coroutine != 1)) {
53229
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53230
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
53231
  }
53232
  self->private_impl.active_coroutine = 0;
53233
  wuffs_base__status status = wuffs_base__make_status(NULL);
53234
53235
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
53236
53237
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
53238
  switch (coro_susp_point) {
53239
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53240
53241
    while (true) {
53242
      {
53243
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_image_config(self, a_dst, a_src);
53244
        v_status = t_0;
53245
      }
53246
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
53247
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
53248
        goto exit;
53249
      }
53250
      status = v_status;
53251
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
53252
    }
53253
53254
    ok:
53255
    self->private_impl.p_decode_image_config = 0;
53256
    goto exit;
53257
  }
53258
53259
  goto suspend;
53260
  suspend:
53261
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53262
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
53263
53264
  goto exit;
53265
  exit:
53266
  if (wuffs_base__status__is_error(&status)) {
53267
    self->private_impl.magic = WUFFS_BASE__DISABLED;
53268
  }
53269
  return status;
53270
}
53271
53272
// -------- func jpeg.decoder.do_decode_image_config
53273
53274
WUFFS_BASE__GENERATED_C_CODE
53275
static wuffs_base__status
53276
wuffs_jpeg__decoder__do_decode_image_config(
53277
    wuffs_jpeg__decoder* self,
53278
    wuffs_base__image_config* a_dst,
53279
    wuffs_base__io_buffer* a_src) {
53280
  wuffs_base__status status = wuffs_base__make_status(NULL);
53281
53282
  uint8_t v_c8 = 0;
53283
  uint8_t v_marker = 0;
53284
  uint32_t v_pixfmt = 0;
53285
53286
  const uint8_t* iop_a_src = NULL;
53287
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53288
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53289
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53290
  if (a_src && a_src->data.ptr) {
53291
    io0_a_src = a_src->data.ptr;
53292
    io1_a_src = io0_a_src + a_src->meta.ri;
53293
    iop_a_src = io1_a_src;
53294
    io2_a_src = io0_a_src + a_src->meta.wi;
53295
  }
53296
53297
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
53298
  if (coro_susp_point) {
53299
    v_marker = self->private_data.s_do_decode_image_config.v_marker;
53300
  }
53301
  switch (coro_susp_point) {
53302
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53303
53304
    if (self->private_impl.f_call_sequence != 0u) {
53305
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
53306
      goto exit;
53307
    }
53308
    {
53309
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
53310
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53311
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53312
        goto suspend;
53313
      }
53314
      uint8_t t_0 = *iop_a_src++;
53315
      v_c8 = t_0;
53316
    }
53317
    if (v_c8 != 255u) {
53318
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
53319
      goto exit;
53320
    }
53321
    {
53322
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
53323
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53324
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53325
        goto suspend;
53326
      }
53327
      uint8_t t_1 = *iop_a_src++;
53328
      v_c8 = t_1;
53329
    }
53330
    if (v_c8 != 216u) {
53331
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_header);
53332
      goto exit;
53333
    }
53334
    while (true) {
53335
      while (true) {
53336
        {
53337
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
53338
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53339
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53340
            goto suspend;
53341
          }
53342
          uint8_t t_2 = *iop_a_src++;
53343
          v_c8 = t_2;
53344
        }
53345
        if (v_c8 == 255u) {
53346
          break;
53347
        }
53348
      }
53349
      while (true) {
53350
        {
53351
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
53352
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53353
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53354
            goto suspend;
53355
          }
53356
          uint8_t t_3 = *iop_a_src++;
53357
          v_c8 = t_3;
53358
        }
53359
        if (v_c8 != 255u) {
53360
          v_marker = v_c8;
53361
          break;
53362
        }
53363
      }
53364
      if (v_marker == 0u) {
53365
        continue;
53366
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
53367
        if (v_marker <= 215u) {
53368
          continue;
53369
        }
53370
      } else {
53371
        {
53372
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
53373
          uint32_t t_4;
53374
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
53375
            t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
53376
            iop_a_src += 2;
53377
          } else {
53378
            self->private_data.s_do_decode_image_config.scratch = 0;
53379
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
53380
            while (true) {
53381
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53382
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53383
                goto suspend;
53384
              }
53385
              uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
53386
              uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
53387
              *scratch >>= 8;
53388
              *scratch <<= 8;
53389
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
53390
              if (num_bits_4 == 8) {
53391
                t_4 = ((uint32_t)(*scratch >> 48));
53392
                break;
53393
              }
53394
              num_bits_4 += 8u;
53395
              *scratch |= ((uint64_t)(num_bits_4));
53396
            }
53397
          }
53398
          self->private_impl.f_payload_length = t_4;
53399
        }
53400
        if (self->private_impl.f_payload_length < 2u) {
53401
          if ((v_marker == 254u) || ((224u <= v_marker) && (v_marker < 240u))) {
53402
            continue;
53403
          }
53404
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
53405
          goto exit;
53406
        }
53407
        self->private_impl.f_payload_length -= 2u;
53408
      }
53409
      if (v_marker < 192u) {
53410
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
53411
        goto exit;
53412
      } else if (v_marker < 208u) {
53413
        if (v_marker <= 194u) {
53414
          if ((v_marker == 194u) && self->private_impl.f_reject_progressive_jpegs) {
53415
            status = wuffs_base__make_status(wuffs_jpeg__error__rejected_progressive_jpeg);
53416
            goto exit;
53417
          } else if (self->private_impl.f_sof_marker != 0u) {
53418
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
53419
            goto exit;
53420
          } else if (v_marker == 192u) {
53421
            if (self->private_impl.f_seen_dht[2u] ||
53422
                self->private_impl.f_seen_dht[3u] ||
53423
                self->private_impl.f_seen_dht[6u] ||
53424
                self->private_impl.f_seen_dht[7u]) {
53425
              status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
53426
              goto exit;
53427
            }
53428
          }
53429
          self->private_impl.f_sof_marker = v_marker;
53430
          if (a_src) {
53431
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53432
          }
53433
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
53434
          status = wuffs_jpeg__decoder__decode_sof(self, a_src);
53435
          if (a_src) {
53436
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
53437
          }
53438
          if (status.repr) {
53439
            goto suspend;
53440
          }
53441
          break;
53442
        } else if (v_marker == 195u) {
53443
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_lossless_coding);
53444
          goto exit;
53445
        } else if (v_marker == 196u) {
53446
          if (a_src) {
53447
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53448
          }
53449
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
53450
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
53451
          if (a_src) {
53452
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
53453
          }
53454
          if (status.repr) {
53455
            goto suspend;
53456
          }
53457
          continue;
53458
        } else if ((197u <= v_marker) && (v_marker <= 199u)) {
53459
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_hierarchical_coding);
53460
          goto exit;
53461
        } else if (v_marker == 200u) {
53462
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
53463
          goto exit;
53464
        } else {
53465
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_arithmetic_coding);
53466
          goto exit;
53467
        }
53468
      } else if (v_marker < 224u) {
53469
        if (v_marker < 218u) {
53470
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
53471
          goto exit;
53472
        } else if (v_marker == 218u) {
53473
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
53474
          goto exit;
53475
        } else if (v_marker == 219u) {
53476
          if (a_src) {
53477
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53478
          }
53479
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
53480
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
53481
          if (a_src) {
53482
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
53483
          }
53484
          if (status.repr) {
53485
            goto suspend;
53486
          }
53487
          continue;
53488
        } else if (v_marker == 221u) {
53489
          if (a_src) {
53490
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53491
          }
53492
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
53493
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
53494
          if (a_src) {
53495
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
53496
          }
53497
          if (status.repr) {
53498
            goto suspend;
53499
          }
53500
          continue;
53501
        } else {
53502
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
53503
          goto exit;
53504
        }
53505
      } else if (v_marker < 240u) {
53506
        if (a_src) {
53507
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53508
        }
53509
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
53510
        status = wuffs_jpeg__decoder__decode_appn(self, a_src, v_marker);
53511
        if (a_src) {
53512
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
53513
        }
53514
        if (status.repr) {
53515
          goto suspend;
53516
        }
53517
        continue;
53518
      } else {
53519
        if (v_marker == 254u) {
53520
        } else {
53521
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
53522
          goto exit;
53523
        }
53524
      }
53525
      self->private_data.s_do_decode_image_config.scratch = self->private_impl.f_payload_length;
53526
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
53527
      if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
53528
        self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
53529
        iop_a_src = io2_a_src;
53530
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53531
        goto suspend;
53532
      }
53533
      iop_a_src += self->private_data.s_do_decode_image_config.scratch;
53534
      self->private_impl.f_payload_length = 0u;
53535
    }
53536
    self->private_impl.choosy_decode_idct = (
53537
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V3)
53538
        wuffs_base__cpu_arch__have_x86_avx2() ? &wuffs_jpeg__decoder__decode_idct_x86_avx2 :
53539
#endif
53540
        self->private_impl.choosy_decode_idct);
53541
    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)));
53542
    if (a_dst != NULL) {
53543
      v_pixfmt = 536870920u;
53544
      if (self->private_impl.f_num_components > 1u) {
53545
        v_pixfmt = 2415954056u;
53546
      }
53547
      wuffs_base__image_config__set(
53548
          a_dst,
53549
          v_pixfmt,
53550
          0u,
53551
          self->private_impl.f_width,
53552
          self->private_impl.f_height,
53553
          self->private_impl.f_frame_config_io_position,
53554
          true);
53555
    }
53556
    self->private_impl.f_call_sequence = 32u;
53557
53558
    goto ok;
53559
    ok:
53560
    self->private_impl.p_do_decode_image_config = 0;
53561
    goto exit;
53562
  }
53563
53564
  goto suspend;
53565
  suspend:
53566
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53567
  self->private_data.s_do_decode_image_config.v_marker = v_marker;
53568
53569
  goto exit;
53570
  exit:
53571
  if (a_src && a_src->data.ptr) {
53572
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53573
  }
53574
53575
  return status;
53576
}
53577
53578
// -------- func jpeg.decoder.decode_dqt
53579
53580
WUFFS_BASE__GENERATED_C_CODE
53581
static wuffs_base__status
53582
wuffs_jpeg__decoder__decode_dqt(
53583
    wuffs_jpeg__decoder* self,
53584
    wuffs_base__io_buffer* a_src) {
53585
  wuffs_base__status status = wuffs_base__make_status(NULL);
53586
53587
  uint8_t v_c8 = 0;
53588
  uint8_t v_q = 0;
53589
  uint32_t v_i = 0;
53590
53591
  const uint8_t* iop_a_src = NULL;
53592
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53593
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53594
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53595
  if (a_src && a_src->data.ptr) {
53596
    io0_a_src = a_src->data.ptr;
53597
    io1_a_src = io0_a_src + a_src->meta.ri;
53598
    iop_a_src = io1_a_src;
53599
    io2_a_src = io0_a_src + a_src->meta.wi;
53600
  }
53601
53602
  uint32_t coro_susp_point = self->private_impl.p_decode_dqt;
53603
  if (coro_susp_point) {
53604
    v_q = self->private_data.s_decode_dqt.v_q;
53605
    v_i = self->private_data.s_decode_dqt.v_i;
53606
  }
53607
  switch (coro_susp_point) {
53608
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53609
53610
    while (self->private_impl.f_payload_length > 0u) {
53611
      self->private_impl.f_payload_length -= 1u;
53612
      {
53613
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
53614
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53615
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53616
          goto suspend;
53617
        }
53618
        uint8_t t_0 = *iop_a_src++;
53619
        v_c8 = t_0;
53620
      }
53621
      if (((uint8_t)(v_c8 & 15u)) > 3u) {
53622
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
53623
        goto exit;
53624
      }
53625
      v_q = ((uint8_t)(v_c8 & 15u));
53626
      if (((uint8_t)(v_c8 >> 4u)) == 1u) {
53627
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
53628
        goto exit;
53629
      } else if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (self->private_impl.f_payload_length < 64u)) {
53630
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dqt_marker);
53631
        goto exit;
53632
      }
53633
      self->private_impl.f_payload_length -= 64u;
53634
      v_i = 0u;
53635
      while (v_i < 64u) {
53636
        v_i += 1u;
53637
        {
53638
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
53639
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53640
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53641
            goto suspend;
53642
          }
53643
          uint16_t t_1 = *iop_a_src++;
53644
          self->private_impl.f_quant_tables[v_q][WUFFS_JPEG__UNZIG[v_i]] = t_1;
53645
        }
53646
      }
53647
      self->private_impl.f_seen_dqt[v_q] = true;
53648
      if (self->private_impl.f_sof_marker == 0u) {
53649
        v_i = 0u;
53650
        while (v_i < 64u) {
53651
          self->private_impl.f_saved_quant_tables[v_q][v_i] = self->private_impl.f_quant_tables[v_q][v_i];
53652
          v_i += 1u;
53653
        }
53654
        self->private_impl.f_saved_seen_dqt[v_q] = true;
53655
      }
53656
    }
53657
53658
    goto ok;
53659
    ok:
53660
    self->private_impl.p_decode_dqt = 0;
53661
    goto exit;
53662
  }
53663
53664
  goto suspend;
53665
  suspend:
53666
  self->private_impl.p_decode_dqt = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53667
  self->private_data.s_decode_dqt.v_q = v_q;
53668
  self->private_data.s_decode_dqt.v_i = v_i;
53669
53670
  goto exit;
53671
  exit:
53672
  if (a_src && a_src->data.ptr) {
53673
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53674
  }
53675
53676
  return status;
53677
}
53678
53679
// -------- func jpeg.decoder.decode_dri
53680
53681
WUFFS_BASE__GENERATED_C_CODE
53682
static wuffs_base__status
53683
wuffs_jpeg__decoder__decode_dri(
53684
    wuffs_jpeg__decoder* self,
53685
    wuffs_base__io_buffer* a_src) {
53686
  wuffs_base__status status = wuffs_base__make_status(NULL);
53687
53688
  const uint8_t* iop_a_src = NULL;
53689
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53690
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53691
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53692
  if (a_src && a_src->data.ptr) {
53693
    io0_a_src = a_src->data.ptr;
53694
    io1_a_src = io0_a_src + a_src->meta.ri;
53695
    iop_a_src = io1_a_src;
53696
    io2_a_src = io0_a_src + a_src->meta.wi;
53697
  }
53698
53699
  uint32_t coro_susp_point = self->private_impl.p_decode_dri;
53700
  switch (coro_susp_point) {
53701
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53702
53703
    if (self->private_impl.f_payload_length != 2u) {
53704
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_dri_marker);
53705
      goto exit;
53706
    }
53707
    self->private_impl.f_payload_length = 0u;
53708
    {
53709
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
53710
      uint16_t t_0;
53711
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
53712
        t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
53713
        iop_a_src += 2;
53714
      } else {
53715
        self->private_data.s_decode_dri.scratch = 0;
53716
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
53717
        while (true) {
53718
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53719
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53720
            goto suspend;
53721
          }
53722
          uint64_t* scratch = &self->private_data.s_decode_dri.scratch;
53723
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
53724
          *scratch >>= 8;
53725
          *scratch <<= 8;
53726
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
53727
          if (num_bits_0 == 8) {
53728
            t_0 = ((uint16_t)(*scratch >> 48));
53729
            break;
53730
          }
53731
          num_bits_0 += 8u;
53732
          *scratch |= ((uint64_t)(num_bits_0));
53733
        }
53734
      }
53735
      self->private_impl.f_restart_interval = t_0;
53736
    }
53737
    if (self->private_impl.f_sof_marker == 0u) {
53738
      self->private_impl.f_saved_restart_interval = self->private_impl.f_restart_interval;
53739
    }
53740
53741
    goto ok;
53742
    ok:
53743
    self->private_impl.p_decode_dri = 0;
53744
    goto exit;
53745
  }
53746
53747
  goto suspend;
53748
  suspend:
53749
  self->private_impl.p_decode_dri = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53750
53751
  goto exit;
53752
  exit:
53753
  if (a_src && a_src->data.ptr) {
53754
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53755
  }
53756
53757
  return status;
53758
}
53759
53760
// -------- func jpeg.decoder.decode_appn
53761
53762
WUFFS_BASE__GENERATED_C_CODE
53763
static wuffs_base__status
53764
wuffs_jpeg__decoder__decode_appn(
53765
    wuffs_jpeg__decoder* self,
53766
    wuffs_base__io_buffer* a_src,
53767
    uint8_t a_marker) {
53768
  wuffs_base__status status = wuffs_base__make_status(NULL);
53769
53770
  uint8_t v_c8 = 0;
53771
  uint32_t v_c32 = 0;
53772
53773
  const uint8_t* iop_a_src = NULL;
53774
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53775
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53776
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53777
  if (a_src && a_src->data.ptr) {
53778
    io0_a_src = a_src->data.ptr;
53779
    io1_a_src = io0_a_src + a_src->meta.ri;
53780
    iop_a_src = io1_a_src;
53781
    io2_a_src = io0_a_src + a_src->meta.wi;
53782
  }
53783
53784
  uint32_t coro_susp_point = self->private_impl.p_decode_appn;
53785
  switch (coro_susp_point) {
53786
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
53787
53788
    do {
53789
      if (a_marker == 224u) {
53790
        if (self->private_impl.f_payload_length >= 5u) {
53791
          self->private_impl.f_payload_length -= 5u;
53792
          {
53793
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
53794
            uint32_t t_0;
53795
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
53796
              t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
53797
              iop_a_src += 4;
53798
            } else {
53799
              self->private_data.s_decode_appn.scratch = 0;
53800
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
53801
              while (true) {
53802
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53803
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53804
                  goto suspend;
53805
                }
53806
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
53807
                uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
53808
                *scratch <<= 8;
53809
                *scratch >>= 8;
53810
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
53811
                if (num_bits_0 == 24) {
53812
                  t_0 = ((uint32_t)(*scratch));
53813
                  break;
53814
                }
53815
                num_bits_0 += 8u;
53816
                *scratch |= ((uint64_t)(num_bits_0)) << 56;
53817
              }
53818
            }
53819
            v_c32 = t_0;
53820
          }
53821
          if (v_c32 != 1179207242u) {
53822
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 1u));
53823
            break;
53824
          }
53825
          {
53826
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
53827
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53828
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53829
              goto suspend;
53830
            }
53831
            uint8_t t_1 = *iop_a_src++;
53832
            v_c8 = t_1;
53833
          }
53834
          self->private_impl.f_is_jfif = (v_c8 == 0u);
53835
        }
53836
      } else if (a_marker == 238u) {
53837
        if (self->private_impl.f_payload_length >= 12u) {
53838
          self->private_impl.f_payload_length -= 12u;
53839
          {
53840
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
53841
            uint32_t t_2;
53842
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
53843
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
53844
              iop_a_src += 4;
53845
            } else {
53846
              self->private_data.s_decode_appn.scratch = 0;
53847
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
53848
              while (true) {
53849
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53850
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53851
                  goto suspend;
53852
                }
53853
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
53854
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
53855
                *scratch <<= 8;
53856
                *scratch >>= 8;
53857
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
53858
                if (num_bits_2 == 24) {
53859
                  t_2 = ((uint32_t)(*scratch));
53860
                  break;
53861
                }
53862
                num_bits_2 += 8u;
53863
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
53864
              }
53865
            }
53866
            v_c32 = t_2;
53867
          }
53868
          if (v_c32 != 1651467329u) {
53869
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 8u));
53870
            break;
53871
          }
53872
          {
53873
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
53874
            uint32_t t_3;
53875
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
53876
              t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
53877
              iop_a_src += 4;
53878
            } else {
53879
              self->private_data.s_decode_appn.scratch = 0;
53880
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
53881
              while (true) {
53882
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53883
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53884
                  goto suspend;
53885
                }
53886
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
53887
                uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
53888
                *scratch <<= 8;
53889
                *scratch >>= 8;
53890
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
53891
                if (num_bits_3 == 24) {
53892
                  t_3 = ((uint32_t)(*scratch));
53893
                  break;
53894
                }
53895
                num_bits_3 += 8u;
53896
                *scratch |= ((uint64_t)(num_bits_3)) << 56;
53897
              }
53898
            }
53899
            v_c32 = t_3;
53900
          }
53901
          if ((255u & v_c32) != 101u) {
53902
            self->private_impl.f_payload_length = (65535u & (self->private_impl.f_payload_length + 4u));
53903
            break;
53904
          }
53905
          {
53906
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
53907
            uint32_t t_4;
53908
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
53909
              t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
53910
              iop_a_src += 4;
53911
            } else {
53912
              self->private_data.s_decode_appn.scratch = 0;
53913
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
53914
              while (true) {
53915
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
53916
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53917
                  goto suspend;
53918
                }
53919
                uint64_t* scratch = &self->private_data.s_decode_appn.scratch;
53920
                uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
53921
                *scratch <<= 8;
53922
                *scratch >>= 8;
53923
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
53924
                if (num_bits_4 == 24) {
53925
                  t_4 = ((uint32_t)(*scratch));
53926
                  break;
53927
                }
53928
                num_bits_4 += 8u;
53929
                *scratch |= ((uint64_t)(num_bits_4)) << 56;
53930
              }
53931
            }
53932
            v_c32 = t_4;
53933
          }
53934
          if ((v_c32 >> 24u) == 0u) {
53935
            self->private_impl.f_is_adobe = 1u;
53936
          } else {
53937
            self->private_impl.f_is_adobe = 2u;
53938
          }
53939
        }
53940
      }
53941
    } while (0);
53942
    self->private_data.s_decode_appn.scratch = self->private_impl.f_payload_length;
53943
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
53944
    if (self->private_data.s_decode_appn.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
53945
      self->private_data.s_decode_appn.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
53946
      iop_a_src = io2_a_src;
53947
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
53948
      goto suspend;
53949
    }
53950
    iop_a_src += self->private_data.s_decode_appn.scratch;
53951
    self->private_impl.f_payload_length = 0u;
53952
53953
    goto ok;
53954
    ok:
53955
    self->private_impl.p_decode_appn = 0;
53956
    goto exit;
53957
  }
53958
53959
  goto suspend;
53960
  suspend:
53961
  self->private_impl.p_decode_appn = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
53962
53963
  goto exit;
53964
  exit:
53965
  if (a_src && a_src->data.ptr) {
53966
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
53967
  }
53968
53969
  return status;
53970
}
53971
53972
// -------- func jpeg.decoder.decode_sof
53973
53974
WUFFS_BASE__GENERATED_C_CODE
53975
static wuffs_base__status
53976
wuffs_jpeg__decoder__decode_sof(
53977
    wuffs_jpeg__decoder* self,
53978
    wuffs_base__io_buffer* a_src) {
53979
  wuffs_base__status status = wuffs_base__make_status(NULL);
53980
53981
  uint8_t v_c8 = 0;
53982
  uint8_t v_comp_h = 0;
53983
  uint8_t v_comp_v = 0;
53984
  uint32_t v_i = 0;
53985
  uint32_t v_j = 0;
53986
  bool v_has_h24 = false;
53987
  bool v_has_h3 = false;
53988
  bool v_has_v24 = false;
53989
  bool v_has_v3 = false;
53990
  uint32_t v_upper_bound = 0;
53991
  uint64_t v_wh0 = 0;
53992
  uint64_t v_wh1 = 0;
53993
  uint64_t v_wh2 = 0;
53994
  uint64_t v_wh3 = 0;
53995
  uint64_t v_progressive = 0;
53996
53997
  const uint8_t* iop_a_src = NULL;
53998
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
53999
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54000
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54001
  if (a_src && a_src->data.ptr) {
54002
    io0_a_src = a_src->data.ptr;
54003
    io1_a_src = io0_a_src + a_src->meta.ri;
54004
    iop_a_src = io1_a_src;
54005
    io2_a_src = io0_a_src + a_src->meta.wi;
54006
  }
54007
54008
  uint32_t coro_susp_point = self->private_impl.p_decode_sof;
54009
  if (coro_susp_point) {
54010
    v_i = self->private_data.s_decode_sof.v_i;
54011
  }
54012
  switch (coro_susp_point) {
54013
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54014
54015
    if (self->private_impl.f_payload_length < 6u) {
54016
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54017
      goto exit;
54018
    }
54019
    self->private_impl.f_payload_length -= 6u;
54020
    {
54021
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54022
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54023
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54024
        goto suspend;
54025
      }
54026
      uint8_t t_0 = *iop_a_src++;
54027
      v_c8 = t_0;
54028
    }
54029
    if (v_c8 == 8u) {
54030
    } else if (v_c8 == 12u) {
54031
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_12_bits);
54032
      goto exit;
54033
    } else if (v_c8 == 16u) {
54034
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision_16_bits);
54035
      goto exit;
54036
    } else {
54037
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_precision);
54038
      goto exit;
54039
    }
54040
    {
54041
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54042
      uint32_t t_1;
54043
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54044
        t_1 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54045
        iop_a_src += 2;
54046
      } else {
54047
        self->private_data.s_decode_sof.scratch = 0;
54048
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54049
        while (true) {
54050
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54051
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54052
            goto suspend;
54053
          }
54054
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
54055
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
54056
          *scratch >>= 8;
54057
          *scratch <<= 8;
54058
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
54059
          if (num_bits_1 == 8) {
54060
            t_1 = ((uint32_t)(*scratch >> 48));
54061
            break;
54062
          }
54063
          num_bits_1 += 8u;
54064
          *scratch |= ((uint64_t)(num_bits_1));
54065
        }
54066
      }
54067
      self->private_impl.f_height = t_1;
54068
    }
54069
    if (self->private_impl.f_height == 0u) {
54070
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_implicit_height);
54071
      goto exit;
54072
    }
54073
    {
54074
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
54075
      uint32_t t_2;
54076
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54077
        t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54078
        iop_a_src += 2;
54079
      } else {
54080
        self->private_data.s_decode_sof.scratch = 0;
54081
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
54082
        while (true) {
54083
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54084
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54085
            goto suspend;
54086
          }
54087
          uint64_t* scratch = &self->private_data.s_decode_sof.scratch;
54088
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
54089
          *scratch >>= 8;
54090
          *scratch <<= 8;
54091
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
54092
          if (num_bits_2 == 8) {
54093
            t_2 = ((uint32_t)(*scratch >> 48));
54094
            break;
54095
          }
54096
          num_bits_2 += 8u;
54097
          *scratch |= ((uint64_t)(num_bits_2));
54098
        }
54099
      }
54100
      self->private_impl.f_width = t_2;
54101
    }
54102
    if (self->private_impl.f_width == 0u) {
54103
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
54104
      goto exit;
54105
    }
54106
    {
54107
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
54108
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54109
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54110
        goto suspend;
54111
      }
54112
      uint8_t t_3 = *iop_a_src++;
54113
      v_c8 = t_3;
54114
    }
54115
    if ((v_c8 == 0u) || (v_c8 > 4u)) {
54116
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54117
      goto exit;
54118
    } else if (v_c8 == 2u) {
54119
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_color_model);
54120
      goto exit;
54121
    }
54122
    self->private_impl.f_num_components = ((uint32_t)(v_c8));
54123
    if (self->private_impl.f_payload_length != (3u * self->private_impl.f_num_components)) {
54124
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54125
      goto exit;
54126
    }
54127
    self->private_impl.f_payload_length = 0u;
54128
    v_i = 0u;
54129
    while (v_i < self->private_impl.f_num_components) {
54130
      {
54131
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
54132
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54133
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54134
          goto suspend;
54135
        }
54136
        uint8_t t_4 = *iop_a_src++;
54137
        self->private_impl.f_components_c[v_i] = t_4;
54138
      }
54139
      {
54140
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
54141
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54142
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54143
          goto suspend;
54144
        }
54145
        uint8_t t_5 = *iop_a_src++;
54146
        v_c8 = t_5;
54147
      }
54148
      v_comp_h = ((uint8_t)(v_c8 >> 4u));
54149
      v_comp_v = ((uint8_t)(v_c8 & 15u));
54150
      if ((v_comp_h == 0u) ||
54151
          (v_comp_h > 4u) ||
54152
          (v_comp_v == 0u) ||
54153
          (v_comp_v > 4u)) {
54154
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54155
        goto exit;
54156
      }
54157
      self->private_impl.f_components_h[v_i] = v_comp_h;
54158
      if (self->private_impl.f_max_incl_components_h < self->private_impl.f_components_h[v_i]) {
54159
        self->private_impl.f_max_incl_components_h = self->private_impl.f_components_h[v_i];
54160
      }
54161
      self->private_impl.f_components_v[v_i] = v_comp_v;
54162
      if (self->private_impl.f_max_incl_components_v < self->private_impl.f_components_v[v_i]) {
54163
        self->private_impl.f_max_incl_components_v = self->private_impl.f_components_v[v_i];
54164
      }
54165
      {
54166
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
54167
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54168
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54169
          goto suspend;
54170
        }
54171
        uint8_t t_6 = *iop_a_src++;
54172
        v_c8 = t_6;
54173
      }
54174
      if (v_c8 >= 4u) {
54175
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54176
        goto exit;
54177
      }
54178
      self->private_impl.f_components_tq[v_i] = v_c8;
54179
      v_j = 0u;
54180
      while (v_j < v_i) {
54181
        if (self->private_impl.f_components_c[v_j] == self->private_impl.f_components_c[v_i]) {
54182
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54183
          goto exit;
54184
        }
54185
        v_j += 1u;
54186
      }
54187
      v_i += 1u;
54188
    }
54189
    if (self->private_impl.f_num_components == 1u) {
54190
      self->private_impl.f_max_incl_components_h = 1u;
54191
      self->private_impl.f_max_incl_components_v = 1u;
54192
      self->private_impl.f_components_h[0u] = 1u;
54193
      self->private_impl.f_components_v[0u] = 1u;
54194
    } else {
54195
      v_has_h24 = false;
54196
      v_has_h3 = false;
54197
      v_has_v24 = false;
54198
      v_has_v3 = false;
54199
      v_i = 0u;
54200
      while (v_i < self->private_impl.f_num_components) {
54201
        v_has_h24 = (v_has_h24 || (self->private_impl.f_components_h[v_i] == 2u) || (self->private_impl.f_components_h[v_i] == 4u));
54202
        v_has_h3 = (v_has_h3 || (self->private_impl.f_components_h[v_i] == 3u));
54203
        v_has_v24 = (v_has_v24 || (self->private_impl.f_components_v[v_i] == 2u) || (self->private_impl.f_components_v[v_i] == 4u));
54204
        v_has_v3 = (v_has_v3 || (self->private_impl.f_components_v[v_i] == 3u));
54205
        v_i += 1u;
54206
      }
54207
      if ((v_has_h24 && v_has_h3) || (v_has_v24 && v_has_v3)) {
54208
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_fractional_sampling);
54209
        goto exit;
54210
      }
54211
      if (self->private_impl.f_num_components == 4u) {
54212
        self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe < 2u);
54213
      } else {
54214
        if (self->private_impl.f_is_jfif) {
54215
          self->private_impl.f_is_rgb_or_cmyk = false;
54216
        } else if (self->private_impl.f_is_adobe > 0u) {
54217
          self->private_impl.f_is_rgb_or_cmyk = (self->private_impl.f_is_adobe == 1u);
54218
        } else {
54219
          self->private_impl.f_is_rgb_or_cmyk = ((self->private_impl.f_components_c[0u] == 82u) && (self->private_impl.f_components_c[1u] == 71u) && (self->private_impl.f_components_c[2u] == 66u));
54220
        }
54221
      }
54222
    }
54223
    self->private_impl.f_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, 1u, self->private_impl.f_max_incl_components_h);
54224
    self->private_impl.f_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, 1u, self->private_impl.f_max_incl_components_v);
54225
    v_upper_bound = 65544u;
54226
    self->private_impl.f_components_workbuf_widths[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[0u]))));
54227
    self->private_impl.f_components_workbuf_widths[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[1u]))));
54228
    self->private_impl.f_components_workbuf_widths[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[2u]))));
54229
    self->private_impl.f_components_workbuf_widths[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_width_in_mcus * ((uint32_t)(self->private_impl.f_components_h[3u]))));
54230
    self->private_impl.f_components_workbuf_heights[0u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[0u]))));
54231
    self->private_impl.f_components_workbuf_heights[1u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[1u]))));
54232
    self->private_impl.f_components_workbuf_heights[2u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[2u]))));
54233
    self->private_impl.f_components_workbuf_heights[3u] = wuffs_base__u32__min(v_upper_bound, (8u * self->private_impl.f_height_in_mcus * ((uint32_t)(self->private_impl.f_components_v[3u]))));
54234
    v_wh0 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[0u])));
54235
    v_wh1 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[1u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[1u])));
54236
    v_wh2 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[2u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[2u])));
54237
    v_wh3 = (((uint64_t)(self->private_impl.f_components_workbuf_widths[3u])) * ((uint64_t)(self->private_impl.f_components_workbuf_heights[3u])));
54238
    v_progressive = 0u;
54239
    if (self->private_impl.f_sof_marker >= 194u) {
54240
      v_progressive = 2u;
54241
      v_i = 0u;
54242
      while (v_i < 4u) {
54243
        v_j = 0u;
54244
        while (v_j < 10u) {
54245
          self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
54246
          v_j += 1u;
54247
        }
54248
        v_i += 1u;
54249
      }
54250
    }
54251
    self->private_impl.f_components_workbuf_offsets[0u] = 0u;
54252
    self->private_impl.f_components_workbuf_offsets[1u] = (self->private_impl.f_components_workbuf_offsets[0u] + v_wh0);
54253
    self->private_impl.f_components_workbuf_offsets[2u] = (self->private_impl.f_components_workbuf_offsets[1u] + v_wh1);
54254
    self->private_impl.f_components_workbuf_offsets[3u] = (self->private_impl.f_components_workbuf_offsets[2u] + v_wh2);
54255
    self->private_impl.f_components_workbuf_offsets[4u] = (self->private_impl.f_components_workbuf_offsets[3u] + v_wh3);
54256
    self->private_impl.f_components_workbuf_offsets[5u] = (self->private_impl.f_components_workbuf_offsets[4u] + (v_wh0 * v_progressive));
54257
    self->private_impl.f_components_workbuf_offsets[6u] = (self->private_impl.f_components_workbuf_offsets[5u] + (v_wh1 * v_progressive));
54258
    self->private_impl.f_components_workbuf_offsets[7u] = (self->private_impl.f_components_workbuf_offsets[6u] + (v_wh2 * v_progressive));
54259
    self->private_impl.f_components_workbuf_offsets[8u] = (self->private_impl.f_components_workbuf_offsets[7u] + (v_wh3 * v_progressive));
54260
54261
    goto ok;
54262
    ok:
54263
    self->private_impl.p_decode_sof = 0;
54264
    goto exit;
54265
  }
54266
54267
  goto suspend;
54268
  suspend:
54269
  self->private_impl.p_decode_sof = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54270
  self->private_data.s_decode_sof.v_i = v_i;
54271
54272
  goto exit;
54273
  exit:
54274
  if (a_src && a_src->data.ptr) {
54275
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54276
  }
54277
54278
  return status;
54279
}
54280
54281
// -------- func jpeg.decoder.quantize_dimension
54282
54283
WUFFS_BASE__GENERATED_C_CODE
54284
static uint32_t
54285
wuffs_jpeg__decoder__quantize_dimension(
54286
    const wuffs_jpeg__decoder* self,
54287
    uint32_t a_width,
54288
    uint8_t a_h,
54289
    uint8_t a_max_incl_h) {
54290
  uint32_t v_ratio = 0;
54291
54292
  v_ratio = 0u;
54293
  if (a_h > 0u) {
54294
    v_ratio = ((uint32_t)(((uint8_t)(a_max_incl_h / a_h))));
54295
  }
54296
  if (v_ratio == 1u) {
54297
    return ((a_width + 7u) / 8u);
54298
  } else if (v_ratio == 2u) {
54299
    return ((a_width + 15u) / 16u);
54300
  } else if (v_ratio == 3u) {
54301
    return ((a_width + 23u) / 24u);
54302
  }
54303
  return ((a_width + 31u) / 32u);
54304
}
54305
54306
// -------- func jpeg.decoder.decode_frame_config
54307
54308
WUFFS_BASE__GENERATED_C_CODE
54309
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
54310
wuffs_jpeg__decoder__decode_frame_config(
54311
    wuffs_jpeg__decoder* self,
54312
    wuffs_base__frame_config* a_dst,
54313
    wuffs_base__io_buffer* a_src) {
54314
  if (!self) {
54315
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
54316
  }
54317
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
54318
    return wuffs_base__make_status(
54319
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
54320
        ? wuffs_base__error__disabled_by_previous_error
54321
        : wuffs_base__error__initialize_not_called);
54322
  }
54323
  if (!a_src) {
54324
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54325
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
54326
  }
54327
  if ((self->private_impl.active_coroutine != 0) &&
54328
      (self->private_impl.active_coroutine != 2)) {
54329
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54330
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
54331
  }
54332
  self->private_impl.active_coroutine = 0;
54333
  wuffs_base__status status = wuffs_base__make_status(NULL);
54334
54335
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
54336
54337
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
54338
  switch (coro_susp_point) {
54339
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54340
54341
    while (true) {
54342
      {
54343
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame_config(self, a_dst, a_src);
54344
        v_status = t_0;
54345
      }
54346
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
54347
        status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
54348
        goto exit;
54349
      }
54350
      status = v_status;
54351
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
54352
    }
54353
54354
    ok:
54355
    self->private_impl.p_decode_frame_config = 0;
54356
    goto exit;
54357
  }
54358
54359
  goto suspend;
54360
  suspend:
54361
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54362
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
54363
54364
  goto exit;
54365
  exit:
54366
  if (wuffs_base__status__is_error(&status)) {
54367
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54368
  }
54369
  return status;
54370
}
54371
54372
// -------- func jpeg.decoder.do_decode_frame_config
54373
54374
WUFFS_BASE__GENERATED_C_CODE
54375
static wuffs_base__status
54376
wuffs_jpeg__decoder__do_decode_frame_config(
54377
    wuffs_jpeg__decoder* self,
54378
    wuffs_base__frame_config* a_dst,
54379
    wuffs_base__io_buffer* a_src) {
54380
  wuffs_base__status status = wuffs_base__make_status(NULL);
54381
54382
  const uint8_t* iop_a_src = NULL;
54383
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54384
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54385
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54386
  if (a_src && a_src->data.ptr) {
54387
    io0_a_src = a_src->data.ptr;
54388
    io1_a_src = io0_a_src + a_src->meta.ri;
54389
    iop_a_src = io1_a_src;
54390
    io2_a_src = io0_a_src + a_src->meta.wi;
54391
  }
54392
54393
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
54394
  switch (coro_susp_point) {
54395
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54396
54397
    if (self->private_impl.f_call_sequence == 32u) {
54398
    } else if (self->private_impl.f_call_sequence < 32u) {
54399
      if (a_src) {
54400
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54401
      }
54402
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54403
      status = wuffs_jpeg__decoder__do_decode_image_config(self, NULL, a_src);
54404
      if (a_src) {
54405
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
54406
      }
54407
      if (status.repr) {
54408
        goto suspend;
54409
      }
54410
    } else if (self->private_impl.f_call_sequence == 40u) {
54411
      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)))) {
54412
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
54413
        goto exit;
54414
      }
54415
    } else if (self->private_impl.f_call_sequence == 64u) {
54416
      self->private_impl.f_call_sequence = 96u;
54417
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
54418
      goto ok;
54419
    } else {
54420
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
54421
      goto ok;
54422
    }
54423
    if (a_dst != NULL) {
54424
      wuffs_base__frame_config__set(
54425
          a_dst,
54426
          wuffs_base__utility__make_rect_ie_u32(
54427
          0u,
54428
          0u,
54429
          self->private_impl.f_width,
54430
          self->private_impl.f_height),
54431
          ((wuffs_base__flicks)(0u)),
54432
          0u,
54433
          self->private_impl.f_frame_config_io_position,
54434
          0u,
54435
          true,
54436
          false,
54437
          4278190080u);
54438
    }
54439
    self->private_impl.f_call_sequence = 64u;
54440
54441
    ok:
54442
    self->private_impl.p_do_decode_frame_config = 0;
54443
    goto exit;
54444
  }
54445
54446
  goto suspend;
54447
  suspend:
54448
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54449
54450
  goto exit;
54451
  exit:
54452
  if (a_src && a_src->data.ptr) {
54453
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54454
  }
54455
54456
  return status;
54457
}
54458
54459
// -------- func jpeg.decoder.decode_frame
54460
54461
WUFFS_BASE__GENERATED_C_CODE
54462
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
54463
wuffs_jpeg__decoder__decode_frame(
54464
    wuffs_jpeg__decoder* self,
54465
    wuffs_base__pixel_buffer* a_dst,
54466
    wuffs_base__io_buffer* a_src,
54467
    wuffs_base__pixel_blend a_blend,
54468
    wuffs_base__slice_u8 a_workbuf,
54469
    wuffs_base__decode_frame_options* a_opts) {
54470
  if (!self) {
54471
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
54472
  }
54473
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
54474
    return wuffs_base__make_status(
54475
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
54476
        ? wuffs_base__error__disabled_by_previous_error
54477
        : wuffs_base__error__initialize_not_called);
54478
  }
54479
  if (!a_dst || !a_src) {
54480
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54481
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
54482
  }
54483
  if ((self->private_impl.active_coroutine != 0) &&
54484
      (self->private_impl.active_coroutine != 3)) {
54485
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54486
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
54487
  }
54488
  self->private_impl.active_coroutine = 0;
54489
  wuffs_base__status status = wuffs_base__make_status(NULL);
54490
54491
  wuffs_base__status v_ddf_status = wuffs_base__make_status(NULL);
54492
  wuffs_base__status v_swizzle_status = wuffs_base__make_status(NULL);
54493
  uint32_t v_scan_count = 0;
54494
54495
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
54496
  switch (coro_susp_point) {
54497
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54498
54499
    while (true) {
54500
      v_scan_count = self->private_impl.f_scan_count;
54501
      {
54502
        wuffs_base__status t_0 = wuffs_jpeg__decoder__do_decode_frame(self,
54503
            a_dst,
54504
            a_src,
54505
            a_blend,
54506
            a_workbuf,
54507
            a_opts);
54508
        v_ddf_status = t_0;
54509
      }
54510
      if ((v_ddf_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
54511
        v_ddf_status = wuffs_base__make_status(wuffs_jpeg__error__truncated_input);
54512
      }
54513
      if ( ! self->private_impl.f_swizzle_immediately && (wuffs_base__status__is_error(&v_ddf_status) || (v_scan_count < self->private_impl.f_scan_count))) {
54514
        if (self->private_impl.f_sof_marker >= 194u) {
54515
          wuffs_jpeg__decoder__apply_progressive_idct(self, a_workbuf);
54516
        }
54517
        if (self->private_impl.f_num_components == 1u) {
54518
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_gray(self,
54519
              a_dst,
54520
              a_workbuf,
54521
              0u,
54522
              4294967295u,
54523
              0u,
54524
              4294967295u,
54525
              ((uint64_t)(self->private_impl.f_components_workbuf_widths[0u])));
54526
        } else {
54527
          v_swizzle_status = wuffs_jpeg__decoder__swizzle_colorful(self,
54528
              a_dst,
54529
              a_workbuf,
54530
              0u,
54531
              4294967295u,
54532
              0u,
54533
              4294967295u);
54534
        }
54535
        if (wuffs_base__status__is_error(&v_ddf_status)) {
54536
          status = v_ddf_status;
54537
          goto exit;
54538
        } else if (wuffs_base__status__is_error(&v_swizzle_status)) {
54539
          status = v_swizzle_status;
54540
          goto exit;
54541
        }
54542
      }
54543
      status = v_ddf_status;
54544
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
54545
    }
54546
54547
    ok:
54548
    self->private_impl.p_decode_frame = 0;
54549
    goto exit;
54550
  }
54551
54552
  goto suspend;
54553
  suspend:
54554
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54555
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
54556
54557
  goto exit;
54558
  exit:
54559
  if (wuffs_base__status__is_error(&status)) {
54560
    self->private_impl.magic = WUFFS_BASE__DISABLED;
54561
  }
54562
  return status;
54563
}
54564
54565
// -------- func jpeg.decoder.do_decode_frame
54566
54567
WUFFS_BASE__GENERATED_C_CODE
54568
static wuffs_base__status
54569
wuffs_jpeg__decoder__do_decode_frame(
54570
    wuffs_jpeg__decoder* self,
54571
    wuffs_base__pixel_buffer* a_dst,
54572
    wuffs_base__io_buffer* a_src,
54573
    wuffs_base__pixel_blend a_blend,
54574
    wuffs_base__slice_u8 a_workbuf,
54575
    wuffs_base__decode_frame_options* a_opts) {
54576
  wuffs_base__status status = wuffs_base__make_status(NULL);
54577
54578
  uint32_t v_pixfmt = 0;
54579
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
54580
  uint8_t v_c8 = 0;
54581
  uint8_t v_marker = 0;
54582
54583
  const uint8_t* iop_a_src = NULL;
54584
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54585
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54586
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54587
  if (a_src && a_src->data.ptr) {
54588
    io0_a_src = a_src->data.ptr;
54589
    io1_a_src = io0_a_src + a_src->meta.ri;
54590
    iop_a_src = io1_a_src;
54591
    io2_a_src = io0_a_src + a_src->meta.wi;
54592
  }
54593
54594
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
54595
  if (coro_susp_point) {
54596
    v_marker = self->private_data.s_do_decode_frame.v_marker;
54597
  }
54598
  switch (coro_susp_point) {
54599
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54600
54601
    if (self->private_impl.f_call_sequence == 64u) {
54602
    } else if (self->private_impl.f_call_sequence < 64u) {
54603
      if (a_src) {
54604
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54605
      }
54606
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54607
      status = wuffs_jpeg__decoder__do_decode_frame_config(self, NULL, a_src);
54608
      if (a_src) {
54609
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
54610
      }
54611
      if (status.repr) {
54612
        goto suspend;
54613
      }
54614
    } else {
54615
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
54616
      goto ok;
54617
    }
54618
    v_pixfmt = 536870920u;
54619
    if (self->private_impl.f_num_components > 1u) {
54620
      v_pixfmt = 2415954056u;
54621
    }
54622
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
54623
        wuffs_base__pixel_buffer__pixel_format(a_dst),
54624
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
54625
        wuffs_base__utility__make_pixel_format(v_pixfmt),
54626
        wuffs_base__utility__empty_slice_u8(),
54627
        a_blend);
54628
    if ( ! wuffs_base__status__is_ok(&v_status)) {
54629
      status = v_status;
54630
      if (wuffs_base__status__is_error(&status)) {
54631
        goto exit;
54632
      } else if (wuffs_base__status__is_suspension(&status)) {
54633
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
54634
        goto exit;
54635
      }
54636
      goto ok;
54637
    }
54638
    self->private_impl.f_swizzle_immediately = false;
54639
    if (self->private_impl.f_components_workbuf_offsets[8u] > ((uint64_t)(a_workbuf.len))) {
54640
      if ((self->private_impl.f_sof_marker >= 194u) ||  ! self->private_impl.f_use_lower_quality) {
54641
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
54642
        goto exit;
54643
      }
54644
      self->private_impl.f_swizzle_immediately = true;
54645
      self->private_impl.f_swizzle_immediately_status = wuffs_base__make_status(NULL);
54646
    } else if (self->private_impl.f_components_workbuf_offsets[4u] < self->private_impl.f_components_workbuf_offsets[8u]) {
54647
      wuffs_private_impl__bulk_memset(a_workbuf.ptr + self->private_impl.f_components_workbuf_offsets[4u], (self->private_impl.f_components_workbuf_offsets[8u] - self->private_impl.f_components_workbuf_offsets[4u]), 0u);
54648
    }
54649
    if (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len))) {
54650
      wuffs_private_impl__bulk_memset(a_workbuf.ptr, self->private_impl.f_components_workbuf_offsets[4u], 128u);
54651
    }
54652
    while (true) {
54653
      while (true) {
54654
        {
54655
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54656
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54657
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54658
            goto suspend;
54659
          }
54660
          uint8_t t_0 = *iop_a_src++;
54661
          v_c8 = t_0;
54662
        }
54663
        if (v_c8 == 255u) {
54664
          break;
54665
        }
54666
      }
54667
      while (true) {
54668
        {
54669
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54670
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54671
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54672
            goto suspend;
54673
          }
54674
          uint8_t t_1 = *iop_a_src++;
54675
          v_c8 = t_1;
54676
        }
54677
        if (v_c8 != 255u) {
54678
          v_marker = v_c8;
54679
          break;
54680
        }
54681
      }
54682
      if (v_marker == 0u) {
54683
        continue;
54684
      } else if ((208u <= v_marker) && (v_marker <= 217u)) {
54685
        if (v_marker <= 215u) {
54686
          continue;
54687
        }
54688
      } else {
54689
        {
54690
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
54691
          uint32_t t_2;
54692
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
54693
            t_2 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
54694
            iop_a_src += 2;
54695
          } else {
54696
            self->private_data.s_do_decode_frame.scratch = 0;
54697
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
54698
            while (true) {
54699
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54700
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54701
                goto suspend;
54702
              }
54703
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
54704
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
54705
              *scratch >>= 8;
54706
              *scratch <<= 8;
54707
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
54708
              if (num_bits_2 == 8) {
54709
                t_2 = ((uint32_t)(*scratch >> 48));
54710
                break;
54711
              }
54712
              num_bits_2 += 8u;
54713
              *scratch |= ((uint64_t)(num_bits_2));
54714
            }
54715
          }
54716
          self->private_impl.f_payload_length = t_2;
54717
        }
54718
        if (self->private_impl.f_payload_length < 2u) {
54719
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
54720
          goto exit;
54721
        }
54722
        self->private_impl.f_payload_length -= 2u;
54723
      }
54724
      if (v_marker < 192u) {
54725
        status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54726
        goto exit;
54727
      } else if (v_marker < 208u) {
54728
        if (v_marker == 196u) {
54729
          if (a_src) {
54730
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54731
          }
54732
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
54733
          status = wuffs_jpeg__decoder__decode_dht(self, a_src);
54734
          if (a_src) {
54735
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54736
          }
54737
          if (status.repr) {
54738
            goto suspend;
54739
          }
54740
          continue;
54741
        } else if (v_marker == 200u) {
54742
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54743
          goto exit;
54744
        }
54745
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sof_marker);
54746
        goto exit;
54747
      } else if (v_marker < 224u) {
54748
        if (v_marker < 217u) {
54749
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_marker);
54750
          goto exit;
54751
        } else if (v_marker == 217u) {
54752
          break;
54753
        } else if (v_marker == 218u) {
54754
          if (a_src) {
54755
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54756
          }
54757
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
54758
          status = wuffs_jpeg__decoder__decode_sos(self, a_dst, a_src, a_workbuf);
54759
          if (a_src) {
54760
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54761
          }
54762
          if (status.repr) {
54763
            goto suspend;
54764
          }
54765
          continue;
54766
        } else if (v_marker == 219u) {
54767
          if (a_src) {
54768
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54769
          }
54770
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
54771
          status = wuffs_jpeg__decoder__decode_dqt(self, a_src);
54772
          if (a_src) {
54773
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54774
          }
54775
          if (status.repr) {
54776
            goto suspend;
54777
          }
54778
          continue;
54779
        } else if (v_marker == 221u) {
54780
          if (a_src) {
54781
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54782
          }
54783
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
54784
          status = wuffs_jpeg__decoder__decode_dri(self, a_src);
54785
          if (a_src) {
54786
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
54787
          }
54788
          if (status.repr) {
54789
            goto suspend;
54790
          }
54791
          continue;
54792
        } else {
54793
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54794
          goto exit;
54795
        }
54796
      } else if (v_marker < 240u) {
54797
      } else {
54798
        if (v_marker == 254u) {
54799
        } else {
54800
          status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_marker);
54801
          goto exit;
54802
        }
54803
      }
54804
      self->private_data.s_do_decode_frame.scratch = self->private_impl.f_payload_length;
54805
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
54806
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
54807
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
54808
        iop_a_src = io2_a_src;
54809
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54810
        goto suspend;
54811
      }
54812
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
54813
      self->private_impl.f_payload_length = 0u;
54814
    }
54815
    self->private_impl.f_call_sequence = 96u;
54816
54817
    ok:
54818
    self->private_impl.p_do_decode_frame = 0;
54819
    goto exit;
54820
  }
54821
54822
  goto suspend;
54823
  suspend:
54824
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54825
  self->private_data.s_do_decode_frame.v_marker = v_marker;
54826
54827
  goto exit;
54828
  exit:
54829
  if (a_src && a_src->data.ptr) {
54830
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54831
  }
54832
54833
  return status;
54834
}
54835
54836
// -------- func jpeg.decoder.decode_dht
54837
54838
WUFFS_BASE__GENERATED_C_CODE
54839
static wuffs_base__status
54840
wuffs_jpeg__decoder__decode_dht(
54841
    wuffs_jpeg__decoder* self,
54842
    wuffs_base__io_buffer* a_src) {
54843
  wuffs_base__status status = wuffs_base__make_status(NULL);
54844
54845
  uint8_t v_c8 = 0;
54846
  uint8_t v_tc = 0;
54847
  uint8_t v_th = 0;
54848
  uint8_t v_tc4_th = 0;
54849
  uint32_t v_working_total_count = 0;
54850
  uint32_t v_total_count = 0;
54851
  uint32_t v_i = 0;
54852
  bool v_failed = false;
54853
54854
  const uint8_t* iop_a_src = NULL;
54855
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54856
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54857
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
54858
  if (a_src && a_src->data.ptr) {
54859
    io0_a_src = a_src->data.ptr;
54860
    io1_a_src = io0_a_src + a_src->meta.ri;
54861
    iop_a_src = io1_a_src;
54862
    io2_a_src = io0_a_src + a_src->meta.wi;
54863
  }
54864
54865
  uint32_t coro_susp_point = self->private_impl.p_decode_dht;
54866
  if (coro_susp_point) {
54867
    v_tc4_th = self->private_data.s_decode_dht.v_tc4_th;
54868
    v_total_count = self->private_data.s_decode_dht.v_total_count;
54869
    v_i = self->private_data.s_decode_dht.v_i;
54870
  }
54871
  switch (coro_susp_point) {
54872
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
54873
54874
    while (self->private_impl.f_payload_length > 0u) {
54875
      if (self->private_impl.f_payload_length < 17u) {
54876
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54877
        goto exit;
54878
      }
54879
      self->private_impl.f_payload_length -= 17u;
54880
      {
54881
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
54882
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54883
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54884
          goto suspend;
54885
        }
54886
        uint8_t t_0 = *iop_a_src++;
54887
        v_c8 = t_0;
54888
      }
54889
      if ((((uint8_t)(v_c8 >> 4u)) > 1u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
54890
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54891
        goto exit;
54892
      }
54893
      v_tc = ((uint8_t)(v_c8 >> 4u));
54894
      v_th = ((uint8_t)(v_c8 & 15u));
54895
      v_tc4_th = ((uint8_t)(((uint8_t)(((uint8_t)(v_tc * 4u)) | v_th))));
54896
      if ((self->private_impl.f_sof_marker == 192u) && (((uint8_t)(v_tc4_th & 3u)) > 1u)) {
54897
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54898
        goto exit;
54899
      }
54900
      v_i = 0u;
54901
      while (v_i < 16u) {
54902
        {
54903
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
54904
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54905
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54906
            goto suspend;
54907
          }
54908
          uint8_t t_1 = *iop_a_src++;
54909
          self->private_data.f_dht_temp_counts[v_i] = t_1;
54910
        }
54911
        v_i += 1u;
54912
      }
54913
      v_working_total_count = 0u;
54914
      v_i = 0u;
54915
      while (v_i < 16u) {
54916
        v_working_total_count = ((v_working_total_count + ((uint32_t)(self->private_data.f_dht_temp_counts[v_i]))) & 65535u);
54917
        v_i += 1u;
54918
      }
54919
      if ((v_working_total_count <= 0u) || (256u < v_working_total_count)) {
54920
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54921
        goto exit;
54922
      }
54923
      v_total_count = v_working_total_count;
54924
      if (self->private_impl.f_payload_length < v_total_count) {
54925
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54926
        goto exit;
54927
      }
54928
      self->private_impl.f_payload_length -= v_total_count;
54929
      v_i = 0u;
54930
      while (v_i < v_total_count) {
54931
        {
54932
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
54933
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
54934
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
54935
            goto suspend;
54936
          }
54937
          uint8_t t_2 = *iop_a_src++;
54938
          self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = t_2;
54939
        }
54940
        v_i += 1u;
54941
      }
54942
      while (v_i < 256u) {
54943
        self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] = 0u;
54944
        v_i += 1u;
54945
      }
54946
      if (((uint8_t)(v_tc4_th & 4u)) == 0u) {
54947
        v_i = 0u;
54948
        while (v_i < v_total_count) {
54949
          if (self->private_impl.f_huff_tables_symbols[v_tc4_th][v_i] > 15u) {
54950
            status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54951
            goto exit;
54952
          }
54953
          v_i += 1u;
54954
        }
54955
      }
54956
      v_failed = wuffs_jpeg__decoder__calculate_huff_tables(self, v_tc4_th, v_total_count);
54957
      if (v_failed) {
54958
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_dht_marker);
54959
        goto exit;
54960
      }
54961
      self->private_impl.f_seen_dht[v_tc4_th] = true;
54962
    }
54963
54964
    goto ok;
54965
    ok:
54966
    self->private_impl.p_decode_dht = 0;
54967
    goto exit;
54968
  }
54969
54970
  goto suspend;
54971
  suspend:
54972
  self->private_impl.p_decode_dht = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
54973
  self->private_data.s_decode_dht.v_tc4_th = v_tc4_th;
54974
  self->private_data.s_decode_dht.v_total_count = v_total_count;
54975
  self->private_data.s_decode_dht.v_i = v_i;
54976
54977
  goto exit;
54978
  exit:
54979
  if (a_src && a_src->data.ptr) {
54980
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
54981
  }
54982
54983
  return status;
54984
}
54985
54986
// -------- func jpeg.decoder.calculate_huff_tables
54987
54988
WUFFS_BASE__GENERATED_C_CODE
54989
static bool
54990
wuffs_jpeg__decoder__calculate_huff_tables(
54991
    wuffs_jpeg__decoder* self,
54992
    uint8_t a_tc4_th,
54993
    uint32_t a_total_count) {
54994
  uint32_t v_i = 0;
54995
  uint8_t v_j = 0;
54996
  uint8_t v_k = 0;
54997
  uint32_t v_bit_length_minus_one = 0;
54998
  uint8_t v_bit_length = 0;
54999
  uint32_t v_bit_string = 0;
55000
  uint32_t v_slow = 0;
55001
  uint8_t v_prefix = 0;
55002
  uint16_t v_fast = 0;
55003
  uint32_t v_reps = 0;
55004
55005
  v_i = 0u;
55006
  v_k = 0u;
55007
  v_bit_length_minus_one = 0u;
55008
  while (v_i < a_total_count) {
55009
    while (v_k >= self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
55010
      v_k = 0u;
55011
      v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
55012
    }
55013
#if defined(__GNUC__)
55014
#pragma GCC diagnostic push
55015
#pragma GCC diagnostic ignored "-Wconversion"
55016
#endif
55017
    v_k += 1u;
55018
#if defined(__GNUC__)
55019
#pragma GCC diagnostic pop
55020
#endif
55021
    self->private_data.f_dht_temp_bit_lengths[v_i] = ((uint8_t)((v_bit_length_minus_one + 1u)));
55022
    v_i += 1u;
55023
  }
55024
  v_bit_length = 0u;
55025
  v_bit_string = 0u;
55026
  v_i = 0u;
55027
  while (v_i < a_total_count) {
55028
    while (v_bit_length < self->private_data.f_dht_temp_bit_lengths[v_i]) {
55029
      if (v_bit_length >= 16u) {
55030
        return true;
55031
      }
55032
#if defined(__GNUC__)
55033
#pragma GCC diagnostic push
55034
#pragma GCC diagnostic ignored "-Wconversion"
55035
#endif
55036
      v_bit_length += 1u;
55037
#if defined(__GNUC__)
55038
#pragma GCC diagnostic pop
55039
#endif
55040
      v_bit_string <<= 1u;
55041
    }
55042
    self->private_data.f_dht_temp_bit_strings[v_i] = ((uint16_t)(v_bit_string));
55043
    v_bit_string += 1u;
55044
    if ((v_bit_string >> v_bit_length) > 0u) {
55045
      return true;
55046
    }
55047
    v_i += 1u;
55048
  }
55049
  v_k = 0u;
55050
  v_bit_length_minus_one = 0u;
55051
  while (true) {
55052
    if (self->private_data.f_dht_temp_counts[v_bit_length_minus_one] == 0u) {
55053
      self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = 0u;
55054
    } else {
55055
      v_slow = (255u & ((uint32_t)(((uint32_t)(v_k)) - ((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_k])))));
55056
#if defined(__GNUC__)
55057
#pragma GCC diagnostic push
55058
#pragma GCC diagnostic ignored "-Wconversion"
55059
#endif
55060
      v_k += self->private_data.f_dht_temp_counts[v_bit_length_minus_one];
55061
#if defined(__GNUC__)
55062
#pragma GCC diagnostic pop
55063
#endif
55064
      self->private_impl.f_huff_tables_slow[a_tc4_th][v_bit_length_minus_one] = (v_slow | ((((uint32_t)(self->private_data.f_dht_temp_bit_strings[((uint8_t)(v_k - 1u))])) + 1u) << 8u));
55065
    }
55066
    v_bit_length_minus_one = ((v_bit_length_minus_one + 1u) & 15u);
55067
    if (v_bit_length_minus_one == 0u) {
55068
      break;
55069
    }
55070
  }
55071
  v_i = 0u;
55072
  while (v_i < 256u) {
55073
    self->private_impl.f_huff_tables_fast[a_tc4_th][v_i] = 65535u;
55074
    v_i += 1u;
55075
  }
55076
  v_j = 0u;
55077
  v_bit_length_minus_one = 0u;
55078
  while (v_bit_length_minus_one < 8u) {
55079
    v_k = 0u;
55080
    while (v_k < self->private_data.f_dht_temp_counts[v_bit_length_minus_one]) {
55081
      v_prefix = ((uint8_t)((((uint32_t)(self->private_data.f_dht_temp_bit_strings[v_j])) << (7u - v_bit_length_minus_one))));
55082
      v_fast = ((uint16_t)(((((uint32_t)((v_bit_length_minus_one + 1u))) << 8u) | ((uint32_t)(self->private_impl.f_huff_tables_symbols[a_tc4_th][v_j])))));
55083
      v_reps = (((uint32_t)(1u)) << (7u - v_bit_length_minus_one));
55084
      while (v_reps > 0u) {
55085
        self->private_impl.f_huff_tables_fast[a_tc4_th][v_prefix] = v_fast;
55086
#if defined(__GNUC__)
55087
#pragma GCC diagnostic push
55088
#pragma GCC diagnostic ignored "-Wconversion"
55089
#endif
55090
        v_prefix += 1u;
55091
#if defined(__GNUC__)
55092
#pragma GCC diagnostic pop
55093
#endif
55094
        v_reps -= 1u;
55095
      }
55096
#if defined(__GNUC__)
55097
#pragma GCC diagnostic push
55098
#pragma GCC diagnostic ignored "-Wconversion"
55099
#endif
55100
      v_k += 1u;
55101
      v_j += 1u;
55102
#if defined(__GNUC__)
55103
#pragma GCC diagnostic pop
55104
#endif
55105
    }
55106
    v_bit_length_minus_one += 1u;
55107
  }
55108
  return false;
55109
}
55110
55111
// -------- func jpeg.decoder.decode_sos
55112
55113
WUFFS_BASE__GENERATED_C_CODE
55114
static wuffs_base__status
55115
wuffs_jpeg__decoder__decode_sos(
55116
    wuffs_jpeg__decoder* self,
55117
    wuffs_base__pixel_buffer* a_dst,
55118
    wuffs_base__io_buffer* a_src,
55119
    wuffs_base__slice_u8 a_workbuf) {
55120
  wuffs_base__status status = wuffs_base__make_status(NULL);
55121
55122
  uint32_t v_my = 0;
55123
  uint32_t v_mx = 0;
55124
  uint32_t v_decode_mcu_result = 0;
55125
  uint32_t v_bitstream_length = 0;
55126
55127
  uint32_t coro_susp_point = self->private_impl.p_decode_sos;
55128
  if (coro_susp_point) {
55129
    v_my = self->private_data.s_decode_sos.v_my;
55130
    v_mx = self->private_data.s_decode_sos.v_mx;
55131
  }
55132
  switch (coro_susp_point) {
55133
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55134
55135
    if (self->private_impl.f_scan_count >= 32u) {
55136
      status = wuffs_base__make_status(wuffs_jpeg__error__unsupported_scan_count);
55137
      goto exit;
55138
    } else if ((self->private_impl.f_scan_count > 0u) &&  ! self->private_impl.f_expect_multiple_scans) {
55139
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_scan_count);
55140
      goto exit;
55141
    }
55142
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55143
    status = wuffs_jpeg__decoder__prepare_scan(self, a_src);
55144
    if (status.repr) {
55145
      goto suspend;
55146
    }
55147
    self->private_impl.f_next_restart_marker = 0u;
55148
    self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
55149
    self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
55150
    self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
55151
    self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
55152
    self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
55153
    self->private_impl.f_eob_run = 0u;
55154
    self->private_impl.f_bitstream_bits = 0u;
55155
    self->private_impl.f_bitstream_n_bits = 0u;
55156
    self->private_impl.f_bitstream_ri = 0u;
55157
    self->private_impl.f_bitstream_wi = 0u;
55158
    self->private_impl.f_bitstream_padding = 12345u;
55159
    wuffs_jpeg__decoder__fill_bitstream(self, a_src);
55160
    v_my = 0u;
55161
    while (v_my < self->private_impl.f_scan_height_in_mcus) {
55162
      v_mx = 0u;
55163
      while (v_mx < self->private_impl.f_scan_width_in_mcus) {
55164
        self->private_impl.f_mcu_current_block = 0u;
55165
        self->private_impl.f_mcu_zig_index = ((uint32_t)(self->private_impl.f_scan_ss));
55166
        if (self->private_impl.f_sof_marker >= 194u) {
55167
          wuffs_jpeg__decoder__load_mcu_blocks(self, v_mx, v_my, a_workbuf);
55168
        }
55169
        while (true) {
55170
          v_decode_mcu_result = wuffs_jpeg__decoder__decode_mcu(self,
55171
              a_dst,
55172
              a_workbuf,
55173
              v_mx,
55174
              v_my);
55175
          if (v_decode_mcu_result == 0u) {
55176
            break;
55177
          } else if (v_decode_mcu_result == 1u) {
55178
          } else if (v_decode_mcu_result == 2u) {
55179
            status = wuffs_base__make_status(wuffs_jpeg__error__internal_error_inconsistent_decoder_state);
55180
            goto exit;
55181
          } else {
55182
            status = self->private_impl.f_swizzle_immediately_status;
55183
            if (wuffs_base__status__is_error(&status)) {
55184
              goto exit;
55185
            } else if (wuffs_base__status__is_suspension(&status)) {
55186
              status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
55187
              goto exit;
55188
            }
55189
            goto ok;
55190
          }
55191
          while (true) {
55192
            v_bitstream_length = ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri));
55193
            wuffs_jpeg__decoder__fill_bitstream(self, a_src);
55194
            if (v_bitstream_length < ((uint32_t)(self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri))) {
55195
              break;
55196
            } else if (self->private_impl.f_bitstream_padding == 0u) {
55197
              status = wuffs_base__make_status(wuffs_jpeg__error__short_sos_bitstream);
55198
              goto exit;
55199
            } else if ((a_src && a_src->meta.closed) &&  ! self->private_impl.f_bitstream_is_closed) {
55200
              if (self->private_impl.f_bitstream_wi < 1024u) {
55201
                wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[self->private_impl.f_bitstream_wi], 264u, 0u);
55202
                self->private_impl.f_bitstream_wi += 264u;
55203
                self->private_impl.f_bitstream_is_closed = true;
55204
              }
55205
              break;
55206
            }
55207
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55208
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
55209
          }
55210
        }
55211
        if (self->private_impl.f_sof_marker >= 194u) {
55212
          wuffs_jpeg__decoder__save_mcu_blocks(self, v_mx, v_my, a_workbuf);
55213
        }
55214
        if (self->private_impl.f_restarts_remaining > 0u) {
55215
#if defined(__GNUC__)
55216
#pragma GCC diagnostic push
55217
#pragma GCC diagnostic ignored "-Wconversion"
55218
#endif
55219
          self->private_impl.f_restarts_remaining -= 1u;
55220
#if defined(__GNUC__)
55221
#pragma GCC diagnostic pop
55222
#endif
55223
          if (self->private_impl.f_restarts_remaining == 0u) {
55224
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
55225
            status = wuffs_jpeg__decoder__skip_past_the_next_restart_marker(self, a_src);
55226
            if (status.repr) {
55227
              goto suspend;
55228
            }
55229
            self->private_impl.f_mcu_previous_dc_values[0u] = 0u;
55230
            self->private_impl.f_mcu_previous_dc_values[1u] = 0u;
55231
            self->private_impl.f_mcu_previous_dc_values[2u] = 0u;
55232
            self->private_impl.f_mcu_previous_dc_values[3u] = 0u;
55233
            self->private_impl.f_restarts_remaining = self->private_impl.f_restart_interval;
55234
            self->private_impl.f_eob_run = 0u;
55235
            self->private_impl.f_bitstream_bits = 0u;
55236
            self->private_impl.f_bitstream_n_bits = 0u;
55237
            self->private_impl.f_bitstream_ri = 0u;
55238
            self->private_impl.f_bitstream_wi = 0u;
55239
            self->private_impl.f_bitstream_padding = 12345u;
55240
          }
55241
        }
55242
        v_mx += 1u;
55243
      }
55244
      v_my += 1u;
55245
    }
55246
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_scan_count, 1u);
55247
55248
    ok:
55249
    self->private_impl.p_decode_sos = 0;
55250
    goto exit;
55251
  }
55252
55253
  goto suspend;
55254
  suspend:
55255
  self->private_impl.p_decode_sos = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55256
  self->private_data.s_decode_sos.v_my = v_my;
55257
  self->private_data.s_decode_sos.v_mx = v_mx;
55258
55259
  goto exit;
55260
  exit:
55261
  return status;
55262
}
55263
55264
// -------- func jpeg.decoder.prepare_scan
55265
55266
WUFFS_BASE__GENERATED_C_CODE
55267
static wuffs_base__status
55268
wuffs_jpeg__decoder__prepare_scan(
55269
    wuffs_jpeg__decoder* self,
55270
    wuffs_base__io_buffer* a_src) {
55271
  wuffs_base__status status = wuffs_base__make_status(NULL);
55272
55273
  uint8_t v_c8 = 0;
55274
  uint32_t v_i = 0;
55275
  uint32_t v_j = 0;
55276
  uint32_t v_j_max_incl = 0;
55277
  bool v_failed = false;
55278
55279
  const uint8_t* iop_a_src = NULL;
55280
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55281
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55282
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55283
  if (a_src && a_src->data.ptr) {
55284
    io0_a_src = a_src->data.ptr;
55285
    io1_a_src = io0_a_src + a_src->meta.ri;
55286
    iop_a_src = io1_a_src;
55287
    io2_a_src = io0_a_src + a_src->meta.wi;
55288
  }
55289
55290
  uint32_t coro_susp_point = self->private_impl.p_prepare_scan;
55291
  if (coro_susp_point) {
55292
    v_i = self->private_data.s_prepare_scan.v_i;
55293
  }
55294
  switch (coro_susp_point) {
55295
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55296
55297
    if ((self->private_impl.f_payload_length < 6u) || (self->private_impl.f_payload_length > 12u)) {
55298
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55299
      goto exit;
55300
    }
55301
    {
55302
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
55303
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55304
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55305
        goto suspend;
55306
      }
55307
      uint8_t t_0 = *iop_a_src++;
55308
      v_c8 = t_0;
55309
    }
55310
    if ((v_c8 < 1u) || (v_c8 > 4u)) {
55311
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55312
      goto exit;
55313
    }
55314
    self->private_impl.f_scan_num_components = ((uint32_t)(v_c8));
55315
    if ((self->private_impl.f_scan_num_components > self->private_impl.f_num_components) || (self->private_impl.f_payload_length != (4u + (2u * self->private_impl.f_scan_num_components)))) {
55316
      status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55317
      goto exit;
55318
    }
55319
    self->private_impl.f_payload_length = 0u;
55320
    v_i = 0u;
55321
    while (v_i < self->private_impl.f_scan_num_components) {
55322
      {
55323
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
55324
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55325
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55326
          goto suspend;
55327
        }
55328
        uint8_t t_1 = *iop_a_src++;
55329
        v_c8 = t_1;
55330
      }
55331
      v_j = 0u;
55332
      while (true) {
55333
        if (v_j >= self->private_impl.f_num_components) {
55334
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55335
          goto exit;
55336
        }
55337
        if (v_c8 == self->private_impl.f_components_c[v_j]) {
55338
          if ( ! self->private_impl.f_seen_dqt[self->private_impl.f_components_tq[v_j]]) {
55339
            status = wuffs_base__make_status(wuffs_jpeg__error__missing_quantization_table);
55340
            goto exit;
55341
          }
55342
          self->private_impl.f_scan_comps_cselector[v_i] = ((uint8_t)(v_j));
55343
          break;
55344
        }
55345
        v_j += 1u;
55346
      }
55347
      v_j = 0u;
55348
      while (v_j < v_i) {
55349
        if (self->private_impl.f_scan_comps_cselector[v_i] == self->private_impl.f_scan_comps_cselector[v_j]) {
55350
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55351
          goto exit;
55352
        }
55353
        v_j += 1u;
55354
      }
55355
      {
55356
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
55357
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55358
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55359
          goto suspend;
55360
        }
55361
        uint8_t t_2 = *iop_a_src++;
55362
        v_c8 = t_2;
55363
      }
55364
      if ((((uint8_t)(v_c8 >> 4u)) > 3u) || (((uint8_t)(v_c8 & 15u)) > 3u)) {
55365
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55366
        goto exit;
55367
      }
55368
      self->private_impl.f_scan_comps_td[v_i] = ((uint8_t)(v_c8 >> 4u));
55369
      self->private_impl.f_scan_comps_ta[v_i] = ((uint8_t)(v_c8 & 15u));
55370
      if (self->private_impl.f_sof_marker == 192u) {
55371
        if ((self->private_impl.f_scan_comps_td[v_i] > 1u) || (self->private_impl.f_scan_comps_ta[v_i] > 1u)) {
55372
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55373
          goto exit;
55374
        }
55375
      }
55376
      v_i += 1u;
55377
    }
55378
    if (self->private_impl.f_scan_count == 0u) {
55379
      self->private_impl.f_expect_multiple_scans = ((self->private_impl.f_sof_marker >= 194u) || (self->private_impl.f_scan_num_components < self->private_impl.f_num_components));
55380
    }
55381
    if (self->private_impl.f_sof_marker < 194u) {
55382
      self->private_data.s_prepare_scan.scratch = 3u;
55383
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
55384
      if (self->private_data.s_prepare_scan.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
55385
        self->private_data.s_prepare_scan.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
55386
        iop_a_src = io2_a_src;
55387
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55388
        goto suspend;
55389
      }
55390
      iop_a_src += self->private_data.s_prepare_scan.scratch;
55391
      self->private_impl.f_scan_ss = 0u;
55392
      self->private_impl.f_scan_se = 63u;
55393
      self->private_impl.f_scan_ah = 0u;
55394
      self->private_impl.f_scan_al = 0u;
55395
    } else {
55396
      {
55397
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
55398
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55399
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55400
          goto suspend;
55401
        }
55402
        uint8_t t_3 = *iop_a_src++;
55403
        v_c8 = t_3;
55404
      }
55405
      if (v_c8 > 63u) {
55406
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55407
        goto exit;
55408
      }
55409
      self->private_impl.f_scan_ss = v_c8;
55410
      {
55411
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
55412
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55413
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55414
          goto suspend;
55415
        }
55416
        uint8_t t_4 = *iop_a_src++;
55417
        v_c8 = t_4;
55418
      }
55419
      if ((v_c8 > 63u) || (v_c8 < self->private_impl.f_scan_ss)) {
55420
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55421
        goto exit;
55422
      }
55423
      self->private_impl.f_scan_se = v_c8;
55424
      {
55425
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
55426
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
55427
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55428
          goto suspend;
55429
        }
55430
        uint8_t t_5 = *iop_a_src++;
55431
        v_c8 = t_5;
55432
      }
55433
      if ((((uint8_t)(v_c8 >> 4u)) > 14u) || (((uint8_t)(v_c8 & 15u)) > 13u)) {
55434
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55435
        goto exit;
55436
      }
55437
      self->private_impl.f_scan_ah = ((uint8_t)(v_c8 >> 4u));
55438
      self->private_impl.f_scan_al = ((uint8_t)(v_c8 & 15u));
55439
      if (self->private_impl.f_scan_ah > 0u) {
55440
        if (((uint8_t)(self->private_impl.f_scan_ah - 1u)) != self->private_impl.f_scan_al) {
55441
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55442
          goto exit;
55443
        }
55444
      }
55445
      if (self->private_impl.f_scan_ss == 0u) {
55446
        if (self->private_impl.f_scan_se != 0u) {
55447
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55448
          goto exit;
55449
        } else if (self->private_impl.f_scan_ah == 0u) {
55450
          self->private_impl.choosy_decode_mcu = (
55451
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits);
55452
        } else {
55453
          self->private_impl.choosy_decode_mcu = (
55454
              &wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit);
55455
        }
55456
      } else {
55457
        if (self->private_impl.f_scan_num_components != 1u) {
55458
          status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55459
          goto exit;
55460
        } else if (self->private_impl.f_scan_ah == 0u) {
55461
          self->private_impl.choosy_decode_mcu = (
55462
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits);
55463
        } else {
55464
          self->private_impl.choosy_decode_mcu = (
55465
              &wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit);
55466
        }
55467
      }
55468
    }
55469
    v_i = 0u;
55470
    while (v_i < self->private_impl.f_scan_num_components) {
55471
      if ((self->private_impl.f_scan_ss == 0u) &&  ! self->private_impl.f_seen_dht[((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i]))]) {
55472
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
55473
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_i])));
55474
        if (status.repr) {
55475
          goto suspend;
55476
        }
55477
      }
55478
      if ((self->private_impl.f_scan_se != 0u) &&  ! self->private_impl.f_seen_dht[((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i]))]) {
55479
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
55480
        status = wuffs_jpeg__decoder__use_default_huffman_table(self, ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_i])));
55481
        if (status.repr) {
55482
          goto suspend;
55483
        }
55484
      }
55485
      v_j = ((uint32_t)(self->private_impl.f_scan_ss));
55486
      v_j_max_incl = ((uint32_t)(wuffs_base__u8__min(self->private_impl.f_scan_se, 9u)));
55487
      while (v_j <= v_j_max_incl) {
55488
        self->private_impl.f_block_smoothing_lowest_scan_al[self->private_impl.f_scan_comps_cselector[v_i]][v_j] = self->private_impl.f_scan_al;
55489
        v_j += 1u;
55490
      }
55491
      v_i += 1u;
55492
    }
55493
    if (self->private_impl.f_scan_num_components == 1u) {
55494
      wuffs_jpeg__decoder__calculate_single_component_scan_fields(self);
55495
    } else {
55496
      v_failed = wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(self);
55497
      if (v_failed) {
55498
        status = wuffs_base__make_status(wuffs_jpeg__error__bad_sos_marker);
55499
        goto exit;
55500
      }
55501
    }
55502
55503
    goto ok;
55504
    ok:
55505
    self->private_impl.p_prepare_scan = 0;
55506
    goto exit;
55507
  }
55508
55509
  goto suspend;
55510
  suspend:
55511
  self->private_impl.p_prepare_scan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55512
  self->private_data.s_prepare_scan.v_i = v_i;
55513
55514
  goto exit;
55515
  exit:
55516
  if (a_src && a_src->data.ptr) {
55517
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55518
  }
55519
55520
  return status;
55521
}
55522
55523
// -------- func jpeg.decoder.use_default_huffman_table
55524
55525
WUFFS_BASE__GENERATED_C_CODE
55526
static wuffs_base__status
55527
wuffs_jpeg__decoder__use_default_huffman_table(
55528
    wuffs_jpeg__decoder* self,
55529
    uint8_t a_tc4_th) {
55530
  wuffs_base__status status = wuffs_base__make_status(NULL);
55531
55532
  wuffs_base__slice_u8 v_data = {0};
55533
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
55534
  wuffs_base__io_buffer* v_r = &u_r;
55535
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55536
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55537
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55538
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55539
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
55540
55541
  if (a_tc4_th == 0u) {
55542
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_LUMA), 29);
55543
  } else if (a_tc4_th == 1u) {
55544
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_DC_CHROMA), 29);
55545
  } else if (a_tc4_th == 4u) {
55546
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_LUMA), 179);
55547
  } else if (a_tc4_th == 5u) {
55548
    v_data = wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_JPEG__DEFAULT_HUFF_TABLE_AC_CHROMA), 179);
55549
  } else {
55550
    status = wuffs_base__make_status(wuffs_jpeg__error__missing_huffman_table);
55551
    goto exit;
55552
  }
55553
  {
55554
    wuffs_base__io_buffer* o_0_v_r = v_r;
55555
    const uint8_t* o_0_iop_v_r = iop_v_r;
55556
    const uint8_t* o_0_io0_v_r = io0_v_r;
55557
    const uint8_t* o_0_io1_v_r = io1_v_r;
55558
    const uint8_t* o_0_io2_v_r = io2_v_r;
55559
    v_r = wuffs_private_impl__io_reader__set(
55560
        &u_r,
55561
        &iop_v_r,
55562
        &io0_v_r,
55563
        &io1_v_r,
55564
        &io2_v_r,
55565
        v_data,
55566
        0u);
55567
    self->private_impl.f_payload_length = ((uint32_t)((((uint64_t)(v_data.len)) & 65535u)));
55568
    {
55569
      wuffs_base__status t_0 = wuffs_jpeg__decoder__decode_dht(self, v_r);
55570
      v_status = t_0;
55571
    }
55572
    v_r = o_0_v_r;
55573
    iop_v_r = o_0_iop_v_r;
55574
    io0_v_r = o_0_io0_v_r;
55575
    io1_v_r = o_0_io1_v_r;
55576
    io2_v_r = o_0_io2_v_r;
55577
  }
55578
  status = v_status;
55579
  if (wuffs_base__status__is_error(&status)) {
55580
    goto exit;
55581
  } else if (wuffs_base__status__is_suspension(&status)) {
55582
    status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
55583
    goto exit;
55584
  }
55585
  goto ok;
55586
55587
  ok:
55588
  goto exit;
55589
  exit:
55590
  return status;
55591
}
55592
55593
// -------- func jpeg.decoder.calculate_single_component_scan_fields
55594
55595
WUFFS_BASE__GENERATED_C_CODE
55596
static wuffs_base__empty_struct
55597
wuffs_jpeg__decoder__calculate_single_component_scan_fields(
55598
    wuffs_jpeg__decoder* self) {
55599
  uint8_t v_csel = 0;
55600
55601
  self->private_impl.f_scan_comps_bx_offset[0u] = 0u;
55602
  self->private_impl.f_scan_comps_by_offset[0u] = 0u;
55603
  self->private_impl.f_mcu_num_blocks = 1u;
55604
  self->private_impl.f_mcu_blocks_sselector[0u] = 0u;
55605
  v_csel = self->private_impl.f_scan_comps_cselector[0u];
55606
  self->private_impl.f_mcu_blocks_offset[0u] = self->private_impl.f_components_workbuf_offsets[v_csel];
55607
  self->private_impl.f_mcu_blocks_mx_mul[0u] = 8u;
55608
  self->private_impl.f_mcu_blocks_my_mul[0u] = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
55609
  self->private_impl.f_mcu_blocks_dc_hselector[0u] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[0u]));
55610
  self->private_impl.f_mcu_blocks_ac_hselector[0u] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[0u]));
55611
  self->private_impl.f_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h);
55612
  self->private_impl.f_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v);
55613
  return wuffs_base__make_empty_struct();
55614
}
55615
55616
// -------- func jpeg.decoder.calculate_multiple_component_scan_fields
55617
55618
WUFFS_BASE__GENERATED_C_CODE
55619
static bool
55620
wuffs_jpeg__decoder__calculate_multiple_component_scan_fields(
55621
    wuffs_jpeg__decoder* self) {
55622
  uint32_t v_i = 0;
55623
  uint32_t v_h = 0;
55624
  uint32_t v_v = 0;
55625
  uint32_t v_hv = 0;
55626
  uint32_t v_total_hv = 0;
55627
  uint32_t v_b = 0;
55628
  uint32_t v_bx_offset = 0;
55629
  uint32_t v_by_offset = 0;
55630
  uint32_t v_sibo = 0;
55631
  uint8_t v_ssel = 0;
55632
  uint8_t v_csel = 0;
55633
55634
  v_total_hv = 0u;
55635
  v_i = 0u;
55636
  v_b = 0u;
55637
  v_bx_offset = 0u;
55638
  v_by_offset = 0u;
55639
  while (v_i < self->private_impl.f_scan_num_components) {
55640
    v_h = ((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]]));
55641
    v_v = ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]]));
55642
    v_hv = (((uint32_t)(self->private_impl.f_components_h[self->private_impl.f_scan_comps_cselector[v_i]])) * ((uint32_t)(self->private_impl.f_components_v[self->private_impl.f_scan_comps_cselector[v_i]])));
55643
    self->private_impl.f_swizzle_immediately_c_offsets[v_i] = ((uint32_t)(64u * v_total_hv));
55644
    v_total_hv += v_hv;
55645
    while (v_hv > 0u) {
55646
      self->private_impl.f_scan_comps_bx_offset[(v_b & 15u)] = ((uint8_t)((v_bx_offset & 3u)));
55647
      self->private_impl.f_scan_comps_by_offset[(v_b & 15u)] = ((uint8_t)((v_by_offset & 3u)));
55648
      self->private_impl.f_mcu_blocks_sselector[(v_b & 15u)] = ((uint8_t)(v_i));
55649
      v_b += 1u;
55650
      v_bx_offset += 1u;
55651
      if (v_bx_offset == v_h) {
55652
        v_bx_offset = 0u;
55653
        v_by_offset += 1u;
55654
        if (v_by_offset == v_v) {
55655
          v_by_offset = 0u;
55656
        }
55657
      }
55658
      v_hv -= 1u;
55659
    }
55660
    v_i += 1u;
55661
  }
55662
  if (v_total_hv > 10u) {
55663
    return true;
55664
  }
55665
  self->private_impl.f_mcu_num_blocks = v_total_hv;
55666
  self->private_impl.f_swizzle_immediately_c_offsets[self->private_impl.f_scan_num_components] = ((uint32_t)(64u * v_total_hv));
55667
  v_b = 0u;
55668
  while (v_b < self->private_impl.f_mcu_num_blocks) {
55669
    v_ssel = self->private_impl.f_mcu_blocks_sselector[v_b];
55670
    v_csel = self->private_impl.f_scan_comps_cselector[v_ssel];
55671
    self->private_impl.f_mcu_blocks_offset[v_b] = (self->private_impl.f_components_workbuf_offsets[v_csel] + (8u * ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (8u * ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]))));
55672
    self->private_impl.f_mcu_blocks_mx_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_h[v_csel])));
55673
    self->private_impl.f_mcu_blocks_my_mul[v_b] = (8u * ((uint32_t)(self->private_impl.f_components_v[v_csel])) * self->private_impl.f_components_workbuf_widths[v_csel]);
55674
    self->private_impl.f_mcu_blocks_dc_hselector[v_b] = ((uint8_t)(0u | self->private_impl.f_scan_comps_td[v_ssel]));
55675
    self->private_impl.f_mcu_blocks_ac_hselector[v_b] = ((uint8_t)(4u | self->private_impl.f_scan_comps_ta[v_ssel]));
55676
    v_sibo = ((uint32_t)(self->private_impl.f_swizzle_immediately_c_offsets[v_csel] + ((8u * ((uint32_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) + (64u * ((uint32_t)(self->private_impl.f_scan_comps_by_offset[v_b])) * ((uint32_t)(self->private_impl.f_components_h[v_csel]))))));
55677
    self->private_impl.f_swizzle_immediately_b_offsets[v_b] = wuffs_base__u32__min(v_sibo, 576u);
55678
    v_b += 1u;
55679
  }
55680
  self->private_impl.f_scan_width_in_mcus = self->private_impl.f_width_in_mcus;
55681
  self->private_impl.f_scan_height_in_mcus = self->private_impl.f_height_in_mcus;
55682
  return false;
55683
}
55684
55685
// -------- func jpeg.decoder.fill_bitstream
55686
55687
WUFFS_BASE__GENERATED_C_CODE
55688
static wuffs_base__empty_struct
55689
wuffs_jpeg__decoder__fill_bitstream(
55690
    wuffs_jpeg__decoder* self,
55691
    wuffs_base__io_buffer* a_src) {
55692
  uint32_t v_wi = 0;
55693
  uint8_t v_c8 = 0;
55694
  uint32_t v_new_wi = 0;
55695
55696
  const uint8_t* iop_a_src = NULL;
55697
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55698
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55699
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55700
  if (a_src && a_src->data.ptr) {
55701
    io0_a_src = a_src->data.ptr;
55702
    io1_a_src = io0_a_src + a_src->meta.ri;
55703
    iop_a_src = io1_a_src;
55704
    io2_a_src = io0_a_src + a_src->meta.wi;
55705
  }
55706
55707
  if (self->private_impl.f_bitstream_ri <= 0u) {
55708
  } else if (self->private_impl.f_bitstream_ri >= self->private_impl.f_bitstream_wi) {
55709
    self->private_impl.f_bitstream_ri = 0u;
55710
    self->private_impl.f_bitstream_wi = 0u;
55711
  } else {
55712
    v_wi = (self->private_impl.f_bitstream_wi - self->private_impl.f_bitstream_ri);
55713
    wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__make_slice_u8(self->private_data.f_bitstream_buffer, 2048), wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
55714
        self->private_impl.f_bitstream_ri,
55715
        self->private_impl.f_bitstream_wi));
55716
    self->private_impl.f_bitstream_ri = 0u;
55717
    self->private_impl.f_bitstream_wi = v_wi;
55718
  }
55719
  v_wi = self->private_impl.f_bitstream_wi;
55720
  while ((v_wi < 2048u) && (((uint64_t)(io2_a_src - iop_a_src)) > 0u)) {
55721
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
55722
    if (v_c8 < 255u) {
55723
      self->private_data.f_bitstream_buffer[v_wi] = v_c8;
55724
      v_wi += 1u;
55725
      iop_a_src += 1u;
55726
      continue;
55727
    } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
55728
      break;
55729
    }
55730
    v_c8 = iop_a_src[1u];
55731
    if (v_c8 == 0u) {
55732
      self->private_data.f_bitstream_buffer[v_wi] = 255u;
55733
      v_wi += 1u;
55734
      iop_a_src += 2u;
55735
      continue;
55736
    } else if (v_c8 < 255u) {
55737
      break;
55738
    }
55739
    iop_a_src += 1u;
55740
  }
55741
  if (((uint64_t)(io2_a_src - iop_a_src)) > 1u) {
55742
    if ((wuffs_base__peek_u8be__no_bounds_check(iop_a_src) >= 255u) && (((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u)) > 0u)) {
55743
      v_new_wi = (wuffs_base__u32__min(v_wi, 1784u) + 264u);
55744
      v_new_wi = wuffs_base__u32__min(v_new_wi, (v_wi + self->private_impl.f_bitstream_padding));
55745
      if (v_wi < v_new_wi) {
55746
        wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_bitstream_padding, (v_new_wi - v_wi));
55747
        wuffs_private_impl__bulk_memset(&self->private_data.f_bitstream_buffer[v_wi], (v_new_wi - v_wi), 0u);
55748
        v_wi = v_new_wi;
55749
      }
55750
    }
55751
  }
55752
  self->private_impl.f_bitstream_wi = v_wi;
55753
  if (a_src && a_src->data.ptr) {
55754
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55755
  }
55756
55757
  return wuffs_base__make_empty_struct();
55758
}
55759
55760
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component
55761
55762
WUFFS_BASE__GENERATED_C_CODE
55763
static wuffs_base__empty_struct
55764
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(
55765
    wuffs_jpeg__decoder* self,
55766
    uint32_t a_mx,
55767
    uint32_t a_my,
55768
    wuffs_base__slice_u8 a_workbuf,
55769
    uint32_t a_csel) {
55770
  return (*self->private_impl.choosy_load_mcu_blocks_for_single_component)(self, a_mx, a_my, a_workbuf, a_csel);
55771
}
55772
55773
WUFFS_BASE__GENERATED_C_CODE
55774
static wuffs_base__empty_struct
55775
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default(
55776
    wuffs_jpeg__decoder* self,
55777
    uint32_t a_mx,
55778
    uint32_t a_my,
55779
    wuffs_base__slice_u8 a_workbuf,
55780
    uint32_t a_csel) {
55781
  uint64_t v_stride16 = 0;
55782
  uint64_t v_offset = 0;
55783
55784
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
55785
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
55786
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
55787
    wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset));
55788
  }
55789
  return wuffs_base__make_empty_struct();
55790
}
55791
55792
// -------- func jpeg.decoder.load_mcu_blocks
55793
55794
WUFFS_BASE__GENERATED_C_CODE
55795
static wuffs_base__empty_struct
55796
wuffs_jpeg__decoder__load_mcu_blocks(
55797
    wuffs_jpeg__decoder* self,
55798
    uint32_t a_mx,
55799
    uint32_t a_my,
55800
    wuffs_base__slice_u8 a_workbuf) {
55801
  uint32_t v_b = 0;
55802
  uint8_t v_csel = 0;
55803
  uint64_t v_h = 0;
55804
  uint64_t v_v = 0;
55805
  uint64_t v_stride16 = 0;
55806
  uint64_t v_offset = 0;
55807
55808
  v_h = 1u;
55809
  v_v = 1u;
55810
  v_b = 0u;
55811
  while (v_b < self->private_impl.f_mcu_num_blocks) {
55812
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
55813
    if (self->private_impl.f_scan_num_components > 1u) {
55814
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
55815
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
55816
    }
55817
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
55818
    v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16));
55819
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
55820
      wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset));
55821
    }
55822
    v_b += 1u;
55823
  }
55824
  return wuffs_base__make_empty_struct();
55825
}
55826
55827
// -------- func jpeg.decoder.save_mcu_blocks
55828
55829
WUFFS_BASE__GENERATED_C_CODE
55830
static wuffs_base__empty_struct
55831
wuffs_jpeg__decoder__save_mcu_blocks(
55832
    wuffs_jpeg__decoder* self,
55833
    uint32_t a_mx,
55834
    uint32_t a_my,
55835
    wuffs_base__slice_u8 a_workbuf) {
55836
  uint32_t v_b = 0;
55837
  uint8_t v_csel = 0;
55838
  uint64_t v_h = 0;
55839
  uint64_t v_v = 0;
55840
  uint64_t v_stride16 = 0;
55841
  uint64_t v_offset = 0;
55842
55843
  v_h = 1u;
55844
  v_v = 1u;
55845
  v_b = 0u;
55846
  while (v_b < self->private_impl.f_mcu_num_blocks) {
55847
    v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_b]];
55848
    if (self->private_impl.f_scan_num_components > 1u) {
55849
      v_h = ((uint64_t)(self->private_impl.f_components_h[v_csel]));
55850
      v_v = ((uint64_t)(self->private_impl.f_components_v[v_csel]));
55851
    }
55852
    v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[v_csel] * 16u)));
55853
    v_offset = (self->private_impl.f_components_workbuf_offsets[((uint8_t)(v_csel | 4u))] + (((v_h * ((uint64_t)(a_mx))) + ((uint64_t)(self->private_impl.f_scan_comps_bx_offset[v_b]))) * 128u) + (((v_v * ((uint64_t)(a_my))) + ((uint64_t)(self->private_impl.f_scan_comps_by_offset[v_b]))) * v_stride16));
55854
    if (v_offset <= ((uint64_t)(a_workbuf.len))) {
55855
      wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[v_b], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset));
55856
    }
55857
    v_b += 1u;
55858
  }
55859
  return wuffs_base__make_empty_struct();
55860
}
55861
55862
// -------- func jpeg.decoder.skip_past_the_next_restart_marker
55863
55864
WUFFS_BASE__GENERATED_C_CODE
55865
static wuffs_base__status
55866
wuffs_jpeg__decoder__skip_past_the_next_restart_marker(
55867
    wuffs_jpeg__decoder* self,
55868
    wuffs_base__io_buffer* a_src) {
55869
  wuffs_base__status status = wuffs_base__make_status(NULL);
55870
55871
  uint8_t v_c8 = 0;
55872
55873
  const uint8_t* iop_a_src = NULL;
55874
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55875
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55876
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
55877
  if (a_src && a_src->data.ptr) {
55878
    io0_a_src = a_src->data.ptr;
55879
    io1_a_src = io0_a_src + a_src->meta.ri;
55880
    iop_a_src = io1_a_src;
55881
    io2_a_src = io0_a_src + a_src->meta.wi;
55882
  }
55883
55884
  uint32_t coro_susp_point = self->private_impl.p_skip_past_the_next_restart_marker;
55885
  switch (coro_susp_point) {
55886
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
55887
55888
    while (true) {
55889
      if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
55890
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
55891
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
55892
        continue;
55893
      } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) < 255u) {
55894
        iop_a_src += 1u;
55895
        continue;
55896
      }
55897
      v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
55898
      if (v_c8 < 192u) {
55899
        iop_a_src += 2u;
55900
        continue;
55901
      } else if ((v_c8 < 208u) || (215u < v_c8)) {
55902
        break;
55903
      }
55904
      v_c8 &= 7u;
55905
      if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 1u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 2u)) & 7u)))) {
55906
        break;
55907
      } else if ((self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 7u)) & 7u))) || (self->private_impl.f_next_restart_marker == ((uint8_t)(((uint8_t)(v_c8 + 6u)) & 7u)))) {
55908
        iop_a_src += 2u;
55909
        continue;
55910
      } else {
55911
        iop_a_src += 2u;
55912
        break;
55913
      }
55914
    }
55915
    self->private_impl.f_next_restart_marker = ((uint8_t)(((uint8_t)(self->private_impl.f_next_restart_marker + 1u)) & 7u));
55916
55917
    ok:
55918
    self->private_impl.p_skip_past_the_next_restart_marker = 0;
55919
    goto exit;
55920
  }
55921
55922
  goto suspend;
55923
  suspend:
55924
  self->private_impl.p_skip_past_the_next_restart_marker = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
55925
55926
  goto exit;
55927
  exit:
55928
  if (a_src && a_src->data.ptr) {
55929
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
55930
  }
55931
55932
  return status;
55933
}
55934
55935
// -------- func jpeg.decoder.apply_progressive_idct
55936
55937
WUFFS_BASE__GENERATED_C_CODE
55938
static wuffs_base__empty_struct
55939
wuffs_jpeg__decoder__apply_progressive_idct(
55940
    wuffs_jpeg__decoder* self,
55941
    wuffs_base__slice_u8 a_workbuf) {
55942
  uint32_t v_csel = 0;
55943
  bool v_block_smoothing_applicable = false;
55944
  uint32_t v_scan_width_in_mcus = 0;
55945
  uint32_t v_scan_height_in_mcus = 0;
55946
  uint32_t v_mcu_blocks_mx_mul_0 = 0;
55947
  uint32_t v_mcu_blocks_my_mul_0 = 0;
55948
  uint32_t v_my = 0;
55949
  uint32_t v_mx = 0;
55950
  uint64_t v_stride = 0;
55951
  uint64_t v_offset = 0;
55952
  uint8_t v_stashed_mcu_blocks_0[128] = {0};
55953
55954
  wuffs_private_impl__bulk_save_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128));
55955
  v_block_smoothing_applicable = true;
55956
  v_csel = 0u;
55957
  while (v_csel < self->private_impl.f_num_components) {
55958
    if ((self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][0u] >= 16u) || wuffs_jpeg__decoder__top_left_quants_has_zero(self, ((uint32_t)(self->private_impl.f_components_tq[v_csel])))) {
55959
      v_block_smoothing_applicable = false;
55960
    }
55961
    v_csel += 1u;
55962
  }
55963
  v_csel = 0u;
55964
  while (v_csel < self->private_impl.f_num_components) {
55965
    v_scan_width_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_width, self->private_impl.f_components_h[v_csel], self->private_impl.f_max_incl_components_h);
55966
    v_scan_height_in_mcus = wuffs_jpeg__decoder__quantize_dimension(self, self->private_impl.f_height, self->private_impl.f_components_v[v_csel], self->private_impl.f_max_incl_components_v);
55967
    v_mcu_blocks_mx_mul_0 = 8u;
55968
    v_mcu_blocks_my_mul_0 = (8u * self->private_impl.f_components_workbuf_widths[v_csel]);
55969
    if (v_block_smoothing_applicable && (0u != (self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][1u] |
55970
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][2u] |
55971
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][3u] |
55972
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][4u] |
55973
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][5u] |
55974
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][6u] |
55975
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
55976
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][8u] |
55977
        self->private_impl.f_block_smoothing_lowest_scan_al[v_csel][9u]))) {
55978
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
55979
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth);
55980
      self->private_impl.f_block_smoothing_mx_max_incl = wuffs_base__u32__sat_sub(v_scan_width_in_mcus, 1u);
55981
      self->private_impl.f_block_smoothing_my_max_incl = wuffs_base__u32__sat_sub(v_scan_height_in_mcus, 1u);
55982
    } else {
55983
      self->private_impl.choosy_load_mcu_blocks_for_single_component = (
55984
          &wuffs_jpeg__decoder__load_mcu_blocks_for_single_component__choosy_default);
55985
    }
55986
    v_my = 0u;
55987
    while (v_my < v_scan_height_in_mcus) {
55988
      v_mx = 0u;
55989
      while (v_mx < v_scan_width_in_mcus) {
55990
        wuffs_jpeg__decoder__load_mcu_blocks_for_single_component(self,
55991
            v_mx,
55992
            v_my,
55993
            a_workbuf,
55994
            v_csel);
55995
        v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
55996
        v_offset = (self->private_impl.f_components_workbuf_offsets[v_csel] + (((uint64_t)(v_mcu_blocks_mx_mul_0)) * ((uint64_t)(v_mx))) + (((uint64_t)(v_mcu_blocks_my_mul_0)) * ((uint64_t)(v_my))));
55997
        if (v_offset <= ((uint64_t)(a_workbuf.len))) {
55998
          wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel])));
55999
        }
56000
        v_mx += 1u;
56001
      }
56002
      v_my += 1u;
56003
    }
56004
    v_csel += 1u;
56005
  }
56006
  wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__make_slice_u8(v_stashed_mcu_blocks_0, 128));
56007
  return wuffs_base__make_empty_struct();
56008
}
56009
56010
// -------- func jpeg.decoder.swizzle_gray
56011
56012
WUFFS_BASE__GENERATED_C_CODE
56013
static wuffs_base__status
56014
wuffs_jpeg__decoder__swizzle_gray(
56015
    wuffs_jpeg__decoder* self,
56016
    wuffs_base__pixel_buffer* a_dst,
56017
    wuffs_base__slice_u8 a_workbuf,
56018
    uint32_t a_x0,
56019
    uint32_t a_x1,
56020
    uint32_t a_y0,
56021
    uint32_t a_y1,
56022
    uint64_t a_stride) {
56023
  wuffs_base__pixel_format v_dst_pixfmt = {0};
56024
  uint32_t v_dst_bits_per_pixel = 0;
56025
  uint32_t v_dst_bytes_per_pixel = 0;
56026
  uint64_t v_x0 = 0;
56027
  uint64_t v_x1 = 0;
56028
  wuffs_base__table_u8 v_tab = {0};
56029
  wuffs_base__slice_u8 v_dst = {0};
56030
  uint32_t v_y = 0;
56031
  uint32_t v_y1 = 0;
56032
56033
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
56034
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
56035
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
56036
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
56037
  }
56038
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
56039
  v_x0 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x0, self->private_impl.f_width))));
56040
  v_x1 = ((uint64_t)((v_dst_bytes_per_pixel * wuffs_base__u32__min(a_x1, self->private_impl.f_width))));
56041
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
56042
  v_y = a_y0;
56043
  v_y1 = wuffs_base__u32__min(a_y1, self->private_impl.f_height);
56044
  while (v_y < v_y1) {
56045
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
56046
    if (v_x1 < ((uint64_t)(v_dst.len))) {
56047
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_x1);
56048
    }
56049
    if (v_x0 < ((uint64_t)(v_dst.len))) {
56050
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_x0);
56051
    } else {
56052
      v_dst = wuffs_base__utility__empty_slice_u8();
56053
    }
56054
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)), a_workbuf);
56055
    if (a_stride <= ((uint64_t)(a_workbuf.len))) {
56056
      a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, a_stride);
56057
    } else {
56058
      a_workbuf = wuffs_base__utility__empty_slice_u8();
56059
    }
56060
    v_y += 1u;
56061
  }
56062
  return wuffs_base__make_status(NULL);
56063
}
56064
56065
// -------- func jpeg.decoder.swizzle_colorful
56066
56067
WUFFS_BASE__GENERATED_C_CODE
56068
static wuffs_base__status
56069
wuffs_jpeg__decoder__swizzle_colorful(
56070
    wuffs_jpeg__decoder* self,
56071
    wuffs_base__pixel_buffer* a_dst,
56072
    wuffs_base__slice_u8 a_workbuf,
56073
    uint32_t a_x0,
56074
    uint32_t a_x1,
56075
    uint32_t a_y0,
56076
    uint32_t a_y1) {
56077
  uint64_t v_i = 0;
56078
  uint64_t v_j = 0;
56079
  wuffs_base__slice_u8 v_src0 = {0};
56080
  wuffs_base__slice_u8 v_src1 = {0};
56081
  wuffs_base__slice_u8 v_src2 = {0};
56082
  wuffs_base__slice_u8 v_src3 = {0};
56083
  uint32_t v_width0 = 0;
56084
  uint32_t v_width1 = 0;
56085
  uint32_t v_width2 = 0;
56086
  uint32_t v_width3 = 0;
56087
  uint32_t v_height0 = 0;
56088
  uint32_t v_height1 = 0;
56089
  uint32_t v_height2 = 0;
56090
  uint32_t v_height3 = 0;
56091
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
56092
56093
  if (self->private_impl.f_swizzle_immediately) {
56094
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[0u]));
56095
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
56096
    if ((v_i <= v_j) && (v_j <= 640u)) {
56097
      v_src0 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56098
      v_width0 = (8u * ((uint32_t)(self->private_impl.f_components_h[0u])));
56099
      v_height0 = (8u * ((uint32_t)(self->private_impl.f_components_v[0u])));
56100
    }
56101
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[1u]));
56102
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
56103
    if ((v_i <= v_j) && (v_j <= 640u)) {
56104
      v_src1 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56105
      v_width1 = (8u * ((uint32_t)(self->private_impl.f_components_h[1u])));
56106
      v_height1 = (8u * ((uint32_t)(self->private_impl.f_components_v[1u])));
56107
    }
56108
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[2u]));
56109
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
56110
    if ((v_i <= v_j) && (v_j <= 640u)) {
56111
      v_src2 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56112
      v_width2 = (8u * ((uint32_t)(self->private_impl.f_components_h[2u])));
56113
      v_height2 = (8u * ((uint32_t)(self->private_impl.f_components_v[2u])));
56114
    }
56115
    v_i = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[3u]));
56116
    v_j = ((uint64_t)(self->private_impl.f_swizzle_immediately_c_offsets[4u]));
56117
    if ((v_i <= v_j) && (v_j <= 640u)) {
56118
      v_src3 = wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, v_i, v_j);
56119
      v_width3 = (8u * ((uint32_t)(self->private_impl.f_components_h[3u])));
56120
      v_height3 = (8u * ((uint32_t)(self->private_impl.f_components_v[3u])));
56121
    }
56122
  } else {
56123
    if ((self->private_impl.f_components_workbuf_offsets[0u] <= self->private_impl.f_components_workbuf_offsets[1u]) && (self->private_impl.f_components_workbuf_offsets[1u] <= ((uint64_t)(a_workbuf.len)))) {
56124
      v_src0 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
56125
          self->private_impl.f_components_workbuf_offsets[0u],
56126
          self->private_impl.f_components_workbuf_offsets[1u]);
56127
      v_width0 = self->private_impl.f_components_workbuf_widths[0u];
56128
      v_height0 = self->private_impl.f_components_workbuf_heights[0u];
56129
    }
56130
    if ((self->private_impl.f_components_workbuf_offsets[1u] <= self->private_impl.f_components_workbuf_offsets[2u]) && (self->private_impl.f_components_workbuf_offsets[2u] <= ((uint64_t)(a_workbuf.len)))) {
56131
      v_src1 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
56132
          self->private_impl.f_components_workbuf_offsets[1u],
56133
          self->private_impl.f_components_workbuf_offsets[2u]);
56134
      v_width1 = self->private_impl.f_components_workbuf_widths[1u];
56135
      v_height1 = self->private_impl.f_components_workbuf_heights[1u];
56136
    }
56137
    if ((self->private_impl.f_components_workbuf_offsets[2u] <= self->private_impl.f_components_workbuf_offsets[3u]) && (self->private_impl.f_components_workbuf_offsets[3u] <= ((uint64_t)(a_workbuf.len)))) {
56138
      v_src2 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
56139
          self->private_impl.f_components_workbuf_offsets[2u],
56140
          self->private_impl.f_components_workbuf_offsets[3u]);
56141
      v_width2 = self->private_impl.f_components_workbuf_widths[2u];
56142
      v_height2 = self->private_impl.f_components_workbuf_heights[2u];
56143
    }
56144
    if ((self->private_impl.f_components_workbuf_offsets[3u] <= self->private_impl.f_components_workbuf_offsets[4u]) && (self->private_impl.f_components_workbuf_offsets[4u] <= ((uint64_t)(a_workbuf.len)))) {
56145
      v_src3 = wuffs_base__slice_u8__subslice_ij(a_workbuf,
56146
          self->private_impl.f_components_workbuf_offsets[3u],
56147
          self->private_impl.f_components_workbuf_offsets[4u]);
56148
      v_width3 = self->private_impl.f_components_workbuf_widths[3u];
56149
      v_height3 = self->private_impl.f_components_workbuf_heights[3u];
56150
    }
56151
  }
56152
  v_status = wuffs_base__pixel_swizzler__swizzle_ycck(&self->private_impl.f_swizzler,
56153
      a_dst,
56154
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
56155
      (a_x0 & 65535u),
56156
      wuffs_base__u32__min(a_x1, self->private_impl.f_width),
56157
      (a_y0 & 65535u),
56158
      wuffs_base__u32__min(a_y1, self->private_impl.f_height),
56159
      v_src0,
56160
      v_src1,
56161
      v_src2,
56162
      v_src3,
56163
      v_width0,
56164
      v_width1,
56165
      v_width2,
56166
      v_width3,
56167
      v_height0,
56168
      v_height1,
56169
      v_height2,
56170
      v_height3,
56171
      v_width0,
56172
      v_width1,
56173
      v_width2,
56174
      v_width3,
56175
      self->private_impl.f_components_h[0u],
56176
      self->private_impl.f_components_h[1u],
56177
      self->private_impl.f_components_h[2u],
56178
      self->private_impl.f_components_h[3u],
56179
      self->private_impl.f_components_v[0u],
56180
      self->private_impl.f_components_v[1u],
56181
      self->private_impl.f_components_v[2u],
56182
      self->private_impl.f_components_v[3u],
56183
      self->private_impl.f_is_rgb_or_cmyk,
56184
      ! self->private_impl.f_use_lower_quality,
56185
      wuffs_base__make_slice_u8(self->private_data.f_swizzle_ycck_scratch_buffer_2k, 2048));
56186
  return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
56187
}
56188
56189
// -------- func jpeg.decoder.frame_dirty_rect
56190
56191
WUFFS_BASE__GENERATED_C_CODE
56192
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
56193
wuffs_jpeg__decoder__frame_dirty_rect(
56194
    const wuffs_jpeg__decoder* self) {
56195
  if (!self) {
56196
    return wuffs_base__utility__empty_rect_ie_u32();
56197
  }
56198
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
56199
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
56200
    return wuffs_base__utility__empty_rect_ie_u32();
56201
  }
56202
56203
  return wuffs_base__utility__make_rect_ie_u32(
56204
      0u,
56205
      0u,
56206
      self->private_impl.f_width,
56207
      self->private_impl.f_height);
56208
}
56209
56210
// -------- func jpeg.decoder.num_animation_loops
56211
56212
WUFFS_BASE__GENERATED_C_CODE
56213
WUFFS_BASE__MAYBE_STATIC uint32_t
56214
wuffs_jpeg__decoder__num_animation_loops(
56215
    const wuffs_jpeg__decoder* self) {
56216
  if (!self) {
56217
    return 0;
56218
  }
56219
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
56220
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
56221
    return 0;
56222
  }
56223
56224
  return 0u;
56225
}
56226
56227
// -------- func jpeg.decoder.num_decoded_frame_configs
56228
56229
WUFFS_BASE__GENERATED_C_CODE
56230
WUFFS_BASE__MAYBE_STATIC uint64_t
56231
wuffs_jpeg__decoder__num_decoded_frame_configs(
56232
    const wuffs_jpeg__decoder* self) {
56233
  if (!self) {
56234
    return 0;
56235
  }
56236
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
56237
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
56238
    return 0;
56239
  }
56240
56241
  if (self->private_impl.f_call_sequence > 32u) {
56242
    return 1u;
56243
  }
56244
  return 0u;
56245
}
56246
56247
// -------- func jpeg.decoder.num_decoded_frames
56248
56249
WUFFS_BASE__GENERATED_C_CODE
56250
WUFFS_BASE__MAYBE_STATIC uint64_t
56251
wuffs_jpeg__decoder__num_decoded_frames(
56252
    const wuffs_jpeg__decoder* self) {
56253
  if (!self) {
56254
    return 0;
56255
  }
56256
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
56257
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
56258
    return 0;
56259
  }
56260
56261
  if (self->private_impl.f_call_sequence > 64u) {
56262
    return 1u;
56263
  }
56264
  return 0u;
56265
}
56266
56267
// -------- func jpeg.decoder.restart_frame
56268
56269
WUFFS_BASE__GENERATED_C_CODE
56270
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
56271
wuffs_jpeg__decoder__restart_frame(
56272
    wuffs_jpeg__decoder* self,
56273
    uint64_t a_index,
56274
    uint64_t a_io_position) {
56275
  if (!self) {
56276
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
56277
  }
56278
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
56279
    return wuffs_base__make_status(
56280
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
56281
        ? wuffs_base__error__disabled_by_previous_error
56282
        : wuffs_base__error__initialize_not_called);
56283
  }
56284
56285
  uint32_t v_i = 0;
56286
  uint32_t v_j = 0;
56287
56288
  if (self->private_impl.f_call_sequence < 32u) {
56289
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
56290
  }
56291
  if (a_index != 0u) {
56292
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
56293
  }
56294
  self->private_impl.f_call_sequence = 40u;
56295
  self->private_impl.f_bitstream_is_closed = false;
56296
  self->private_impl.f_expect_multiple_scans = false;
56297
  self->private_impl.f_frame_config_io_position = a_io_position;
56298
  self->private_impl.f_scan_count = 0u;
56299
  self->private_impl.f_restart_interval = self->private_impl.f_saved_restart_interval;
56300
  v_i = 0u;
56301
  while (v_i < 4u) {
56302
    self->private_impl.f_seen_dqt[v_i] = self->private_impl.f_saved_seen_dqt[v_i];
56303
    v_j = 0u;
56304
    while (v_j < 64u) {
56305
      self->private_impl.f_quant_tables[v_i][v_j] = self->private_impl.f_saved_quant_tables[v_i][v_j];
56306
      v_j += 1u;
56307
    }
56308
    v_i += 1u;
56309
  }
56310
  v_i = 0u;
56311
  while (v_i < 4u) {
56312
    v_j = 0u;
56313
    while (v_j < 10u) {
56314
      self->private_impl.f_block_smoothing_lowest_scan_al[v_i][v_j] = 16u;
56315
      v_j += 1u;
56316
    }
56317
    v_i += 1u;
56318
  }
56319
  v_i = 0u;
56320
  while (v_i < 8u) {
56321
    self->private_impl.f_seen_dht[v_i] = false;
56322
    v_i += 1u;
56323
  }
56324
  return wuffs_base__make_status(NULL);
56325
}
56326
56327
// -------- func jpeg.decoder.set_report_metadata
56328
56329
WUFFS_BASE__GENERATED_C_CODE
56330
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
56331
wuffs_jpeg__decoder__set_report_metadata(
56332
    wuffs_jpeg__decoder* self,
56333
    uint32_t a_fourcc,
56334
    bool a_report) {
56335
  return wuffs_base__make_empty_struct();
56336
}
56337
56338
// -------- func jpeg.decoder.tell_me_more
56339
56340
WUFFS_BASE__GENERATED_C_CODE
56341
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
56342
wuffs_jpeg__decoder__tell_me_more(
56343
    wuffs_jpeg__decoder* self,
56344
    wuffs_base__io_buffer* a_dst,
56345
    wuffs_base__more_information* a_minfo,
56346
    wuffs_base__io_buffer* a_src) {
56347
  if (!self) {
56348
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
56349
  }
56350
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
56351
    return wuffs_base__make_status(
56352
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
56353
        ? wuffs_base__error__disabled_by_previous_error
56354
        : wuffs_base__error__initialize_not_called);
56355
  }
56356
  if (!a_dst || !a_src) {
56357
    self->private_impl.magic = WUFFS_BASE__DISABLED;
56358
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
56359
  }
56360
  if ((self->private_impl.active_coroutine != 0) &&
56361
      (self->private_impl.active_coroutine != 4)) {
56362
    self->private_impl.magic = WUFFS_BASE__DISABLED;
56363
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
56364
  }
56365
  self->private_impl.active_coroutine = 0;
56366
  wuffs_base__status status = wuffs_base__make_status(NULL);
56367
56368
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
56369
  goto exit;
56370
56371
  goto ok;
56372
  ok:
56373
  goto exit;
56374
  exit:
56375
  if (wuffs_base__status__is_error(&status)) {
56376
    self->private_impl.magic = WUFFS_BASE__DISABLED;
56377
  }
56378
  return status;
56379
}
56380
56381
// -------- func jpeg.decoder.workbuf_len
56382
56383
WUFFS_BASE__GENERATED_C_CODE
56384
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
56385
wuffs_jpeg__decoder__workbuf_len(
56386
    const wuffs_jpeg__decoder* self) {
56387
  if (!self) {
56388
    return wuffs_base__utility__empty_range_ii_u64();
56389
  }
56390
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
56391
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
56392
    return wuffs_base__utility__empty_range_ii_u64();
56393
  }
56394
56395
  if (self->private_impl.f_use_lower_quality && (self->private_impl.f_sof_marker < 194u)) {
56396
    return wuffs_base__utility__make_range_ii_u64(0u, self->private_impl.f_components_workbuf_offsets[8u]);
56397
  }
56398
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_components_workbuf_offsets[8u], self->private_impl.f_components_workbuf_offsets[8u]);
56399
}
56400
56401
// -------- func jpeg.decoder.top_left_quants_has_zero
56402
56403
WUFFS_BASE__GENERATED_C_CODE
56404
static bool
56405
wuffs_jpeg__decoder__top_left_quants_has_zero(
56406
    const wuffs_jpeg__decoder* self,
56407
    uint32_t a_q) {
56408
  return ((self->private_impl.f_quant_tables[a_q][0u] == 0u) ||
56409
      (self->private_impl.f_quant_tables[a_q][1u] == 0u) ||
56410
      (self->private_impl.f_quant_tables[a_q][2u] == 0u) ||
56411
      (self->private_impl.f_quant_tables[a_q][3u] == 0u) ||
56412
      (self->private_impl.f_quant_tables[a_q][8u] == 0u) ||
56413
      (self->private_impl.f_quant_tables[a_q][9u] == 0u) ||
56414
      (self->private_impl.f_quant_tables[a_q][10u] == 0u) ||
56415
      (self->private_impl.f_quant_tables[a_q][16u] == 0u) ||
56416
      (self->private_impl.f_quant_tables[a_q][17u] == 0u) ||
56417
      (self->private_impl.f_quant_tables[a_q][24u] == 0u));
56418
}
56419
56420
// -------- func jpeg.decoder.load_mcu_blocks_for_single_component_smooth
56421
56422
WUFFS_BASE__GENERATED_C_CODE
56423
static wuffs_base__empty_struct
56424
wuffs_jpeg__decoder__load_mcu_blocks_for_single_component_smooth(
56425
    wuffs_jpeg__decoder* self,
56426
    uint32_t a_mx,
56427
    uint32_t a_my,
56428
    wuffs_base__slice_u8 a_workbuf,
56429
    uint32_t a_csel) {
56430
  uint64_t v_stride16 = 0;
56431
  uint64_t v_offset = 0;
56432
  uint32_t v_dx = 0;
56433
  uint32_t v_dy = 0;
56434
  uint32_t v_mx = 0;
56435
  uint32_t v_my = 0;
56436
  uint8_t v_q = 0;
56437
  uint32_t v_q_00 = 0;
56438
  uint32_t v_q_xy = 0;
56439
  uint8_t v_al = 0;
56440
  uint32_t v_scratch = 0;
56441
  uint32_t v_limit = 0;
56442
56443
  v_stride16 = ((uint64_t)((self->private_impl.f_components_workbuf_widths[a_csel] * 16u)));
56444
  v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(a_mx)) * 128u) + (((uint64_t)(a_my)) * v_stride16));
56445
  if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56446
    wuffs_private_impl__bulk_load_host_endian(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset));
56447
  }
56448
  v_dy = 0u;
56449
  while (v_dy < 5u) {
56450
    v_my = wuffs_base__u32__min(self->private_impl.f_block_smoothing_my_max_incl, wuffs_base__u32__sat_sub((a_my + v_dy), 2u));
56451
    v_dx = 0u;
56452
    while (v_dx < 5u) {
56453
      v_mx = wuffs_base__u32__min(self->private_impl.f_block_smoothing_mx_max_incl, wuffs_base__u32__sat_sub((a_mx + v_dx), 2u));
56454
      v_offset = (self->private_impl.f_components_workbuf_offsets[(a_csel | 4u)] + (((uint64_t)(v_mx)) * 128u) + (((uint64_t)(v_my)) * v_stride16));
56455
      if (v_offset <= ((uint64_t)(a_workbuf.len))) {
56456
        wuffs_private_impl__bulk_load_host_endian(&self->private_impl.f_block_smoothing_dc_values[v_dy][v_dx], 1u * (size_t)2u, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset));
56457
      }
56458
      v_dx += 1u;
56459
    }
56460
    v_dy += 1u;
56461
  }
56462
  v_q = self->private_impl.f_components_tq[a_csel];
56463
  v_q_00 = ((uint32_t)(self->private_impl.f_quant_tables[v_q][0u]));
56464
  if (v_q_00 <= 0u) {
56465
    return wuffs_base__make_empty_struct();
56466
  }
56467
  if (0u != (16u &
56468
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u] &
56469
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u] &
56470
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u] &
56471
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u] &
56472
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u] &
56473
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][6u] &
56474
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][7u] &
56475
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][8u] &
56476
      self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][9u])) {
56477
    v_scratch = 0u;
56478
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56479
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56480
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56481
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56482
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56483
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56484
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56485
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56486
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56487
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56488
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56489
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56490
    v_scratch += ((uint32_t)(152u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56491
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56492
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56493
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56494
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56495
    v_scratch += ((uint32_t)(42u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56496
    v_scratch += ((uint32_t)(6u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56497
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56498
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56499
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56500
    v_scratch += ((uint32_t)(4294967288u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56501
    v_scratch += ((uint32_t)(4294967290u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56502
    v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56503
    if (v_scratch < 2147483648u) {
56504
      v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + 128u)) / 256u)));
56505
    } else {
56506
      v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + 128u)) / 256u)));
56507
    }
56508
    self->private_data.f_mcu_blocks[0u][0u] = ((uint16_t)(v_scratch));
56509
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
56510
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
56511
      v_scratch = 0u;
56512
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56513
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56514
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56515
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56516
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56517
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56518
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56519
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56520
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56521
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56522
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56523
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56524
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56525
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56526
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56527
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56528
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56529
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56530
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56531
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56532
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56533
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56534
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56535
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56536
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56537
      v_scratch *= v_q_00;
56538
      if (v_scratch < 2147483648u) {
56539
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56540
      } else {
56541
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56542
      }
56543
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
56544
    }
56545
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
56546
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
56547
      v_scratch = 0u;
56548
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56549
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56550
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56551
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56552
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56553
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56554
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56555
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56556
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56557
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56558
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56559
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56560
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56561
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56562
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56563
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56564
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56565
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56566
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56567
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56568
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56569
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56570
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56571
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56572
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56573
      v_scratch *= v_q_00;
56574
      if (v_scratch < 2147483648u) {
56575
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56576
      } else {
56577
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56578
      }
56579
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
56580
    }
56581
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][3u]));
56582
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][3u] == 0u)) {
56583
      v_scratch = 0u;
56584
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56585
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56586
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56587
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56588
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56589
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56590
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56591
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56592
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56593
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56594
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56595
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56596
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56597
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56598
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56599
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56600
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56601
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56602
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56603
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56604
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56605
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56606
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56607
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56608
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56609
      v_scratch *= v_q_00;
56610
      if (v_scratch < 2147483648u) {
56611
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56612
      } else {
56613
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56614
      }
56615
      self->private_data.f_mcu_blocks[0u][3u] = ((uint16_t)(v_scratch));
56616
    }
56617
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
56618
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
56619
      v_scratch = 0u;
56620
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56621
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56622
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56623
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56624
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56625
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56626
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56627
      v_scratch += ((uint32_t)(38u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56628
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56629
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56630
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56631
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56632
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56633
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56634
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56635
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56636
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56637
      v_scratch += ((uint32_t)(4294967258u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56638
      v_scratch += ((uint32_t)(4294967283u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56639
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56640
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56641
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56642
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56643
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56644
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56645
      v_scratch *= v_q_00;
56646
      if (v_scratch < 2147483648u) {
56647
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56648
      } else {
56649
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56650
      }
56651
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
56652
    }
56653
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
56654
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
56655
      v_scratch = 0u;
56656
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56657
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56658
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56659
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56660
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56661
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56662
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56663
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56664
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56665
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56666
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56667
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56668
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56669
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56670
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56671
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56672
      v_scratch += ((uint32_t)(4294967287u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56673
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56674
      v_scratch += ((uint32_t)(9u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56675
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56676
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56677
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56678
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56679
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56680
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56681
      v_scratch *= v_q_00;
56682
      if (v_scratch < 2147483648u) {
56683
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56684
      } else {
56685
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56686
      }
56687
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
56688
    }
56689
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][10u]));
56690
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][10u] == 0u)) {
56691
      v_scratch = 0u;
56692
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56693
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56694
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56695
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56696
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56697
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56698
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56699
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56700
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56701
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56702
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56703
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56704
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56705
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56706
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56707
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56708
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56709
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56710
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56711
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56712
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56713
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56714
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56715
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56716
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56717
      v_scratch *= v_q_00;
56718
      if (v_scratch < 2147483648u) {
56719
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56720
      } else {
56721
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56722
      }
56723
      self->private_data.f_mcu_blocks[0u][10u] = ((uint16_t)(v_scratch));
56724
    }
56725
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
56726
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
56727
      v_scratch = 0u;
56728
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56729
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56730
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56731
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56732
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56733
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56734
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56735
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56736
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56737
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56738
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56739
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56740
      v_scratch += ((uint32_t)(4294967282u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56741
      v_scratch += ((uint32_t)(4294967291u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56742
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56743
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56744
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56745
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56746
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56747
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56748
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56749
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56750
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56751
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56752
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56753
      v_scratch *= v_q_00;
56754
      if (v_scratch < 2147483648u) {
56755
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56756
      } else {
56757
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56758
      }
56759
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
56760
    }
56761
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][17u]));
56762
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][17u] == 0u)) {
56763
      v_scratch = 0u;
56764
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56765
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56766
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56767
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56768
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56769
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56770
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56771
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56772
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56773
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56774
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56775
      v_scratch += ((uint32_t)(4294967293u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56776
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56777
      v_scratch += ((uint32_t)(3u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56778
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56779
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56780
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56781
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56782
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56783
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56784
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56785
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56786
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56787
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56788
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56789
      v_scratch *= v_q_00;
56790
      if (v_scratch < 2147483648u) {
56791
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56792
      } else {
56793
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56794
      }
56795
      self->private_data.f_mcu_blocks[0u][17u] = ((uint16_t)(v_scratch));
56796
    }
56797
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][24u]));
56798
    if ((v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][24u] == 0u)) {
56799
      v_scratch = 0u;
56800
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56801
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56802
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56803
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56804
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56805
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56806
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56807
      v_scratch += ((uint32_t)(2u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56808
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56809
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56810
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56811
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56812
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56813
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56814
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56815
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56816
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56817
      v_scratch += ((uint32_t)(4294967294u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56818
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56819
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56820
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56821
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56822
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56823
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56824
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56825
      v_scratch *= v_q_00;
56826
      if (v_scratch < 2147483648u) {
56827
        v_scratch = ((uint32_t)(0u + (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56828
      } else {
56829
        v_scratch = ((uint32_t)(0u - (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u))));
56830
      }
56831
      self->private_data.f_mcu_blocks[0u][24u] = ((uint16_t)(v_scratch));
56832
    }
56833
  } else {
56834
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][1u];
56835
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][1u]));
56836
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][1u] == 0u)) {
56837
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
56838
      v_scratch = 0u;
56839
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56840
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56841
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56842
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56843
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56844
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56845
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56846
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56847
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56848
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56849
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56850
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56851
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56852
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56853
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56854
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56855
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56856
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56857
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56858
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56859
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56860
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56861
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56862
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56863
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56864
      v_scratch *= v_q_00;
56865
      if (v_scratch < 2147483648u) {
56866
        v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56867
      } else {
56868
        v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56869
      }
56870
      self->private_data.f_mcu_blocks[0u][1u] = ((uint16_t)(v_scratch));
56871
    }
56872
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][5u];
56873
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][2u]));
56874
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][2u] == 0u)) {
56875
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
56876
      v_scratch = 0u;
56877
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56878
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56879
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56880
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56881
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56882
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56883
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56884
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56885
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56886
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56887
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56888
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56889
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56890
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56891
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56892
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56893
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56894
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56895
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56896
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56897
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56898
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56899
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56900
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56901
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56902
      v_scratch *= v_q_00;
56903
      if (v_scratch < 2147483648u) {
56904
        v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56905
      } else {
56906
        v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56907
      }
56908
      self->private_data.f_mcu_blocks[0u][2u] = ((uint16_t)(v_scratch));
56909
    }
56910
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][2u];
56911
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][8u]));
56912
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][8u] == 0u)) {
56913
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
56914
      v_scratch = 0u;
56915
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56916
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56917
      v_scratch += ((uint32_t)(4294967289u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56918
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56919
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56920
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56921
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56922
      v_scratch += ((uint32_t)(50u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56923
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56924
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56925
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56926
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56927
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56928
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56929
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56930
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56931
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56932
      v_scratch += ((uint32_t)(4294967246u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56933
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56934
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56935
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56936
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56937
      v_scratch += ((uint32_t)(7u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56938
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56939
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56940
      v_scratch *= v_q_00;
56941
      if (v_scratch < 2147483648u) {
56942
        v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56943
      } else {
56944
        v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56945
      }
56946
      self->private_data.f_mcu_blocks[0u][8u] = ((uint16_t)(v_scratch));
56947
    }
56948
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][4u];
56949
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][9u]));
56950
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][9u] == 0u)) {
56951
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
56952
      v_scratch = 0u;
56953
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56954
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56955
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56956
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56957
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56958
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56959
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56960
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56961
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
56962
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
56963
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
56964
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
56965
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
56966
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
56967
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
56968
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
56969
      v_scratch += ((uint32_t)(4294967286u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
56970
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
56971
      v_scratch += ((uint32_t)(10u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
56972
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
56973
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
56974
      v_scratch += ((uint32_t)(1u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
56975
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
56976
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
56977
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
56978
      v_scratch *= v_q_00;
56979
      if (v_scratch < 2147483648u) {
56980
        v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56981
      } else {
56982
        v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
56983
      }
56984
      self->private_data.f_mcu_blocks[0u][9u] = ((uint16_t)(v_scratch));
56985
    }
56986
    v_al = self->private_impl.f_block_smoothing_lowest_scan_al[a_csel][3u];
56987
    v_q_xy = ((uint32_t)(self->private_impl.f_quant_tables[v_q][16u]));
56988
    if ((v_al > 0u) && (v_q_xy > 0u) && (self->private_data.f_mcu_blocks[0u][16u] == 0u)) {
56989
      v_limit = ((((uint32_t)(1u)) << v_al) - 1u);
56990
      v_scratch = 0u;
56991
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][0u])));
56992
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][1u])));
56993
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][2u])));
56994
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][3u])));
56995
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[0u][4u])));
56996
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][0u])));
56997
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][1u])));
56998
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][2u])));
56999
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][3u])));
57000
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[1u][4u])));
57001
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][0u])));
57002
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][1u])));
57003
      v_scratch += ((uint32_t)(4294967272u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][2u])));
57004
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][3u])));
57005
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[2u][4u])));
57006
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][0u])));
57007
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][1u])));
57008
      v_scratch += ((uint32_t)(13u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][2u])));
57009
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][3u])));
57010
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[3u][4u])));
57011
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][0u])));
57012
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][1u])));
57013
      v_scratch += ((uint32_t)(4294967295u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][2u])));
57014
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][3u])));
57015
      v_scratch += ((uint32_t)(0u * wuffs_base__utility__sign_extend_convert_u16_u32(self->private_impl.f_block_smoothing_dc_values[4u][4u])));
57016
      v_scratch *= v_q_00;
57017
      if (v_scratch < 2147483648u) {
57018
        v_scratch = ((uint32_t)(0u + wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u + v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
57019
      } else {
57020
        v_scratch = ((uint32_t)(0u - wuffs_base__u32__min(v_limit, (((uint32_t)(((uint32_t)(0u - v_scratch)) + (v_q_xy << 7u))) / (v_q_xy << 8u)))));
57021
      }
57022
      self->private_data.f_mcu_blocks[0u][16u] = ((uint16_t)(v_scratch));
57023
    }
57024
  }
57025
  return wuffs_base__make_empty_struct();
57026
}
57027
57028
// -------- func jpeg.decoder.decode_mcu
57029
57030
WUFFS_BASE__GENERATED_C_CODE
57031
static uint32_t
57032
wuffs_jpeg__decoder__decode_mcu(
57033
    wuffs_jpeg__decoder* self,
57034
    wuffs_base__pixel_buffer* a_dst,
57035
    wuffs_base__slice_u8 a_workbuf,
57036
    uint32_t a_mx,
57037
    uint32_t a_my) {
57038
  return (*self->private_impl.choosy_decode_mcu)(self, a_dst, a_workbuf, a_mx, a_my);
57039
}
57040
57041
WUFFS_BASE__GENERATED_C_CODE
57042
static uint32_t
57043
wuffs_jpeg__decoder__decode_mcu__choosy_default(
57044
    wuffs_jpeg__decoder* self,
57045
    wuffs_base__pixel_buffer* a_dst,
57046
    wuffs_base__slice_u8 a_workbuf,
57047
    uint32_t a_mx,
57048
    uint32_t a_my) {
57049
  uint32_t v_ret = 0;
57050
  uint64_t v_bits = 0;
57051
  uint32_t v_n_bits = 0;
57052
  uint8_t v_csel = 0;
57053
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57054
  wuffs_base__io_buffer* v_r = &u_r;
57055
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57056
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57057
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57058
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57059
  uint32_t v_pos = 0;
57060
  uint8_t v_dc_h = 0;
57061
  uint32_t v_dc_symbol = 0;
57062
  uint32_t v_dc_ht_fast = 0;
57063
  uint32_t v_dc_bl = 0;
57064
  uint32_t v_dc_code = 0;
57065
  uint32_t v_dc_blm1 = 0;
57066
  uint32_t v_dc_ht_slow = 0;
57067
  uint16_t v_dc_value = 0;
57068
  uint16_t v_dc_extend = 0;
57069
  const uint16_t* v_ac_huff_table_fast = NULL;
57070
  uint8_t v_ac_h = 0;
57071
  uint32_t v_ac_symbol = 0;
57072
  uint32_t v_ac_ht_fast = 0;
57073
  uint32_t v_ac_bl = 0;
57074
  uint32_t v_ac_code = 0;
57075
  uint32_t v_ac_blm1 = 0;
57076
  uint32_t v_ac_ht_slow = 0;
57077
  uint16_t v_ac_value = 0;
57078
  uint16_t v_ac_extend = 0;
57079
  uint32_t v_ac_rrrr = 0;
57080
  uint32_t v_ac_ssss = 0;
57081
  uint32_t v_z = 0;
57082
  uint32_t v_mcb = 0;
57083
  uint64_t v_stride = 0;
57084
  uint64_t v_offset = 0;
57085
57086
  v_bits = self->private_impl.f_bitstream_bits;
57087
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57088
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57089
    return 2u;
57090
  }
57091
  {
57092
    wuffs_base__io_buffer* o_0_v_r = v_r;
57093
    const uint8_t* o_0_iop_v_r = iop_v_r;
57094
    const uint8_t* o_0_io0_v_r = io0_v_r;
57095
    const uint8_t* o_0_io1_v_r = io1_v_r;
57096
    const uint8_t* o_0_io2_v_r = io2_v_r;
57097
    v_r = wuffs_private_impl__io_reader__set(
57098
        &u_r,
57099
        &iop_v_r,
57100
        &io0_v_r,
57101
        &io1_v_r,
57102
        &io2_v_r,
57103
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57104
        self->private_impl.f_bitstream_ri,
57105
        self->private_impl.f_bitstream_wi),
57106
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57107
    do {
57108
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
57109
        while (self->private_impl.f_mcu_zig_index <= 0u) {
57110
          wuffs_private_impl__bulk_memset(&self->private_data.f_mcu_blocks[0], 1u * (size_t)128u, 0u);
57111
          if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57112
            v_ret = 1u;
57113
            goto label__goto_done__break;
57114
          }
57115
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57116
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57117
          v_n_bits |= 56u;
57118
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
57119
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
57120
          v_dc_bl = (v_dc_ht_fast >> 8u);
57121
          if (v_n_bits >= v_dc_bl) {
57122
            v_dc_symbol = (15u & v_dc_ht_fast);
57123
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57124
            v_bits <<= (v_dc_bl & 63u);
57125
            v_n_bits -= v_dc_bl;
57126
          } else {
57127
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
57128
            v_dc_blm1 = 8u;
57129
            v_bits <<= 9u;
57130
            v_n_bits -= 9u;
57131
            while (true) {
57132
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
57133
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
57134
                v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))])));
57135
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57136
                break;
57137
              }
57138
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
57139
              v_bits <<= 1u;
57140
              v_n_bits -= 1u;
57141
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
57142
              if (v_dc_blm1 == 0u) {
57143
                v_dc_symbol = 0u;
57144
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57145
                break;
57146
              }
57147
            }
57148
          }
57149
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
57150
#if defined(__GNUC__)
57151
#pragma GCC diagnostic push
57152
#pragma GCC diagnostic ignored "-Wconversion"
57153
#endif
57154
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
57155
#if defined(__GNUC__)
57156
#pragma GCC diagnostic pop
57157
#endif
57158
          v_bits <<= v_dc_symbol;
57159
          v_n_bits -= v_dc_symbol;
57160
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
57161
#if defined(__GNUC__)
57162
#pragma GCC diagnostic push
57163
#pragma GCC diagnostic ignored "-Wconversion"
57164
#endif
57165
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
57166
#if defined(__GNUC__)
57167
#pragma GCC diagnostic pop
57168
#endif
57169
          self->private_data.f_mcu_blocks[0u][0u] = self->private_impl.f_mcu_previous_dc_values[v_csel];
57170
          self->private_impl.f_mcu_zig_index = 1u;
57171
          break;
57172
        }
57173
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57174
          v_ret = 1u;
57175
          goto label__goto_done__break;
57176
        }
57177
        if (v_n_bits < 16u) {
57178
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57179
        }
57180
        v_z = 1u;
57181
        self->private_impl.f_mcu_zig_index = 0u;
57182
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[self->private_impl.f_mcu_current_block];
57183
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
57184
        while (v_z < 64u) {
57185
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
57186
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57187
            v_ret = 2u;
57188
            goto label__goto_done__break;
57189
          }
57190
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57191
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57192
          v_n_bits |= 56u;
57193
          v_ac_bl = (v_ac_ht_fast >> 8u);
57194
          if (v_n_bits >= v_ac_bl) {
57195
            v_ac_symbol = (255u & v_ac_ht_fast);
57196
            v_bits <<= (v_ac_bl & 63u);
57197
            v_n_bits -= v_ac_bl;
57198
          } else {
57199
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
57200
            v_ac_blm1 = 8u;
57201
            v_bits <<= 9u;
57202
            v_n_bits -= 9u;
57203
            while (true) {
57204
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
57205
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
57206
                v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))]));
57207
                break;
57208
              }
57209
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
57210
              v_bits <<= 1u;
57211
              v_n_bits -= 1u;
57212
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
57213
              if (v_ac_blm1 == 0u) {
57214
                v_ac_symbol = 0u;
57215
                break;
57216
              }
57217
            }
57218
          }
57219
          v_ac_rrrr = (v_ac_symbol >> 4u);
57220
          v_z += (v_ac_rrrr + 1u);
57221
          v_ac_ssss = (v_ac_symbol & 15u);
57222
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
57223
          if (v_ac_ssss > 0u) {
57224
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
57225
#if defined(__GNUC__)
57226
#pragma GCC diagnostic push
57227
#pragma GCC diagnostic ignored "-Wconversion"
57228
#endif
57229
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
57230
#if defined(__GNUC__)
57231
#pragma GCC diagnostic pop
57232
#endif
57233
            v_bits <<= v_ac_ssss;
57234
            v_n_bits -= v_ac_ssss;
57235
            self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = v_ac_value;
57236
          } else if (v_ac_rrrr < 15u) {
57237
            break;
57238
          }
57239
        }
57240
        v_mcb = self->private_impl.f_mcu_current_block;
57241
        self->private_impl.f_mcu_current_block += 1u;
57242
        if (self->private_impl.f_test_only_interrupt_decode_mcu) {
57243
          goto label__goto_done__break;
57244
        }
57245
        if ( ! self->private_impl.f_swizzle_immediately) {
57246
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
57247
          v_stride = ((uint64_t)(self->private_impl.f_components_workbuf_widths[v_csel]));
57248
          v_offset = (self->private_impl.f_mcu_blocks_offset[v_mcb] + (((uint64_t)(self->private_impl.f_mcu_blocks_mx_mul[v_mcb])) * ((uint64_t)(a_mx))) + (((uint64_t)(self->private_impl.f_mcu_blocks_my_mul[v_mcb])) * ((uint64_t)(a_my))));
57249
          if (v_offset <= ((uint64_t)(a_workbuf.len))) {
57250
            wuffs_jpeg__decoder__decode_idct(self, wuffs_base__slice_u8__subslice_i(a_workbuf, v_offset), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel])));
57251
          }
57252
        } else if (self->private_impl.f_num_components == 1u) {
57253
          wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64), 8u, ((uint32_t)(self->private_impl.f_components_tq[v_csel])));
57254
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_gray(self,
57255
              a_dst,
57256
              wuffs_base__make_slice_u8(self->private_data.f_swizzle_immediately_buffer, 64),
57257
              ((a_mx + 0u) * 8u),
57258
              ((a_mx + 1u) * 8u),
57259
              ((a_my + 0u) * 8u),
57260
              ((a_my + 1u) * 8u),
57261
              8u);
57262
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
57263
            v_ret = 3u;
57264
            goto label__goto_done__break;
57265
          }
57266
          break;
57267
        } else {
57268
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[v_mcb]];
57269
          v_stride = (8u * ((uint64_t)(self->private_impl.f_components_h[v_csel])));
57270
          wuffs_jpeg__decoder__decode_idct(self, wuffs_base__make_slice_u8_ij(self->private_data.f_swizzle_immediately_buffer, self->private_impl.f_swizzle_immediately_b_offsets[v_mcb], 640), v_stride, ((uint32_t)(self->private_impl.f_components_tq[v_csel])));
57271
          if (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
57272
            continue;
57273
          }
57274
          self->private_impl.f_swizzle_immediately_status = wuffs_jpeg__decoder__swizzle_colorful(self,
57275
              a_dst,
57276
              wuffs_base__utility__empty_slice_u8(),
57277
              ((a_mx + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
57278
              ((a_mx + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_h))),
57279
              ((a_my + 0u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))),
57280
              ((a_my + 1u) * 8u * ((uint32_t)(self->private_impl.f_max_incl_components_v))));
57281
          if ( ! wuffs_base__status__is_ok(&self->private_impl.f_swizzle_immediately_status)) {
57282
            v_ret = 3u;
57283
            goto label__goto_done__break;
57284
          }
57285
          break;
57286
        }
57287
      }
57288
      self->private_impl.f_mcu_current_block = 0u;
57289
    } while (0);
57290
    label__goto_done__break:;
57291
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
57292
    if (v_pos > self->private_impl.f_bitstream_wi) {
57293
      v_ret = 2u;
57294
    } else {
57295
      self->private_impl.f_bitstream_ri = v_pos;
57296
    }
57297
    v_r = o_0_v_r;
57298
    iop_v_r = o_0_iop_v_r;
57299
    io0_v_r = o_0_io0_v_r;
57300
    io1_v_r = o_0_io1_v_r;
57301
    io2_v_r = o_0_io2_v_r;
57302
  }
57303
  self->private_impl.f_bitstream_bits = v_bits;
57304
  self->private_impl.f_bitstream_n_bits = v_n_bits;
57305
  return v_ret;
57306
}
57307
57308
// -------- func jpeg.decoder.decode_mcu_progressive_ac_high_bits
57309
57310
WUFFS_BASE__GENERATED_C_CODE
57311
static uint32_t
57312
wuffs_jpeg__decoder__decode_mcu_progressive_ac_high_bits(
57313
    wuffs_jpeg__decoder* self,
57314
    wuffs_base__pixel_buffer* a_dst,
57315
    wuffs_base__slice_u8 a_workbuf,
57316
    uint32_t a_mx,
57317
    uint32_t a_my) {
57318
  uint32_t v_ret = 0;
57319
  uint64_t v_bits = 0;
57320
  uint32_t v_n_bits = 0;
57321
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57322
  wuffs_base__io_buffer* v_r = &u_r;
57323
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57324
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57325
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57326
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57327
  uint32_t v_pos = 0;
57328
  const uint16_t* v_ac_huff_table_fast = NULL;
57329
  uint8_t v_ac_h = 0;
57330
  uint32_t v_ac_symbol = 0;
57331
  uint32_t v_ac_ht_fast = 0;
57332
  uint32_t v_ac_bl = 0;
57333
  uint32_t v_ac_code = 0;
57334
  uint32_t v_ac_blm1 = 0;
57335
  uint32_t v_ac_ht_slow = 0;
57336
  uint16_t v_ac_value = 0;
57337
  uint16_t v_ac_extend = 0;
57338
  uint32_t v_ac_rrrr = 0;
57339
  uint32_t v_ac_ssss = 0;
57340
  uint32_t v_z = 0;
57341
57342
  if (self->private_impl.f_eob_run > 0u) {
57343
#if defined(__GNUC__)
57344
#pragma GCC diagnostic push
57345
#pragma GCC diagnostic ignored "-Wconversion"
57346
#endif
57347
    self->private_impl.f_eob_run -= 1u;
57348
#if defined(__GNUC__)
57349
#pragma GCC diagnostic pop
57350
#endif
57351
    return 0u;
57352
  }
57353
  v_bits = self->private_impl.f_bitstream_bits;
57354
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57355
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57356
    return 2u;
57357
  }
57358
  {
57359
    wuffs_base__io_buffer* o_0_v_r = v_r;
57360
    const uint8_t* o_0_iop_v_r = iop_v_r;
57361
    const uint8_t* o_0_io0_v_r = io0_v_r;
57362
    const uint8_t* o_0_io1_v_r = io1_v_r;
57363
    const uint8_t* o_0_io2_v_r = io2_v_r;
57364
    v_r = wuffs_private_impl__io_reader__set(
57365
        &u_r,
57366
        &iop_v_r,
57367
        &io0_v_r,
57368
        &io1_v_r,
57369
        &io2_v_r,
57370
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57371
        self->private_impl.f_bitstream_ri,
57372
        self->private_impl.f_bitstream_wi),
57373
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57374
    do {
57375
      do {
57376
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57377
          v_ret = 1u;
57378
          goto label__goto_done__break;
57379
        }
57380
        if (v_n_bits < 16u) {
57381
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57382
        }
57383
        v_z = self->private_impl.f_mcu_zig_index;
57384
        self->private_impl.f_mcu_zig_index = 0u;
57385
        v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
57386
        v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
57387
        while (v_z <= ((uint32_t)(self->private_impl.f_scan_se))) {
57388
          v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
57389
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57390
            v_ret = 2u;
57391
            goto label__goto_done__break;
57392
          }
57393
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57394
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57395
          v_n_bits |= 56u;
57396
          v_ac_bl = (v_ac_ht_fast >> 8u);
57397
          if (v_n_bits >= v_ac_bl) {
57398
            v_ac_symbol = (255u & v_ac_ht_fast);
57399
            v_bits <<= (v_ac_bl & 63u);
57400
            v_n_bits -= v_ac_bl;
57401
          } else {
57402
            v_ac_code = ((uint32_t)((v_bits >> 55u)));
57403
            v_ac_blm1 = 8u;
57404
            v_bits <<= 9u;
57405
            v_n_bits -= 9u;
57406
            while (true) {
57407
              v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
57408
              if (v_ac_code < (v_ac_ht_slow >> 8u)) {
57409
                v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))]));
57410
                break;
57411
              }
57412
              v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
57413
              v_bits <<= 1u;
57414
              v_n_bits -= 1u;
57415
              v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
57416
              if (v_ac_blm1 == 0u) {
57417
                v_ac_symbol = 0u;
57418
                break;
57419
              }
57420
            }
57421
          }
57422
          v_ac_rrrr = (v_ac_symbol >> 4u);
57423
          v_z += (v_ac_rrrr + 1u);
57424
          v_ac_ssss = (v_ac_symbol & 15u);
57425
          v_ac_extend = WUFFS_JPEG__EXTEND[v_ac_ssss];
57426
          if (v_ac_ssss > 0u) {
57427
            v_ac_value = ((uint16_t)((v_bits >> (64u - v_ac_ssss))));
57428
#if defined(__GNUC__)
57429
#pragma GCC diagnostic push
57430
#pragma GCC diagnostic ignored "-Wconversion"
57431
#endif
57432
            v_ac_value += ((uint16_t)(v_ac_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
57433
#if defined(__GNUC__)
57434
#pragma GCC diagnostic pop
57435
#endif
57436
            v_bits <<= v_ac_ssss;
57437
            v_n_bits -= v_ac_ssss;
57438
            self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[v_z]] = ((uint16_t)(((uint16_t)(v_ac_value << self->private_impl.f_scan_al))));
57439
          } else if (v_ac_rrrr < 15u) {
57440
            self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr)) - 1u))));
57441
            if (v_ac_rrrr > 0u) {
57442
#if defined(__GNUC__)
57443
#pragma GCC diagnostic push
57444
#pragma GCC diagnostic ignored "-Wconversion"
57445
#endif
57446
              self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
57447
#if defined(__GNUC__)
57448
#pragma GCC diagnostic pop
57449
#endif
57450
              v_bits <<= v_ac_rrrr;
57451
              v_n_bits -= v_ac_rrrr;
57452
            }
57453
            break;
57454
          }
57455
        }
57456
      } while (0);
57457
    } while (0);
57458
    label__goto_done__break:;
57459
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
57460
    if (v_pos > self->private_impl.f_bitstream_wi) {
57461
      v_ret = 2u;
57462
    } else {
57463
      self->private_impl.f_bitstream_ri = v_pos;
57464
    }
57465
    v_r = o_0_v_r;
57466
    iop_v_r = o_0_iop_v_r;
57467
    io0_v_r = o_0_io0_v_r;
57468
    io1_v_r = o_0_io1_v_r;
57469
    io2_v_r = o_0_io2_v_r;
57470
  }
57471
  self->private_impl.f_bitstream_bits = v_bits;
57472
  self->private_impl.f_bitstream_n_bits = v_n_bits;
57473
  return v_ret;
57474
}
57475
57476
// -------- func jpeg.decoder.decode_mcu_progressive_ac_low_bit
57477
57478
WUFFS_BASE__GENERATED_C_CODE
57479
static uint32_t
57480
wuffs_jpeg__decoder__decode_mcu_progressive_ac_low_bit(
57481
    wuffs_jpeg__decoder* self,
57482
    wuffs_base__pixel_buffer* a_dst,
57483
    wuffs_base__slice_u8 a_workbuf,
57484
    uint32_t a_mx,
57485
    uint32_t a_my) {
57486
  uint32_t v_ret = 0;
57487
  uint64_t v_bits = 0;
57488
  uint32_t v_n_bits = 0;
57489
  uint16_t v_one_lshift_scan_al = 0;
57490
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57491
  wuffs_base__io_buffer* v_r = &u_r;
57492
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57493
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57494
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57495
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57496
  uint32_t v_pos = 0;
57497
  const uint16_t* v_ac_huff_table_fast = NULL;
57498
  uint8_t v_ac_h = 0;
57499
  uint32_t v_ac_symbol = 0;
57500
  uint32_t v_ac_ht_fast = 0;
57501
  uint32_t v_ac_bl = 0;
57502
  uint32_t v_ac_code = 0;
57503
  uint32_t v_ac_blm1 = 0;
57504
  uint32_t v_ac_ht_slow = 0;
57505
  uint16_t v_ac_value = 0;
57506
  uint32_t v_ac_rrrr = 0;
57507
  uint32_t v_ac_ssss = 0;
57508
  uint8_t v_unzig = 0;
57509
  bool v_bit = false;
57510
57511
  v_bits = self->private_impl.f_bitstream_bits;
57512
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57513
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
57514
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57515
    return 2u;
57516
  }
57517
  {
57518
    wuffs_base__io_buffer* o_0_v_r = v_r;
57519
    const uint8_t* o_0_iop_v_r = iop_v_r;
57520
    const uint8_t* o_0_io0_v_r = io0_v_r;
57521
    const uint8_t* o_0_io1_v_r = io1_v_r;
57522
    const uint8_t* o_0_io2_v_r = io2_v_r;
57523
    v_r = wuffs_private_impl__io_reader__set(
57524
        &u_r,
57525
        &iop_v_r,
57526
        &io0_v_r,
57527
        &io1_v_r,
57528
        &io2_v_r,
57529
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57530
        self->private_impl.f_bitstream_ri,
57531
        self->private_impl.f_bitstream_wi),
57532
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57533
    do {
57534
      do {
57535
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57536
          v_ret = 1u;
57537
          goto label__goto_done__break;
57538
        }
57539
        while (true) {
57540
          if (self->private_impl.f_eob_run > 0u) {
57541
            break;
57542
          }
57543
          v_ac_h = self->private_impl.f_mcu_blocks_ac_hselector[0u];
57544
          v_ac_huff_table_fast = &self->private_impl.f_huff_tables_fast[v_ac_h][0u];
57545
          while (true) {
57546
            if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57547
              v_ret = 2u;
57548
              goto label__goto_done__break;
57549
            }
57550
            v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57551
            iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57552
            v_n_bits |= 56u;
57553
            v_ac_ht_fast = ((uint32_t)(v_ac_huff_table_fast[(v_bits >> 56u)]));
57554
            v_ac_bl = (v_ac_ht_fast >> 8u);
57555
            if (v_n_bits >= v_ac_bl) {
57556
              v_ac_symbol = (255u & v_ac_ht_fast);
57557
              v_bits <<= (v_ac_bl & 63u);
57558
              v_n_bits -= v_ac_bl;
57559
            } else {
57560
              v_ac_code = ((uint32_t)((v_bits >> 55u)));
57561
              v_ac_blm1 = 8u;
57562
              v_bits <<= 9u;
57563
              v_n_bits -= 9u;
57564
              while (true) {
57565
                v_ac_ht_slow = self->private_impl.f_huff_tables_slow[v_ac_h][v_ac_blm1];
57566
                if (v_ac_code < (v_ac_ht_slow >> 8u)) {
57567
                  v_ac_symbol = ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_ac_h][(255u & ((uint32_t)(v_ac_code + v_ac_ht_slow)))]));
57568
                  break;
57569
                }
57570
                v_ac_code = (((uint32_t)(v_ac_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
57571
                v_bits <<= 1u;
57572
                v_n_bits -= 1u;
57573
                v_ac_blm1 = ((v_ac_blm1 + 1u) & 15u);
57574
                if (v_ac_blm1 == 0u) {
57575
                  v_ac_symbol = 0u;
57576
                  break;
57577
                }
57578
              }
57579
            }
57580
            v_ac_rrrr = (v_ac_symbol >> 4u);
57581
            v_ac_ssss = (v_ac_symbol & 15u);
57582
            v_ac_value = 0u;
57583
            if (v_ac_ssss > 0u) {
57584
              v_ac_value = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
57585
              if ((v_bits >> 63u) == 0u) {
57586
                v_ac_value = ((uint16_t)(((uint16_t)(65535u)) << self->private_impl.f_scan_al));
57587
              }
57588
              v_bits <<= 1u;
57589
              v_n_bits -= 1u;
57590
            } else if (v_ac_rrrr < 15u) {
57591
              self->private_impl.f_eob_run = ((uint16_t)(((uint16_t)(1u)) << v_ac_rrrr));
57592
              if (v_ac_rrrr > 0u) {
57593
#if defined(__GNUC__)
57594
#pragma GCC diagnostic push
57595
#pragma GCC diagnostic ignored "-Wconversion"
57596
#endif
57597
                self->private_impl.f_eob_run += ((uint16_t)((v_bits >> (64u - v_ac_rrrr))));
57598
#if defined(__GNUC__)
57599
#pragma GCC diagnostic pop
57600
#endif
57601
                v_bits <<= v_ac_rrrr;
57602
                v_n_bits -= v_ac_rrrr;
57603
              }
57604
              goto label__goto_do_eob__break;
57605
            }
57606
            while (true) {
57607
              v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
57608
              if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
57609
                if (v_n_bits == 0u) {
57610
                  if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57611
                    v_ret = 2u;
57612
                    goto label__goto_done__break;
57613
                  }
57614
                  v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57615
                  iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57616
                  v_n_bits |= 56u;
57617
                }
57618
                v_bit = ((v_bits >> 63u) > 0u);
57619
                v_bits <<= 1u;
57620
                v_n_bits -= 1u;
57621
                if (v_bit) {
57622
                  if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
57623
#if defined(__GNUC__)
57624
#pragma GCC diagnostic push
57625
#pragma GCC diagnostic ignored "-Wconversion"
57626
#endif
57627
                    self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
57628
#if defined(__GNUC__)
57629
#pragma GCC diagnostic pop
57630
#endif
57631
                  } else {
57632
#if defined(__GNUC__)
57633
#pragma GCC diagnostic push
57634
#pragma GCC diagnostic ignored "-Wconversion"
57635
#endif
57636
                    self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
57637
#if defined(__GNUC__)
57638
#pragma GCC diagnostic pop
57639
#endif
57640
                  }
57641
                }
57642
              } else if (v_ac_rrrr <= 0u) {
57643
                break;
57644
              } else {
57645
                v_ac_rrrr -= 1u;
57646
              }
57647
              if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
57648
                break;
57649
              }
57650
              self->private_impl.f_mcu_zig_index += 1u;
57651
            }
57652
            if (v_ac_value != 0u) {
57653
              self->private_data.f_mcu_blocks[0u][WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)]] = v_ac_value;
57654
            }
57655
            if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
57656
              break;
57657
            }
57658
            self->private_impl.f_mcu_zig_index += 1u;
57659
          }
57660
          goto label__block__break;
57661
        }
57662
        label__goto_do_eob__break:;
57663
        if (self->private_impl.f_eob_run <= 0u) {
57664
          v_ret = 2u;
57665
          goto label__goto_done__break;
57666
        }
57667
        while (true) {
57668
          v_unzig = WUFFS_JPEG__UNZIG[(1u + self->private_impl.f_mcu_zig_index)];
57669
          if (self->private_data.f_mcu_blocks[0u][v_unzig] != 0u) {
57670
            if (v_n_bits == 0u) {
57671
              if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57672
                v_ret = 2u;
57673
                goto label__goto_done__break;
57674
              }
57675
              v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57676
              iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57677
              v_n_bits |= 56u;
57678
            }
57679
            v_bit = ((v_bits >> 63u) > 0u);
57680
            v_bits <<= 1u;
57681
            v_n_bits -= 1u;
57682
            if (v_bit) {
57683
              if (self->private_data.f_mcu_blocks[0u][v_unzig] < 32768u) {
57684
#if defined(__GNUC__)
57685
#pragma GCC diagnostic push
57686
#pragma GCC diagnostic ignored "-Wconversion"
57687
#endif
57688
                self->private_data.f_mcu_blocks[0u][v_unzig] += v_one_lshift_scan_al;
57689
#if defined(__GNUC__)
57690
#pragma GCC diagnostic pop
57691
#endif
57692
              } else {
57693
#if defined(__GNUC__)
57694
#pragma GCC diagnostic push
57695
#pragma GCC diagnostic ignored "-Wconversion"
57696
#endif
57697
                self->private_data.f_mcu_blocks[0u][v_unzig] -= v_one_lshift_scan_al;
57698
#if defined(__GNUC__)
57699
#pragma GCC diagnostic pop
57700
#endif
57701
              }
57702
            }
57703
          }
57704
          if (self->private_impl.f_mcu_zig_index >= ((uint32_t)(self->private_impl.f_scan_se))) {
57705
            break;
57706
          }
57707
          self->private_impl.f_mcu_zig_index += 1u;
57708
        }
57709
#if defined(__GNUC__)
57710
#pragma GCC diagnostic push
57711
#pragma GCC diagnostic ignored "-Wconversion"
57712
#endif
57713
        self->private_impl.f_eob_run -= 1u;
57714
#if defined(__GNUC__)
57715
#pragma GCC diagnostic pop
57716
#endif
57717
      } while (0);
57718
      label__block__break:;
57719
    } while (0);
57720
    label__goto_done__break:;
57721
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
57722
    if (v_pos > self->private_impl.f_bitstream_wi) {
57723
      v_ret = 2u;
57724
    } else {
57725
      self->private_impl.f_bitstream_ri = v_pos;
57726
    }
57727
    v_r = o_0_v_r;
57728
    iop_v_r = o_0_iop_v_r;
57729
    io0_v_r = o_0_io0_v_r;
57730
    io1_v_r = o_0_io1_v_r;
57731
    io2_v_r = o_0_io2_v_r;
57732
  }
57733
  self->private_impl.f_bitstream_bits = v_bits;
57734
  self->private_impl.f_bitstream_n_bits = v_n_bits;
57735
  return v_ret;
57736
}
57737
57738
// -------- func jpeg.decoder.decode_mcu_progressive_dc_high_bits
57739
57740
WUFFS_BASE__GENERATED_C_CODE
57741
static uint32_t
57742
wuffs_jpeg__decoder__decode_mcu_progressive_dc_high_bits(
57743
    wuffs_jpeg__decoder* self,
57744
    wuffs_base__pixel_buffer* a_dst,
57745
    wuffs_base__slice_u8 a_workbuf,
57746
    uint32_t a_mx,
57747
    uint32_t a_my) {
57748
  uint32_t v_ret = 0;
57749
  uint64_t v_bits = 0;
57750
  uint32_t v_n_bits = 0;
57751
  uint8_t v_csel = 0;
57752
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57753
  wuffs_base__io_buffer* v_r = &u_r;
57754
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57755
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57756
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57757
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57758
  uint32_t v_pos = 0;
57759
  uint8_t v_dc_h = 0;
57760
  uint32_t v_dc_symbol = 0;
57761
  uint32_t v_dc_ht_fast = 0;
57762
  uint32_t v_dc_bl = 0;
57763
  uint32_t v_dc_code = 0;
57764
  uint32_t v_dc_blm1 = 0;
57765
  uint32_t v_dc_ht_slow = 0;
57766
  uint16_t v_dc_value = 0;
57767
  uint16_t v_dc_extend = 0;
57768
57769
  v_bits = self->private_impl.f_bitstream_bits;
57770
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57771
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57772
    return 2u;
57773
  }
57774
  {
57775
    wuffs_base__io_buffer* o_0_v_r = v_r;
57776
    const uint8_t* o_0_iop_v_r = iop_v_r;
57777
    const uint8_t* o_0_io0_v_r = io0_v_r;
57778
    const uint8_t* o_0_io1_v_r = io1_v_r;
57779
    const uint8_t* o_0_io2_v_r = io2_v_r;
57780
    v_r = wuffs_private_impl__io_reader__set(
57781
        &u_r,
57782
        &iop_v_r,
57783
        &io0_v_r,
57784
        &io1_v_r,
57785
        &io2_v_r,
57786
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57787
        self->private_impl.f_bitstream_ri,
57788
        self->private_impl.f_bitstream_wi),
57789
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57790
    do {
57791
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
57792
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57793
          v_ret = 1u;
57794
          goto label__goto_done__break;
57795
        }
57796
        do {
57797
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57798
            v_ret = 2u;
57799
            goto label__goto_done__break;
57800
          }
57801
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57802
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57803
          v_n_bits |= 56u;
57804
          v_dc_h = self->private_impl.f_mcu_blocks_dc_hselector[self->private_impl.f_mcu_current_block];
57805
          v_dc_ht_fast = ((uint32_t)(self->private_impl.f_huff_tables_fast[v_dc_h][(v_bits >> 56u)]));
57806
          v_dc_bl = (v_dc_ht_fast >> 8u);
57807
          if (v_n_bits >= v_dc_bl) {
57808
            v_dc_symbol = (15u & v_dc_ht_fast);
57809
            v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57810
            v_bits <<= (v_dc_bl & 63u);
57811
            v_n_bits -= v_dc_bl;
57812
          } else {
57813
            v_dc_code = ((uint32_t)((v_bits >> 55u)));
57814
            v_dc_blm1 = 8u;
57815
            v_bits <<= 9u;
57816
            v_n_bits -= 9u;
57817
            while (true) {
57818
              v_dc_ht_slow = self->private_impl.f_huff_tables_slow[v_dc_h][v_dc_blm1];
57819
              if (v_dc_code < (v_dc_ht_slow >> 8u)) {
57820
                v_dc_symbol = (15u & ((uint32_t)(self->private_impl.f_huff_tables_symbols[v_dc_h][(255u & ((uint32_t)(v_dc_code + v_dc_ht_slow)))])));
57821
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57822
                break;
57823
              }
57824
              v_dc_code = (((uint32_t)(v_dc_code << 1u)) | ((uint32_t)((v_bits >> 63u))));
57825
              v_bits <<= 1u;
57826
              v_n_bits -= 1u;
57827
              v_dc_blm1 = ((v_dc_blm1 + 1u) & 15u);
57828
              if (v_dc_blm1 == 0u) {
57829
                v_dc_symbol = 0u;
57830
                v_dc_extend = WUFFS_JPEG__EXTEND[v_dc_symbol];
57831
                break;
57832
              }
57833
            }
57834
          }
57835
          v_dc_value = ((uint16_t)(((v_bits >> 32u) >> (32u - v_dc_symbol))));
57836
#if defined(__GNUC__)
57837
#pragma GCC diagnostic push
57838
#pragma GCC diagnostic ignored "-Wconversion"
57839
#endif
57840
          v_dc_value += ((uint16_t)(v_dc_extend & ((uint16_t)(((uint16_t)(wuffs_base__utility__sign_extend_rshift_u64(v_bits, 63u))) ^ 65535u))));
57841
#if defined(__GNUC__)
57842
#pragma GCC diagnostic pop
57843
#endif
57844
          v_bits <<= v_dc_symbol;
57845
          v_n_bits -= v_dc_symbol;
57846
          v_csel = self->private_impl.f_scan_comps_cselector[self->private_impl.f_mcu_blocks_sselector[self->private_impl.f_mcu_current_block]];
57847
#if defined(__GNUC__)
57848
#pragma GCC diagnostic push
57849
#pragma GCC diagnostic ignored "-Wconversion"
57850
#endif
57851
          self->private_impl.f_mcu_previous_dc_values[v_csel] += v_dc_value;
57852
#if defined(__GNUC__)
57853
#pragma GCC diagnostic pop
57854
#endif
57855
          self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] = ((uint16_t)(self->private_impl.f_mcu_previous_dc_values[v_csel] << self->private_impl.f_scan_al));
57856
        } while (0);
57857
        self->private_impl.f_mcu_current_block += 1u;
57858
      }
57859
      self->private_impl.f_mcu_current_block = 0u;
57860
    } while (0);
57861
    label__goto_done__break:;
57862
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
57863
    if (v_pos > self->private_impl.f_bitstream_wi) {
57864
      v_ret = 2u;
57865
    } else {
57866
      self->private_impl.f_bitstream_ri = v_pos;
57867
    }
57868
    v_r = o_0_v_r;
57869
    iop_v_r = o_0_iop_v_r;
57870
    io0_v_r = o_0_io0_v_r;
57871
    io1_v_r = o_0_io1_v_r;
57872
    io2_v_r = o_0_io2_v_r;
57873
  }
57874
  self->private_impl.f_bitstream_bits = v_bits;
57875
  self->private_impl.f_bitstream_n_bits = v_n_bits;
57876
  return v_ret;
57877
}
57878
57879
// -------- func jpeg.decoder.decode_mcu_progressive_dc_low_bit
57880
57881
WUFFS_BASE__GENERATED_C_CODE
57882
static uint32_t
57883
wuffs_jpeg__decoder__decode_mcu_progressive_dc_low_bit(
57884
    wuffs_jpeg__decoder* self,
57885
    wuffs_base__pixel_buffer* a_dst,
57886
    wuffs_base__slice_u8 a_workbuf,
57887
    uint32_t a_mx,
57888
    uint32_t a_my) {
57889
  uint32_t v_ret = 0;
57890
  uint64_t v_bits = 0;
57891
  uint32_t v_n_bits = 0;
57892
  uint16_t v_one_lshift_scan_al = 0;
57893
  wuffs_base__io_buffer u_r = wuffs_base__empty_io_buffer();
57894
  wuffs_base__io_buffer* v_r = &u_r;
57895
  const uint8_t* iop_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57896
  const uint8_t* io0_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57897
  const uint8_t* io1_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57898
  const uint8_t* io2_v_r WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
57899
  uint32_t v_pos = 0;
57900
57901
  v_bits = self->private_impl.f_bitstream_bits;
57902
  v_n_bits = self->private_impl.f_bitstream_n_bits;
57903
  v_one_lshift_scan_al = ((uint16_t)(((uint16_t)(1u)) << self->private_impl.f_scan_al));
57904
  if (self->private_impl.f_bitstream_ri > self->private_impl.f_bitstream_wi) {
57905
    return 2u;
57906
  }
57907
  {
57908
    wuffs_base__io_buffer* o_0_v_r = v_r;
57909
    const uint8_t* o_0_iop_v_r = iop_v_r;
57910
    const uint8_t* o_0_io0_v_r = io0_v_r;
57911
    const uint8_t* o_0_io1_v_r = io1_v_r;
57912
    const uint8_t* o_0_io2_v_r = io2_v_r;
57913
    v_r = wuffs_private_impl__io_reader__set(
57914
        &u_r,
57915
        &iop_v_r,
57916
        &io0_v_r,
57917
        &io1_v_r,
57918
        &io2_v_r,
57919
        wuffs_base__make_slice_u8_ij(self->private_data.f_bitstream_buffer,
57920
        self->private_impl.f_bitstream_ri,
57921
        self->private_impl.f_bitstream_wi),
57922
        ((uint64_t)(self->private_impl.f_bitstream_ri)));
57923
    do {
57924
      while (self->private_impl.f_mcu_current_block < self->private_impl.f_mcu_num_blocks) {
57925
        if (((uint64_t)(io2_v_r - iop_v_r)) < 264u) {
57926
          v_ret = 1u;
57927
          goto label__goto_done__break;
57928
        }
57929
        do {
57930
          if (((uint64_t)(io2_v_r - iop_v_r)) < 8u) {
57931
            v_ret = 2u;
57932
            goto label__goto_done__break;
57933
          }
57934
          v_bits |= (wuffs_base__peek_u64be__no_bounds_check(iop_v_r) >> (v_n_bits & 63u));
57935
          iop_v_r += ((63u - (v_n_bits & 63u)) >> 3u);
57936
          v_n_bits |= 56u;
57937
          if ((v_bits >> 63u) != 0u) {
57938
            self->private_data.f_mcu_blocks[self->private_impl.f_mcu_current_block][0u] |= v_one_lshift_scan_al;
57939
          }
57940
          v_bits <<= 1u;
57941
          v_n_bits -= 1u;
57942
        } while (0);
57943
        self->private_impl.f_mcu_current_block += 1u;
57944
      }
57945
      self->private_impl.f_mcu_current_block = 0u;
57946
    } while (0);
57947
    label__goto_done__break:;
57948
    v_pos = ((uint32_t)(wuffs_base__u64__sat_add((v_r ? v_r->meta.pos : 0), ((uint64_t)(iop_v_r - io0_v_r)))));
57949
    if (v_pos > self->private_impl.f_bitstream_wi) {
57950
      v_ret = 2u;
57951
    } else {
57952
      self->private_impl.f_bitstream_ri = v_pos;
57953
    }
57954
    v_r = o_0_v_r;
57955
    iop_v_r = o_0_iop_v_r;
57956
    io0_v_r = o_0_io0_v_r;
57957
    io1_v_r = o_0_io1_v_r;
57958
    io2_v_r = o_0_io2_v_r;
57959
  }
57960
  self->private_impl.f_bitstream_bits = v_bits;
57961
  self->private_impl.f_bitstream_n_bits = v_n_bits;
57962
  return v_ret;
57963
}
57964
57965
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
57966
57967
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
57968
57969
// ---------------- Status Codes Implementations
57970
57971
const char wuffs_json__error__bad_c0_control_code[] = "#json: bad C0 control code";
57972
const char wuffs_json__error__bad_utf_8[] = "#json: bad UTF-8";
57973
const char wuffs_json__error__bad_backslash_escape[] = "#json: bad backslash-escape";
57974
const char wuffs_json__error__bad_input[] = "#json: bad input";
57975
const char wuffs_json__error__bad_new_line_in_a_string[] = "#json: bad new-line in a string";
57976
const char wuffs_json__error__bad_quirk_combination[] = "#json: bad quirk combination";
57977
const char wuffs_json__error__unsupported_number_length[] = "#json: unsupported number length";
57978
const char wuffs_json__error__unsupported_recursion_depth[] = "#json: unsupported recursion depth";
57979
const char wuffs_json__error__internal_error_inconsistent_i_o[] = "#json: internal error: inconsistent I/O";
57980
57981
// ---------------- Private Consts
57982
57983
#define WUFFS_JSON__DECODER_NUMBER_LENGTH_MAX_INCL 99u
57984
57985
static const uint8_t
57986
WUFFS_JSON__LUT_BACKSLASHES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
57987
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57988
  0u, 0u, 3u, 0u, 0u, 0u, 0u, 0u,
57989
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57990
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57991
  0u, 0u, 162u, 0u, 0u, 0u, 0u, 5u,
57992
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 175u,
57993
  7u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57994
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u,
57995
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57996
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57997
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
57998
  0u, 0u, 0u, 0u, 220u, 0u, 0u, 0u,
57999
  0u, 1u, 136u, 0u, 0u, 2u, 140u, 0u,
58000
  0u, 0u, 0u, 0u, 0u, 0u, 138u, 0u,
58001
  0u, 0u, 141u, 0u, 137u, 0u, 6u, 0u,
58002
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58003
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58004
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58005
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58006
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58007
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58008
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58009
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58010
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58011
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58012
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58013
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58014
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58015
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58016
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58017
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58018
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58019
};
58020
58021
static const uint8_t
58022
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
58023
  0u, 1u, 3u, 4u, 5u, 6u, 7u, 10u,
58024
};
58025
58026
static const uint8_t
58027
WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
58028
  0u, 7u, 27u, 10u, 63u, 39u, 11u, 0u,
58029
};
58030
58031
static const uint8_t
58032
WUFFS_JSON__LUT_CHARS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58033
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
58034
  136u, 137u, 138u, 139u, 140u, 141u, 142u, 143u,
58035
  144u, 145u, 146u, 147u, 148u, 149u, 150u, 151u,
58036
  152u, 153u, 154u, 155u, 156u, 157u, 158u, 159u,
58037
  0u, 0u, 1u, 0u, 0u, 0u, 0u, 0u,
58038
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58039
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58040
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58041
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58042
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58043
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58044
  0u, 0u, 0u, 0u, 2u, 0u, 0u, 0u,
58045
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58046
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58047
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58048
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58049
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58050
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58051
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58052
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58053
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58054
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58055
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58056
  16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u,
58057
  32u, 32u, 3u, 3u, 3u, 3u, 3u, 3u,
58058
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58059
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58060
  3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u,
58061
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58062
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58063
  5u, 5u, 5u, 5u, 5u, 32u, 32u, 32u,
58064
  32u, 32u, 32u, 32u, 32u, 32u, 32u, 32u,
58065
};
58066
58067
#define WUFFS_JSON__CLASS_WHITESPACE 0u
58068
58069
#define WUFFS_JSON__CLASS_STRING 1u
58070
58071
#define WUFFS_JSON__CLASS_COMMA 2u
58072
58073
#define WUFFS_JSON__CLASS_COLON 3u
58074
58075
#define WUFFS_JSON__CLASS_NUMBER 4u
58076
58077
#define WUFFS_JSON__CLASS_OPEN_CURLY_BRACE 5u
58078
58079
#define WUFFS_JSON__CLASS_CLOSE_CURLY_BRACE 6u
58080
58081
#define WUFFS_JSON__CLASS_OPEN_SQUARE_BRACKET 7u
58082
58083
#define WUFFS_JSON__CLASS_CLOSE_SQUARE_BRACKET 8u
58084
58085
#define WUFFS_JSON__CLASS_FALSE 9u
58086
58087
#define WUFFS_JSON__CLASS_TRUE 10u
58088
58089
#define WUFFS_JSON__CLASS_NULL_NAN_INF 11u
58090
58091
#define WUFFS_JSON__CLASS_COMMENT 12u
58092
58093
#define WUFFS_JSON__EXPECT_VALUE 7858u
58094
58095
#define WUFFS_JSON__EXPECT_NON_STRING_VALUE 7856u
58096
58097
#define WUFFS_JSON__EXPECT_STRING 4098u
58098
58099
#define WUFFS_JSON__EXPECT_COMMA 4100u
58100
58101
#define WUFFS_JSON__EXPECT_COLON 4104u
58102
58103
#define WUFFS_JSON__EXPECT_NUMBER 4112u
58104
58105
#define WUFFS_JSON__EXPECT_CLOSE_CURLY_BRACE 4160u
58106
58107
#define WUFFS_JSON__EXPECT_CLOSE_SQUARE_BRACKET 4352u
58108
58109
static const uint8_t
58110
WUFFS_JSON__LUT_CLASSES[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58111
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58112
  15u, 0u, 0u, 15u, 15u, 0u, 15u, 15u,
58113
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58114
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58115
  0u, 15u, 1u, 15u, 15u, 15u, 15u, 15u,
58116
  15u, 15u, 15u, 11u, 2u, 4u, 15u, 12u,
58117
  4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u,
58118
  4u, 4u, 3u, 15u, 15u, 15u, 15u, 15u,
58119
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58120
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
58121
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58122
  15u, 15u, 15u, 7u, 15u, 8u, 15u, 15u,
58123
  15u, 15u, 15u, 15u, 15u, 15u, 9u, 15u,
58124
  15u, 11u, 15u, 15u, 15u, 15u, 11u, 15u,
58125
  15u, 15u, 15u, 15u, 10u, 15u, 15u, 15u,
58126
  15u, 15u, 15u, 5u, 15u, 6u, 15u, 15u,
58127
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58128
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58129
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58130
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58131
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58132
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58133
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58134
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58135
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58136
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58137
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58138
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58139
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58140
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58141
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58142
  15u, 15u, 15u, 15u, 15u, 15u, 15u, 15u,
58143
};
58144
58145
static const uint8_t
58146
WUFFS_JSON__LUT_DECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58147
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58148
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58149
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58150
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58151
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58152
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58153
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
58154
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
58155
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58156
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58157
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58158
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58159
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58160
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58161
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58162
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58163
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58164
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58165
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58166
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58167
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58168
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58169
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58170
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58171
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58172
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58173
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58174
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58175
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58176
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58177
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58178
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58179
};
58180
58181
static const uint8_t
58182
WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
58183
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58184
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58185
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58186
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58187
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58188
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58189
  128u, 129u, 130u, 131u, 132u, 133u, 134u, 135u,
58190
  136u, 137u, 0u, 0u, 0u, 0u, 0u, 0u,
58191
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
58192
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58193
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58194
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58195
  0u, 138u, 139u, 140u, 141u, 142u, 143u, 0u,
58196
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58197
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58198
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58199
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58200
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58201
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58202
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58203
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58204
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58205
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58206
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58207
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58208
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58209
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58210
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58211
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58212
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58213
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58214
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
58215
};
58216
58217
#define WUFFS_JSON__QUIRKS_BASE 1167656960u
58218
58219
#define WUFFS_JSON__QUIRKS_COUNT 21u
58220
58221
// ---------------- Private Initializer Prototypes
58222
58223
// ---------------- Private Function Prototypes
58224
58225
WUFFS_BASE__GENERATED_C_CODE
58226
static uint32_t
58227
wuffs_json__decoder__decode_number(
58228
    wuffs_json__decoder* self,
58229
    wuffs_base__io_buffer* a_src);
58230
58231
WUFFS_BASE__GENERATED_C_CODE
58232
static uint32_t
58233
wuffs_json__decoder__decode_digits(
58234
    wuffs_json__decoder* self,
58235
    wuffs_base__io_buffer* a_src,
58236
    uint32_t a_n);
58237
58238
WUFFS_BASE__GENERATED_C_CODE
58239
static wuffs_base__status
58240
wuffs_json__decoder__decode_leading(
58241
    wuffs_json__decoder* self,
58242
    wuffs_base__token_buffer* a_dst,
58243
    wuffs_base__io_buffer* a_src);
58244
58245
WUFFS_BASE__GENERATED_C_CODE
58246
static wuffs_base__status
58247
wuffs_json__decoder__decode_comment(
58248
    wuffs_json__decoder* self,
58249
    wuffs_base__token_buffer* a_dst,
58250
    wuffs_base__io_buffer* a_src);
58251
58252
WUFFS_BASE__GENERATED_C_CODE
58253
static wuffs_base__status
58254
wuffs_json__decoder__decode_inf_nan(
58255
    wuffs_json__decoder* self,
58256
    wuffs_base__token_buffer* a_dst,
58257
    wuffs_base__io_buffer* a_src);
58258
58259
WUFFS_BASE__GENERATED_C_CODE
58260
static wuffs_base__status
58261
wuffs_json__decoder__decode_trailer(
58262
    wuffs_json__decoder* self,
58263
    wuffs_base__token_buffer* a_dst,
58264
    wuffs_base__io_buffer* a_src);
58265
58266
// ---------------- VTables
58267
58268
const wuffs_base__token_decoder__func_ptrs
58269
wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder = {
58270
  (wuffs_base__status(*)(void*,
58271
      wuffs_base__token_buffer*,
58272
      wuffs_base__io_buffer*,
58273
      wuffs_base__slice_u8))(&wuffs_json__decoder__decode_tokens),
58274
  (uint64_t(*)(const void*,
58275
      uint32_t))(&wuffs_json__decoder__get_quirk),
58276
  (wuffs_base__status(*)(void*,
58277
      uint32_t,
58278
      uint64_t))(&wuffs_json__decoder__set_quirk),
58279
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_json__decoder__workbuf_len),
58280
};
58281
58282
// ---------------- Initializer Implementations
58283
58284
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
58285
wuffs_json__decoder__initialize(
58286
    wuffs_json__decoder* self,
58287
    size_t sizeof_star_self,
58288
    uint64_t wuffs_version,
58289
    uint32_t options){
58290
  if (!self) {
58291
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
58292
  }
58293
  if (sizeof(*self) != sizeof_star_self) {
58294
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
58295
  }
58296
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
58297
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
58298
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
58299
  }
58300
58301
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
58302
    // The whole point of this if-check is to detect an uninitialized *self.
58303
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
58304
#if !defined(__clang__) && defined(__GNUC__)
58305
#pragma GCC diagnostic push
58306
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
58307
#endif
58308
    if (self->private_impl.magic != 0) {
58309
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
58310
    }
58311
#if !defined(__clang__) && defined(__GNUC__)
58312
#pragma GCC diagnostic pop
58313
#endif
58314
  } else {
58315
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
58316
      memset(self, 0, sizeof(*self));
58317
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
58318
    } else {
58319
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
58320
    }
58321
  }
58322
58323
  self->private_impl.magic = WUFFS_BASE__MAGIC;
58324
  self->private_impl.vtable_for__wuffs_base__token_decoder.vtable_name =
58325
      wuffs_base__token_decoder__vtable_name;
58326
  self->private_impl.vtable_for__wuffs_base__token_decoder.function_pointers =
58327
      (const void*)(&wuffs_json__decoder__func_ptrs_for__wuffs_base__token_decoder);
58328
  return wuffs_base__make_status(NULL);
58329
}
58330
58331
wuffs_json__decoder*
58332
wuffs_json__decoder__alloc(void) {
58333
  wuffs_json__decoder* x =
58334
      (wuffs_json__decoder*)(calloc(1, sizeof(wuffs_json__decoder)));
58335
  if (!x) {
58336
    return NULL;
58337
  }
58338
  if (wuffs_json__decoder__initialize(
58339
      x, sizeof(wuffs_json__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
58340
    free(x);
58341
    return NULL;
58342
  }
58343
  return x;
58344
}
58345
58346
size_t
58347
sizeof__wuffs_json__decoder(void) {
58348
  return sizeof(wuffs_json__decoder);
58349
}
58350
58351
// ---------------- Function Implementations
58352
58353
// -------- func json.decoder.get_quirk
58354
58355
WUFFS_BASE__GENERATED_C_CODE
58356
WUFFS_BASE__MAYBE_STATIC uint64_t
58357
wuffs_json__decoder__get_quirk(
58358
    const wuffs_json__decoder* self,
58359
    uint32_t a_key) {
58360
  if (!self) {
58361
    return 0;
58362
  }
58363
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
58364
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
58365
    return 0;
58366
  }
58367
58368
  uint32_t v_key = 0;
58369
58370
  if (a_key >= 1167656960u) {
58371
    v_key = (a_key - 1167656960u);
58372
    if (v_key < 21u) {
58373
      if (self->private_impl.f_quirks[v_key]) {
58374
        return 1u;
58375
      }
58376
    }
58377
  }
58378
  return 0u;
58379
}
58380
58381
// -------- func json.decoder.set_quirk
58382
58383
WUFFS_BASE__GENERATED_C_CODE
58384
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
58385
wuffs_json__decoder__set_quirk(
58386
    wuffs_json__decoder* self,
58387
    uint32_t a_key,
58388
    uint64_t a_value) {
58389
  if (!self) {
58390
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
58391
  }
58392
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
58393
    return wuffs_base__make_status(
58394
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
58395
        ? wuffs_base__error__disabled_by_previous_error
58396
        : wuffs_base__error__initialize_not_called);
58397
  }
58398
58399
  if (a_key >= 1167656960u) {
58400
    a_key -= 1167656960u;
58401
    if (a_key < 21u) {
58402
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
58403
      return wuffs_base__make_status(NULL);
58404
    }
58405
  }
58406
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
58407
}
58408
58409
// -------- func json.decoder.workbuf_len
58410
58411
WUFFS_BASE__GENERATED_C_CODE
58412
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
58413
wuffs_json__decoder__workbuf_len(
58414
    const wuffs_json__decoder* self) {
58415
  if (!self) {
58416
    return wuffs_base__utility__empty_range_ii_u64();
58417
  }
58418
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
58419
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
58420
    return wuffs_base__utility__empty_range_ii_u64();
58421
  }
58422
58423
  return wuffs_base__utility__empty_range_ii_u64();
58424
}
58425
58426
// -------- func json.decoder.decode_tokens
58427
58428
WUFFS_BASE__GENERATED_C_CODE
58429
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
58430
wuffs_json__decoder__decode_tokens(
58431
    wuffs_json__decoder* self,
58432
    wuffs_base__token_buffer* a_dst,
58433
    wuffs_base__io_buffer* a_src,
58434
    wuffs_base__slice_u8 a_workbuf) {
58435
  if (!self) {
58436
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
58437
  }
58438
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
58439
    return wuffs_base__make_status(
58440
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
58441
        ? wuffs_base__error__disabled_by_previous_error
58442
        : wuffs_base__error__initialize_not_called);
58443
  }
58444
  if (!a_dst || !a_src) {
58445
    self->private_impl.magic = WUFFS_BASE__DISABLED;
58446
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
58447
  }
58448
  if ((self->private_impl.active_coroutine != 0) &&
58449
      (self->private_impl.active_coroutine != 1)) {
58450
    self->private_impl.magic = WUFFS_BASE__DISABLED;
58451
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
58452
  }
58453
  self->private_impl.active_coroutine = 0;
58454
  wuffs_base__status status = wuffs_base__make_status(NULL);
58455
58456
  uint32_t v_vminor = 0;
58457
  uint32_t v_number_length = 0;
58458
  uint32_t v_number_status = 0;
58459
  uint32_t v_string_length = 0;
58460
  uint32_t v_whitespace_length = 0;
58461
  uint32_t v_depth = 0;
58462
  uint32_t v_stack_byte = 0;
58463
  uint32_t v_stack_bit = 0;
58464
  uint32_t v_match = 0;
58465
  uint32_t v_c32 = 0;
58466
  uint8_t v_c8 = 0;
58467
  uint8_t v_backslash = 0;
58468
  uint8_t v_char = 0;
58469
  uint8_t v_class = 0;
58470
  uint32_t v_multi_byte_utf8 = 0;
58471
  uint8_t v_backslash_x_ok = 0;
58472
  uint8_t v_backslash_x_value = 0;
58473
  uint32_t v_backslash_x_string = 0;
58474
  uint8_t v_uni4_ok = 0;
58475
  uint64_t v_uni4_string = 0;
58476
  uint32_t v_uni4_value = 0;
58477
  uint32_t v_uni4_high_surrogate = 0;
58478
  uint8_t v_uni8_ok = 0;
58479
  uint64_t v_uni8_string = 0;
58480
  uint32_t v_uni8_value = 0;
58481
  uint32_t v_expect = 0;
58482
  uint32_t v_expect_after_value = 0;
58483
58484
  wuffs_base__token* iop_a_dst = NULL;
58485
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58486
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58487
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58488
  if (a_dst && a_dst->data.ptr) {
58489
    io0_a_dst = a_dst->data.ptr;
58490
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
58491
    iop_a_dst = io1_a_dst;
58492
    io2_a_dst = io0_a_dst + a_dst->data.len;
58493
    if (a_dst->meta.closed) {
58494
      io2_a_dst = iop_a_dst;
58495
    }
58496
  }
58497
  const uint8_t* iop_a_src = NULL;
58498
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58499
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58500
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
58501
  if (a_src && a_src->data.ptr) {
58502
    io0_a_src = a_src->data.ptr;
58503
    io1_a_src = io0_a_src + a_src->meta.ri;
58504
    iop_a_src = io1_a_src;
58505
    io2_a_src = io0_a_src + a_src->meta.wi;
58506
  }
58507
58508
  uint32_t coro_susp_point = self->private_impl.p_decode_tokens;
58509
  if (coro_susp_point) {
58510
    v_depth = self->private_data.s_decode_tokens.v_depth;
58511
    v_expect = self->private_data.s_decode_tokens.v_expect;
58512
    v_expect_after_value = self->private_data.s_decode_tokens.v_expect_after_value;
58513
  }
58514
  switch (coro_susp_point) {
58515
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
58516
58517
    if (self->private_impl.f_end_of_data) {
58518
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
58519
      goto ok;
58520
    }
58521
    if (self->private_impl.f_quirks[18u]) {
58522
      if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u] || self->private_impl.f_quirks[17u]) {
58523
        status = wuffs_base__make_status(wuffs_json__error__bad_quirk_combination);
58524
        goto exit;
58525
      }
58526
    }
58527
    if (self->private_impl.f_quirks[15u] || self->private_impl.f_quirks[16u]) {
58528
      if (a_dst) {
58529
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
58530
      }
58531
      if (a_src) {
58532
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
58533
      }
58534
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
58535
      status = wuffs_json__decoder__decode_leading(self, a_dst, a_src);
58536
      if (a_dst) {
58537
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
58538
      }
58539
      if (a_src) {
58540
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
58541
      }
58542
      if (status.repr) {
58543
        goto suspend;
58544
      }
58545
    }
58546
    v_expect = 7858u;
58547
    label__outer__continue:;
58548
    while (true) {
58549
      while (true) {
58550
        if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58551
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
58552
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
58553
          goto label__outer__continue;
58554
        }
58555
        v_whitespace_length = 0u;
58556
        v_c8 = 0u;
58557
        v_class = 0u;
58558
        while (true) {
58559
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58560
            if (v_whitespace_length > 0u) {
58561
              *iop_a_dst++ = wuffs_base__make_token(
58562
                  (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58563
                  (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58564
              v_whitespace_length = 0u;
58565
            }
58566
            if (a_src && a_src->meta.closed) {
58567
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
58568
              goto exit;
58569
            }
58570
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58571
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
58572
            goto label__outer__continue;
58573
          }
58574
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58575
          v_class = WUFFS_JSON__LUT_CLASSES[v_c8];
58576
          if (v_class != 0u) {
58577
            break;
58578
          }
58579
          iop_a_src += 1u;
58580
          if (v_whitespace_length >= 65534u) {
58581
            *iop_a_dst++ = wuffs_base__make_token(
58582
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58583
                (((uint64_t)(65535u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58584
            v_whitespace_length = 0u;
58585
            goto label__outer__continue;
58586
          }
58587
          v_whitespace_length += 1u;
58588
        }
58589
        if (v_whitespace_length > 0u) {
58590
          *iop_a_dst++ = wuffs_base__make_token(
58591
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58592
              (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58593
          v_whitespace_length = 0u;
58594
          if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58595
            goto label__outer__continue;
58596
          }
58597
        }
58598
        if (0u == (v_expect & (((uint32_t)(1u)) << v_class))) {
58599
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
58600
          goto exit;
58601
        }
58602
        if (v_class == 1u) {
58603
          *iop_a_dst++ = wuffs_base__make_token(
58604
              (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58605
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58606
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58607
          iop_a_src += 1u;
58608
          label__string_loop_outer__continue:;
58609
          while (true) {
58610
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58611
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
58612
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
58613
              continue;
58614
            }
58615
            v_string_length = 0u;
58616
            while (true) {
58617
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
58618
                if (v_string_length > 0u) {
58619
                  *iop_a_dst++ = wuffs_base__make_token(
58620
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58621
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58622
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58623
                  v_string_length = 0u;
58624
                }
58625
                if (a_src && a_src->meta.closed) {
58626
                  status = wuffs_base__make_status(wuffs_json__error__bad_input);
58627
                  goto exit;
58628
                }
58629
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58630
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
58631
                goto label__string_loop_outer__continue;
58632
              }
58633
              while (((uint64_t)(io2_a_src - iop_a_src)) > 4u) {
58634
                v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
58635
                if (0u != (WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 0u))] |
58636
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 8u))] |
58637
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 16u))] |
58638
                    WUFFS_JSON__LUT_CHARS[(255u & (v_c32 >> 24u))])) {
58639
                  break;
58640
                }
58641
                iop_a_src += 4u;
58642
                if (v_string_length > 65527u) {
58643
                  *iop_a_dst++ = wuffs_base__make_token(
58644
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58645
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58646
                      (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58647
                  v_string_length = 0u;
58648
                  goto label__string_loop_outer__continue;
58649
                }
58650
                v_string_length += 4u;
58651
              }
58652
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
58653
              v_char = WUFFS_JSON__LUT_CHARS[v_c8];
58654
              if (v_char == 0u) {
58655
                iop_a_src += 1u;
58656
                if (v_string_length >= 65531u) {
58657
                  *iop_a_dst++ = wuffs_base__make_token(
58658
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58659
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58660
                      (((uint64_t)(65532u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58661
                  v_string_length = 0u;
58662
                  goto label__string_loop_outer__continue;
58663
                }
58664
                v_string_length += 1u;
58665
                continue;
58666
              } else if (v_char == 1u) {
58667
                if (v_string_length != 0u) {
58668
                  *iop_a_dst++ = wuffs_base__make_token(
58669
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58670
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58671
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58672
                  v_string_length = 0u;
58673
                }
58674
                goto label__string_loop_outer__break;
58675
              } else if (v_char == 2u) {
58676
                if (v_string_length > 0u) {
58677
                  *iop_a_dst++ = wuffs_base__make_token(
58678
                      (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58679
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58680
                      (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58681
                  v_string_length = 0u;
58682
                  if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58683
                    goto label__string_loop_outer__continue;
58684
                  }
58685
                }
58686
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
58687
                  if (a_src && a_src->meta.closed) {
58688
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58689
                    goto exit;
58690
                  }
58691
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58692
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
58693
                  goto label__string_loop_outer__continue;
58694
                }
58695
                v_c8 = ((uint8_t)(((uint16_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src) >> 8u))));
58696
                v_backslash = WUFFS_JSON__LUT_BACKSLASHES[v_c8];
58697
                if (((uint8_t)(v_backslash & 128u)) != 0u) {
58698
                  iop_a_src += 2u;
58699
                  *iop_a_dst++ = wuffs_base__make_token(
58700
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_backslash & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58701
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58702
                      (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58703
                  goto label__string_loop_outer__continue;
58704
                } else if (v_backslash != 0u) {
58705
                  if (self->private_impl.f_quirks[WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_QUIRKS[((uint8_t)(v_backslash & 7u))]]) {
58706
                    iop_a_src += 2u;
58707
                    *iop_a_dst++ = wuffs_base__make_token(
58708
                        (((uint64_t)((6291456u | ((uint32_t)(WUFFS_JSON__LUT_QUIRKY_BACKSLASHES_CHARS[((uint8_t)(v_backslash & 7u))]))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58709
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58710
                        (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58711
                    goto label__string_loop_outer__continue;
58712
                  }
58713
                } else if (v_c8 == 117u) {
58714
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
58715
                    if (a_src && a_src->meta.closed) {
58716
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58717
                      goto exit;
58718
                    }
58719
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58720
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
58721
                    goto label__string_loop_outer__continue;
58722
                  }
58723
                  v_uni4_string = (((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src))) >> 16u);
58724
                  v_uni4_value = 0u;
58725
                  v_uni4_ok = 128u;
58726
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
58727
                  v_uni4_ok &= v_c8;
58728
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
58729
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
58730
                  v_uni4_ok &= v_c8;
58731
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
58732
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
58733
                  v_uni4_ok &= v_c8;
58734
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
58735
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
58736
                  v_uni4_ok &= v_c8;
58737
                  v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
58738
                  if (v_uni4_ok == 0u) {
58739
                  } else if ((v_uni4_value < 55296u) || (57343u < v_uni4_value)) {
58740
                    iop_a_src += 6u;
58741
                    *iop_a_dst++ = wuffs_base__make_token(
58742
                        (((uint64_t)((6291456u | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58743
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58744
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58745
                    goto label__string_loop_outer__continue;
58746
                  } else if (v_uni4_value >= 56320u) {
58747
                  } else {
58748
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 12u) {
58749
                      if (a_src && a_src->meta.closed) {
58750
                        if (self->private_impl.f_quirks[20u]) {
58751
                          iop_a_src += 6u;
58752
                          *iop_a_dst++ = wuffs_base__make_token(
58753
                              (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58754
                              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58755
                              (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58756
                          goto label__string_loop_outer__continue;
58757
                        }
58758
                        status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58759
                        goto exit;
58760
                      }
58761
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58762
                      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
58763
                      goto label__string_loop_outer__continue;
58764
                    }
58765
                    v_uni4_string = (wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 4u) >> 16u);
58766
                    if (((255u & (v_uni4_string >> 0u)) != 92u) || ((255u & (v_uni4_string >> 8u)) != 117u)) {
58767
                      v_uni4_high_surrogate = 0u;
58768
                      v_uni4_value = 0u;
58769
                      v_uni4_ok = 0u;
58770
                    } else {
58771
                      v_uni4_high_surrogate = (65536u + ((v_uni4_value - 55296u) << 10u));
58772
                      v_uni4_value = 0u;
58773
                      v_uni4_ok = 128u;
58774
                      v_uni4_string >>= 16u;
58775
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 0u))];
58776
                      v_uni4_ok &= v_c8;
58777
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
58778
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 8u))];
58779
                      v_uni4_ok &= v_c8;
58780
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
58781
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 16u))];
58782
                      v_uni4_ok &= v_c8;
58783
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
58784
                      v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni4_string >> 24u))];
58785
                      v_uni4_ok &= v_c8;
58786
                      v_uni4_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
58787
                    }
58788
                    if ((v_uni4_ok != 0u) && (56320u <= v_uni4_value) && (v_uni4_value <= 57343u)) {
58789
                      v_uni4_value -= 56320u;
58790
                      iop_a_src += 12u;
58791
                      *iop_a_dst++ = wuffs_base__make_token(
58792
                          (((uint64_t)((6291456u | v_uni4_high_surrogate | v_uni4_value))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58793
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58794
                          (((uint64_t)(12u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58795
                      goto label__string_loop_outer__continue;
58796
                    }
58797
                  }
58798
                  if (self->private_impl.f_quirks[20u]) {
58799
                    if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
58800
                      status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
58801
                      goto exit;
58802
                    }
58803
                    iop_a_src += 6u;
58804
                    *iop_a_dst++ = wuffs_base__make_token(
58805
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58806
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58807
                        (((uint64_t)(6u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58808
                    goto label__string_loop_outer__continue;
58809
                  }
58810
                } else if ((v_c8 == 85u) && self->private_impl.f_quirks[2u]) {
58811
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 10u) {
58812
                    if (a_src && a_src->meta.closed) {
58813
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58814
                      goto exit;
58815
                    }
58816
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58817
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
58818
                    goto label__string_loop_outer__continue;
58819
                  }
58820
                  v_uni8_string = wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 2u);
58821
                  v_uni8_value = 0u;
58822
                  v_uni8_ok = 128u;
58823
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 0u))];
58824
                  v_uni8_ok &= v_c8;
58825
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 28u);
58826
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 8u))];
58827
                  v_uni8_ok &= v_c8;
58828
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 24u);
58829
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 16u))];
58830
                  v_uni8_ok &= v_c8;
58831
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 20u);
58832
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 24u))];
58833
                  v_uni8_ok &= v_c8;
58834
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 16u);
58835
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 32u))];
58836
                  v_uni8_ok &= v_c8;
58837
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 12u);
58838
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 40u))];
58839
                  v_uni8_ok &= v_c8;
58840
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 8u);
58841
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 48u))];
58842
                  v_uni8_ok &= v_c8;
58843
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 4u);
58844
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_uni8_string >> 56u))];
58845
                  v_uni8_ok &= v_c8;
58846
                  v_uni8_value |= (((uint32_t)(((uint8_t)(v_c8 & 15u)))) << 0u);
58847
                  if (v_uni8_ok == 0u) {
58848
                  } else if ((v_uni8_value < 55296u) || ((57343u < v_uni8_value) && (v_uni8_value <= 1114111u))) {
58849
                    iop_a_src += 10u;
58850
                    *iop_a_dst++ = wuffs_base__make_token(
58851
                        (((uint64_t)((6291456u | (v_uni8_value & 2097151u)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58852
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58853
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58854
                    goto label__string_loop_outer__continue;
58855
                  } else if (self->private_impl.f_quirks[20u]) {
58856
                    iop_a_src += 10u;
58857
                    *iop_a_dst++ = wuffs_base__make_token(
58858
                        (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58859
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58860
                        (((uint64_t)(10u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58861
                    goto label__string_loop_outer__continue;
58862
                  }
58863
                } else if ((v_c8 == 120u) && self->private_impl.f_quirks[9u]) {
58864
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
58865
                    if (a_src && a_src->meta.closed) {
58866
                      status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58867
                      goto exit;
58868
                    }
58869
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58870
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
58871
                    goto label__string_loop_outer__continue;
58872
                  }
58873
                  v_backslash_x_string = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
58874
                  v_backslash_x_ok = 128u;
58875
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 16u))];
58876
                  v_backslash_x_ok &= v_c8;
58877
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 & 15u)) << 4u))));
58878
                  v_c8 = WUFFS_JSON__LUT_HEXADECIMAL_DIGITS[(255u & (v_backslash_x_string >> 24u))];
58879
                  v_backslash_x_ok &= v_c8;
58880
                  v_backslash_x_value = ((uint8_t)(((uint8_t)(v_backslash_x_value | ((uint8_t)(v_c8 & 15u))))));
58881
                  if ((v_backslash_x_ok == 0u) || ((v_backslash_x_string & 65535u) != 30812u)) {
58882
                    status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58883
                    goto exit;
58884
                  }
58885
                  iop_a_src += 4u;
58886
                  *iop_a_dst++ = wuffs_base__make_token(
58887
                      (((uint64_t)((6291456u | ((uint32_t)(v_backslash_x_value))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58888
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58889
                      (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58890
                  goto label__string_loop_outer__continue;
58891
                }
58892
                status = wuffs_base__make_status(wuffs_json__error__bad_backslash_escape);
58893
                goto exit;
58894
              } else if (v_char == 3u) {
58895
                if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
58896
                  if (v_string_length > 0u) {
58897
                    *iop_a_dst++ = wuffs_base__make_token(
58898
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58899
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58900
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58901
                    v_string_length = 0u;
58902
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58903
                      goto label__string_loop_outer__continue;
58904
                    }
58905
                  }
58906
                  if (a_src && a_src->meta.closed) {
58907
                    if (self->private_impl.f_quirks[20u]) {
58908
                      *iop_a_dst++ = wuffs_base__make_token(
58909
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58910
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58911
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58912
                      iop_a_src += 1u;
58913
                      goto label__string_loop_outer__continue;
58914
                    }
58915
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
58916
                    goto exit;
58917
                  }
58918
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58919
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
58920
                  goto label__string_loop_outer__continue;
58921
                }
58922
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
58923
                if ((v_multi_byte_utf8 & 49152u) == 32768u) {
58924
                  v_multi_byte_utf8 = ((1984u & ((uint32_t)(v_multi_byte_utf8 << 6u))) | (63u & (v_multi_byte_utf8 >> 8u)));
58925
                  iop_a_src += 2u;
58926
                  if (v_string_length >= 65528u) {
58927
                    *iop_a_dst++ = wuffs_base__make_token(
58928
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58929
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58930
                        (((uint64_t)((v_string_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58931
                    v_string_length = 0u;
58932
                    goto label__string_loop_outer__continue;
58933
                  }
58934
                  v_string_length += 2u;
58935
                  continue;
58936
                }
58937
              } else if (v_char == 4u) {
58938
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
58939
                  if (v_string_length > 0u) {
58940
                    *iop_a_dst++ = wuffs_base__make_token(
58941
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58942
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58943
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58944
                    v_string_length = 0u;
58945
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58946
                      goto label__string_loop_outer__continue;
58947
                    }
58948
                  }
58949
                  if (a_src && a_src->meta.closed) {
58950
                    if (self->private_impl.f_quirks[20u]) {
58951
                      *iop_a_dst++ = wuffs_base__make_token(
58952
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58953
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58954
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58955
                      iop_a_src += 1u;
58956
                      goto label__string_loop_outer__continue;
58957
                    }
58958
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
58959
                    goto exit;
58960
                  }
58961
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
58962
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(12);
58963
                  goto label__string_loop_outer__continue;
58964
                }
58965
                v_multi_byte_utf8 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
58966
                if ((v_multi_byte_utf8 & 12632064u) == 8421376u) {
58967
                  v_multi_byte_utf8 = ((61440u & ((uint32_t)(v_multi_byte_utf8 << 12u))) | (4032u & (v_multi_byte_utf8 >> 2u)) | (63u & (v_multi_byte_utf8 >> 16u)));
58968
                  if ((2047u < v_multi_byte_utf8) && ((v_multi_byte_utf8 < 55296u) || (57343u < v_multi_byte_utf8))) {
58969
                    iop_a_src += 3u;
58970
                    if (v_string_length >= 65528u) {
58971
                      *iop_a_dst++ = wuffs_base__make_token(
58972
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58973
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58974
                          (((uint64_t)((v_string_length + 3u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58975
                      v_string_length = 0u;
58976
                      goto label__string_loop_outer__continue;
58977
                    }
58978
                    v_string_length += 3u;
58979
                    continue;
58980
                  }
58981
                }
58982
              } else if (v_char == 5u) {
58983
                if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
58984
                  if (v_string_length > 0u) {
58985
                    *iop_a_dst++ = wuffs_base__make_token(
58986
                        (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58987
                        (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58988
                        (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
58989
                    v_string_length = 0u;
58990
                    if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
58991
                      goto label__string_loop_outer__continue;
58992
                    }
58993
                  }
58994
                  if (a_src && a_src->meta.closed) {
58995
                    if (self->private_impl.f_quirks[20u]) {
58996
                      *iop_a_dst++ = wuffs_base__make_token(
58997
                          (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
58998
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
58999
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59000
                      iop_a_src += 1u;
59001
                      goto label__string_loop_outer__continue;
59002
                    }
59003
                    status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59004
                    goto exit;
59005
                  }
59006
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59007
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(13);
59008
                  goto label__string_loop_outer__continue;
59009
                }
59010
                v_multi_byte_utf8 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
59011
                if ((v_multi_byte_utf8 & 3233857536u) == 2155905024u) {
59012
                  v_multi_byte_utf8 = ((1835008u & ((uint32_t)(v_multi_byte_utf8 << 18u))) |
59013
                      (258048u & ((uint32_t)(v_multi_byte_utf8 << 4u))) |
59014
                      (4032u & (v_multi_byte_utf8 >> 10u)) |
59015
                      (63u & (v_multi_byte_utf8 >> 24u)));
59016
                  if ((65535u < v_multi_byte_utf8) && (v_multi_byte_utf8 <= 1114111u)) {
59017
                    iop_a_src += 4u;
59018
                    if (v_string_length >= 65528u) {
59019
                      *iop_a_dst++ = wuffs_base__make_token(
59020
                          (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59021
                          (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59022
                          (((uint64_t)((v_string_length + 4u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59023
                      v_string_length = 0u;
59024
                      goto label__string_loop_outer__continue;
59025
                    }
59026
                    v_string_length += 4u;
59027
                    continue;
59028
                  }
59029
                }
59030
              }
59031
              if (v_string_length > 0u) {
59032
                *iop_a_dst++ = wuffs_base__make_token(
59033
                    (((uint64_t)(4194819u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59034
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59035
                    (((uint64_t)(v_string_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59036
                v_string_length = 0u;
59037
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59038
                  goto label__string_loop_outer__continue;
59039
                }
59040
              }
59041
              if (((uint8_t)(v_char & 128u)) != 0u) {
59042
                if (self->private_impl.f_quirks[0u]) {
59043
                  *iop_a_dst++ = wuffs_base__make_token(
59044
                      (((uint64_t)((6291456u | ((uint32_t)(((uint8_t)(v_char & 127u))))))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59045
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59046
                      (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59047
                  iop_a_src += 1u;
59048
                  goto label__string_loop_outer__continue;
59049
                }
59050
                if (v_char == 138u) {
59051
                  status = wuffs_base__make_status(wuffs_json__error__bad_new_line_in_a_string);
59052
                  goto exit;
59053
                }
59054
                status = wuffs_base__make_status(wuffs_json__error__bad_c0_control_code);
59055
                goto exit;
59056
              }
59057
              if (self->private_impl.f_quirks[20u]) {
59058
                *iop_a_dst++ = wuffs_base__make_token(
59059
                    (((uint64_t)(6356989u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59060
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59061
                    (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59062
                iop_a_src += 1u;
59063
                goto label__string_loop_outer__continue;
59064
              }
59065
              status = wuffs_base__make_status(wuffs_json__error__bad_utf_8);
59066
              goto exit;
59067
            }
59068
          }
59069
          label__string_loop_outer__break:;
59070
          while (true) {
59071
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59072
              if (a_src && a_src->meta.closed) {
59073
                status = wuffs_base__make_status(wuffs_json__error__bad_input);
59074
                goto exit;
59075
              }
59076
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59077
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(14);
59078
              continue;
59079
            }
59080
            if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59081
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59082
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(15);
59083
              continue;
59084
            }
59085
            iop_a_src += 1u;
59086
            *iop_a_dst++ = wuffs_base__make_token(
59087
                (((uint64_t)(4194579u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59088
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59089
            break;
59090
          }
59091
          if (0u == (v_expect & (((uint32_t)(1u)) << 4u))) {
59092
            v_expect = 4104u;
59093
            goto label__outer__continue;
59094
          }
59095
          break;
59096
        } else if (v_class == 2u) {
59097
          iop_a_src += 1u;
59098
          *iop_a_dst++ = wuffs_base__make_token(
59099
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59100
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59101
          if (0u == (v_expect & (((uint32_t)(1u)) << 8u))) {
59102
            if (self->private_impl.f_quirks[13u]) {
59103
              v_expect = 4162u;
59104
            } else {
59105
              v_expect = 4098u;
59106
            }
59107
          } else {
59108
            if (self->private_impl.f_quirks[13u]) {
59109
              v_expect = 8114u;
59110
            } else {
59111
              v_expect = 7858u;
59112
            }
59113
          }
59114
          goto label__outer__continue;
59115
        } else if (v_class == 3u) {
59116
          iop_a_src += 1u;
59117
          *iop_a_dst++ = wuffs_base__make_token(
59118
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59119
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59120
          v_expect = 7858u;
59121
          goto label__outer__continue;
59122
        } else if (v_class == 4u) {
59123
          while (true) {
59124
            if (a_src) {
59125
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59126
            }
59127
            v_number_length = wuffs_json__decoder__decode_number(self, a_src);
59128
            if (a_src) {
59129
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
59130
            }
59131
            v_number_status = (v_number_length >> 8u);
59132
            v_vminor = 10486787u;
59133
            if ((v_number_length & 128u) != 0u) {
59134
              v_vminor = 10486785u;
59135
            }
59136
            v_number_length = (v_number_length & 127u);
59137
            if (v_number_status == 0u) {
59138
              *iop_a_dst++ = wuffs_base__make_token(
59139
                  (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59140
                  (((uint64_t)(v_number_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59141
              break;
59142
            }
59143
            while (v_number_length > 0u) {
59144
              v_number_length -= 1u;
59145
              if (iop_a_src > io1_a_src) {
59146
                iop_a_src--;
59147
              } else {
59148
                status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
59149
                goto exit;
59150
              }
59151
            }
59152
            if (v_number_status == 1u) {
59153
              if (self->private_impl.f_quirks[14u]) {
59154
                if (a_dst) {
59155
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59156
                }
59157
                if (a_src) {
59158
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59159
                }
59160
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
59161
                status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
59162
                if (a_dst) {
59163
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59164
                }
59165
                if (a_src) {
59166
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
59167
                }
59168
                if (status.repr) {
59169
                  goto suspend;
59170
                }
59171
                break;
59172
              }
59173
              status = wuffs_base__make_status(wuffs_json__error__bad_input);
59174
              goto exit;
59175
            } else if (v_number_status == 2u) {
59176
              status = wuffs_base__make_status(wuffs_json__error__unsupported_number_length);
59177
              goto exit;
59178
            } else {
59179
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59180
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(17);
59181
              while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59182
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59183
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(18);
59184
              }
59185
            }
59186
          }
59187
          break;
59188
        } else if (v_class == 5u) {
59189
          v_vminor = 2113553u;
59190
          if (v_depth == 0u) {
59191
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
59192
            v_vminor = 2113601u;
59193
          } else {
59194
            v_vminor = 2113569u;
59195
          }
59196
          if (v_depth >= 1024u) {
59197
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
59198
            goto exit;
59199
          }
59200
          v_stack_byte = (v_depth / 32u);
59201
          v_stack_bit = (v_depth & 31u);
59202
          self->private_data.f_stack[v_stack_byte] |= (((uint32_t)(1u)) << v_stack_bit);
59203
          v_depth += 1u;
59204
          iop_a_src += 1u;
59205
          *iop_a_dst++ = wuffs_base__make_token(
59206
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59207
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59208
          v_expect = 4162u;
59209
          v_expect_after_value = 4164u;
59210
          goto label__outer__continue;
59211
        } else if (v_class == 6u) {
59212
          iop_a_src += 1u;
59213
          if (v_depth <= 1u) {
59214
            *iop_a_dst++ = wuffs_base__make_token(
59215
                (((uint64_t)(2101314u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59216
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59217
            goto label__outer__break;
59218
          }
59219
          v_depth -= 1u;
59220
          v_stack_byte = ((v_depth - 1u) / 32u);
59221
          v_stack_bit = ((v_depth - 1u) & 31u);
59222
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
59223
            *iop_a_dst++ = wuffs_base__make_token(
59224
                (((uint64_t)(2105410u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59225
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59226
            v_expect = 4356u;
59227
            v_expect_after_value = 4356u;
59228
          } else {
59229
            *iop_a_dst++ = wuffs_base__make_token(
59230
                (((uint64_t)(2113602u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59231
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59232
            v_expect = 4164u;
59233
            v_expect_after_value = 4164u;
59234
          }
59235
          goto label__outer__continue;
59236
        } else if (v_class == 7u) {
59237
          v_vminor = 2105361u;
59238
          if (v_depth == 0u) {
59239
          } else if (0u != (v_expect_after_value & (((uint32_t)(1u)) << 6u))) {
59240
            v_vminor = 2105409u;
59241
          } else {
59242
            v_vminor = 2105377u;
59243
          }
59244
          if (v_depth >= 1024u) {
59245
            status = wuffs_base__make_status(wuffs_json__error__unsupported_recursion_depth);
59246
            goto exit;
59247
          }
59248
          v_stack_byte = (v_depth / 32u);
59249
          v_stack_bit = (v_depth & 31u);
59250
          self->private_data.f_stack[v_stack_byte] &= (4294967295u ^ (((uint32_t)(1u)) << v_stack_bit));
59251
          v_depth += 1u;
59252
          iop_a_src += 1u;
59253
          *iop_a_dst++ = wuffs_base__make_token(
59254
              (((uint64_t)(v_vminor)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59255
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59256
          v_expect = 8114u;
59257
          v_expect_after_value = 4356u;
59258
          goto label__outer__continue;
59259
        } else if (v_class == 8u) {
59260
          iop_a_src += 1u;
59261
          if (v_depth <= 1u) {
59262
            *iop_a_dst++ = wuffs_base__make_token(
59263
                (((uint64_t)(2101282u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59264
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59265
            goto label__outer__break;
59266
          }
59267
          v_depth -= 1u;
59268
          v_stack_byte = ((v_depth - 1u) / 32u);
59269
          v_stack_bit = ((v_depth - 1u) & 31u);
59270
          if (0u == (self->private_data.f_stack[v_stack_byte] & (((uint32_t)(1u)) << v_stack_bit))) {
59271
            *iop_a_dst++ = wuffs_base__make_token(
59272
                (((uint64_t)(2105378u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59273
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59274
            v_expect = 4356u;
59275
            v_expect_after_value = 4356u;
59276
          } else {
59277
            *iop_a_dst++ = wuffs_base__make_token(
59278
                (((uint64_t)(2113570u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59279
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59280
            v_expect = 4164u;
59281
            v_expect_after_value = 4164u;
59282
          }
59283
          goto label__outer__continue;
59284
        } else if (v_class == 9u) {
59285
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 111546413966853u);
59286
          if (v_match == 0u) {
59287
            *iop_a_dst++ = wuffs_base__make_token(
59288
                (((uint64_t)(8388612u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59289
                (((uint64_t)(5u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59290
            if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
59291
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
59292
              goto exit;
59293
            }
59294
            iop_a_src += 5u;
59295
            break;
59296
          } else if (v_match == 1u) {
59297
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59298
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(19);
59299
            goto label__outer__continue;
59300
          }
59301
        } else if (v_class == 10u) {
59302
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 435762131972u);
59303
          if (v_match == 0u) {
59304
            *iop_a_dst++ = wuffs_base__make_token(
59305
                (((uint64_t)(8388616u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59306
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59307
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
59308
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
59309
              goto exit;
59310
            }
59311
            iop_a_src += 4u;
59312
            break;
59313
          } else if (v_match == 1u) {
59314
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59315
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(20);
59316
            goto label__outer__continue;
59317
          }
59318
        } else if (v_class == 11u) {
59319
          v_match = wuffs_private_impl__io_reader__match7(iop_a_src, io2_a_src, a_src, 465676103172u);
59320
          if (v_match == 0u) {
59321
            *iop_a_dst++ = wuffs_base__make_token(
59322
                (((uint64_t)(8388610u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59323
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59324
            if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
59325
              status = wuffs_base__make_status(wuffs_json__error__internal_error_inconsistent_i_o);
59326
              goto exit;
59327
            }
59328
            iop_a_src += 4u;
59329
            break;
59330
          } else if (v_match == 1u) {
59331
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59332
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
59333
            goto label__outer__continue;
59334
          }
59335
          if (self->private_impl.f_quirks[14u]) {
59336
            if (a_dst) {
59337
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59338
            }
59339
            if (a_src) {
59340
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59341
            }
59342
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
59343
            status = wuffs_json__decoder__decode_inf_nan(self, a_dst, a_src);
59344
            if (a_dst) {
59345
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59346
            }
59347
            if (a_src) {
59348
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
59349
            }
59350
            if (status.repr) {
59351
              goto suspend;
59352
            }
59353
            break;
59354
          }
59355
        } else if (v_class == 12u) {
59356
          if (self->private_impl.f_quirks[11u] || self->private_impl.f_quirks[12u]) {
59357
            if (a_dst) {
59358
              a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59359
            }
59360
            if (a_src) {
59361
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59362
            }
59363
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
59364
            status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
59365
            if (a_dst) {
59366
              iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59367
            }
59368
            if (a_src) {
59369
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
59370
            }
59371
            if (status.repr) {
59372
              goto suspend;
59373
            }
59374
            if (self->private_impl.f_comment_type > 0u) {
59375
              goto label__outer__continue;
59376
            }
59377
          }
59378
        }
59379
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
59380
        goto exit;
59381
      }
59382
      if (v_depth == 0u) {
59383
        break;
59384
      }
59385
      v_expect = v_expect_after_value;
59386
    }
59387
    label__outer__break:;
59388
    if (self->private_impl.f_quirks[17u] || self->private_impl.f_quirks[18u]) {
59389
      if (a_dst) {
59390
        a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59391
      }
59392
      if (a_src) {
59393
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59394
      }
59395
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
59396
      status = wuffs_json__decoder__decode_trailer(self, a_dst, a_src);
59397
      if (a_dst) {
59398
        iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
59399
      }
59400
      if (a_src) {
59401
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
59402
      }
59403
      if (status.repr) {
59404
        goto suspend;
59405
      }
59406
    }
59407
    self->private_impl.f_end_of_data = true;
59408
59409
    ok:
59410
    self->private_impl.p_decode_tokens = 0;
59411
    goto exit;
59412
  }
59413
59414
  goto suspend;
59415
  suspend:
59416
  self->private_impl.p_decode_tokens = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
59417
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
59418
  self->private_data.s_decode_tokens.v_depth = v_depth;
59419
  self->private_data.s_decode_tokens.v_expect = v_expect;
59420
  self->private_data.s_decode_tokens.v_expect_after_value = v_expect_after_value;
59421
59422
  goto exit;
59423
  exit:
59424
  if (a_dst && a_dst->data.ptr) {
59425
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59426
  }
59427
  if (a_src && a_src->data.ptr) {
59428
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59429
  }
59430
59431
  if (wuffs_base__status__is_error(&status)) {
59432
    self->private_impl.magic = WUFFS_BASE__DISABLED;
59433
  }
59434
  return status;
59435
}
59436
59437
// -------- func json.decoder.decode_number
59438
59439
WUFFS_BASE__GENERATED_C_CODE
59440
static uint32_t
59441
wuffs_json__decoder__decode_number(
59442
    wuffs_json__decoder* self,
59443
    wuffs_base__io_buffer* a_src) {
59444
  uint8_t v_c8 = 0;
59445
  uint32_t v_n = 0;
59446
  uint32_t v_floating_point = 0;
59447
59448
  const uint8_t* iop_a_src = NULL;
59449
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59450
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59451
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59452
  if (a_src && a_src->data.ptr) {
59453
    io0_a_src = a_src->data.ptr;
59454
    io1_a_src = io0_a_src + a_src->meta.ri;
59455
    iop_a_src = io1_a_src;
59456
    io2_a_src = io0_a_src + a_src->meta.wi;
59457
  }
59458
59459
  do {
59460
    v_n = 0u;
59461
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59462
      if ( ! (a_src && a_src->meta.closed)) {
59463
        v_n |= 768u;
59464
      }
59465
      break;
59466
    }
59467
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59468
    if (v_c8 != 45u) {
59469
    } else {
59470
      v_n += 1u;
59471
      iop_a_src += 1u;
59472
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59473
        if ( ! (a_src && a_src->meta.closed)) {
59474
          v_n |= 768u;
59475
        }
59476
        v_n |= 256u;
59477
        break;
59478
      }
59479
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59480
    }
59481
    if (v_c8 == 48u) {
59482
      v_n += 1u;
59483
      iop_a_src += 1u;
59484
    } else {
59485
      if (a_src) {
59486
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59487
      }
59488
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
59489
      if (a_src) {
59490
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
59491
      }
59492
      if (v_n > 99u) {
59493
        break;
59494
      }
59495
    }
59496
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59497
      if ( ! (a_src && a_src->meta.closed)) {
59498
        v_n |= 768u;
59499
      }
59500
      break;
59501
    }
59502
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59503
    if (v_c8 != 46u) {
59504
    } else {
59505
      if (v_n >= 99u) {
59506
        v_n |= 512u;
59507
        break;
59508
      }
59509
      v_n += 1u;
59510
      iop_a_src += 1u;
59511
      v_floating_point = 128u;
59512
      if (a_src) {
59513
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59514
      }
59515
      v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
59516
      if (a_src) {
59517
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
59518
      }
59519
      if (v_n > 99u) {
59520
        break;
59521
      }
59522
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59523
        if ( ! (a_src && a_src->meta.closed)) {
59524
          v_n |= 768u;
59525
        }
59526
        break;
59527
      }
59528
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59529
    }
59530
    if ((v_c8 != 69u) && (v_c8 != 101u)) {
59531
      break;
59532
    }
59533
    if (v_n >= 99u) {
59534
      v_n |= 512u;
59535
      break;
59536
    }
59537
    v_n += 1u;
59538
    iop_a_src += 1u;
59539
    v_floating_point = 128u;
59540
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59541
      if ( ! (a_src && a_src->meta.closed)) {
59542
        v_n |= 768u;
59543
      }
59544
      v_n |= 256u;
59545
      break;
59546
    }
59547
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59548
    if ((v_c8 != 43u) && (v_c8 != 45u)) {
59549
    } else {
59550
      if (v_n >= 99u) {
59551
        v_n |= 512u;
59552
        break;
59553
      }
59554
      v_n += 1u;
59555
      iop_a_src += 1u;
59556
    }
59557
    if (a_src) {
59558
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59559
    }
59560
    v_n = wuffs_json__decoder__decode_digits(self, a_src, v_n);
59561
    if (a_src) {
59562
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
59563
    }
59564
  } while (0);
59565
  if (a_src && a_src->data.ptr) {
59566
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59567
  }
59568
  return (v_n | v_floating_point);
59569
}
59570
59571
// -------- func json.decoder.decode_digits
59572
59573
WUFFS_BASE__GENERATED_C_CODE
59574
static uint32_t
59575
wuffs_json__decoder__decode_digits(
59576
    wuffs_json__decoder* self,
59577
    wuffs_base__io_buffer* a_src,
59578
    uint32_t a_n) {
59579
  uint8_t v_c8 = 0;
59580
  uint32_t v_n = 0;
59581
59582
  const uint8_t* iop_a_src = NULL;
59583
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59584
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59585
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59586
  if (a_src && a_src->data.ptr) {
59587
    io0_a_src = a_src->data.ptr;
59588
    io1_a_src = io0_a_src + a_src->meta.ri;
59589
    iop_a_src = io1_a_src;
59590
    io2_a_src = io0_a_src + a_src->meta.wi;
59591
  }
59592
59593
  v_n = a_n;
59594
  while (true) {
59595
    if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59596
      if ( ! (a_src && a_src->meta.closed)) {
59597
        v_n |= 768u;
59598
      }
59599
      break;
59600
    }
59601
    v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59602
    if (0u == WUFFS_JSON__LUT_DECIMAL_DIGITS[v_c8]) {
59603
      break;
59604
    }
59605
    if (v_n >= 99u) {
59606
      v_n |= 512u;
59607
      break;
59608
    }
59609
    v_n += 1u;
59610
    iop_a_src += 1u;
59611
  }
59612
  if (v_n == a_n) {
59613
    v_n |= 256u;
59614
  }
59615
  if (a_src && a_src->data.ptr) {
59616
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59617
  }
59618
  return v_n;
59619
}
59620
59621
// -------- func json.decoder.decode_leading
59622
59623
WUFFS_BASE__GENERATED_C_CODE
59624
static wuffs_base__status
59625
wuffs_json__decoder__decode_leading(
59626
    wuffs_json__decoder* self,
59627
    wuffs_base__token_buffer* a_dst,
59628
    wuffs_base__io_buffer* a_src) {
59629
  wuffs_base__status status = wuffs_base__make_status(NULL);
59630
59631
  uint8_t v_c8 = 0;
59632
  uint32_t v_u = 0;
59633
59634
  wuffs_base__token* iop_a_dst = NULL;
59635
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59636
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59637
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59638
  if (a_dst && a_dst->data.ptr) {
59639
    io0_a_dst = a_dst->data.ptr;
59640
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59641
    iop_a_dst = io1_a_dst;
59642
    io2_a_dst = io0_a_dst + a_dst->data.len;
59643
    if (a_dst->meta.closed) {
59644
      io2_a_dst = iop_a_dst;
59645
    }
59646
  }
59647
  const uint8_t* iop_a_src = NULL;
59648
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59649
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59650
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59651
  if (a_src && a_src->data.ptr) {
59652
    io0_a_src = a_src->data.ptr;
59653
    io1_a_src = io0_a_src + a_src->meta.ri;
59654
    iop_a_src = io1_a_src;
59655
    io2_a_src = io0_a_src + a_src->meta.wi;
59656
  }
59657
59658
  uint32_t coro_susp_point = self->private_impl.p_decode_leading;
59659
  switch (coro_susp_point) {
59660
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59661
59662
    self->private_impl.f_allow_leading_ars = self->private_impl.f_quirks[15u];
59663
    self->private_impl.f_allow_leading_ubom = self->private_impl.f_quirks[16u];
59664
    while (self->private_impl.f_allow_leading_ars || self->private_impl.f_allow_leading_ubom) {
59665
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59666
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59667
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
59668
        continue;
59669
      }
59670
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59671
        if (a_src && a_src->meta.closed) {
59672
          break;
59673
        }
59674
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59675
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
59676
        continue;
59677
      }
59678
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59679
      if ((v_c8 == 30u) && self->private_impl.f_allow_leading_ars) {
59680
        self->private_impl.f_allow_leading_ars = false;
59681
        iop_a_src += 1u;
59682
        *iop_a_dst++ = wuffs_base__make_token(
59683
            (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59684
            (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59685
        continue;
59686
      } else if ((v_c8 == 239u) && self->private_impl.f_allow_leading_ubom) {
59687
        if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
59688
          if (a_src && a_src->meta.closed) {
59689
            break;
59690
          }
59691
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59692
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
59693
          continue;
59694
        }
59695
        v_u = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
59696
        if (v_u == 12565487u) {
59697
          self->private_impl.f_allow_leading_ubom = false;
59698
          iop_a_src += 3u;
59699
          *iop_a_dst++ = wuffs_base__make_token(
59700
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59701
              (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59702
          continue;
59703
        }
59704
      }
59705
      break;
59706
    }
59707
59708
    ok:
59709
    self->private_impl.p_decode_leading = 0;
59710
    goto exit;
59711
  }
59712
59713
  goto suspend;
59714
  suspend:
59715
  self->private_impl.p_decode_leading = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
59716
59717
  goto exit;
59718
  exit:
59719
  if (a_dst && a_dst->data.ptr) {
59720
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59721
  }
59722
  if (a_src && a_src->data.ptr) {
59723
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59724
  }
59725
59726
  return status;
59727
}
59728
59729
// -------- func json.decoder.decode_comment
59730
59731
WUFFS_BASE__GENERATED_C_CODE
59732
static wuffs_base__status
59733
wuffs_json__decoder__decode_comment(
59734
    wuffs_json__decoder* self,
59735
    wuffs_base__token_buffer* a_dst,
59736
    wuffs_base__io_buffer* a_src) {
59737
  wuffs_base__status status = wuffs_base__make_status(NULL);
59738
59739
  uint8_t v_c8 = 0;
59740
  uint16_t v_c16 = 0;
59741
  uint32_t v_length = 0;
59742
59743
  wuffs_base__token* iop_a_dst = NULL;
59744
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59745
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59746
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59747
  if (a_dst && a_dst->data.ptr) {
59748
    io0_a_dst = a_dst->data.ptr;
59749
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59750
    iop_a_dst = io1_a_dst;
59751
    io2_a_dst = io0_a_dst + a_dst->data.len;
59752
    if (a_dst->meta.closed) {
59753
      io2_a_dst = iop_a_dst;
59754
    }
59755
  }
59756
  const uint8_t* iop_a_src = NULL;
59757
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59758
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59759
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59760
  if (a_src && a_src->data.ptr) {
59761
    io0_a_src = a_src->data.ptr;
59762
    io1_a_src = io0_a_src + a_src->meta.ri;
59763
    iop_a_src = io1_a_src;
59764
    io2_a_src = io0_a_src + a_src->meta.wi;
59765
  }
59766
59767
  uint32_t coro_susp_point = self->private_impl.p_decode_comment;
59768
  switch (coro_susp_point) {
59769
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59770
59771
    self->private_impl.f_comment_type = 0u;
59772
    while ((((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) || (((uint64_t)(io2_a_src - iop_a_src)) <= 1u)) {
59773
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59774
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59775
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
59776
        continue;
59777
      }
59778
      if (a_src && a_src->meta.closed) {
59779
        status = wuffs_base__make_status(NULL);
59780
        goto ok;
59781
      }
59782
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59783
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
59784
    }
59785
    v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
59786
    if ((v_c16 == 10799u) && self->private_impl.f_quirks[11u]) {
59787
      iop_a_src += 2u;
59788
      v_length = 2u;
59789
      while (true) {
59790
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 1u) {
59791
          if (v_length > 0u) {
59792
            *iop_a_dst++ = wuffs_base__make_token(
59793
                (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59794
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59795
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59796
          }
59797
          if (a_src && a_src->meta.closed) {
59798
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
59799
            goto exit;
59800
          }
59801
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59802
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
59803
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59804
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59805
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
59806
          }
59807
          v_length = 0u;
59808
          continue;
59809
        }
59810
        v_c16 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
59811
        if (v_c16 == 12074u) {
59812
          iop_a_src += 2u;
59813
          *iop_a_dst++ = wuffs_base__make_token(
59814
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59815
              (((uint64_t)((v_length + 2u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59816
          self->private_impl.f_comment_type = 1u;
59817
          status = wuffs_base__make_status(NULL);
59818
          goto ok;
59819
        }
59820
        iop_a_src += 1u;
59821
        if (v_length >= 65533u) {
59822
          *iop_a_dst++ = wuffs_base__make_token(
59823
              (((uint64_t)(2u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59824
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59825
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59826
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59827
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59828
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
59829
          }
59830
          v_length = 0u;
59831
          continue;
59832
        }
59833
        v_length += 1u;
59834
      }
59835
    } else if ((v_c16 == 12079u) && self->private_impl.f_quirks[12u]) {
59836
      iop_a_src += 2u;
59837
      v_length = 2u;
59838
      while (true) {
59839
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
59840
          if (a_src && a_src->meta.closed) {
59841
            *iop_a_dst++ = wuffs_base__make_token(
59842
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59843
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59844
            self->private_impl.f_comment_type = 2u;
59845
            status = wuffs_base__make_status(NULL);
59846
            goto ok;
59847
          } else if (v_length > 0u) {
59848
            *iop_a_dst++ = wuffs_base__make_token(
59849
                (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59850
                (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59851
                (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59852
          }
59853
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59854
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
59855
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59856
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59857
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
59858
          }
59859
          v_length = 0u;
59860
          continue;
59861
        }
59862
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
59863
        if (v_c8 == 10u) {
59864
          *iop_a_dst++ = wuffs_base__make_token(
59865
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59866
              (((uint64_t)(v_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59867
          self->private_impl.f_comment_type = 2u;
59868
          status = wuffs_base__make_status(NULL);
59869
          goto ok;
59870
        }
59871
        iop_a_src += 1u;
59872
        if (v_length >= 65533u) {
59873
          *iop_a_dst++ = wuffs_base__make_token(
59874
              (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59875
              (((uint64_t)(1u)) << WUFFS_BASE__TOKEN__CONTINUED__SHIFT) |
59876
              (((uint64_t)((v_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59877
          while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59878
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59879
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
59880
          }
59881
          v_length = 0u;
59882
          continue;
59883
        }
59884
        v_length += 1u;
59885
      }
59886
    }
59887
59888
    ok:
59889
    self->private_impl.p_decode_comment = 0;
59890
    goto exit;
59891
  }
59892
59893
  goto suspend;
59894
  suspend:
59895
  self->private_impl.p_decode_comment = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
59896
59897
  goto exit;
59898
  exit:
59899
  if (a_dst && a_dst->data.ptr) {
59900
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
59901
  }
59902
  if (a_src && a_src->data.ptr) {
59903
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
59904
  }
59905
59906
  return status;
59907
}
59908
59909
// -------- func json.decoder.decode_inf_nan
59910
59911
WUFFS_BASE__GENERATED_C_CODE
59912
static wuffs_base__status
59913
wuffs_json__decoder__decode_inf_nan(
59914
    wuffs_json__decoder* self,
59915
    wuffs_base__token_buffer* a_dst,
59916
    wuffs_base__io_buffer* a_src) {
59917
  wuffs_base__status status = wuffs_base__make_status(NULL);
59918
59919
  uint32_t v_c32 = 0;
59920
  uint32_t v_neg = 0;
59921
59922
  wuffs_base__token* iop_a_dst = NULL;
59923
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59924
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59925
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59926
  if (a_dst && a_dst->data.ptr) {
59927
    io0_a_dst = a_dst->data.ptr;
59928
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
59929
    iop_a_dst = io1_a_dst;
59930
    io2_a_dst = io0_a_dst + a_dst->data.len;
59931
    if (a_dst->meta.closed) {
59932
      io2_a_dst = iop_a_dst;
59933
    }
59934
  }
59935
  const uint8_t* iop_a_src = NULL;
59936
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59937
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59938
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
59939
  if (a_src && a_src->data.ptr) {
59940
    io0_a_src = a_src->data.ptr;
59941
    io1_a_src = io0_a_src + a_src->meta.ri;
59942
    iop_a_src = io1_a_src;
59943
    io2_a_src = io0_a_src + a_src->meta.wi;
59944
  }
59945
59946
  uint32_t coro_susp_point = self->private_impl.p_decode_inf_nan;
59947
  switch (coro_susp_point) {
59948
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
59949
59950
    while (true) {
59951
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
59952
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
59953
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
59954
        continue;
59955
      }
59956
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 2u) {
59957
        if (a_src && a_src->meta.closed) {
59958
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
59959
          goto exit;
59960
        }
59961
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59962
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
59963
        continue;
59964
      }
59965
      v_c32 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
59966
      if ((v_c32 | 2105376u) == 6712937u) {
59967
        if (((uint64_t)(io2_a_src - iop_a_src)) > 7u) {
59968
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) | 2314885530818453536u) == 8751735898823356009u) {
59969
            *iop_a_dst++ = wuffs_base__make_token(
59970
                (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59971
                (((uint64_t)(8u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59972
            iop_a_src += 8u;
59973
            status = wuffs_base__make_status(NULL);
59974
            goto ok;
59975
          }
59976
        } else if ( ! (a_src && a_src->meta.closed)) {
59977
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
59978
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
59979
          continue;
59980
        }
59981
        *iop_a_dst++ = wuffs_base__make_token(
59982
            (((uint64_t)(10485792u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59983
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59984
        iop_a_src += 3u;
59985
        status = wuffs_base__make_status(NULL);
59986
        goto ok;
59987
      } else if ((v_c32 | 2105376u) == 7233902u) {
59988
        *iop_a_dst++ = wuffs_base__make_token(
59989
            (((uint64_t)(10485888u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
59990
            (((uint64_t)(3u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
59991
        iop_a_src += 3u;
59992
        status = wuffs_base__make_status(NULL);
59993
        goto ok;
59994
      } else if ((v_c32 & 255u) == 43u) {
59995
        v_neg = 0u;
59996
      } else if ((v_c32 & 255u) == 45u) {
59997
        v_neg = 1u;
59998
      } else {
59999
        status = wuffs_base__make_status(wuffs_json__error__bad_input);
60000
        goto exit;
60001
      }
60002
      if (((uint64_t)(io2_a_src - iop_a_src)) <= 3u) {
60003
        if (a_src && a_src->meta.closed) {
60004
          status = wuffs_base__make_status(wuffs_json__error__bad_input);
60005
          goto exit;
60006
        }
60007
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60008
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
60009
        continue;
60010
      }
60011
      v_c32 = (wuffs_base__peek_u32le__no_bounds_check(iop_a_src) >> 8u);
60012
      if ((v_c32 | 2105376u) == 6712937u) {
60013
        if (((uint64_t)(io2_a_src - iop_a_src)) > 8u) {
60014
          if ((wuffs_base__peek_u64le__no_bounds_check(iop_a_src + 1u) | 2314885530818453536u) == 8751735898823356009u) {
60015
            *iop_a_dst++ = wuffs_base__make_token(
60016
                (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60017
                (((uint64_t)(9u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60018
            iop_a_src += 9u;
60019
            status = wuffs_base__make_status(NULL);
60020
            goto ok;
60021
          }
60022
        } else if ( ! (a_src && a_src->meta.closed)) {
60023
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60024
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
60025
          continue;
60026
        }
60027
        *iop_a_dst++ = wuffs_base__make_token(
60028
            (((uint64_t)((10485760u | (((uint32_t)(32u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60029
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60030
        iop_a_src += 4u;
60031
        status = wuffs_base__make_status(NULL);
60032
        goto ok;
60033
      } else if ((v_c32 | 2105376u) == 7233902u) {
60034
        *iop_a_dst++ = wuffs_base__make_token(
60035
            (((uint64_t)((10485760u | (((uint32_t)(128u)) >> v_neg)))) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60036
            (((uint64_t)(4u)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60037
        iop_a_src += 4u;
60038
        status = wuffs_base__make_status(NULL);
60039
        goto ok;
60040
      }
60041
      status = wuffs_base__make_status(wuffs_json__error__bad_input);
60042
      goto exit;
60043
    }
60044
60045
    ok:
60046
    self->private_impl.p_decode_inf_nan = 0;
60047
    goto exit;
60048
  }
60049
60050
  goto suspend;
60051
  suspend:
60052
  self->private_impl.p_decode_inf_nan = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60053
60054
  goto exit;
60055
  exit:
60056
  if (a_dst && a_dst->data.ptr) {
60057
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60058
  }
60059
  if (a_src && a_src->data.ptr) {
60060
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60061
  }
60062
60063
  return status;
60064
}
60065
60066
// -------- func json.decoder.decode_trailer
60067
60068
WUFFS_BASE__GENERATED_C_CODE
60069
static wuffs_base__status
60070
wuffs_json__decoder__decode_trailer(
60071
    wuffs_json__decoder* self,
60072
    wuffs_base__token_buffer* a_dst,
60073
    wuffs_base__io_buffer* a_src) {
60074
  wuffs_base__status status = wuffs_base__make_status(NULL);
60075
60076
  uint8_t v_c8 = 0;
60077
  uint32_t v_whitespace_length = 0;
60078
60079
  wuffs_base__token* iop_a_dst = NULL;
60080
  wuffs_base__token* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60081
  wuffs_base__token* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60082
  wuffs_base__token* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60083
  if (a_dst && a_dst->data.ptr) {
60084
    io0_a_dst = a_dst->data.ptr;
60085
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60086
    iop_a_dst = io1_a_dst;
60087
    io2_a_dst = io0_a_dst + a_dst->data.len;
60088
    if (a_dst->meta.closed) {
60089
      io2_a_dst = iop_a_dst;
60090
    }
60091
  }
60092
  const uint8_t* iop_a_src = NULL;
60093
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60094
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60095
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60096
  if (a_src && a_src->data.ptr) {
60097
    io0_a_src = a_src->data.ptr;
60098
    io1_a_src = io0_a_src + a_src->meta.ri;
60099
    iop_a_src = io1_a_src;
60100
    io2_a_src = io0_a_src + a_src->meta.wi;
60101
  }
60102
60103
  uint32_t coro_susp_point = self->private_impl.p_decode_trailer;
60104
  switch (coro_susp_point) {
60105
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
60106
60107
    if (self->private_impl.f_quirks[18u]) {
60108
      self->private_impl.f_trailer_stop = 10u;
60109
    } else {
60110
      self->private_impl.f_trailer_stop = 0u;
60111
    }
60112
    label__outer__continue:;
60113
    while (true) {
60114
      if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
60115
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
60116
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
60117
        continue;
60118
      }
60119
      v_whitespace_length = 0u;
60120
      while (true) {
60121
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60122
          if (v_whitespace_length > 0u) {
60123
            *iop_a_dst++ = wuffs_base__make_token(
60124
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60125
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60126
          }
60127
          if (a_src && a_src->meta.closed) {
60128
            goto label__outer__break;
60129
          }
60130
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
60131
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
60132
          goto label__outer__continue;
60133
        }
60134
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60135
        if (WUFFS_JSON__LUT_CLASSES[v_c8] != 0u) {
60136
          if (v_whitespace_length > 0u) {
60137
            *iop_a_dst++ = wuffs_base__make_token(
60138
                (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60139
                (((uint64_t)(v_whitespace_length)) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60140
          }
60141
          if (self->private_impl.f_trailer_stop > 0u) {
60142
            status = wuffs_base__make_status(wuffs_json__error__bad_input);
60143
            goto exit;
60144
          }
60145
          if (a_dst) {
60146
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60147
          }
60148
          if (a_src) {
60149
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60150
          }
60151
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
60152
          status = wuffs_json__decoder__decode_comment(self, a_dst, a_src);
60153
          if (a_dst) {
60154
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
60155
          }
60156
          if (a_src) {
60157
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
60158
          }
60159
          if (status.repr) {
60160
            goto suspend;
60161
          }
60162
          if (self->private_impl.f_comment_type > 0u) {
60163
            goto label__outer__continue;
60164
          }
60165
          status = wuffs_base__make_status(NULL);
60166
          goto ok;
60167
        }
60168
        iop_a_src += 1u;
60169
        if ((v_whitespace_length >= 65534u) || (v_c8 == self->private_impl.f_trailer_stop)) {
60170
          *iop_a_dst++ = wuffs_base__make_token(
60171
              (((uint64_t)(0u)) << WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT) |
60172
              (((uint64_t)((v_whitespace_length + 1u))) << WUFFS_BASE__TOKEN__LENGTH__SHIFT));
60173
          if (v_c8 == self->private_impl.f_trailer_stop) {
60174
            status = wuffs_base__make_status(NULL);
60175
            goto ok;
60176
          }
60177
          goto label__outer__continue;
60178
        }
60179
        v_whitespace_length += 1u;
60180
      }
60181
    }
60182
    label__outer__break:;
60183
60184
    ok:
60185
    self->private_impl.p_decode_trailer = 0;
60186
    goto exit;
60187
  }
60188
60189
  goto suspend;
60190
  suspend:
60191
  self->private_impl.p_decode_trailer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
60192
60193
  goto exit;
60194
  exit:
60195
  if (a_dst && a_dst->data.ptr) {
60196
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
60197
  }
60198
  if (a_src && a_src->data.ptr) {
60199
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
60200
  }
60201
60202
  return status;
60203
}
60204
60205
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JSON)
60206
60207
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
60208
60209
// ---------------- Status Codes Implementations
60210
60211
const char wuffs_lzma__error__bad_lzma2_header[] = "#lzma: bad LZMA2 header";
60212
const char wuffs_lzma__error__bad_bitstream_trailer[] = "#lzma: bad bitstream trailer";
60213
const char wuffs_lzma__error__bad_code[] = "#lzma: bad code";
60214
const char wuffs_lzma__error__bad_decoded_length[] = "#lzma: bad decoded length";
60215
const char wuffs_lzma__error__bad_distance[] = "#lzma: bad distance";
60216
const char wuffs_lzma__error__bad_header[] = "#lzma: bad header";
60217
const char wuffs_lzma__error__truncated_input[] = "#lzma: truncated input";
60218
const char wuffs_lzma__error__unsupported_decoded_length[] = "#lzma: unsupported decoded length";
60219
const char wuffs_lzma__error__unsupported_properties[] = "#lzma: unsupported properties";
60220
const char wuffs_lzma__error__internal_error_inconsistent_i_o[] = "#lzma: internal error: inconsistent I/O";
60221
const char wuffs_lzma__error__internal_error_inconsistent_dictionary_state[] = "#lzma: internal error: inconsistent dictionary state";
60222
60223
// ---------------- Private Consts
60224
60225
static const uint8_t
60226
WUFFS_LZMA__STATE_TRANSITION_LITERAL[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
60227
  0u, 0u, 0u, 0u, 1u, 2u, 3u, 4u,
60228
  5u, 6u, 4u, 5u,
60229
};
60230
60231
static const uint8_t
60232
WUFFS_LZMA__STATE_TRANSITION_MATCH[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
60233
  7u, 7u, 7u, 7u, 7u, 7u, 7u, 10u,
60234
  10u, 10u, 10u, 10u,
60235
};
60236
60237
static const uint8_t
60238
WUFFS_LZMA__STATE_TRANSITION_LONGREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
60239
  8u, 8u, 8u, 8u, 8u, 8u, 8u, 11u,
60240
  11u, 11u, 11u, 11u,
60241
};
60242
60243
static const uint8_t
60244
WUFFS_LZMA__STATE_TRANSITION_SHORTREP[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
60245
  9u, 9u, 9u, 9u, 9u, 9u, 9u, 11u,
60246
  11u, 11u, 11u, 11u,
60247
};
60248
60249
static const uint8_t
60250
WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
60251
  0u, 1u, 2u, 3u, 3u, 3u, 3u, 3u,
60252
};
60253
60254
#define WUFFS_LZMA__QUIRKS_BASE 1290294272u
60255
60256
// ---------------- Private Initializer Prototypes
60257
60258
// ---------------- Private Function Prototypes
60259
60260
WUFFS_BASE__GENERATED_C_CODE
60261
static wuffs_base__status
60262
wuffs_lzma__decoder__decode_bitstream_fast(
60263
    wuffs_lzma__decoder* self,
60264
    wuffs_base__io_buffer* a_dst,
60265
    wuffs_base__io_buffer* a_src,
60266
    wuffs_base__slice_u8 a_workbuf);
60267
60268
WUFFS_BASE__GENERATED_C_CODE
60269
static wuffs_base__status
60270
wuffs_lzma__decoder__decode_bitstream_slow(
60271
    wuffs_lzma__decoder* self,
60272
    wuffs_base__io_buffer* a_dst,
60273
    wuffs_base__io_buffer* a_src,
60274
    wuffs_base__slice_u8 a_workbuf);
60275
60276
WUFFS_BASE__GENERATED_C_CODE
60277
static wuffs_base__status
60278
wuffs_lzma__decoder__add_history(
60279
    wuffs_lzma__decoder* self,
60280
    wuffs_base__slice_u8 a_hist,
60281
    wuffs_base__slice_u8 a_workbuf);
60282
60283
WUFFS_BASE__GENERATED_C_CODE
60284
static wuffs_base__status
60285
wuffs_lzma__decoder__do_transform_io(
60286
    wuffs_lzma__decoder* self,
60287
    wuffs_base__io_buffer* a_dst,
60288
    wuffs_base__io_buffer* a_src,
60289
    wuffs_base__slice_u8 a_workbuf);
60290
60291
WUFFS_BASE__GENERATED_C_CODE
60292
static wuffs_base__status
60293
wuffs_lzma__decoder__decode_bitstream(
60294
    wuffs_lzma__decoder* self,
60295
    wuffs_base__io_buffer* a_dst,
60296
    wuffs_base__io_buffer* a_src,
60297
    wuffs_base__slice_u8 a_workbuf);
60298
60299
WUFFS_BASE__GENERATED_C_CODE
60300
static wuffs_base__status
60301
wuffs_lzma__decoder__update_stashed_bytes(
60302
    wuffs_lzma__decoder* self,
60303
    wuffs_base__io_buffer* a_dst,
60304
    wuffs_base__slice_u8 a_workbuf);
60305
60306
WUFFS_BASE__GENERATED_C_CODE
60307
static wuffs_base__status
60308
wuffs_lzma__decoder__decode_optional_end_of_stream(
60309
    wuffs_lzma__decoder* self,
60310
    wuffs_base__io_buffer* a_src,
60311
    wuffs_base__slice_u8 a_workbuf);
60312
60313
WUFFS_BASE__GENERATED_C_CODE
60314
static wuffs_base__empty_struct
60315
wuffs_lzma__decoder__initialize_dict(
60316
    wuffs_lzma__decoder* self);
60317
60318
WUFFS_BASE__GENERATED_C_CODE
60319
static wuffs_base__empty_struct
60320
wuffs_lzma__decoder__initialize_probs(
60321
    wuffs_lzma__decoder* self);
60322
60323
// ---------------- VTables
60324
60325
const wuffs_base__io_transformer__func_ptrs
60326
wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer = {
60327
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzma__decoder__dst_history_retain_length),
60328
  (uint64_t(*)(const void*,
60329
      uint32_t))(&wuffs_lzma__decoder__get_quirk),
60330
  (wuffs_base__status(*)(void*,
60331
      uint32_t,
60332
      uint64_t))(&wuffs_lzma__decoder__set_quirk),
60333
  (wuffs_base__status(*)(void*,
60334
      wuffs_base__io_buffer*,
60335
      wuffs_base__io_buffer*,
60336
      wuffs_base__slice_u8))(&wuffs_lzma__decoder__transform_io),
60337
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzma__decoder__workbuf_len),
60338
};
60339
60340
// ---------------- Initializer Implementations
60341
60342
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
60343
wuffs_lzma__decoder__initialize(
60344
    wuffs_lzma__decoder* self,
60345
    size_t sizeof_star_self,
60346
    uint64_t wuffs_version,
60347
    uint32_t options){
60348
  if (!self) {
60349
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
60350
  }
60351
  if (sizeof(*self) != sizeof_star_self) {
60352
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
60353
  }
60354
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
60355
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
60356
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
60357
  }
60358
60359
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
60360
    // The whole point of this if-check is to detect an uninitialized *self.
60361
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
60362
#if !defined(__clang__) && defined(__GNUC__)
60363
#pragma GCC diagnostic push
60364
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
60365
#endif
60366
    if (self->private_impl.magic != 0) {
60367
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
60368
    }
60369
#if !defined(__clang__) && defined(__GNUC__)
60370
#pragma GCC diagnostic pop
60371
#endif
60372
  } else {
60373
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
60374
      memset(self, 0, sizeof(*self));
60375
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
60376
    } else {
60377
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
60378
    }
60379
  }
60380
60381
  self->private_impl.magic = WUFFS_BASE__MAGIC;
60382
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
60383
      wuffs_base__io_transformer__vtable_name;
60384
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
60385
      (const void*)(&wuffs_lzma__decoder__func_ptrs_for__wuffs_base__io_transformer);
60386
  return wuffs_base__make_status(NULL);
60387
}
60388
60389
wuffs_lzma__decoder*
60390
wuffs_lzma__decoder__alloc(void) {
60391
  wuffs_lzma__decoder* x =
60392
      (wuffs_lzma__decoder*)(calloc(1, sizeof(wuffs_lzma__decoder)));
60393
  if (!x) {
60394
    return NULL;
60395
  }
60396
  if (wuffs_lzma__decoder__initialize(
60397
      x, sizeof(wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
60398
    free(x);
60399
    return NULL;
60400
  }
60401
  return x;
60402
}
60403
60404
size_t
60405
sizeof__wuffs_lzma__decoder(void) {
60406
  return sizeof(wuffs_lzma__decoder);
60407
}
60408
60409
// ---------------- Function Implementations
60410
60411
// -------- func lzma.decoder.decode_bitstream_fast
60412
60413
WUFFS_BASE__GENERATED_C_CODE
60414
static wuffs_base__status
60415
wuffs_lzma__decoder__decode_bitstream_fast(
60416
    wuffs_lzma__decoder* self,
60417
    wuffs_base__io_buffer* a_dst,
60418
    wuffs_base__io_buffer* a_src,
60419
    wuffs_base__slice_u8 a_workbuf) {
60420
  wuffs_base__status status = wuffs_base__make_status(NULL);
60421
60422
  uint8_t v_c8 = 0;
60423
  uint32_t v_bits = 0;
60424
  uint32_t v_range = 0;
60425
  uint32_t v_state = 0;
60426
  uint32_t v_rep0 = 0;
60427
  uint32_t v_rep1 = 0;
60428
  uint32_t v_rep2 = 0;
60429
  uint32_t v_rep3 = 0;
60430
  uint32_t v_reptmp = 0;
60431
  uint32_t v_rep = 0;
60432
  uint64_t v_pos = 0;
60433
  uint64_t v_pos_end = 0;
60434
  uint32_t v_lc = 0;
60435
  uint64_t v_lp_mask = 0;
60436
  uint64_t v_pb_mask = 0;
60437
  uint32_t v_prob = 0;
60438
  uint32_t v_threshold = 0;
60439
  uint32_t v_tree_node = 0;
60440
  uint8_t v_prev_byte = 0;
60441
  uint32_t v_match_byte = 0;
60442
  uint32_t v_match_cusp = 0;
60443
  uint32_t v_len_state = 0;
60444
  uint32_t v_slot = 0;
60445
  uint32_t v_len = 0;
60446
  uint32_t v_lanl_offset = 0;
60447
  uint32_t v_lanl_old_offset = 0;
60448
  uint32_t v_lanl_index = 0;
60449
  uint32_t v_num_extra_bits = 0;
60450
  uint32_t v_dist_extra_bits = 0;
60451
  uint32_t v_high_bit_was_on = 0;
60452
  uint32_t v_i = 0;
60453
  uint32_t v_index_ao00 = 0;
60454
  uint32_t v_index_ao41 = 0;
60455
  uint32_t v_index_lit = 0;
60456
  uint32_t v_index_len = 0;
60457
  uint32_t v_index_small_dist_base = 0;
60458
  uint32_t v_index_small_dist_extra = 0;
60459
  uint32_t v_index_small_dist = 0;
60460
  uint32_t v_index_large_dist = 0;
60461
  uint32_t v_dist = 0;
60462
  uint32_t v_adj_dist = 0;
60463
  uint64_t v_wb_index = 0;
60464
60465
  uint8_t* iop_a_dst = NULL;
60466
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60467
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60468
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60469
  if (a_dst && a_dst->data.ptr) {
60470
    io0_a_dst = a_dst->data.ptr;
60471
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
60472
    iop_a_dst = io1_a_dst;
60473
    io2_a_dst = io0_a_dst + a_dst->data.len;
60474
    if (a_dst->meta.closed) {
60475
      io2_a_dst = iop_a_dst;
60476
    }
60477
  }
60478
  const uint8_t* iop_a_src = NULL;
60479
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60480
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60481
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
60482
  if (a_src && a_src->data.ptr) {
60483
    io0_a_src = a_src->data.ptr;
60484
    io1_a_src = io0_a_src + a_src->meta.ri;
60485
    iop_a_src = io1_a_src;
60486
    io2_a_src = io0_a_src + a_src->meta.wi;
60487
  }
60488
60489
  v_prev_byte = self->private_impl.f_stashed_bytes[0u];
60490
  v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
60491
  v_bits = self->private_impl.f_stashed_bits;
60492
  v_range = self->private_impl.f_stashed_range;
60493
  v_state = self->private_impl.f_stashed_state;
60494
  v_rep0 = self->private_impl.f_stashed_rep0;
60495
  v_rep1 = self->private_impl.f_stashed_rep1;
60496
  v_rep2 = self->private_impl.f_stashed_rep2;
60497
  v_rep3 = self->private_impl.f_stashed_rep3;
60498
  v_pos = self->private_impl.f_stashed_pos;
60499
  v_pos_end = self->private_impl.f_stashed_pos_end;
60500
  v_lc = self->private_impl.f_lc;
60501
  v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
60502
  v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
60503
  while ((((uint64_t)(io2_a_dst - iop_a_dst)) >= 282u) && (((uint64_t)(io2_a_src - iop_a_src)) >= 48u)) {
60504
    if (v_pos >= v_pos_end) {
60505
      self->private_impl.f_end_of_chunk = true;
60506
      break;
60507
    }
60508
    v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
60509
    v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
60510
    v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60511
    if (v_bits < v_threshold) {
60512
      v_range = v_threshold;
60513
      v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60514
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
60515
      if ((v_range >> 24u) == 0u) {
60516
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60517
        iop_a_src += 1u;
60518
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60519
        v_range <<= 8u;
60520
      }
60521
      v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
60522
      v_lanl_offset = 0u;
60523
      if (v_state >= 7u) {
60524
        v_lanl_offset = 256u;
60525
      }
60526
      v_tree_node = 1u;
60527
      while (v_tree_node < 256u) {
60528
        v_match_byte <<= 1u;
60529
        v_lanl_old_offset = v_lanl_offset;
60530
        v_lanl_offset &= v_match_byte;
60531
        v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
60532
        v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
60533
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60534
        if (v_bits < v_threshold) {
60535
          v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
60536
          v_range = v_threshold;
60537
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60538
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
60539
          v_tree_node = (v_tree_node << 1u);
60540
        } else {
60541
          v_bits -= v_threshold;
60542
          v_range -= v_threshold;
60543
          v_prob -= (v_prob >> 5u);
60544
          self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
60545
          v_tree_node = ((v_tree_node << 1u) | 1u);
60546
        }
60547
        if ((v_range >> 24u) == 0u) {
60548
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60549
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60550
            goto exit;
60551
          }
60552
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60553
          iop_a_src += 1u;
60554
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60555
          v_range <<= 8u;
60556
        }
60557
      }
60558
      v_prev_byte = ((uint8_t)(v_tree_node));
60559
      (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_prev_byte), iop_a_dst += 1);
60560
      v_pos += 1u;
60561
      v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
60562
      continue;
60563
    }
60564
    v_bits -= v_threshold;
60565
    v_range -= v_threshold;
60566
    v_prob -= (v_prob >> 5u);
60567
    self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
60568
    if ((v_range >> 24u) == 0u) {
60569
      v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60570
      iop_a_src += 1u;
60571
      v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60572
      v_range <<= 8u;
60573
    } else {
60574
    }
60575
    do {
60576
      v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
60577
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60578
      if (v_bits < v_threshold) {
60579
        v_range = v_threshold;
60580
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60581
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
60582
        if ((v_range >> 24u) == 0u) {
60583
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60584
          iop_a_src += 1u;
60585
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60586
          v_range <<= 8u;
60587
        } else {
60588
        }
60589
        do {
60590
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
60591
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60592
          if (v_bits < v_threshold) {
60593
            v_range = v_threshold;
60594
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60595
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
60596
            if ((v_range >> 24u) == 0u) {
60597
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60598
              iop_a_src += 1u;
60599
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60600
              v_range <<= 8u;
60601
            }
60602
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
60603
            v_tree_node = 1u;
60604
            while (v_tree_node < 8u) {
60605
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
60606
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60607
              if (v_bits < v_threshold) {
60608
                v_range = v_threshold;
60609
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60610
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
60611
                v_tree_node = (v_tree_node << 1u);
60612
              } else {
60613
                v_bits -= v_threshold;
60614
                v_range -= v_threshold;
60615
                v_prob -= (v_prob >> 5u);
60616
                self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
60617
                v_tree_node = ((v_tree_node << 1u) | 1u);
60618
              }
60619
              if ((v_range >> 24u) == 0u) {
60620
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60621
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60622
                  goto exit;
60623
                }
60624
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60625
                iop_a_src += 1u;
60626
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60627
                v_range <<= 8u;
60628
              }
60629
            }
60630
            v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
60631
            v_len = ((v_tree_node & 7u) + 2u);
60632
            break;
60633
          }
60634
          v_bits -= v_threshold;
60635
          v_range -= v_threshold;
60636
          v_prob -= (v_prob >> 5u);
60637
          self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
60638
          if ((v_range >> 24u) == 0u) {
60639
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60640
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60641
              goto exit;
60642
            }
60643
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60644
            iop_a_src += 1u;
60645
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60646
            v_range <<= 8u;
60647
          }
60648
          v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
60649
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60650
          if (v_bits < v_threshold) {
60651
            v_range = v_threshold;
60652
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60653
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
60654
            if ((v_range >> 24u) == 0u) {
60655
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60656
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60657
                goto exit;
60658
              }
60659
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60660
              iop_a_src += 1u;
60661
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60662
              v_range <<= 8u;
60663
            }
60664
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
60665
            v_tree_node = 1u;
60666
            while (v_tree_node < 8u) {
60667
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
60668
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60669
              if (v_bits < v_threshold) {
60670
                v_range = v_threshold;
60671
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60672
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
60673
                v_tree_node = (v_tree_node << 1u);
60674
              } else {
60675
                v_bits -= v_threshold;
60676
                v_range -= v_threshold;
60677
                v_prob -= (v_prob >> 5u);
60678
                self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
60679
                v_tree_node = ((v_tree_node << 1u) | 1u);
60680
              }
60681
              if ((v_range >> 24u) == 0u) {
60682
                if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60683
                  status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60684
                  goto exit;
60685
                }
60686
                v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60687
                iop_a_src += 1u;
60688
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60689
                v_range <<= 8u;
60690
              }
60691
            }
60692
            v_len = ((v_tree_node & 7u) + 10u);
60693
            v_len_state = 3u;
60694
            break;
60695
          }
60696
          v_bits -= v_threshold;
60697
          v_range -= v_threshold;
60698
          v_prob -= (v_prob >> 5u);
60699
          self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
60700
          if ((v_range >> 24u) == 0u) {
60701
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60702
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60703
              goto exit;
60704
            }
60705
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60706
            iop_a_src += 1u;
60707
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60708
            v_range <<= 8u;
60709
          }
60710
          v_tree_node = 1u;
60711
          while (v_tree_node < 256u) {
60712
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
60713
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60714
            if (v_bits < v_threshold) {
60715
              v_range = v_threshold;
60716
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60717
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
60718
              v_tree_node = (v_tree_node << 1u);
60719
            } else {
60720
              v_bits -= v_threshold;
60721
              v_range -= v_threshold;
60722
              v_prob -= (v_prob >> 5u);
60723
              self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
60724
              v_tree_node = ((v_tree_node << 1u) | 1u);
60725
            }
60726
            if ((v_range >> 24u) == 0u) {
60727
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60728
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60729
                goto exit;
60730
              }
60731
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60732
              iop_a_src += 1u;
60733
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60734
              v_range <<= 8u;
60735
            }
60736
          }
60737
          v_len = ((v_tree_node & 255u) + 18u);
60738
          v_len_state = 3u;
60739
        } while (0);
60740
        v_slot = 1u;
60741
        while (v_slot < 64u) {
60742
          v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
60743
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60744
          if (v_bits < v_threshold) {
60745
            v_range = v_threshold;
60746
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60747
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
60748
            v_slot = (v_slot << 1u);
60749
          } else {
60750
            v_bits -= v_threshold;
60751
            v_range -= v_threshold;
60752
            v_prob -= (v_prob >> 5u);
60753
            self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
60754
            v_slot = ((v_slot << 1u) | 1u);
60755
          }
60756
          if ((v_range >> 24u) == 0u) {
60757
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60758
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60759
              goto exit;
60760
            }
60761
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60762
            iop_a_src += 1u;
60763
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60764
            v_range <<= 8u;
60765
          }
60766
        }
60767
        v_slot &= 63u;
60768
        v_rep = v_slot;
60769
        if (v_slot < 4u) {
60770
        } else if (v_slot < 14u) {
60771
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
60772
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
60773
          v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
60774
          v_index_small_dist_extra = 1u;
60775
          v_dist_extra_bits = 0u;
60776
          v_i = 0u;
60777
          while (v_i < v_num_extra_bits) {
60778
            v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
60779
            v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
60780
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60781
            if (v_bits < v_threshold) {
60782
              v_range = v_threshold;
60783
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60784
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
60785
              v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
60786
              v_i += 1u;
60787
            } else {
60788
              v_bits -= v_threshold;
60789
              v_range -= v_threshold;
60790
              v_prob -= (v_prob >> 5u);
60791
              self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
60792
              v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
60793
              v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
60794
              v_i += 1u;
60795
            }
60796
            if ((v_range >> 24u) == 0u) {
60797
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60798
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60799
                goto exit;
60800
              }
60801
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60802
              iop_a_src += 1u;
60803
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60804
              v_range <<= 8u;
60805
            }
60806
          }
60807
          v_rep += v_dist_extra_bits;
60808
        } else {
60809
          v_num_extra_bits = ((v_slot >> 1u) - 1u);
60810
          v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
60811
          v_dist_extra_bits = 0u;
60812
          while (true) {
60813
            v_range >>= 1u;
60814
            v_bits -= v_range;
60815
            v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
60816
            v_bits += (v_range & v_high_bit_was_on);
60817
            v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
60818
            if ((v_range >> 24u) == 0u) {
60819
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60820
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60821
                goto exit;
60822
              }
60823
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60824
              iop_a_src += 1u;
60825
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60826
              v_range <<= 8u;
60827
            }
60828
            v_num_extra_bits -= 1u;
60829
            if (v_num_extra_bits <= 4u) {
60830
              break;
60831
            }
60832
          }
60833
          v_dist_extra_bits <<= 4u;
60834
          v_index_large_dist = 1u;
60835
          while (true) {
60836
            v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
60837
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60838
            if (v_bits < v_threshold) {
60839
              v_range = v_threshold;
60840
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60841
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
60842
              v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
60843
            } else {
60844
              v_bits -= v_threshold;
60845
              v_range -= v_threshold;
60846
              v_prob -= (v_prob >> 5u);
60847
              self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
60848
              v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
60849
              v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
60850
            }
60851
            if ((v_range >> 24u) == 0u) {
60852
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
60853
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
60854
                goto exit;
60855
              }
60856
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60857
              iop_a_src += 1u;
60858
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60859
              v_range <<= 8u;
60860
            }
60861
            v_num_extra_bits -= 1u;
60862
            if (v_num_extra_bits <= 0u) {
60863
              break;
60864
            }
60865
          }
60866
          v_rep += v_dist_extra_bits;
60867
        }
60868
        if (v_rep >= 4294967295u) {
60869
          self->private_impl.f_end_of_chunk = true;
60870
          goto label__outer__break;
60871
        }
60872
        v_rep3 = v_rep2;
60873
        v_rep2 = v_rep1;
60874
        v_rep1 = v_rep0;
60875
        v_rep0 = v_rep;
60876
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
60877
        break;
60878
      }
60879
      v_bits -= v_threshold;
60880
      v_range -= v_threshold;
60881
      v_prob -= (v_prob >> 5u);
60882
      self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
60883
      if ((v_range >> 24u) == 0u) {
60884
        v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60885
        iop_a_src += 1u;
60886
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60887
        v_range <<= 8u;
60888
      } else {
60889
      }
60890
      v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
60891
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60892
      if (v_bits < v_threshold) {
60893
        v_range = v_threshold;
60894
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60895
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
60896
        if ((v_range >> 24u) == 0u) {
60897
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60898
          iop_a_src += 1u;
60899
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60900
          v_range <<= 8u;
60901
        } else {
60902
        }
60903
        v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
60904
        v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
60905
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60906
        if (v_bits < v_threshold) {
60907
          v_range = v_threshold;
60908
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60909
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
60910
          if ((v_range >> 24u) == 0u) {
60911
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60912
            iop_a_src += 1u;
60913
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60914
            v_range <<= 8u;
60915
          }
60916
          v_len = 1u;
60917
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
60918
          break;
60919
        }
60920
        v_bits -= v_threshold;
60921
        v_range -= v_threshold;
60922
        v_prob -= (v_prob >> 5u);
60923
        self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
60924
        if ((v_range >> 24u) == 0u) {
60925
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60926
          iop_a_src += 1u;
60927
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60928
          v_range <<= 8u;
60929
        }
60930
      } else {
60931
        v_bits -= v_threshold;
60932
        v_range -= v_threshold;
60933
        v_prob -= (v_prob >> 5u);
60934
        self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
60935
        if ((v_range >> 24u) == 0u) {
60936
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60937
          iop_a_src += 1u;
60938
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60939
          v_range <<= 8u;
60940
        } else {
60941
        }
60942
        v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
60943
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60944
        if (v_bits < v_threshold) {
60945
          v_range = v_threshold;
60946
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60947
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
60948
          if ((v_range >> 24u) == 0u) {
60949
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60950
            iop_a_src += 1u;
60951
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60952
            v_range <<= 8u;
60953
          }
60954
          v_reptmp = v_rep1;
60955
          v_rep1 = v_rep0;
60956
          v_rep0 = v_reptmp;
60957
        } else {
60958
          v_bits -= v_threshold;
60959
          v_range -= v_threshold;
60960
          v_prob -= (v_prob >> 5u);
60961
          self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
60962
          if ((v_range >> 24u) == 0u) {
60963
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60964
            iop_a_src += 1u;
60965
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60966
            v_range <<= 8u;
60967
          } else {
60968
          }
60969
          v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
60970
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
60971
          if (v_bits < v_threshold) {
60972
            v_range = v_threshold;
60973
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
60974
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
60975
            if ((v_range >> 24u) == 0u) {
60976
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60977
              iop_a_src += 1u;
60978
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60979
              v_range <<= 8u;
60980
            }
60981
            v_reptmp = v_rep2;
60982
            v_rep2 = v_rep1;
60983
            v_rep1 = v_rep0;
60984
            v_rep0 = v_reptmp;
60985
          } else {
60986
            v_bits -= v_threshold;
60987
            v_range -= v_threshold;
60988
            v_prob -= (v_prob >> 5u);
60989
            self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
60990
            if ((v_range >> 24u) == 0u) {
60991
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
60992
              iop_a_src += 1u;
60993
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
60994
              v_range <<= 8u;
60995
            }
60996
            v_reptmp = v_rep3;
60997
            v_rep3 = v_rep2;
60998
            v_rep2 = v_rep1;
60999
            v_rep1 = v_rep0;
61000
            v_rep0 = v_reptmp;
61001
          }
61002
        }
61003
      }
61004
      do {
61005
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
61006
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61007
        if (v_bits < v_threshold) {
61008
          v_range = v_threshold;
61009
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61010
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
61011
          if ((v_range >> 24u) == 0u) {
61012
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61013
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61014
              goto exit;
61015
            }
61016
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61017
            iop_a_src += 1u;
61018
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61019
            v_range <<= 8u;
61020
          }
61021
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61022
          v_tree_node = 1u;
61023
          while (v_tree_node < 8u) {
61024
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
61025
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61026
            if (v_bits < v_threshold) {
61027
              v_range = v_threshold;
61028
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61029
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61030
              v_tree_node = (v_tree_node << 1u);
61031
            } else {
61032
              v_bits -= v_threshold;
61033
              v_range -= v_threshold;
61034
              v_prob -= (v_prob >> 5u);
61035
              self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61036
              v_tree_node = ((v_tree_node << 1u) | 1u);
61037
            }
61038
            if ((v_range >> 24u) == 0u) {
61039
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61040
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61041
                goto exit;
61042
              }
61043
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61044
              iop_a_src += 1u;
61045
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61046
              v_range <<= 8u;
61047
            }
61048
          }
61049
          v_len = ((v_tree_node & 7u) + 2u);
61050
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
61051
          break;
61052
        }
61053
        v_bits -= v_threshold;
61054
        v_range -= v_threshold;
61055
        v_prob -= (v_prob >> 5u);
61056
        self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
61057
        if ((v_range >> 24u) == 0u) {
61058
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61059
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61060
            goto exit;
61061
          }
61062
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61063
          iop_a_src += 1u;
61064
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61065
          v_range <<= 8u;
61066
        }
61067
        v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
61068
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61069
        if (v_bits < v_threshold) {
61070
          v_range = v_threshold;
61071
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61072
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
61073
          if ((v_range >> 24u) == 0u) {
61074
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61075
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61076
              goto exit;
61077
            }
61078
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61079
            iop_a_src += 1u;
61080
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61081
            v_range <<= 8u;
61082
          }
61083
          v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61084
          v_tree_node = 1u;
61085
          while (v_tree_node < 8u) {
61086
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
61087
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61088
            if (v_bits < v_threshold) {
61089
              v_range = v_threshold;
61090
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61091
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61092
              v_tree_node = (v_tree_node << 1u);
61093
            } else {
61094
              v_bits -= v_threshold;
61095
              v_range -= v_threshold;
61096
              v_prob -= (v_prob >> 5u);
61097
              self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61098
              v_tree_node = ((v_tree_node << 1u) | 1u);
61099
            }
61100
            if ((v_range >> 24u) == 0u) {
61101
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61102
                status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61103
                goto exit;
61104
              }
61105
              v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61106
              iop_a_src += 1u;
61107
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61108
              v_range <<= 8u;
61109
            }
61110
          }
61111
          v_len = ((v_tree_node & 7u) + 10u);
61112
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
61113
          break;
61114
        }
61115
        v_bits -= v_threshold;
61116
        v_range -= v_threshold;
61117
        v_prob -= (v_prob >> 5u);
61118
        self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
61119
        if ((v_range >> 24u) == 0u) {
61120
          if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61121
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61122
            goto exit;
61123
          }
61124
          v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61125
          iop_a_src += 1u;
61126
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61127
          v_range <<= 8u;
61128
        }
61129
        v_tree_node = 1u;
61130
        while (v_tree_node < 256u) {
61131
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
61132
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61133
          if (v_bits < v_threshold) {
61134
            v_range = v_threshold;
61135
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61136
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61137
            v_tree_node = (v_tree_node << 1u);
61138
          } else {
61139
            v_bits -= v_threshold;
61140
            v_range -= v_threshold;
61141
            v_prob -= (v_prob >> 5u);
61142
            self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61143
            v_tree_node = ((v_tree_node << 1u) | 1u);
61144
          }
61145
          if ((v_range >> 24u) == 0u) {
61146
            if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
61147
              status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_i_o);
61148
              goto exit;
61149
            }
61150
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
61151
            iop_a_src += 1u;
61152
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61153
            v_range <<= 8u;
61154
          }
61155
        }
61156
        v_len = ((v_tree_node & 255u) + 18u);
61157
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
61158
      } while (0);
61159
    } while (0);
61160
    v_dist = (v_rep0 + 1u);
61161
    if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
61162
      status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
61163
      goto exit;
61164
    }
61165
    v_pos += ((uint64_t)(v_len));
61166
    if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
61167
      v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
61168
      if (v_adj_dist > self->private_impl.f_dict_seen) {
61169
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
61170
        goto exit;
61171
      }
61172
      v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
61173
      while (v_wb_index >= 9223372036854775808u) {
61174
        v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
61175
      }
61176
      if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
61177
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61178
        goto exit;
61179
      }
61180
      if (v_len < v_adj_dist) {
61181
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
61182
            &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
61183
        if ( ! (iop_a_dst > io1_a_dst)) {
61184
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61185
          goto exit;
61186
        }
61187
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
61188
        iop_a_dst--;
61189
        if ( ! (iop_a_dst > io1_a_dst)) {
61190
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61191
          goto exit;
61192
        }
61193
        v_prev_byte = iop_a_dst[-1];
61194
        continue;
61195
      } else if (v_len == v_adj_dist) {
61196
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
61197
            &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
61198
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
61199
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
61200
        if ( ! (iop_a_dst > io1_a_dst)) {
61201
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61202
          goto exit;
61203
        }
61204
        v_match_byte = ((uint32_t)(iop_a_dst[-1]));
61205
        iop_a_dst--;
61206
        if ( ! (iop_a_dst > io1_a_dst)) {
61207
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61208
          goto exit;
61209
        }
61210
        v_prev_byte = iop_a_dst[-1];
61211
        continue;
61212
      }
61213
      wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
61214
          &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
61215
      v_len -= v_adj_dist;
61216
      if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)((v_len + 8u))) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) {
61217
        status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
61218
        goto exit;
61219
      }
61220
    }
61221
    if (v_dist >= 8u) {
61222
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_8_byte_chunks_fast_return_cusp(
61223
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
61224
      v_match_byte = (v_match_cusp >> 8u);
61225
      v_prev_byte = ((uint8_t)(v_match_cusp));
61226
    } else {
61227
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
61228
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
61229
      v_match_byte = (v_match_cusp >> 8u);
61230
      v_prev_byte = ((uint8_t)(v_match_cusp));
61231
    }
61232
  }
61233
  label__outer__break:;
61234
  self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
61235
  self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
61236
  self->private_impl.f_stashed_bits = v_bits;
61237
  self->private_impl.f_stashed_range = v_range;
61238
  self->private_impl.f_stashed_state = v_state;
61239
  self->private_impl.f_stashed_rep0 = v_rep0;
61240
  self->private_impl.f_stashed_rep1 = v_rep1;
61241
  self->private_impl.f_stashed_rep2 = v_rep2;
61242
  self->private_impl.f_stashed_rep3 = v_rep3;
61243
  self->private_impl.f_stashed_pos = v_pos;
61244
  self->private_impl.f_stashed_pos_end = v_pos_end;
61245
  goto exit;
61246
  exit:
61247
  if (a_dst && a_dst->data.ptr) {
61248
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
61249
  }
61250
  if (a_src && a_src->data.ptr) {
61251
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
61252
  }
61253
61254
  return status;
61255
}
61256
61257
// -------- func lzma.decoder.decode_bitstream_slow
61258
61259
WUFFS_BASE__GENERATED_C_CODE
61260
static wuffs_base__status
61261
wuffs_lzma__decoder__decode_bitstream_slow(
61262
    wuffs_lzma__decoder* self,
61263
    wuffs_base__io_buffer* a_dst,
61264
    wuffs_base__io_buffer* a_src,
61265
    wuffs_base__slice_u8 a_workbuf) {
61266
  wuffs_base__status status = wuffs_base__make_status(NULL);
61267
61268
  uint8_t v_c8 = 0;
61269
  uint32_t v_bits = 0;
61270
  uint32_t v_range = 0;
61271
  uint32_t v_state = 0;
61272
  uint32_t v_rep0 = 0;
61273
  uint32_t v_rep1 = 0;
61274
  uint32_t v_rep2 = 0;
61275
  uint32_t v_rep3 = 0;
61276
  uint32_t v_reptmp = 0;
61277
  uint32_t v_rep = 0;
61278
  uint64_t v_pos = 0;
61279
  uint64_t v_pos_end = 0;
61280
  uint32_t v_lc = 0;
61281
  uint64_t v_lp_mask = 0;
61282
  uint64_t v_pb_mask = 0;
61283
  uint32_t v_prob = 0;
61284
  uint32_t v_threshold = 0;
61285
  uint32_t v_tree_node = 0;
61286
  uint8_t v_prev_byte = 0;
61287
  uint32_t v_match_byte = 0;
61288
  uint32_t v_match_cusp = 0;
61289
  uint32_t v_len_state = 0;
61290
  uint32_t v_slot = 0;
61291
  uint32_t v_len = 0;
61292
  uint32_t v_lanl_offset = 0;
61293
  uint32_t v_lanl_old_offset = 0;
61294
  uint32_t v_lanl_index = 0;
61295
  uint32_t v_num_extra_bits = 0;
61296
  uint32_t v_dist_extra_bits = 0;
61297
  uint32_t v_high_bit_was_on = 0;
61298
  uint32_t v_i = 0;
61299
  uint32_t v_index_ao00 = 0;
61300
  uint32_t v_index_ao41 = 0;
61301
  uint32_t v_index_lit = 0;
61302
  uint32_t v_index_len = 0;
61303
  uint32_t v_index_small_dist_base = 0;
61304
  uint32_t v_index_small_dist_extra = 0;
61305
  uint32_t v_index_small_dist = 0;
61306
  uint32_t v_index_large_dist = 0;
61307
  uint32_t v_dist = 0;
61308
  uint32_t v_adj_dist = 0;
61309
  uint64_t v_wb_index = 0;
61310
61311
  uint8_t* iop_a_dst = NULL;
61312
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61313
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61314
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61315
  if (a_dst && a_dst->data.ptr) {
61316
    io0_a_dst = a_dst->data.ptr;
61317
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
61318
    iop_a_dst = io1_a_dst;
61319
    io2_a_dst = io0_a_dst + a_dst->data.len;
61320
    if (a_dst->meta.closed) {
61321
      io2_a_dst = iop_a_dst;
61322
    }
61323
  }
61324
  const uint8_t* iop_a_src = NULL;
61325
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61326
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61327
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
61328
  if (a_src && a_src->data.ptr) {
61329
    io0_a_src = a_src->data.ptr;
61330
    io1_a_src = io0_a_src + a_src->meta.ri;
61331
    iop_a_src = io1_a_src;
61332
    io2_a_src = io0_a_src + a_src->meta.wi;
61333
  }
61334
61335
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream_slow;
61336
  if (coro_susp_point) {
61337
    v_bits = self->private_data.s_decode_bitstream_slow.v_bits;
61338
    v_range = self->private_data.s_decode_bitstream_slow.v_range;
61339
    v_state = self->private_data.s_decode_bitstream_slow.v_state;
61340
    v_rep0 = self->private_data.s_decode_bitstream_slow.v_rep0;
61341
    v_rep1 = self->private_data.s_decode_bitstream_slow.v_rep1;
61342
    v_rep2 = self->private_data.s_decode_bitstream_slow.v_rep2;
61343
    v_rep3 = self->private_data.s_decode_bitstream_slow.v_rep3;
61344
    v_rep = self->private_data.s_decode_bitstream_slow.v_rep;
61345
    v_pos = self->private_data.s_decode_bitstream_slow.v_pos;
61346
    v_pos_end = self->private_data.s_decode_bitstream_slow.v_pos_end;
61347
    v_lc = self->private_data.s_decode_bitstream_slow.v_lc;
61348
    v_lp_mask = self->private_data.s_decode_bitstream_slow.v_lp_mask;
61349
    v_pb_mask = self->private_data.s_decode_bitstream_slow.v_pb_mask;
61350
    v_tree_node = self->private_data.s_decode_bitstream_slow.v_tree_node;
61351
    v_prev_byte = self->private_data.s_decode_bitstream_slow.v_prev_byte;
61352
    v_match_byte = self->private_data.s_decode_bitstream_slow.v_match_byte;
61353
    v_len_state = self->private_data.s_decode_bitstream_slow.v_len_state;
61354
    v_slot = self->private_data.s_decode_bitstream_slow.v_slot;
61355
    v_len = self->private_data.s_decode_bitstream_slow.v_len;
61356
    v_lanl_offset = self->private_data.s_decode_bitstream_slow.v_lanl_offset;
61357
    v_num_extra_bits = self->private_data.s_decode_bitstream_slow.v_num_extra_bits;
61358
    v_dist_extra_bits = self->private_data.s_decode_bitstream_slow.v_dist_extra_bits;
61359
    v_i = self->private_data.s_decode_bitstream_slow.v_i;
61360
    v_index_lit = self->private_data.s_decode_bitstream_slow.v_index_lit;
61361
    v_index_len = self->private_data.s_decode_bitstream_slow.v_index_len;
61362
    v_index_small_dist_base = self->private_data.s_decode_bitstream_slow.v_index_small_dist_base;
61363
    v_index_small_dist_extra = self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra;
61364
    v_index_large_dist = self->private_data.s_decode_bitstream_slow.v_index_large_dist;
61365
    v_dist = self->private_data.s_decode_bitstream_slow.v_dist;
61366
  }
61367
  switch (coro_susp_point) {
61368
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
61369
61370
    v_prev_byte = self->private_impl.f_stashed_bytes[0u];
61371
    v_match_byte = ((uint32_t)(self->private_impl.f_stashed_bytes[1u]));
61372
    v_bits = self->private_impl.f_stashed_bits;
61373
    v_range = self->private_impl.f_stashed_range;
61374
    v_state = self->private_impl.f_stashed_state;
61375
    v_rep0 = self->private_impl.f_stashed_rep0;
61376
    v_rep1 = self->private_impl.f_stashed_rep1;
61377
    v_rep2 = self->private_impl.f_stashed_rep2;
61378
    v_rep3 = self->private_impl.f_stashed_rep3;
61379
    v_pos = self->private_impl.f_stashed_pos;
61380
    v_pos_end = self->private_impl.f_stashed_pos_end;
61381
    v_lc = self->private_impl.f_lc;
61382
    v_lp_mask = ((((uint64_t)(1u)) << self->private_impl.f_lp) - 1u);
61383
    v_pb_mask = ((((uint64_t)(1u)) << self->private_impl.f_pb) - 1u);
61384
    while ( ! (self->private_impl.p_decode_bitstream_slow != 0)) {
61385
      if (v_pos >= v_pos_end) {
61386
        self->private_impl.f_end_of_chunk = true;
61387
        break;
61388
      }
61389
      v_index_ao00 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
61390
      v_prob = ((uint32_t)(self->private_data.f_probs_ao00[v_index_ao00]));
61391
      v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61392
      if (v_bits < v_threshold) {
61393
        v_range = v_threshold;
61394
        v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61395
        self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
61396
        if ((v_range >> 24u) == 0u) {
61397
          {
61398
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
61399
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61400
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61401
              goto suspend;
61402
            }
61403
            uint8_t t_0 = *iop_a_src++;
61404
            v_c8 = t_0;
61405
          }
61406
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61407
          v_range <<= 8u;
61408
        }
61409
        v_index_lit = (15u & ((((uint32_t)((v_pos & v_lp_mask))) << v_lc) | (((uint32_t)(v_prev_byte)) >> (8u - v_lc))));
61410
        if (v_state >= 7u) {
61411
          v_lanl_offset = 256u;
61412
          v_tree_node = 1u;
61413
          while (v_tree_node < 256u) {
61414
            v_match_byte <<= 1u;
61415
            v_lanl_old_offset = v_lanl_offset;
61416
            v_lanl_offset &= v_match_byte;
61417
            v_lanl_index = (v_lanl_offset + v_lanl_old_offset + v_tree_node);
61418
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_lanl_index]));
61419
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61420
            if (v_bits < v_threshold) {
61421
              v_lanl_offset = ((v_lanl_offset ^ v_lanl_old_offset) & 256u);
61422
              v_range = v_threshold;
61423
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61424
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
61425
              v_tree_node = (v_tree_node << 1u);
61426
            } else {
61427
              v_bits -= v_threshold;
61428
              v_range -= v_threshold;
61429
              v_prob -= (v_prob >> 5u);
61430
              self->private_data.f_probs_lit[v_index_lit][v_lanl_index] = ((uint16_t)(v_prob));
61431
              v_tree_node = ((v_tree_node << 1u) | 1u);
61432
            }
61433
            if ((v_range >> 24u) == 0u) {
61434
              {
61435
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
61436
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61437
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61438
                  goto suspend;
61439
                }
61440
                uint8_t t_1 = *iop_a_src++;
61441
                v_c8 = t_1;
61442
              }
61443
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61444
              v_range <<= 8u;
61445
            }
61446
          }
61447
        } else {
61448
          v_tree_node = 1u;
61449
          while (v_tree_node < 256u) {
61450
            v_prob = ((uint32_t)(self->private_data.f_probs_lit[v_index_lit][v_tree_node]));
61451
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61452
            if (v_bits < v_threshold) {
61453
              v_range = v_threshold;
61454
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61455
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
61456
              v_tree_node = (v_tree_node << 1u);
61457
            } else {
61458
              v_bits -= v_threshold;
61459
              v_range -= v_threshold;
61460
              v_prob -= (v_prob >> 5u);
61461
              self->private_data.f_probs_lit[v_index_lit][v_tree_node] = ((uint16_t)(v_prob));
61462
              v_tree_node = ((v_tree_node << 1u) | 1u);
61463
            }
61464
            if ((v_range >> 24u) == 0u) {
61465
              {
61466
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
61467
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61468
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61469
                  goto suspend;
61470
                }
61471
                uint8_t t_2 = *iop_a_src++;
61472
                v_c8 = t_2;
61473
              }
61474
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61475
              v_range <<= 8u;
61476
            }
61477
          }
61478
        }
61479
        v_prev_byte = ((uint8_t)(v_tree_node));
61480
        self->private_data.s_decode_bitstream_slow.scratch = v_prev_byte;
61481
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
61482
        if (iop_a_dst == io2_a_dst) {
61483
          status = wuffs_base__make_status(wuffs_base__suspension__short_write);
61484
          goto suspend;
61485
        }
61486
        *iop_a_dst++ = ((uint8_t)(self->private_data.s_decode_bitstream_slow.scratch));
61487
        v_pos += 1u;
61488
        v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LITERAL[v_state]));
61489
        continue;
61490
      }
61491
      v_bits -= v_threshold;
61492
      v_range -= v_threshold;
61493
      v_prob -= (v_prob >> 5u);
61494
      self->private_data.f_probs_ao00[v_index_ao00] = ((uint16_t)(v_prob));
61495
      if ((v_range >> 24u) == 0u) {
61496
        {
61497
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
61498
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61499
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61500
            goto suspend;
61501
          }
61502
          uint8_t t_3 = *iop_a_src++;
61503
          v_c8 = t_3;
61504
        }
61505
        v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61506
        v_range <<= 8u;
61507
      }
61508
      do {
61509
        v_prob = ((uint32_t)(self->private_data.f_probs_ao20[v_state]));
61510
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61511
        if (v_bits < v_threshold) {
61512
          v_range = v_threshold;
61513
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61514
          self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
61515
          if ((v_range >> 24u) == 0u) {
61516
            {
61517
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
61518
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61519
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61520
                goto suspend;
61521
              }
61522
              uint8_t t_4 = *iop_a_src++;
61523
              v_c8 = t_4;
61524
            }
61525
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61526
            v_range <<= 8u;
61527
          }
61528
          do {
61529
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[0u][0u]));
61530
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61531
            if (v_bits < v_threshold) {
61532
              v_range = v_threshold;
61533
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61534
              self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
61535
              if ((v_range >> 24u) == 0u) {
61536
                {
61537
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
61538
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61539
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61540
                    goto suspend;
61541
                  }
61542
                  uint8_t t_5 = *iop_a_src++;
61543
                  v_c8 = t_5;
61544
                }
61545
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61546
                v_range <<= 8u;
61547
              }
61548
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61549
              v_tree_node = 1u;
61550
              while (v_tree_node < 8u) {
61551
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_low[v_index_len][v_tree_node]));
61552
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61553
                if (v_bits < v_threshold) {
61554
                  v_range = v_threshold;
61555
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61556
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61557
                  v_tree_node = (v_tree_node << 1u);
61558
                } else {
61559
                  v_bits -= v_threshold;
61560
                  v_range -= v_threshold;
61561
                  v_prob -= (v_prob >> 5u);
61562
                  self->private_data.f_probs_match_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61563
                  v_tree_node = ((v_tree_node << 1u) | 1u);
61564
                }
61565
                if ((v_range >> 24u) == 0u) {
61566
                  {
61567
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
61568
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61569
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61570
                      goto suspend;
61571
                    }
61572
                    uint8_t t_6 = *iop_a_src++;
61573
                    v_c8 = t_6;
61574
                  }
61575
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61576
                  v_range <<= 8u;
61577
                }
61578
              }
61579
              v_len_state = ((uint32_t)(WUFFS_LZMA__CLAMP_NO_MORE_THAN_3[(v_tree_node & 7u)]));
61580
              v_len = ((v_tree_node & 7u) + 2u);
61581
              break;
61582
            }
61583
            v_bits -= v_threshold;
61584
            v_range -= v_threshold;
61585
            v_prob -= (v_prob >> 5u);
61586
            self->private_data.f_probs_match_len_low[0u][0u] = ((uint16_t)(v_prob));
61587
            if ((v_range >> 24u) == 0u) {
61588
              {
61589
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
61590
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61591
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61592
                  goto suspend;
61593
                }
61594
                uint8_t t_7 = *iop_a_src++;
61595
                v_c8 = t_7;
61596
              }
61597
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61598
              v_range <<= 8u;
61599
            }
61600
            v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[0u][0u]));
61601
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61602
            if (v_bits < v_threshold) {
61603
              v_range = v_threshold;
61604
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61605
              self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
61606
              if ((v_range >> 24u) == 0u) {
61607
                {
61608
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
61609
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61610
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61611
                    goto suspend;
61612
                  }
61613
                  uint8_t t_8 = *iop_a_src++;
61614
                  v_c8 = t_8;
61615
                }
61616
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61617
                v_range <<= 8u;
61618
              }
61619
              v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
61620
              v_tree_node = 1u;
61621
              while (v_tree_node < 8u) {
61622
                v_prob = ((uint32_t)(self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node]));
61623
                v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61624
                if (v_bits < v_threshold) {
61625
                  v_range = v_threshold;
61626
                  v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61627
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61628
                  v_tree_node = (v_tree_node << 1u);
61629
                } else {
61630
                  v_bits -= v_threshold;
61631
                  v_range -= v_threshold;
61632
                  v_prob -= (v_prob >> 5u);
61633
                  self->private_data.f_probs_match_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
61634
                  v_tree_node = ((v_tree_node << 1u) | 1u);
61635
                }
61636
                if ((v_range >> 24u) == 0u) {
61637
                  {
61638
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
61639
                    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61640
                      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61641
                      goto suspend;
61642
                    }
61643
                    uint8_t t_9 = *iop_a_src++;
61644
                    v_c8 = t_9;
61645
                  }
61646
                  v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61647
                  v_range <<= 8u;
61648
                }
61649
              }
61650
              v_len = ((v_tree_node & 7u) + 10u);
61651
              v_len_state = 3u;
61652
              break;
61653
            }
61654
            v_bits -= v_threshold;
61655
            v_range -= v_threshold;
61656
            v_prob -= (v_prob >> 5u);
61657
            self->private_data.f_probs_match_len_mid[0u][0u] = ((uint16_t)(v_prob));
61658
            if ((v_range >> 24u) == 0u) {
61659
              {
61660
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
61661
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61662
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61663
                  goto suspend;
61664
                }
61665
                uint8_t t_10 = *iop_a_src++;
61666
                v_c8 = t_10;
61667
              }
61668
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61669
              v_range <<= 8u;
61670
            }
61671
            v_tree_node = 1u;
61672
            while (v_tree_node < 256u) {
61673
              v_prob = ((uint32_t)(self->private_data.f_probs_match_len_high[0u][v_tree_node]));
61674
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61675
              if (v_bits < v_threshold) {
61676
                v_range = v_threshold;
61677
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61678
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61679
                v_tree_node = (v_tree_node << 1u);
61680
              } else {
61681
                v_bits -= v_threshold;
61682
                v_range -= v_threshold;
61683
                v_prob -= (v_prob >> 5u);
61684
                self->private_data.f_probs_match_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
61685
                v_tree_node = ((v_tree_node << 1u) | 1u);
61686
              }
61687
              if ((v_range >> 24u) == 0u) {
61688
                {
61689
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
61690
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61691
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61692
                    goto suspend;
61693
                  }
61694
                  uint8_t t_11 = *iop_a_src++;
61695
                  v_c8 = t_11;
61696
                }
61697
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61698
                v_range <<= 8u;
61699
              }
61700
            }
61701
            v_len = ((v_tree_node & 255u) + 18u);
61702
            v_len_state = 3u;
61703
          } while (0);
61704
          v_slot = 1u;
61705
          while (v_slot < 64u) {
61706
            v_prob = ((uint32_t)(self->private_data.f_probs_slot[v_len_state][v_slot]));
61707
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61708
            if (v_bits < v_threshold) {
61709
              v_range = v_threshold;
61710
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61711
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
61712
              v_slot = (v_slot << 1u);
61713
            } else {
61714
              v_bits -= v_threshold;
61715
              v_range -= v_threshold;
61716
              v_prob -= (v_prob >> 5u);
61717
              self->private_data.f_probs_slot[v_len_state][v_slot] = ((uint16_t)(v_prob));
61718
              v_slot = ((v_slot << 1u) | 1u);
61719
            }
61720
            if ((v_range >> 24u) == 0u) {
61721
              {
61722
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
61723
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61724
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61725
                  goto suspend;
61726
                }
61727
                uint8_t t_12 = *iop_a_src++;
61728
                v_c8 = t_12;
61729
              }
61730
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61731
              v_range <<= 8u;
61732
            }
61733
          }
61734
          v_slot &= 63u;
61735
          v_rep = v_slot;
61736
          if (v_slot < 4u) {
61737
          } else if (v_slot < 14u) {
61738
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
61739
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
61740
            v_index_small_dist_base = ((uint32_t)(v_rep - v_slot));
61741
            v_index_small_dist_extra = 1u;
61742
            v_dist_extra_bits = 0u;
61743
            v_i = 0u;
61744
            while (v_i < v_num_extra_bits) {
61745
              v_index_small_dist = (((uint32_t)(v_index_small_dist_base + v_index_small_dist_extra)) & 127u);
61746
              v_prob = ((uint32_t)(self->private_data.f_probs_small_dist[v_index_small_dist]));
61747
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61748
              if (v_bits < v_threshold) {
61749
                v_range = v_threshold;
61750
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61751
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
61752
                v_index_small_dist_extra = ((uint32_t)(v_index_small_dist_extra << 1u));
61753
                v_i += 1u;
61754
              } else {
61755
                v_bits -= v_threshold;
61756
                v_range -= v_threshold;
61757
                v_prob -= (v_prob >> 5u);
61758
                self->private_data.f_probs_small_dist[v_index_small_dist] = ((uint16_t)(v_prob));
61759
                v_index_small_dist_extra = (((uint32_t)(v_index_small_dist_extra << 1u)) | 1u);
61760
                v_dist_extra_bits |= (((uint32_t)(1u)) << v_i);
61761
                v_i += 1u;
61762
              }
61763
              if ((v_range >> 24u) == 0u) {
61764
                {
61765
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
61766
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61767
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61768
                    goto suspend;
61769
                  }
61770
                  uint8_t t_13 = *iop_a_src++;
61771
                  v_c8 = t_13;
61772
                }
61773
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61774
                v_range <<= 8u;
61775
              }
61776
            }
61777
            v_rep += v_dist_extra_bits;
61778
          } else {
61779
            v_num_extra_bits = ((v_slot >> 1u) - 1u);
61780
            v_rep = ((2u | (v_slot & 1u)) << v_num_extra_bits);
61781
            v_dist_extra_bits = 0u;
61782
            while (true) {
61783
              v_range >>= 1u;
61784
              v_bits -= v_range;
61785
              v_high_bit_was_on = ((uint32_t)(0u - (v_bits >> 31u)));
61786
              v_bits += (v_range & v_high_bit_was_on);
61787
              v_dist_extra_bits = (((uint32_t)(v_dist_extra_bits << 1u)) | (((uint32_t)(v_high_bit_was_on + 1u)) & 1u));
61788
              if ((v_range >> 24u) == 0u) {
61789
                {
61790
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
61791
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61792
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61793
                    goto suspend;
61794
                  }
61795
                  uint8_t t_14 = *iop_a_src++;
61796
                  v_c8 = t_14;
61797
                }
61798
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61799
                v_range <<= 8u;
61800
              }
61801
              v_num_extra_bits -= 1u;
61802
              if (v_num_extra_bits <= 4u) {
61803
                break;
61804
              }
61805
            }
61806
            v_dist_extra_bits <<= 4u;
61807
            v_index_large_dist = 1u;
61808
            while (true) {
61809
              v_prob = ((uint32_t)(self->private_data.f_probs_large_dist[v_index_large_dist]));
61810
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61811
              if (v_bits < v_threshold) {
61812
                v_range = v_threshold;
61813
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61814
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
61815
                v_index_large_dist = (15u & ((uint32_t)(v_index_large_dist << 1u)));
61816
              } else {
61817
                v_bits -= v_threshold;
61818
                v_range -= v_threshold;
61819
                v_prob -= (v_prob >> 5u);
61820
                self->private_data.f_probs_large_dist[v_index_large_dist] = ((uint16_t)(v_prob));
61821
                v_index_large_dist = (15u & (((uint32_t)(v_index_large_dist << 1u)) | 1u));
61822
                v_dist_extra_bits |= (((uint32_t)(1u)) << (4u - v_num_extra_bits));
61823
              }
61824
              if ((v_range >> 24u) == 0u) {
61825
                {
61826
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
61827
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61828
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61829
                    goto suspend;
61830
                  }
61831
                  uint8_t t_15 = *iop_a_src++;
61832
                  v_c8 = t_15;
61833
                }
61834
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61835
                v_range <<= 8u;
61836
              }
61837
              v_num_extra_bits -= 1u;
61838
              if (v_num_extra_bits <= 0u) {
61839
                break;
61840
              }
61841
            }
61842
            v_rep += v_dist_extra_bits;
61843
          }
61844
          if (v_rep >= 4294967295u) {
61845
            self->private_impl.f_end_of_chunk = true;
61846
            goto label__outer__break;
61847
          }
61848
          v_rep3 = v_rep2;
61849
          v_rep2 = v_rep1;
61850
          v_rep1 = v_rep0;
61851
          v_rep0 = v_rep;
61852
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_MATCH[v_state]));
61853
          break;
61854
        }
61855
        v_bits -= v_threshold;
61856
        v_range -= v_threshold;
61857
        v_prob -= (v_prob >> 5u);
61858
        self->private_data.f_probs_ao20[v_state] = ((uint16_t)(v_prob));
61859
        if ((v_range >> 24u) == 0u) {
61860
          {
61861
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
61862
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61863
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61864
              goto suspend;
61865
            }
61866
            uint8_t t_16 = *iop_a_src++;
61867
            v_c8 = t_16;
61868
          }
61869
          v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61870
          v_range <<= 8u;
61871
        }
61872
        v_prob = ((uint32_t)(self->private_data.f_probs_ao40[v_state]));
61873
        v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61874
        if (v_bits < v_threshold) {
61875
          v_range = v_threshold;
61876
          v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61877
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
61878
          if ((v_range >> 24u) == 0u) {
61879
            {
61880
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
61881
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61882
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61883
                goto suspend;
61884
              }
61885
              uint8_t t_17 = *iop_a_src++;
61886
              v_c8 = t_17;
61887
            }
61888
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61889
            v_range <<= 8u;
61890
          }
61891
          v_index_ao41 = ((v_state << 4u) | ((uint32_t)((v_pos & v_pb_mask))));
61892
          v_prob = ((uint32_t)(self->private_data.f_probs_ao41[v_index_ao41]));
61893
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61894
          if (v_bits < v_threshold) {
61895
            v_range = v_threshold;
61896
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61897
            self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
61898
            if ((v_range >> 24u) == 0u) {
61899
              {
61900
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
61901
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61902
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61903
                  goto suspend;
61904
                }
61905
                uint8_t t_18 = *iop_a_src++;
61906
                v_c8 = t_18;
61907
              }
61908
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61909
              v_range <<= 8u;
61910
            }
61911
            v_len = 1u;
61912
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_SHORTREP[v_state]));
61913
            break;
61914
          }
61915
          v_bits -= v_threshold;
61916
          v_range -= v_threshold;
61917
          v_prob -= (v_prob >> 5u);
61918
          self->private_data.f_probs_ao41[v_index_ao41] = ((uint16_t)(v_prob));
61919
          if ((v_range >> 24u) == 0u) {
61920
            {
61921
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
61922
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61923
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61924
                goto suspend;
61925
              }
61926
              uint8_t t_19 = *iop_a_src++;
61927
              v_c8 = t_19;
61928
            }
61929
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61930
            v_range <<= 8u;
61931
          }
61932
        } else {
61933
          v_bits -= v_threshold;
61934
          v_range -= v_threshold;
61935
          v_prob -= (v_prob >> 5u);
61936
          self->private_data.f_probs_ao40[v_state] = ((uint16_t)(v_prob));
61937
          if ((v_range >> 24u) == 0u) {
61938
            {
61939
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
61940
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61941
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61942
                goto suspend;
61943
              }
61944
              uint8_t t_20 = *iop_a_src++;
61945
              v_c8 = t_20;
61946
            }
61947
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61948
            v_range <<= 8u;
61949
          }
61950
          v_prob = ((uint32_t)(self->private_data.f_probs_ao60[v_state]));
61951
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61952
          if (v_bits < v_threshold) {
61953
            v_range = v_threshold;
61954
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61955
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
61956
            if ((v_range >> 24u) == 0u) {
61957
              {
61958
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
61959
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61960
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61961
                  goto suspend;
61962
                }
61963
                uint8_t t_21 = *iop_a_src++;
61964
                v_c8 = t_21;
61965
              }
61966
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61967
              v_range <<= 8u;
61968
            }
61969
            v_reptmp = v_rep1;
61970
            v_rep1 = v_rep0;
61971
            v_rep0 = v_reptmp;
61972
          } else {
61973
            v_bits -= v_threshold;
61974
            v_range -= v_threshold;
61975
            v_prob -= (v_prob >> 5u);
61976
            self->private_data.f_probs_ao60[v_state] = ((uint16_t)(v_prob));
61977
            if ((v_range >> 24u) == 0u) {
61978
              {
61979
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
61980
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
61981
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
61982
                  goto suspend;
61983
                }
61984
                uint8_t t_22 = *iop_a_src++;
61985
                v_c8 = t_22;
61986
              }
61987
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
61988
              v_range <<= 8u;
61989
            }
61990
            v_prob = ((uint32_t)(self->private_data.f_probs_ao63[v_state]));
61991
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
61992
            if (v_bits < v_threshold) {
61993
              v_range = v_threshold;
61994
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
61995
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
61996
              if ((v_range >> 24u) == 0u) {
61997
                {
61998
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(25);
61999
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62000
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62001
                    goto suspend;
62002
                  }
62003
                  uint8_t t_23 = *iop_a_src++;
62004
                  v_c8 = t_23;
62005
                }
62006
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62007
                v_range <<= 8u;
62008
              }
62009
              v_reptmp = v_rep2;
62010
              v_rep2 = v_rep1;
62011
              v_rep1 = v_rep0;
62012
              v_rep0 = v_reptmp;
62013
            } else {
62014
              v_bits -= v_threshold;
62015
              v_range -= v_threshold;
62016
              v_prob -= (v_prob >> 5u);
62017
              self->private_data.f_probs_ao63[v_state] = ((uint16_t)(v_prob));
62018
              if ((v_range >> 24u) == 0u) {
62019
                {
62020
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
62021
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62022
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62023
                    goto suspend;
62024
                  }
62025
                  uint8_t t_24 = *iop_a_src++;
62026
                  v_c8 = t_24;
62027
                }
62028
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62029
                v_range <<= 8u;
62030
              }
62031
              v_reptmp = v_rep3;
62032
              v_rep3 = v_rep2;
62033
              v_rep2 = v_rep1;
62034
              v_rep1 = v_rep0;
62035
              v_rep0 = v_reptmp;
62036
            }
62037
          }
62038
        }
62039
        do {
62040
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[0u][0u]));
62041
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62042
          if (v_bits < v_threshold) {
62043
            v_range = v_threshold;
62044
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62045
            self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
62046
            if ((v_range >> 24u) == 0u) {
62047
              {
62048
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
62049
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62050
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62051
                  goto suspend;
62052
                }
62053
                uint8_t t_25 = *iop_a_src++;
62054
                v_c8 = t_25;
62055
              }
62056
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62057
              v_range <<= 8u;
62058
            }
62059
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
62060
            v_tree_node = 1u;
62061
            while (v_tree_node < 8u) {
62062
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node]));
62063
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62064
              if (v_bits < v_threshold) {
62065
                v_range = v_threshold;
62066
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62067
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62068
                v_tree_node = (v_tree_node << 1u);
62069
              } else {
62070
                v_bits -= v_threshold;
62071
                v_range -= v_threshold;
62072
                v_prob -= (v_prob >> 5u);
62073
                self->private_data.f_probs_longrep_len_low[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62074
                v_tree_node = ((v_tree_node << 1u) | 1u);
62075
              }
62076
              if ((v_range >> 24u) == 0u) {
62077
                {
62078
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
62079
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62080
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62081
                    goto suspend;
62082
                  }
62083
                  uint8_t t_26 = *iop_a_src++;
62084
                  v_c8 = t_26;
62085
                }
62086
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62087
                v_range <<= 8u;
62088
              }
62089
            }
62090
            v_len = ((v_tree_node & 7u) + 2u);
62091
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
62092
            break;
62093
          }
62094
          v_bits -= v_threshold;
62095
          v_range -= v_threshold;
62096
          v_prob -= (v_prob >> 5u);
62097
          self->private_data.f_probs_longrep_len_low[0u][0u] = ((uint16_t)(v_prob));
62098
          if ((v_range >> 24u) == 0u) {
62099
            {
62100
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
62101
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62102
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62103
                goto suspend;
62104
              }
62105
              uint8_t t_27 = *iop_a_src++;
62106
              v_c8 = t_27;
62107
            }
62108
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62109
            v_range <<= 8u;
62110
          }
62111
          v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[0u][0u]));
62112
          v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62113
          if (v_bits < v_threshold) {
62114
            v_range = v_threshold;
62115
            v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62116
            self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
62117
            if ((v_range >> 24u) == 0u) {
62118
              {
62119
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
62120
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62121
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62122
                  goto suspend;
62123
                }
62124
                uint8_t t_28 = *iop_a_src++;
62125
                v_c8 = t_28;
62126
              }
62127
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62128
              v_range <<= 8u;
62129
            }
62130
            v_index_len = ((uint32_t)((v_pos & v_pb_mask)));
62131
            v_tree_node = 1u;
62132
            while (v_tree_node < 8u) {
62133
              v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node]));
62134
              v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62135
              if (v_bits < v_threshold) {
62136
                v_range = v_threshold;
62137
                v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62138
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62139
                v_tree_node = (v_tree_node << 1u);
62140
              } else {
62141
                v_bits -= v_threshold;
62142
                v_range -= v_threshold;
62143
                v_prob -= (v_prob >> 5u);
62144
                self->private_data.f_probs_longrep_len_mid[v_index_len][v_tree_node] = ((uint16_t)(v_prob));
62145
                v_tree_node = ((v_tree_node << 1u) | 1u);
62146
              }
62147
              if ((v_range >> 24u) == 0u) {
62148
                {
62149
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT(31);
62150
                  if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62151
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62152
                    goto suspend;
62153
                  }
62154
                  uint8_t t_29 = *iop_a_src++;
62155
                  v_c8 = t_29;
62156
                }
62157
                v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62158
                v_range <<= 8u;
62159
              }
62160
            }
62161
            v_len = ((v_tree_node & 7u) + 10u);
62162
            v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
62163
            break;
62164
          }
62165
          v_bits -= v_threshold;
62166
          v_range -= v_threshold;
62167
          v_prob -= (v_prob >> 5u);
62168
          self->private_data.f_probs_longrep_len_mid[0u][0u] = ((uint16_t)(v_prob));
62169
          if ((v_range >> 24u) == 0u) {
62170
            {
62171
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
62172
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62173
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62174
                goto suspend;
62175
              }
62176
              uint8_t t_30 = *iop_a_src++;
62177
              v_c8 = t_30;
62178
            }
62179
            v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62180
            v_range <<= 8u;
62181
          }
62182
          v_tree_node = 1u;
62183
          while (v_tree_node < 256u) {
62184
            v_prob = ((uint32_t)(self->private_data.f_probs_longrep_len_high[0u][v_tree_node]));
62185
            v_threshold = ((uint32_t)((v_range >> 11u) * v_prob));
62186
            if (v_bits < v_threshold) {
62187
              v_range = v_threshold;
62188
              v_prob += (((uint32_t)(2048u - v_prob)) >> 5u);
62189
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62190
              v_tree_node = (v_tree_node << 1u);
62191
            } else {
62192
              v_bits -= v_threshold;
62193
              v_range -= v_threshold;
62194
              v_prob -= (v_prob >> 5u);
62195
              self->private_data.f_probs_longrep_len_high[0u][v_tree_node] = ((uint16_t)(v_prob));
62196
              v_tree_node = ((v_tree_node << 1u) | 1u);
62197
            }
62198
            if ((v_range >> 24u) == 0u) {
62199
              {
62200
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
62201
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62202
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62203
                  goto suspend;
62204
                }
62205
                uint8_t t_31 = *iop_a_src++;
62206
                v_c8 = t_31;
62207
              }
62208
              v_bits = (((uint32_t)(v_bits << 8u)) | ((uint32_t)(v_c8)));
62209
              v_range <<= 8u;
62210
            }
62211
          }
62212
          v_len = ((v_tree_node & 255u) + 18u);
62213
          v_state = ((uint32_t)(WUFFS_LZMA__STATE_TRANSITION_LONGREP[v_state]));
62214
        } while (0);
62215
      } while (0);
62216
      v_dist = (v_rep0 + 1u);
62217
      if ((((uint64_t)(v_dist)) > v_pos) || (((uint64_t)(v_dist)) > ((uint64_t)(self->private_impl.f_dict_size)))) {
62218
        status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
62219
        goto exit;
62220
      }
62221
      v_pos += ((uint64_t)(v_len));
62222
      while (274u > ((uint64_t)(io2_a_dst - iop_a_dst))) {
62223
        status = wuffs_base__make_status(wuffs_base__suspension__short_write);
62224
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
62225
      }
62226
      if (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst))) {
62227
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
62228
        if (v_adj_dist > self->private_impl.f_dict_seen) {
62229
          status = wuffs_base__make_status(wuffs_lzma__error__bad_distance);
62230
          goto exit;
62231
        }
62232
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
62233
        while (v_wb_index >= 9223372036854775808u) {
62234
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
62235
        }
62236
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
62237
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62238
          goto exit;
62239
        }
62240
        if (v_len < v_adj_dist) {
62241
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62242
              &iop_a_dst, io2_a_dst,(v_len + 1u), wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62243
          if ( ! (iop_a_dst > io1_a_dst)) {
62244
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62245
            goto exit;
62246
          }
62247
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
62248
          iop_a_dst--;
62249
          if ( ! (iop_a_dst > io1_a_dst)) {
62250
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62251
            goto exit;
62252
          }
62253
          v_prev_byte = iop_a_dst[-1];
62254
          continue;
62255
        } else if (v_len == v_adj_dist) {
62256
          wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62257
              &iop_a_dst, io2_a_dst,v_len, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62258
          wuffs_private_impl__io_writer__limited_copy_u32_from_history(
62259
              &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
62260
          if ( ! (iop_a_dst > io1_a_dst)) {
62261
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62262
            goto exit;
62263
          }
62264
          v_match_byte = ((uint32_t)(iop_a_dst[-1]));
62265
          iop_a_dst--;
62266
          if ( ! (iop_a_dst > io1_a_dst)) {
62267
            status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62268
            goto exit;
62269
          }
62270
          v_prev_byte = iop_a_dst[-1];
62271
          continue;
62272
        }
62273
        wuffs_private_impl__io_writer__limited_copy_u32_from_slice(
62274
            &iop_a_dst, io2_a_dst,v_adj_dist, wuffs_base__slice_u8__subslice_i(a_workbuf, v_wb_index));
62275
        v_len -= v_adj_dist;
62276
        if ((((uint64_t)(v_len)) > ((uint64_t)(io2_a_dst - iop_a_dst))) || (((uint64_t)(v_dist)) > ((uint64_t)(iop_a_dst - io0_a_dst)))) {
62277
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62278
          goto exit;
62279
        }
62280
      }
62281
      v_match_cusp = wuffs_private_impl__io_writer__limited_copy_u32_from_history_fast_return_cusp(
62282
          &iop_a_dst, io0_a_dst, io2_a_dst, v_len, v_dist);
62283
      v_match_byte = (v_match_cusp >> 8u);
62284
      v_prev_byte = ((uint8_t)(v_match_cusp));
62285
    }
62286
    label__outer__break:;
62287
    self->private_impl.f_stashed_bytes[0u] = v_prev_byte;
62288
    self->private_impl.f_stashed_bytes[1u] = ((uint8_t)(v_match_byte));
62289
    self->private_impl.f_stashed_bits = v_bits;
62290
    self->private_impl.f_stashed_range = v_range;
62291
    self->private_impl.f_stashed_state = v_state;
62292
    self->private_impl.f_stashed_rep0 = v_rep0;
62293
    self->private_impl.f_stashed_rep1 = v_rep1;
62294
    self->private_impl.f_stashed_rep2 = v_rep2;
62295
    self->private_impl.f_stashed_rep3 = v_rep3;
62296
    self->private_impl.f_stashed_pos = v_pos;
62297
    self->private_impl.f_stashed_pos_end = v_pos_end;
62298
62299
    ok:
62300
    self->private_impl.p_decode_bitstream_slow = 0;
62301
    goto exit;
62302
  }
62303
62304
  goto suspend;
62305
  suspend:
62306
  self->private_impl.p_decode_bitstream_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62307
  self->private_data.s_decode_bitstream_slow.v_bits = v_bits;
62308
  self->private_data.s_decode_bitstream_slow.v_range = v_range;
62309
  self->private_data.s_decode_bitstream_slow.v_state = v_state;
62310
  self->private_data.s_decode_bitstream_slow.v_rep0 = v_rep0;
62311
  self->private_data.s_decode_bitstream_slow.v_rep1 = v_rep1;
62312
  self->private_data.s_decode_bitstream_slow.v_rep2 = v_rep2;
62313
  self->private_data.s_decode_bitstream_slow.v_rep3 = v_rep3;
62314
  self->private_data.s_decode_bitstream_slow.v_rep = v_rep;
62315
  self->private_data.s_decode_bitstream_slow.v_pos = v_pos;
62316
  self->private_data.s_decode_bitstream_slow.v_pos_end = v_pos_end;
62317
  self->private_data.s_decode_bitstream_slow.v_lc = v_lc;
62318
  self->private_data.s_decode_bitstream_slow.v_lp_mask = v_lp_mask;
62319
  self->private_data.s_decode_bitstream_slow.v_pb_mask = v_pb_mask;
62320
  self->private_data.s_decode_bitstream_slow.v_tree_node = v_tree_node;
62321
  self->private_data.s_decode_bitstream_slow.v_prev_byte = v_prev_byte;
62322
  self->private_data.s_decode_bitstream_slow.v_match_byte = v_match_byte;
62323
  self->private_data.s_decode_bitstream_slow.v_len_state = v_len_state;
62324
  self->private_data.s_decode_bitstream_slow.v_slot = v_slot;
62325
  self->private_data.s_decode_bitstream_slow.v_len = v_len;
62326
  self->private_data.s_decode_bitstream_slow.v_lanl_offset = v_lanl_offset;
62327
  self->private_data.s_decode_bitstream_slow.v_num_extra_bits = v_num_extra_bits;
62328
  self->private_data.s_decode_bitstream_slow.v_dist_extra_bits = v_dist_extra_bits;
62329
  self->private_data.s_decode_bitstream_slow.v_i = v_i;
62330
  self->private_data.s_decode_bitstream_slow.v_index_lit = v_index_lit;
62331
  self->private_data.s_decode_bitstream_slow.v_index_len = v_index_len;
62332
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_base = v_index_small_dist_base;
62333
  self->private_data.s_decode_bitstream_slow.v_index_small_dist_extra = v_index_small_dist_extra;
62334
  self->private_data.s_decode_bitstream_slow.v_index_large_dist = v_index_large_dist;
62335
  self->private_data.s_decode_bitstream_slow.v_dist = v_dist;
62336
62337
  goto exit;
62338
  exit:
62339
  if (a_dst && a_dst->data.ptr) {
62340
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
62341
  }
62342
  if (a_src && a_src->data.ptr) {
62343
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
62344
  }
62345
62346
  return status;
62347
}
62348
62349
// -------- func lzma.decoder.add_history
62350
62351
WUFFS_BASE__GENERATED_C_CODE
62352
static wuffs_base__status
62353
wuffs_lzma__decoder__add_history(
62354
    wuffs_lzma__decoder* self,
62355
    wuffs_base__slice_u8 a_hist,
62356
    wuffs_base__slice_u8 a_workbuf) {
62357
  uint64_t v_dict_workbuf_index = 0;
62358
  uint64_t v_dict_size = 0;
62359
  uint64_t v_hist_length = 0;
62360
  wuffs_base__slice_u8 v_s = {0};
62361
  uint64_t v_n_copied = 0;
62362
  uint64_t v_n = 0;
62363
62364
  v_dict_workbuf_index = ((uint64_t)(self->private_impl.f_dict_workbuf_index));
62365
  v_dict_size = ((uint64_t)(self->private_impl.f_dict_size));
62366
  if (((uint64_t)(a_hist.len)) == 0u) {
62367
    return wuffs_base__make_status(NULL);
62368
  }
62369
  if (((uint64_t)(a_workbuf.len)) < (v_dict_size + 273u)) {
62370
    return wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
62371
  }
62372
  v_hist_length = ((uint64_t)(a_hist.len));
62373
  if (v_hist_length > 4294967295u) {
62374
    self->private_impl.f_dict_seen = 4294967295u;
62375
  } else {
62376
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dict_seen, ((uint32_t)(v_hist_length)));
62377
  }
62378
  v_s = a_hist;
62379
  if (((uint64_t)(v_s.len)) >= v_dict_size) {
62380
    v_s = wuffs_private_impl__slice_u8__suffix(v_s, v_dict_size);
62381
    wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, v_s);
62382
    self->private_impl.f_dict_workbuf_index = 0u;
62383
  } else if (v_dict_workbuf_index > v_dict_size) {
62384
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62385
  } else {
62386
    v_n_copied = wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_ij(a_workbuf, v_dict_workbuf_index, v_dict_size), v_s);
62387
    if (v_n_copied < ((uint64_t)(v_s.len))) {
62388
      v_n = wuffs_private_impl__slice_u8__copy_from_slice(a_workbuf, wuffs_base__slice_u8__subslice_i(v_s, v_n_copied));
62389
      self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
62390
    } else {
62391
      v_n = ((uint64_t)(v_dict_workbuf_index + v_n_copied));
62392
      if (v_n < v_dict_size) {
62393
        self->private_impl.f_dict_workbuf_index = ((uint32_t)(v_n));
62394
      } else {
62395
        self->private_impl.f_dict_workbuf_index = 0u;
62396
      }
62397
    }
62398
  }
62399
  if ((273u > v_dict_size) || (v_dict_size > ((uint64_t)(a_workbuf.len)))) {
62400
    return wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
62401
  }
62402
  wuffs_private_impl__slice_u8__copy_from_slice(wuffs_base__slice_u8__subslice_i(a_workbuf, v_dict_size), wuffs_base__slice_u8__subslice_j(a_workbuf, 273u));
62403
  return wuffs_base__make_status(NULL);
62404
}
62405
62406
// -------- func lzma.decoder.get_quirk
62407
62408
WUFFS_BASE__GENERATED_C_CODE
62409
WUFFS_BASE__MAYBE_STATIC uint64_t
62410
wuffs_lzma__decoder__get_quirk(
62411
    const wuffs_lzma__decoder* self,
62412
    uint32_t a_key) {
62413
  if (!self) {
62414
    return 0;
62415
  }
62416
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
62417
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
62418
    return 0;
62419
  }
62420
62421
  if (a_key == 1290294272u) {
62422
    if (self->private_impl.f_allow_non_zero_initial_byte) {
62423
      return 1u;
62424
    }
62425
  } else if (a_key == 1290294273u) {
62426
    return ((uint64_t)(self->private_impl.f_format_extension));
62427
  }
62428
  return 0u;
62429
}
62430
62431
// -------- func lzma.decoder.set_quirk
62432
62433
WUFFS_BASE__GENERATED_C_CODE
62434
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62435
wuffs_lzma__decoder__set_quirk(
62436
    wuffs_lzma__decoder* self,
62437
    uint32_t a_key,
62438
    uint64_t a_value) {
62439
  if (!self) {
62440
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62441
  }
62442
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62443
    return wuffs_base__make_status(
62444
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62445
        ? wuffs_base__error__disabled_by_previous_error
62446
        : wuffs_base__error__initialize_not_called);
62447
  }
62448
62449
  uint32_t v_v = 0;
62450
  uint32_t v_n = 0;
62451
62452
  if (a_key == 1290294272u) {
62453
    self->private_impl.f_allow_non_zero_initial_byte = (a_value > 0u);
62454
  } else if (a_key == 1290294273u) {
62455
    if (a_value == 0u) {
62456
      self->private_impl.f_format_extension = 0u;
62457
      return wuffs_base__make_status(NULL);
62458
    } else if ((a_value & 255u) == 1u) {
62459
      if ((a_value >> 8u) <= 255u) {
62460
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
62461
        v_v = (self->private_impl.f_format_extension >> 8u);
62462
        v_n = (((uint32_t)(1u)) << (v_v & 31u));
62463
        wuffs_private_impl__u32__sat_sub_indirect(&v_n, ((v_n >> 4u) * ((v_v >> 5u) & 7u)));
62464
        if ((v_n < 4096u) || (536870912u < v_n)) {
62465
          return wuffs_base__make_status(wuffs_base__error__bad_argument);
62466
        }
62467
        self->private_impl.f_dict_size = v_n;
62468
        return wuffs_base__make_status(NULL);
62469
      }
62470
    } else if ((a_value & 255u) == 2u) {
62471
      if ((a_value >> 8u) <= 40u) {
62472
        self->private_impl.f_format_extension = ((uint32_t)(a_value));
62473
        v_v = (self->private_impl.f_format_extension >> 8u);
62474
        if (v_v < 40u) {
62475
          self->private_impl.f_dict_size = ((2u | (v_v & 1u)) << ((v_v >> 1u) + 11u));
62476
        } else {
62477
          self->private_impl.f_dict_size = 4294967295u;
62478
        }
62479
        return wuffs_base__make_status(NULL);
62480
      }
62481
    }
62482
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
62483
  }
62484
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
62485
}
62486
62487
// -------- func lzma.decoder.dst_history_retain_length
62488
62489
WUFFS_BASE__GENERATED_C_CODE
62490
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
62491
wuffs_lzma__decoder__dst_history_retain_length(
62492
    const wuffs_lzma__decoder* self) {
62493
  if (!self) {
62494
    return wuffs_base__utility__make_optional_u63(false, 0u);
62495
  }
62496
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
62497
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
62498
    return wuffs_base__utility__make_optional_u63(false, 0u);
62499
  }
62500
62501
  return wuffs_base__utility__make_optional_u63(true, 0u);
62502
}
62503
62504
// -------- func lzma.decoder.workbuf_len
62505
62506
WUFFS_BASE__GENERATED_C_CODE
62507
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
62508
wuffs_lzma__decoder__workbuf_len(
62509
    const wuffs_lzma__decoder* self) {
62510
  if (!self) {
62511
    return wuffs_base__utility__empty_range_ii_u64();
62512
  }
62513
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
62514
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
62515
    return wuffs_base__utility__empty_range_ii_u64();
62516
  }
62517
62518
  uint64_t v_m = 0;
62519
62520
  if (self->private_impl.f_dict_size == 0u) {
62521
    return wuffs_base__utility__make_range_ii_u64(0u, 0u);
62522
  }
62523
  v_m = (((uint64_t)(self->private_impl.f_dict_size)) + 273u);
62524
  return wuffs_base__utility__make_range_ii_u64(v_m, v_m);
62525
}
62526
62527
// -------- func lzma.decoder.transform_io
62528
62529
WUFFS_BASE__GENERATED_C_CODE
62530
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
62531
wuffs_lzma__decoder__transform_io(
62532
    wuffs_lzma__decoder* self,
62533
    wuffs_base__io_buffer* a_dst,
62534
    wuffs_base__io_buffer* a_src,
62535
    wuffs_base__slice_u8 a_workbuf) {
62536
  if (!self) {
62537
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
62538
  }
62539
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
62540
    return wuffs_base__make_status(
62541
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
62542
        ? wuffs_base__error__disabled_by_previous_error
62543
        : wuffs_base__error__initialize_not_called);
62544
  }
62545
  if (!a_dst || !a_src) {
62546
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62547
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
62548
  }
62549
  if ((self->private_impl.active_coroutine != 0) &&
62550
      (self->private_impl.active_coroutine != 1)) {
62551
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62552
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
62553
  }
62554
  self->private_impl.active_coroutine = 0;
62555
  wuffs_base__status status = wuffs_base__make_status(NULL);
62556
62557
  uint64_t v_mark = 0;
62558
  wuffs_base__status v_dti_status = wuffs_base__make_status(NULL);
62559
  wuffs_base__status v_ah_status = wuffs_base__make_status(NULL);
62560
62561
  uint8_t* iop_a_dst = NULL;
62562
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62563
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62564
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62565
  if (a_dst && a_dst->data.ptr) {
62566
    io0_a_dst = a_dst->data.ptr;
62567
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
62568
    iop_a_dst = io1_a_dst;
62569
    io2_a_dst = io0_a_dst + a_dst->data.len;
62570
    if (a_dst->meta.closed) {
62571
      io2_a_dst = iop_a_dst;
62572
    }
62573
  }
62574
62575
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
62576
  switch (coro_susp_point) {
62577
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62578
62579
    while (true) {
62580
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
62581
      {
62582
        if (a_dst) {
62583
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
62584
        }
62585
        wuffs_base__status t_0 = wuffs_lzma__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
62586
        v_dti_status = t_0;
62587
        if (a_dst) {
62588
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
62589
        }
62590
      }
62591
      if ( ! wuffs_base__status__is_suspension(&v_dti_status)) {
62592
        status = v_dti_status;
62593
        if (wuffs_base__status__is_error(&status)) {
62594
          goto exit;
62595
        } else if (wuffs_base__status__is_suspension(&status)) {
62596
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
62597
          goto exit;
62598
        }
62599
        goto ok;
62600
      } else if ((v_dti_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
62601
        status = wuffs_base__make_status(wuffs_lzma__error__truncated_input);
62602
        goto exit;
62603
      }
62604
      v_ah_status = wuffs_lzma__decoder__add_history(self, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst), a_workbuf);
62605
      if (wuffs_base__status__is_error(&v_ah_status)) {
62606
        status = v_ah_status;
62607
        goto exit;
62608
      }
62609
      status = v_dti_status;
62610
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
62611
    }
62612
62613
    ok:
62614
    self->private_impl.p_transform_io = 0;
62615
    goto exit;
62616
  }
62617
62618
  goto suspend;
62619
  suspend:
62620
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
62621
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
62622
62623
  goto exit;
62624
  exit:
62625
  if (a_dst && a_dst->data.ptr) {
62626
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
62627
  }
62628
62629
  if (wuffs_base__status__is_error(&status)) {
62630
    self->private_impl.magic = WUFFS_BASE__DISABLED;
62631
  }
62632
  return status;
62633
}
62634
62635
// -------- func lzma.decoder.do_transform_io
62636
62637
WUFFS_BASE__GENERATED_C_CODE
62638
static wuffs_base__status
62639
wuffs_lzma__decoder__do_transform_io(
62640
    wuffs_lzma__decoder* self,
62641
    wuffs_base__io_buffer* a_dst,
62642
    wuffs_base__io_buffer* a_src,
62643
    wuffs_base__slice_u8 a_workbuf) {
62644
  wuffs_base__status status = wuffs_base__make_status(NULL);
62645
62646
  uint8_t v_header_byte = 0;
62647
  uint8_t v_c8 = 0;
62648
  uint32_t v_c32 = 0;
62649
  uint8_t v_prop_byte = 0;
62650
  uint32_t v_lc = 0;
62651
  uint32_t v_lp = 0;
62652
  uint32_t v_pb = 0;
62653
  uint32_t v_length = 0;
62654
  uint32_t v_n_copied = 0;
62655
  uint64_t v_smark = 0;
62656
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
62657
62658
  uint8_t* iop_a_dst = NULL;
62659
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62660
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62661
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62662
  if (a_dst && a_dst->data.ptr) {
62663
    io0_a_dst = a_dst->data.ptr;
62664
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
62665
    iop_a_dst = io1_a_dst;
62666
    io2_a_dst = io0_a_dst + a_dst->data.len;
62667
    if (a_dst->meta.closed) {
62668
      io2_a_dst = iop_a_dst;
62669
    }
62670
  }
62671
  const uint8_t* iop_a_src = NULL;
62672
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62673
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62674
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
62675
  if (a_src && a_src->data.ptr) {
62676
    io0_a_src = a_src->data.ptr;
62677
    io1_a_src = io0_a_src + a_src->meta.ri;
62678
    iop_a_src = io1_a_src;
62679
    io2_a_src = io0_a_src + a_src->meta.wi;
62680
  }
62681
62682
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
62683
  if (coro_susp_point) {
62684
    v_header_byte = self->private_data.s_do_transform_io.v_header_byte;
62685
    v_length = self->private_data.s_do_transform_io.v_length;
62686
  }
62687
  switch (coro_susp_point) {
62688
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
62689
62690
    self->private_impl.f_lzma2_need_prob_reset = true;
62691
    self->private_impl.f_lzma2_need_properties = true;
62692
    self->private_impl.f_lzma2_need_dict_reset = true;
62693
    while (true) {
62694
      if ((self->private_impl.f_format_extension & 255u) == 0u) {
62695
        {
62696
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
62697
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62698
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62699
            goto suspend;
62700
          }
62701
          uint8_t t_0 = *iop_a_src++;
62702
          v_prop_byte = t_0;
62703
        }
62704
        if (v_prop_byte >= 225u) {
62705
          status = wuffs_base__make_status(wuffs_lzma__error__bad_header);
62706
          goto exit;
62707
        }
62708
        v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
62709
#if defined(__GNUC__)
62710
#pragma GCC diagnostic push
62711
#pragma GCC diagnostic ignored "-Wconversion"
62712
#endif
62713
        v_prop_byte /= 9u;
62714
#if defined(__GNUC__)
62715
#pragma GCC diagnostic pop
62716
#endif
62717
        v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
62718
        v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
62719
        if ((v_lc + v_lp) > 4u) {
62720
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_properties);
62721
          goto exit;
62722
        }
62723
        self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
62724
        self->private_impl.f_lp = v_lp;
62725
        self->private_impl.f_pb = v_pb;
62726
        {
62727
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
62728
          uint32_t t_1;
62729
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
62730
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
62731
            iop_a_src += 4;
62732
          } else {
62733
            self->private_data.s_do_transform_io.scratch = 0;
62734
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
62735
            while (true) {
62736
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62737
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62738
                goto suspend;
62739
              }
62740
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
62741
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
62742
              *scratch <<= 8;
62743
              *scratch >>= 8;
62744
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
62745
              if (num_bits_1 == 24) {
62746
                t_1 = ((uint32_t)(*scratch));
62747
                break;
62748
              }
62749
              num_bits_1 += 8u;
62750
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
62751
            }
62752
          }
62753
          v_c32 = t_1;
62754
        }
62755
        self->private_impl.f_dict_size = wuffs_base__u32__max(v_c32, 4096u);
62756
        {
62757
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
62758
          uint64_t t_2;
62759
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
62760
            t_2 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
62761
            iop_a_src += 8;
62762
          } else {
62763
            self->private_data.s_do_transform_io.scratch = 0;
62764
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
62765
            while (true) {
62766
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62767
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62768
                goto suspend;
62769
              }
62770
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
62771
              uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
62772
              *scratch <<= 8;
62773
              *scratch >>= 8;
62774
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
62775
              if (num_bits_2 == 56) {
62776
                t_2 = ((uint64_t)(*scratch));
62777
                break;
62778
              }
62779
              num_bits_2 += 8u;
62780
              *scratch |= ((uint64_t)(num_bits_2)) << 56;
62781
            }
62782
          }
62783
          self->private_impl.f_decoded_length = t_2;
62784
        }
62785
        if ((self->private_impl.f_decoded_length >= 9223372036854775808u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
62786
          status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
62787
          goto exit;
62788
        }
62789
        wuffs_lzma__decoder__initialize_probs(self);
62790
      } else if ((self->private_impl.f_format_extension & 255u) == 1u) {
62791
        self->private_impl.f_lc = 3u;
62792
        self->private_impl.f_lp = 0u;
62793
        self->private_impl.f_pb = 2u;
62794
        self->private_impl.f_decoded_length = 18446744073709551615u;
62795
        wuffs_lzma__decoder__initialize_probs(self);
62796
      } else {
62797
        while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
62798
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62799
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
62800
        }
62801
        if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
62802
          iop_a_src += 1u;
62803
          break;
62804
        }
62805
        {
62806
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
62807
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62808
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62809
            goto suspend;
62810
          }
62811
          uint8_t t_3 = *iop_a_src++;
62812
          v_header_byte = t_3;
62813
        }
62814
        if (v_header_byte < 128u) {
62815
          if (v_header_byte < 2u) {
62816
            self->private_impl.f_lzma2_need_prob_reset = true;
62817
            self->private_impl.f_lzma2_need_properties = true;
62818
            self->private_impl.f_lzma2_need_dict_reset = false;
62819
            wuffs_lzma__decoder__initialize_dict(self);
62820
          } else if ((v_header_byte > 2u) || self->private_impl.f_lzma2_need_dict_reset) {
62821
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
62822
            goto exit;
62823
          }
62824
          self->private_impl.f_prev_lzma2_chunk_was_uncompressed = true;
62825
          {
62826
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
62827
            uint32_t t_4;
62828
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
62829
              t_4 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
62830
              iop_a_src += 2;
62831
            } else {
62832
              self->private_data.s_do_transform_io.scratch = 0;
62833
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
62834
              while (true) {
62835
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62836
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62837
                  goto suspend;
62838
                }
62839
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
62840
                uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
62841
                *scratch >>= 8;
62842
                *scratch <<= 8;
62843
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
62844
                if (num_bits_4 == 8) {
62845
                  t_4 = ((uint32_t)(*scratch >> 48));
62846
                  break;
62847
                }
62848
                num_bits_4 += 8u;
62849
                *scratch |= ((uint64_t)(num_bits_4));
62850
              }
62851
            }
62852
            v_c32 = t_4;
62853
          }
62854
          v_length = (1u + v_c32);
62855
          while (true) {
62856
            v_n_copied = wuffs_private_impl__io_writer__limited_copy_u32_from_reader(
62857
                &iop_a_dst, io2_a_dst,v_length, &iop_a_src, io2_a_src);
62858
            wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_stashed_pos, ((uint64_t)(v_n_copied)));
62859
            if (v_length <= v_n_copied) {
62860
              break;
62861
            }
62862
            v_length -= v_n_copied;
62863
            if (((uint64_t)(io2_a_dst - iop_a_dst)) == 0u) {
62864
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
62865
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
62866
            } else {
62867
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62868
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
62869
            }
62870
          }
62871
          continue;
62872
        }
62873
        self->private_impl.f_decoded_length = ((uint64_t)(v_header_byte));
62874
        {
62875
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
62876
          uint32_t t_5;
62877
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
62878
            t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
62879
            iop_a_src += 2;
62880
          } else {
62881
            self->private_data.s_do_transform_io.scratch = 0;
62882
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
62883
            while (true) {
62884
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62885
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62886
                goto suspend;
62887
              }
62888
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
62889
              uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
62890
              *scratch >>= 8;
62891
              *scratch <<= 8;
62892
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
62893
              if (num_bits_5 == 8) {
62894
                t_5 = ((uint32_t)(*scratch >> 48));
62895
                break;
62896
              }
62897
              num_bits_5 += 8u;
62898
              *scratch |= ((uint64_t)(num_bits_5));
62899
            }
62900
          }
62901
          v_c32 = t_5;
62902
        }
62903
        self->private_impl.f_decoded_length = (((self->private_impl.f_decoded_length & 31u) << 16u) + ((uint64_t)((1u + v_c32))));
62904
        {
62905
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
62906
          uint32_t t_6;
62907
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
62908
            t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
62909
            iop_a_src += 2;
62910
          } else {
62911
            self->private_data.s_do_transform_io.scratch = 0;
62912
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
62913
            while (true) {
62914
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62915
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62916
                goto suspend;
62917
              }
62918
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
62919
              uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
62920
              *scratch >>= 8;
62921
              *scratch <<= 8;
62922
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
62923
              if (num_bits_6 == 8) {
62924
                t_6 = ((uint32_t)(*scratch >> 48));
62925
                break;
62926
              }
62927
              num_bits_6 += 8u;
62928
              *scratch |= ((uint64_t)(num_bits_6));
62929
            }
62930
          }
62931
          v_c32 = t_6;
62932
        }
62933
        self->private_impl.f_lzma2_encoded_length_want = ((uint64_t)((1u + v_c32)));
62934
        if (v_header_byte >= 160u) {
62935
          wuffs_lzma__decoder__initialize_probs(self);
62936
          self->private_impl.f_lzma2_need_prob_reset = false;
62937
        }
62938
        if (v_header_byte >= 192u) {
62939
          {
62940
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
62941
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62942
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62943
              goto suspend;
62944
            }
62945
            uint8_t t_7 = *iop_a_src++;
62946
            v_prop_byte = t_7;
62947
          }
62948
          if (v_prop_byte >= 225u) {
62949
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
62950
            goto exit;
62951
          }
62952
          v_lc = ((uint32_t)(((uint8_t)(v_prop_byte % 9u))));
62953
#if defined(__GNUC__)
62954
#pragma GCC diagnostic push
62955
#pragma GCC diagnostic ignored "-Wconversion"
62956
#endif
62957
          v_prop_byte /= 9u;
62958
#if defined(__GNUC__)
62959
#pragma GCC diagnostic pop
62960
#endif
62961
          v_lp = ((uint32_t)(((uint8_t)(v_prop_byte % 5u))));
62962
          v_pb = ((uint32_t)(((uint8_t)(v_prop_byte / 5u))));
62963
          if ((v_lc + v_lp) > 4u) {
62964
            status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
62965
            goto exit;
62966
          }
62967
          self->private_impl.f_lc = wuffs_base__u32__min(v_lc, 4u);
62968
          self->private_impl.f_lp = v_lp;
62969
          self->private_impl.f_pb = v_pb;
62970
          self->private_impl.f_lzma2_need_properties = false;
62971
        }
62972
        if (v_header_byte >= 224u) {
62973
          self->private_impl.f_lzma2_need_dict_reset = false;
62974
          wuffs_lzma__decoder__initialize_dict(self);
62975
        } else if (self->private_impl.f_prev_lzma2_chunk_was_uncompressed) {
62976
          if (a_dst) {
62977
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
62978
          }
62979
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
62980
          status = wuffs_lzma__decoder__update_stashed_bytes(self, a_dst, a_workbuf);
62981
          if (a_dst) {
62982
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
62983
          }
62984
          if (status.repr) {
62985
            goto suspend;
62986
          }
62987
        }
62988
        self->private_impl.f_prev_lzma2_chunk_was_uncompressed = false;
62989
        if (self->private_impl.f_lzma2_need_prob_reset || self->private_impl.f_lzma2_need_properties || self->private_impl.f_lzma2_need_dict_reset) {
62990
          status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
62991
          goto exit;
62992
        }
62993
      }
62994
      {
62995
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
62996
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
62997
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
62998
          goto suspend;
62999
        }
63000
        uint8_t t_8 = *iop_a_src++;
63001
        v_c8 = t_8;
63002
      }
63003
      if ((v_c8 != 0u) &&  ! self->private_impl.f_allow_non_zero_initial_byte) {
63004
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
63005
        goto exit;
63006
      }
63007
      {
63008
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
63009
        uint32_t t_9;
63010
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63011
          t_9 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
63012
          iop_a_src += 4;
63013
        } else {
63014
          self->private_data.s_do_transform_io.scratch = 0;
63015
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
63016
          while (true) {
63017
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63018
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63019
              goto suspend;
63020
            }
63021
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63022
            uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
63023
            *scratch >>= 8;
63024
            *scratch <<= 8;
63025
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
63026
            if (num_bits_9 == 24) {
63027
              t_9 = ((uint32_t)(*scratch >> 32));
63028
              break;
63029
            }
63030
            num_bits_9 += 8u;
63031
            *scratch |= ((uint64_t)(num_bits_9));
63032
          }
63033
        }
63034
        self->private_impl.f_stashed_bits = t_9;
63035
      }
63036
      if (self->private_impl.f_stashed_bits == 4294967295u) {
63037
        status = wuffs_base__make_status(wuffs_lzma__error__bad_code);
63038
        goto exit;
63039
      }
63040
      self->private_impl.f_stashed_range = 4294967295u;
63041
      self->private_impl.f_stashed_pos_end = wuffs_base__u64__sat_add(self->private_impl.f_stashed_pos, self->private_impl.f_decoded_length);
63042
      if ((self->private_impl.f_stashed_pos_end == 18446744073709551615u) && (self->private_impl.f_decoded_length != 18446744073709551615u)) {
63043
        status = wuffs_base__make_status(wuffs_lzma__error__unsupported_decoded_length);
63044
        goto exit;
63045
      }
63046
      self->private_impl.f_lzma2_encoded_length_have = 5u;
63047
      while (((uint64_t)(a_workbuf.len)) < (((uint64_t)(self->private_impl.f_dict_size)) + 273u)) {
63048
        status = wuffs_base__make_status(wuffs_base__suspension__short_workbuf);
63049
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(21);
63050
      }
63051
      while (true) {
63052
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
63053
        {
63054
          if (a_dst) {
63055
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63056
          }
63057
          if (a_src) {
63058
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63059
          }
63060
          wuffs_base__status t_10 = wuffs_lzma__decoder__decode_bitstream(self, a_dst, a_src, a_workbuf);
63061
          v_status = t_10;
63062
          if (a_dst) {
63063
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
63064
          }
63065
          if (a_src) {
63066
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
63067
          }
63068
        }
63069
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_lzma2_encoded_length_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))));
63070
        if (wuffs_base__status__is_ok(&v_status)) {
63071
          break;
63072
        }
63073
        status = v_status;
63074
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(22);
63075
      }
63076
      if (self->private_impl.f_decoded_length == 18446744073709551615u) {
63077
        if (self->private_impl.f_stashed_bits != 0u) {
63078
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
63079
          goto exit;
63080
        }
63081
      } else if (self->private_impl.f_stashed_pos != self->private_impl.f_stashed_pos_end) {
63082
        status = wuffs_base__make_status(wuffs_lzma__error__bad_decoded_length);
63083
        goto exit;
63084
      } else if (self->private_impl.f_stashed_bits != 0u) {
63085
        if (a_src) {
63086
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63087
        }
63088
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
63089
        status = wuffs_lzma__decoder__decode_optional_end_of_stream(self, a_src, a_workbuf);
63090
        if (a_src) {
63091
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
63092
        }
63093
        if (status.repr) {
63094
          goto suspend;
63095
        }
63096
        if (self->private_impl.f_stashed_bits != 0u) {
63097
          status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
63098
          goto exit;
63099
        }
63100
      }
63101
      if ((self->private_impl.f_format_extension & 255u) < 2u) {
63102
        break;
63103
      } else if (self->private_impl.f_lzma2_encoded_length_have != self->private_impl.f_lzma2_encoded_length_want) {
63104
        status = wuffs_base__make_status(wuffs_lzma__error__bad_lzma2_header);
63105
        goto exit;
63106
      }
63107
    }
63108
63109
    ok:
63110
    self->private_impl.p_do_transform_io = 0;
63111
    goto exit;
63112
  }
63113
63114
  goto suspend;
63115
  suspend:
63116
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63117
  self->private_data.s_do_transform_io.v_header_byte = v_header_byte;
63118
  self->private_data.s_do_transform_io.v_length = v_length;
63119
63120
  goto exit;
63121
  exit:
63122
  if (a_dst && a_dst->data.ptr) {
63123
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63124
  }
63125
  if (a_src && a_src->data.ptr) {
63126
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63127
  }
63128
63129
  return status;
63130
}
63131
63132
// -------- func lzma.decoder.decode_bitstream
63133
63134
WUFFS_BASE__GENERATED_C_CODE
63135
static wuffs_base__status
63136
wuffs_lzma__decoder__decode_bitstream(
63137
    wuffs_lzma__decoder* self,
63138
    wuffs_base__io_buffer* a_dst,
63139
    wuffs_base__io_buffer* a_src,
63140
    wuffs_base__slice_u8 a_workbuf) {
63141
  wuffs_base__status status = wuffs_base__make_status(NULL);
63142
63143
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63144
63145
  uint32_t coro_susp_point = self->private_impl.p_decode_bitstream;
63146
  switch (coro_susp_point) {
63147
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63148
63149
    self->private_impl.f_end_of_chunk = false;
63150
    while (true) {
63151
      v_status = wuffs_lzma__decoder__decode_bitstream_fast(self, a_dst, a_src, a_workbuf);
63152
      if (wuffs_base__status__is_error(&v_status)) {
63153
        status = v_status;
63154
        goto exit;
63155
      }
63156
      if (self->private_impl.f_end_of_chunk) {
63157
        break;
63158
      }
63159
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63160
      status = wuffs_lzma__decoder__decode_bitstream_slow(self, a_dst, a_src, a_workbuf);
63161
      if (status.repr) {
63162
        goto suspend;
63163
      }
63164
      if (self->private_impl.f_end_of_chunk) {
63165
        break;
63166
      }
63167
    }
63168
63169
    goto ok;
63170
    ok:
63171
    self->private_impl.p_decode_bitstream = 0;
63172
    goto exit;
63173
  }
63174
63175
  goto suspend;
63176
  suspend:
63177
  self->private_impl.p_decode_bitstream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63178
63179
  goto exit;
63180
  exit:
63181
  return status;
63182
}
63183
63184
// -------- func lzma.decoder.update_stashed_bytes
63185
63186
WUFFS_BASE__GENERATED_C_CODE
63187
static wuffs_base__status
63188
wuffs_lzma__decoder__update_stashed_bytes(
63189
    wuffs_lzma__decoder* self,
63190
    wuffs_base__io_buffer* a_dst,
63191
    wuffs_base__slice_u8 a_workbuf) {
63192
  wuffs_base__status status = wuffs_base__make_status(NULL);
63193
63194
  uint32_t v_dist = 0;
63195
  uint32_t v_which = 0;
63196
  uint32_t v_adj_dist = 0;
63197
  uint64_t v_wb_index = 0;
63198
63199
  uint8_t* iop_a_dst = NULL;
63200
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63201
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63202
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63203
  if (a_dst && a_dst->data.ptr) {
63204
    io0_a_dst = a_dst->data.ptr;
63205
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
63206
    iop_a_dst = io1_a_dst;
63207
    io2_a_dst = io0_a_dst + a_dst->data.len;
63208
    if (a_dst->meta.closed) {
63209
      io2_a_dst = iop_a_dst;
63210
    }
63211
  }
63212
63213
  uint32_t coro_susp_point = self->private_impl.p_update_stashed_bytes;
63214
  switch (coro_susp_point) {
63215
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63216
63217
    while (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
63218
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
63219
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63220
    }
63221
    v_dist = 1u;
63222
    v_which = 0u;
63223
    while (v_which < 2u) {
63224
      if (((uint64_t)(v_dist)) <= ((uint64_t)(iop_a_dst - io0_a_dst))) {
63225
        wuffs_private_impl__io_writer__limited_copy_u32_from_history(
63226
            &iop_a_dst, io0_a_dst, io2_a_dst, 1u, v_dist);
63227
        if ( ! (iop_a_dst > io1_a_dst)) {
63228
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63229
          goto exit;
63230
        }
63231
        self->private_impl.f_stashed_bytes[v_which] = iop_a_dst[-1];
63232
        iop_a_dst--;
63233
      } else {
63234
        v_adj_dist = ((uint32_t)((((uint64_t)(v_dist)) - ((uint64_t)(iop_a_dst - io0_a_dst)))));
63235
        v_wb_index = ((uint64_t)(((uint64_t)(self->private_impl.f_dict_workbuf_index)) - ((uint64_t)(v_adj_dist))));
63236
        while (v_wb_index >= 9223372036854775808u) {
63237
          v_wb_index += ((uint64_t)(self->private_impl.f_dict_size));
63238
        }
63239
        if (v_wb_index >= ((uint64_t)(a_workbuf.len))) {
63240
          status = wuffs_base__make_status(wuffs_lzma__error__internal_error_inconsistent_dictionary_state);
63241
          goto exit;
63242
        }
63243
        self->private_impl.f_stashed_bytes[v_which] = a_workbuf.ptr[v_wb_index];
63244
      }
63245
      v_dist = (1u + self->private_impl.f_stashed_rep0);
63246
      v_which += 1u;
63247
    }
63248
63249
    ok:
63250
    self->private_impl.p_update_stashed_bytes = 0;
63251
    goto exit;
63252
  }
63253
63254
  goto suspend;
63255
  suspend:
63256
  self->private_impl.p_update_stashed_bytes = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63257
63258
  goto exit;
63259
  exit:
63260
  if (a_dst && a_dst->data.ptr) {
63261
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63262
  }
63263
63264
  return status;
63265
}
63266
63267
// -------- func lzma.decoder.decode_optional_end_of_stream
63268
63269
WUFFS_BASE__GENERATED_C_CODE
63270
static wuffs_base__status
63271
wuffs_lzma__decoder__decode_optional_end_of_stream(
63272
    wuffs_lzma__decoder* self,
63273
    wuffs_base__io_buffer* a_src,
63274
    wuffs_base__slice_u8 a_workbuf) {
63275
  wuffs_base__status status = wuffs_base__make_status(NULL);
63276
63277
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
63278
  wuffs_base__io_buffer* v_w = &u_w;
63279
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63280
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63281
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63282
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63283
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63284
63285
  uint32_t coro_susp_point = self->private_impl.p_decode_optional_end_of_stream;
63286
  switch (coro_susp_point) {
63287
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63288
63289
    self->private_impl.f_stashed_pos_end = 18446744073709551615u;
63290
    while (true) {
63291
      {
63292
        wuffs_base__io_buffer* o_0_v_w = v_w;
63293
        uint8_t* o_0_iop_v_w = iop_v_w;
63294
        uint8_t* o_0_io0_v_w = io0_v_w;
63295
        uint8_t* o_0_io1_v_w = io1_v_w;
63296
        uint8_t* o_0_io2_v_w = io2_v_w;
63297
        v_w = wuffs_private_impl__io_writer__set(
63298
            &u_w,
63299
            &iop_v_w,
63300
            &io0_v_w,
63301
            &io1_v_w,
63302
            &io2_v_w,
63303
            wuffs_base__utility__empty_slice_u8(),
63304
            0u);
63305
        {
63306
          wuffs_base__status t_0 = wuffs_lzma__decoder__decode_bitstream_slow(self, v_w, a_src, a_workbuf);
63307
          v_status = t_0;
63308
        }
63309
        v_w = o_0_v_w;
63310
        iop_v_w = o_0_iop_v_w;
63311
        io0_v_w = o_0_io0_v_w;
63312
        io1_v_w = o_0_io1_v_w;
63313
        io2_v_w = o_0_io2_v_w;
63314
      }
63315
      if (wuffs_base__status__is_ok(&v_status)) {
63316
        break;
63317
      } else if (v_status.repr == wuffs_base__suspension__short_write) {
63318
        status = wuffs_base__make_status(wuffs_lzma__error__bad_bitstream_trailer);
63319
        goto exit;
63320
      }
63321
      status = v_status;
63322
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63323
    }
63324
    self->private_impl.f_stashed_pos_end = self->private_impl.f_stashed_pos;
63325
63326
    ok:
63327
    self->private_impl.p_decode_optional_end_of_stream = 0;
63328
    goto exit;
63329
  }
63330
63331
  goto suspend;
63332
  suspend:
63333
  self->private_impl.p_decode_optional_end_of_stream = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63334
63335
  goto exit;
63336
  exit:
63337
  return status;
63338
}
63339
63340
// -------- func lzma.decoder.initialize_dict
63341
63342
WUFFS_BASE__GENERATED_C_CODE
63343
static wuffs_base__empty_struct
63344
wuffs_lzma__decoder__initialize_dict(
63345
    wuffs_lzma__decoder* self) {
63346
  self->private_impl.f_dict_workbuf_index = 0u;
63347
  self->private_impl.f_dict_seen = 0u;
63348
  self->private_impl.f_stashed_bytes[0u] = 0u;
63349
  self->private_impl.f_stashed_bytes[1u] = 0u;
63350
  self->private_impl.f_stashed_pos = 0u;
63351
  return wuffs_base__make_empty_struct();
63352
}
63353
63354
// -------- func lzma.decoder.initialize_probs
63355
63356
WUFFS_BASE__GENERATED_C_CODE
63357
static wuffs_base__empty_struct
63358
wuffs_lzma__decoder__initialize_probs(
63359
    wuffs_lzma__decoder* self) {
63360
  uint32_t v_i = 0;
63361
  uint32_t v_j = 0;
63362
63363
  v_i = 0u;
63364
  while (v_i < 192u) {
63365
    self->private_data.f_probs_ao00[v_i] = 1024u;
63366
    v_i += 1u;
63367
  }
63368
  v_i = 0u;
63369
  while (v_i < 12u) {
63370
    self->private_data.f_probs_ao20[v_i] = 1024u;
63371
    v_i += 1u;
63372
  }
63373
  v_i = 0u;
63374
  while (v_i < 12u) {
63375
    self->private_data.f_probs_ao40[v_i] = 1024u;
63376
    v_i += 1u;
63377
  }
63378
  v_i = 0u;
63379
  while (v_i < 192u) {
63380
    self->private_data.f_probs_ao41[v_i] = 1024u;
63381
    v_i += 1u;
63382
  }
63383
  v_i = 0u;
63384
  while (v_i < 12u) {
63385
    self->private_data.f_probs_ao60[v_i] = 1024u;
63386
    v_i += 1u;
63387
  }
63388
  v_i = 0u;
63389
  while (v_i < 12u) {
63390
    self->private_data.f_probs_ao63[v_i] = 1024u;
63391
    v_i += 1u;
63392
  }
63393
  v_i = 0u;
63394
  while (v_i < 16u) {
63395
    v_j = 0u;
63396
    while (v_j < 8u) {
63397
      self->private_data.f_probs_match_len_low[v_i][v_j] = 1024u;
63398
      v_j += 1u;
63399
    }
63400
    v_i += 1u;
63401
  }
63402
  v_i = 0u;
63403
  while (v_i < 16u) {
63404
    v_j = 0u;
63405
    while (v_j < 8u) {
63406
      self->private_data.f_probs_match_len_mid[v_i][v_j] = 1024u;
63407
      v_j += 1u;
63408
    }
63409
    v_i += 1u;
63410
  }
63411
  v_i = 0u;
63412
  while (v_i < 256u) {
63413
    self->private_data.f_probs_match_len_high[0u][v_i] = 1024u;
63414
    v_i += 1u;
63415
  }
63416
  v_i = 0u;
63417
  while (v_i < 16u) {
63418
    v_j = 0u;
63419
    while (v_j < 8u) {
63420
      self->private_data.f_probs_longrep_len_low[v_i][v_j] = 1024u;
63421
      v_j += 1u;
63422
    }
63423
    v_i += 1u;
63424
  }
63425
  v_i = 0u;
63426
  while (v_i < 16u) {
63427
    v_j = 0u;
63428
    while (v_j < 8u) {
63429
      self->private_data.f_probs_longrep_len_mid[v_i][v_j] = 1024u;
63430
      v_j += 1u;
63431
    }
63432
    v_i += 1u;
63433
  }
63434
  v_i = 0u;
63435
  while (v_i < 256u) {
63436
    self->private_data.f_probs_longrep_len_high[0u][v_i] = 1024u;
63437
    v_i += 1u;
63438
  }
63439
  v_i = 0u;
63440
  while (v_i < 4u) {
63441
    v_j = 0u;
63442
    while (v_j < 64u) {
63443
      self->private_data.f_probs_slot[v_i][v_j] = 1024u;
63444
      v_j += 1u;
63445
    }
63446
    v_i += 1u;
63447
  }
63448
  v_i = 0u;
63449
  while (v_i < 128u) {
63450
    self->private_data.f_probs_small_dist[v_i] = 1024u;
63451
    v_i += 1u;
63452
  }
63453
  v_i = 0u;
63454
  while (v_i < 16u) {
63455
    self->private_data.f_probs_large_dist[v_i] = 1024u;
63456
    v_i += 1u;
63457
  }
63458
  v_i = 0u;
63459
  while (v_i < 16u) {
63460
    v_j = 0u;
63461
    while (v_j < 768u) {
63462
      self->private_data.f_probs_lit[v_i][v_j] = 1024u;
63463
      v_j += 1u;
63464
    }
63465
    v_i += 1u;
63466
  }
63467
  self->private_impl.f_stashed_state = 0u;
63468
  self->private_impl.f_stashed_rep0 = 0u;
63469
  self->private_impl.f_stashed_rep1 = 0u;
63470
  self->private_impl.f_stashed_rep2 = 0u;
63471
  self->private_impl.f_stashed_rep3 = 0u;
63472
  return wuffs_base__make_empty_struct();
63473
}
63474
63475
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZMA)
63476
63477
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
63478
63479
// ---------------- Status Codes Implementations
63480
63481
const char wuffs_lzip__error__bad_checksum[] = "#lzip: bad checksum";
63482
const char wuffs_lzip__error__bad_footer[] = "#lzip: bad footer";
63483
const char wuffs_lzip__error__bad_header[] = "#lzip: bad header";
63484
const char wuffs_lzip__error__truncated_input[] = "#lzip: truncated input";
63485
63486
// ---------------- Private Consts
63487
63488
// ---------------- Private Initializer Prototypes
63489
63490
// ---------------- Private Function Prototypes
63491
63492
WUFFS_BASE__GENERATED_C_CODE
63493
static wuffs_base__status
63494
wuffs_lzip__decoder__do_transform_io(
63495
    wuffs_lzip__decoder* self,
63496
    wuffs_base__io_buffer* a_dst,
63497
    wuffs_base__io_buffer* a_src,
63498
    wuffs_base__slice_u8 a_workbuf);
63499
63500
// ---------------- VTables
63501
63502
const wuffs_base__io_transformer__func_ptrs
63503
wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer = {
63504
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzip__decoder__dst_history_retain_length),
63505
  (uint64_t(*)(const void*,
63506
      uint32_t))(&wuffs_lzip__decoder__get_quirk),
63507
  (wuffs_base__status(*)(void*,
63508
      uint32_t,
63509
      uint64_t))(&wuffs_lzip__decoder__set_quirk),
63510
  (wuffs_base__status(*)(void*,
63511
      wuffs_base__io_buffer*,
63512
      wuffs_base__io_buffer*,
63513
      wuffs_base__slice_u8))(&wuffs_lzip__decoder__transform_io),
63514
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzip__decoder__workbuf_len),
63515
};
63516
63517
// ---------------- Initializer Implementations
63518
63519
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
63520
wuffs_lzip__decoder__initialize(
63521
    wuffs_lzip__decoder* self,
63522
    size_t sizeof_star_self,
63523
    uint64_t wuffs_version,
63524
    uint32_t options){
63525
  if (!self) {
63526
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63527
  }
63528
  if (sizeof(*self) != sizeof_star_self) {
63529
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
63530
  }
63531
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
63532
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
63533
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
63534
  }
63535
63536
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
63537
    // The whole point of this if-check is to detect an uninitialized *self.
63538
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
63539
#if !defined(__clang__) && defined(__GNUC__)
63540
#pragma GCC diagnostic push
63541
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
63542
#endif
63543
    if (self->private_impl.magic != 0) {
63544
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
63545
    }
63546
#if !defined(__clang__) && defined(__GNUC__)
63547
#pragma GCC diagnostic pop
63548
#endif
63549
  } else {
63550
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
63551
      memset(self, 0, sizeof(*self));
63552
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
63553
    } else {
63554
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
63555
    }
63556
  }
63557
63558
  {
63559
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
63560
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
63561
    if (z.repr) {
63562
      return z;
63563
    }
63564
  }
63565
  {
63566
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
63567
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
63568
    if (z.repr) {
63569
      return z;
63570
    }
63571
  }
63572
  self->private_impl.magic = WUFFS_BASE__MAGIC;
63573
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
63574
      wuffs_base__io_transformer__vtable_name;
63575
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
63576
      (const void*)(&wuffs_lzip__decoder__func_ptrs_for__wuffs_base__io_transformer);
63577
  return wuffs_base__make_status(NULL);
63578
}
63579
63580
wuffs_lzip__decoder*
63581
wuffs_lzip__decoder__alloc(void) {
63582
  wuffs_lzip__decoder* x =
63583
      (wuffs_lzip__decoder*)(calloc(1, sizeof(wuffs_lzip__decoder)));
63584
  if (!x) {
63585
    return NULL;
63586
  }
63587
  if (wuffs_lzip__decoder__initialize(
63588
      x, sizeof(wuffs_lzip__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
63589
    free(x);
63590
    return NULL;
63591
  }
63592
  return x;
63593
}
63594
63595
size_t
63596
sizeof__wuffs_lzip__decoder(void) {
63597
  return sizeof(wuffs_lzip__decoder);
63598
}
63599
63600
// ---------------- Function Implementations
63601
63602
// -------- func lzip.decoder.get_quirk
63603
63604
WUFFS_BASE__GENERATED_C_CODE
63605
WUFFS_BASE__MAYBE_STATIC uint64_t
63606
wuffs_lzip__decoder__get_quirk(
63607
    const wuffs_lzip__decoder* self,
63608
    uint32_t a_key) {
63609
  if (!self) {
63610
    return 0;
63611
  }
63612
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63613
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63614
    return 0;
63615
  }
63616
63617
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
63618
    return 1u;
63619
  }
63620
  return 0u;
63621
}
63622
63623
// -------- func lzip.decoder.set_quirk
63624
63625
WUFFS_BASE__GENERATED_C_CODE
63626
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63627
wuffs_lzip__decoder__set_quirk(
63628
    wuffs_lzip__decoder* self,
63629
    uint32_t a_key,
63630
    uint64_t a_value) {
63631
  if (!self) {
63632
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63633
  }
63634
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63635
    return wuffs_base__make_status(
63636
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63637
        ? wuffs_base__error__disabled_by_previous_error
63638
        : wuffs_base__error__initialize_not_called);
63639
  }
63640
63641
  if (a_key == 1u) {
63642
    self->private_impl.f_ignore_checksum = (a_value > 0u);
63643
    return wuffs_base__make_status(NULL);
63644
  }
63645
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
63646
}
63647
63648
// -------- func lzip.decoder.dst_history_retain_length
63649
63650
WUFFS_BASE__GENERATED_C_CODE
63651
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
63652
wuffs_lzip__decoder__dst_history_retain_length(
63653
    const wuffs_lzip__decoder* self) {
63654
  if (!self) {
63655
    return wuffs_base__utility__make_optional_u63(false, 0u);
63656
  }
63657
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63658
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63659
    return wuffs_base__utility__make_optional_u63(false, 0u);
63660
  }
63661
63662
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
63663
}
63664
63665
// -------- func lzip.decoder.workbuf_len
63666
63667
WUFFS_BASE__GENERATED_C_CODE
63668
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
63669
wuffs_lzip__decoder__workbuf_len(
63670
    const wuffs_lzip__decoder* self) {
63671
  if (!self) {
63672
    return wuffs_base__utility__empty_range_ii_u64();
63673
  }
63674
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
63675
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
63676
    return wuffs_base__utility__empty_range_ii_u64();
63677
  }
63678
63679
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
63680
}
63681
63682
// -------- func lzip.decoder.transform_io
63683
63684
WUFFS_BASE__GENERATED_C_CODE
63685
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
63686
wuffs_lzip__decoder__transform_io(
63687
    wuffs_lzip__decoder* self,
63688
    wuffs_base__io_buffer* a_dst,
63689
    wuffs_base__io_buffer* a_src,
63690
    wuffs_base__slice_u8 a_workbuf) {
63691
  if (!self) {
63692
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
63693
  }
63694
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
63695
    return wuffs_base__make_status(
63696
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
63697
        ? wuffs_base__error__disabled_by_previous_error
63698
        : wuffs_base__error__initialize_not_called);
63699
  }
63700
  if (!a_dst || !a_src) {
63701
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63702
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
63703
  }
63704
  if ((self->private_impl.active_coroutine != 0) &&
63705
      (self->private_impl.active_coroutine != 1)) {
63706
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63707
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
63708
  }
63709
  self->private_impl.active_coroutine = 0;
63710
  wuffs_base__status status = wuffs_base__make_status(NULL);
63711
63712
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63713
63714
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
63715
  switch (coro_susp_point) {
63716
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63717
63718
    while (true) {
63719
      {
63720
        wuffs_base__status t_0 = wuffs_lzip__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
63721
        v_status = t_0;
63722
      }
63723
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
63724
        status = wuffs_base__make_status(wuffs_lzip__error__truncated_input);
63725
        goto exit;
63726
      }
63727
      status = v_status;
63728
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
63729
    }
63730
63731
    ok:
63732
    self->private_impl.p_transform_io = 0;
63733
    goto exit;
63734
  }
63735
63736
  goto suspend;
63737
  suspend:
63738
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
63739
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
63740
63741
  goto exit;
63742
  exit:
63743
  if (wuffs_base__status__is_error(&status)) {
63744
    self->private_impl.magic = WUFFS_BASE__DISABLED;
63745
  }
63746
  return status;
63747
}
63748
63749
// -------- func lzip.decoder.do_transform_io
63750
63751
WUFFS_BASE__GENERATED_C_CODE
63752
static wuffs_base__status
63753
wuffs_lzip__decoder__do_transform_io(
63754
    wuffs_lzip__decoder* self,
63755
    wuffs_base__io_buffer* a_dst,
63756
    wuffs_base__io_buffer* a_src,
63757
    wuffs_base__slice_u8 a_workbuf) {
63758
  wuffs_base__status status = wuffs_base__make_status(NULL);
63759
63760
  uint8_t v_c8 = 0;
63761
  uint32_t v_c32 = 0;
63762
  uint64_t v_c64 = 0;
63763
  uint64_t v_dmark = 0;
63764
  uint64_t v_smark = 0;
63765
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
63766
  uint32_t v_checksum_want = 0;
63767
  uint32_t v_checksum_have = 0;
63768
  uint64_t v_size_want = 0;
63769
63770
  uint8_t* iop_a_dst = NULL;
63771
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63772
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63773
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63774
  if (a_dst && a_dst->data.ptr) {
63775
    io0_a_dst = a_dst->data.ptr;
63776
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
63777
    iop_a_dst = io1_a_dst;
63778
    io2_a_dst = io0_a_dst + a_dst->data.len;
63779
    if (a_dst->meta.closed) {
63780
      io2_a_dst = iop_a_dst;
63781
    }
63782
  }
63783
  const uint8_t* iop_a_src = NULL;
63784
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63785
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63786
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
63787
  if (a_src && a_src->data.ptr) {
63788
    io0_a_src = a_src->data.ptr;
63789
    io1_a_src = io0_a_src + a_src->meta.ri;
63790
    iop_a_src = io1_a_src;
63791
    io2_a_src = io0_a_src + a_src->meta.wi;
63792
  }
63793
63794
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
63795
  switch (coro_susp_point) {
63796
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
63797
63798
    while (true) {
63799
      {
63800
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
63801
        uint64_t t_0;
63802
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 5)) {
63803
          t_0 = ((uint64_t)(wuffs_base__peek_u40le__no_bounds_check(iop_a_src)));
63804
          iop_a_src += 5;
63805
        } else {
63806
          self->private_data.s_do_transform_io.scratch = 0;
63807
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
63808
          while (true) {
63809
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63810
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63811
              goto suspend;
63812
            }
63813
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63814
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
63815
            *scratch <<= 8;
63816
            *scratch >>= 8;
63817
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
63818
            if (num_bits_0 == 32) {
63819
              t_0 = ((uint64_t)(*scratch));
63820
              break;
63821
            }
63822
            num_bits_0 += 8u;
63823
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
63824
          }
63825
        }
63826
        v_c64 = t_0;
63827
      }
63828
      if (v_c64 != 5641951820u) {
63829
        status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
63830
        goto exit;
63831
      }
63832
      {
63833
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
63834
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63835
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63836
          goto suspend;
63837
        }
63838
        uint8_t t_1 = *iop_a_src++;
63839
        v_c8 = t_1;
63840
      }
63841
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (1u | (((uint64_t)(v_c8)) << 8u)));
63842
      if ( ! wuffs_base__status__is_ok(&v_status)) {
63843
        if (v_status.repr == wuffs_base__error__bad_argument) {
63844
          status = wuffs_base__make_status(wuffs_lzip__error__bad_header);
63845
          goto exit;
63846
        }
63847
        status = v_status;
63848
        if (wuffs_base__status__is_error(&status)) {
63849
          goto exit;
63850
        } else if (wuffs_base__status__is_suspension(&status)) {
63851
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
63852
          goto exit;
63853
        }
63854
        goto ok;
63855
      }
63856
      self->private_impl.f_ssize_have = 0u;
63857
      self->private_impl.f_dsize_have = 0u;
63858
      wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294272u, 1u);
63859
      while (true) {
63860
        v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
63861
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
63862
        {
63863
          if (a_dst) {
63864
            a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
63865
          }
63866
          if (a_src) {
63867
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
63868
          }
63869
          wuffs_base__status t_2 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
63870
          v_status = t_2;
63871
          if (a_dst) {
63872
            iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
63873
          }
63874
          if (a_src) {
63875
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
63876
          }
63877
        }
63878
        self->private_impl.f_ssize_have += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
63879
        self->private_impl.f_dsize_have += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
63880
        if ( ! self->private_impl.f_ignore_checksum) {
63881
          wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
63882
        }
63883
        if (wuffs_base__status__is_ok(&v_status)) {
63884
          break;
63885
        }
63886
        status = v_status;
63887
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
63888
      }
63889
      {
63890
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
63891
        uint32_t t_3;
63892
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
63893
          t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
63894
          iop_a_src += 4;
63895
        } else {
63896
          self->private_data.s_do_transform_io.scratch = 0;
63897
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
63898
          while (true) {
63899
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63900
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63901
              goto suspend;
63902
            }
63903
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63904
            uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
63905
            *scratch <<= 8;
63906
            *scratch >>= 8;
63907
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
63908
            if (num_bits_3 == 24) {
63909
              t_3 = ((uint32_t)(*scratch));
63910
              break;
63911
            }
63912
            num_bits_3 += 8u;
63913
            *scratch |= ((uint64_t)(num_bits_3)) << 56;
63914
          }
63915
        }
63916
        v_checksum_want = t_3;
63917
      }
63918
      if ( ! self->private_impl.f_ignore_checksum) {
63919
        v_checksum_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
63920
        if (v_checksum_have != v_checksum_want) {
63921
          status = wuffs_base__make_status(wuffs_lzip__error__bad_checksum);
63922
          goto exit;
63923
        }
63924
      }
63925
      {
63926
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
63927
        uint64_t t_4;
63928
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
63929
          t_4 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
63930
          iop_a_src += 8;
63931
        } else {
63932
          self->private_data.s_do_transform_io.scratch = 0;
63933
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
63934
          while (true) {
63935
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63936
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63937
              goto suspend;
63938
            }
63939
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63940
            uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
63941
            *scratch <<= 8;
63942
            *scratch >>= 8;
63943
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
63944
            if (num_bits_4 == 56) {
63945
              t_4 = ((uint64_t)(*scratch));
63946
              break;
63947
            }
63948
            num_bits_4 += 8u;
63949
            *scratch |= ((uint64_t)(num_bits_4)) << 56;
63950
          }
63951
        }
63952
        v_size_want = t_4;
63953
      }
63954
      if (self->private_impl.f_dsize_have != v_size_want) {
63955
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
63956
        goto exit;
63957
      }
63958
      {
63959
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
63960
        uint64_t t_5;
63961
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
63962
          t_5 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
63963
          iop_a_src += 8;
63964
        } else {
63965
          self->private_data.s_do_transform_io.scratch = 0;
63966
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
63967
          while (true) {
63968
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
63969
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63970
              goto suspend;
63971
            }
63972
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
63973
            uint32_t num_bits_5 = ((uint32_t)(*scratch >> 56));
63974
            *scratch <<= 8;
63975
            *scratch >>= 8;
63976
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_5;
63977
            if (num_bits_5 == 56) {
63978
              t_5 = ((uint64_t)(*scratch));
63979
              break;
63980
            }
63981
            num_bits_5 += 8u;
63982
            *scratch |= ((uint64_t)(num_bits_5)) << 56;
63983
          }
63984
        }
63985
        v_size_want = t_5;
63986
      }
63987
      if ((v_size_want < 26u) || (2251799813685248u < v_size_want)) {
63988
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
63989
        goto exit;
63990
      } else if (self->private_impl.f_ssize_have != (v_size_want - 26u)) {
63991
        status = wuffs_base__make_status(wuffs_lzip__error__bad_footer);
63992
        goto exit;
63993
      }
63994
      while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
63995
        if (a_src && a_src->meta.closed) {
63996
          goto label__outer__break;
63997
        }
63998
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
63999
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
64000
      }
64001
      v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
64002
      if (v_c32 != 1346984524u) {
64003
        break;
64004
      }
64005
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
64006
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
64007
      wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
64008
          sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
64009
    }
64010
    label__outer__break:;
64011
64012
    ok:
64013
    self->private_impl.p_do_transform_io = 0;
64014
    goto exit;
64015
  }
64016
64017
  goto suspend;
64018
  suspend:
64019
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64020
64021
  goto exit;
64022
  exit:
64023
  if (a_dst && a_dst->data.ptr) {
64024
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64025
  }
64026
  if (a_src && a_src->data.ptr) {
64027
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64028
  }
64029
64030
  return status;
64031
}
64032
64033
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZIP)
64034
64035
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
64036
64037
// ---------------- Status Codes Implementations
64038
64039
const char wuffs_lzw__error__bad_code[] = "#lzw: bad code";
64040
const char wuffs_lzw__error__truncated_input[] = "#lzw: truncated input";
64041
const char wuffs_lzw__error__internal_error_inconsistent_i_o[] = "#lzw: internal error: inconsistent I/O";
64042
64043
// ---------------- Private Consts
64044
64045
#define WUFFS_LZW__QUIRKS_BASE 1290672128u
64046
64047
// ---------------- Private Initializer Prototypes
64048
64049
// ---------------- Private Function Prototypes
64050
64051
WUFFS_BASE__GENERATED_C_CODE
64052
static wuffs_base__empty_struct
64053
wuffs_lzw__decoder__read_from(
64054
    wuffs_lzw__decoder* self,
64055
    wuffs_base__io_buffer* a_src);
64056
64057
WUFFS_BASE__GENERATED_C_CODE
64058
static wuffs_base__status
64059
wuffs_lzw__decoder__write_to(
64060
    wuffs_lzw__decoder* self,
64061
    wuffs_base__io_buffer* a_dst);
64062
64063
// ---------------- VTables
64064
64065
const wuffs_base__io_transformer__func_ptrs
64066
wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer = {
64067
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_lzw__decoder__dst_history_retain_length),
64068
  (uint64_t(*)(const void*,
64069
      uint32_t))(&wuffs_lzw__decoder__get_quirk),
64070
  (wuffs_base__status(*)(void*,
64071
      uint32_t,
64072
      uint64_t))(&wuffs_lzw__decoder__set_quirk),
64073
  (wuffs_base__status(*)(void*,
64074
      wuffs_base__io_buffer*,
64075
      wuffs_base__io_buffer*,
64076
      wuffs_base__slice_u8))(&wuffs_lzw__decoder__transform_io),
64077
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_lzw__decoder__workbuf_len),
64078
};
64079
64080
// ---------------- Initializer Implementations
64081
64082
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
64083
wuffs_lzw__decoder__initialize(
64084
    wuffs_lzw__decoder* self,
64085
    size_t sizeof_star_self,
64086
    uint64_t wuffs_version,
64087
    uint32_t options){
64088
  if (!self) {
64089
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64090
  }
64091
  if (sizeof(*self) != sizeof_star_self) {
64092
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
64093
  }
64094
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
64095
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
64096
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
64097
  }
64098
64099
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
64100
    // The whole point of this if-check is to detect an uninitialized *self.
64101
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
64102
#if !defined(__clang__) && defined(__GNUC__)
64103
#pragma GCC diagnostic push
64104
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64105
#endif
64106
    if (self->private_impl.magic != 0) {
64107
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
64108
    }
64109
#if !defined(__clang__) && defined(__GNUC__)
64110
#pragma GCC diagnostic pop
64111
#endif
64112
  } else {
64113
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
64114
      memset(self, 0, sizeof(*self));
64115
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
64116
    } else {
64117
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
64118
    }
64119
  }
64120
64121
  self->private_impl.magic = WUFFS_BASE__MAGIC;
64122
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
64123
      wuffs_base__io_transformer__vtable_name;
64124
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
64125
      (const void*)(&wuffs_lzw__decoder__func_ptrs_for__wuffs_base__io_transformer);
64126
  return wuffs_base__make_status(NULL);
64127
}
64128
64129
wuffs_lzw__decoder*
64130
wuffs_lzw__decoder__alloc(void) {
64131
  wuffs_lzw__decoder* x =
64132
      (wuffs_lzw__decoder*)(calloc(1, sizeof(wuffs_lzw__decoder)));
64133
  if (!x) {
64134
    return NULL;
64135
  }
64136
  if (wuffs_lzw__decoder__initialize(
64137
      x, sizeof(wuffs_lzw__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
64138
    free(x);
64139
    return NULL;
64140
  }
64141
  return x;
64142
}
64143
64144
size_t
64145
sizeof__wuffs_lzw__decoder(void) {
64146
  return sizeof(wuffs_lzw__decoder);
64147
}
64148
64149
// ---------------- Function Implementations
64150
64151
// -------- func lzw.decoder.get_quirk
64152
64153
WUFFS_BASE__GENERATED_C_CODE
64154
WUFFS_BASE__MAYBE_STATIC uint64_t
64155
wuffs_lzw__decoder__get_quirk(
64156
    const wuffs_lzw__decoder* self,
64157
    uint32_t a_key) {
64158
  if (!self) {
64159
    return 0;
64160
  }
64161
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64162
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64163
    return 0;
64164
  }
64165
64166
  if (a_key == 1290672128u) {
64167
    return ((uint64_t)(self->private_impl.f_pending_literal_width_plus_one));
64168
  }
64169
  return 0u;
64170
}
64171
64172
// -------- func lzw.decoder.set_quirk
64173
64174
WUFFS_BASE__GENERATED_C_CODE
64175
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64176
wuffs_lzw__decoder__set_quirk(
64177
    wuffs_lzw__decoder* self,
64178
    uint32_t a_key,
64179
    uint64_t a_value) {
64180
  if (!self) {
64181
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64182
  }
64183
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64184
    return wuffs_base__make_status(
64185
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64186
        ? wuffs_base__error__disabled_by_previous_error
64187
        : wuffs_base__error__initialize_not_called);
64188
  }
64189
64190
  if (a_key == 1290672128u) {
64191
    if (a_value > 9u) {
64192
      return wuffs_base__make_status(wuffs_base__error__bad_argument);
64193
    }
64194
    self->private_impl.f_pending_literal_width_plus_one = ((uint32_t)(a_value));
64195
    return wuffs_base__make_status(NULL);
64196
  }
64197
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
64198
}
64199
64200
// -------- func lzw.decoder.dst_history_retain_length
64201
64202
WUFFS_BASE__GENERATED_C_CODE
64203
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
64204
wuffs_lzw__decoder__dst_history_retain_length(
64205
    const wuffs_lzw__decoder* self) {
64206
  if (!self) {
64207
    return wuffs_base__utility__make_optional_u63(false, 0u);
64208
  }
64209
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64210
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64211
    return wuffs_base__utility__make_optional_u63(false, 0u);
64212
  }
64213
64214
  return wuffs_base__utility__make_optional_u63(true, 0u);
64215
}
64216
64217
// -------- func lzw.decoder.workbuf_len
64218
64219
WUFFS_BASE__GENERATED_C_CODE
64220
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
64221
wuffs_lzw__decoder__workbuf_len(
64222
    const wuffs_lzw__decoder* self) {
64223
  if (!self) {
64224
    return wuffs_base__utility__empty_range_ii_u64();
64225
  }
64226
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64227
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64228
    return wuffs_base__utility__empty_range_ii_u64();
64229
  }
64230
64231
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
64232
}
64233
64234
// -------- func lzw.decoder.transform_io
64235
64236
WUFFS_BASE__GENERATED_C_CODE
64237
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64238
wuffs_lzw__decoder__transform_io(
64239
    wuffs_lzw__decoder* self,
64240
    wuffs_base__io_buffer* a_dst,
64241
    wuffs_base__io_buffer* a_src,
64242
    wuffs_base__slice_u8 a_workbuf) {
64243
  if (!self) {
64244
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64245
  }
64246
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64247
    return wuffs_base__make_status(
64248
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64249
        ? wuffs_base__error__disabled_by_previous_error
64250
        : wuffs_base__error__initialize_not_called);
64251
  }
64252
  if (!a_dst || !a_src) {
64253
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64254
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64255
  }
64256
  if ((self->private_impl.active_coroutine != 0) &&
64257
      (self->private_impl.active_coroutine != 1)) {
64258
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64259
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
64260
  }
64261
  self->private_impl.active_coroutine = 0;
64262
  wuffs_base__status status = wuffs_base__make_status(NULL);
64263
64264
  uint32_t v_i = 0;
64265
64266
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
64267
  switch (coro_susp_point) {
64268
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64269
64270
    self->private_impl.f_literal_width = 8u;
64271
    if (self->private_impl.f_pending_literal_width_plus_one > 0u) {
64272
      self->private_impl.f_literal_width = (self->private_impl.f_pending_literal_width_plus_one - 1u);
64273
    }
64274
    self->private_impl.f_clear_code = (((uint32_t)(1u)) << self->private_impl.f_literal_width);
64275
    self->private_impl.f_end_code = (self->private_impl.f_clear_code + 1u);
64276
    self->private_impl.f_save_code = self->private_impl.f_end_code;
64277
    self->private_impl.f_prev_code = self->private_impl.f_end_code;
64278
    self->private_impl.f_width = (self->private_impl.f_literal_width + 1u);
64279
    self->private_impl.f_bits = 0u;
64280
    self->private_impl.f_n_bits = 0u;
64281
    self->private_impl.f_output_ri = 0u;
64282
    self->private_impl.f_output_wi = 0u;
64283
    v_i = 0u;
64284
    while (v_i < self->private_impl.f_clear_code) {
64285
      self->private_data.f_lm1s[v_i] = 0u;
64286
      self->private_data.f_suffixes[v_i][0u] = ((uint8_t)(v_i));
64287
      v_i += 1u;
64288
    }
64289
    while (true) {
64290
      wuffs_lzw__decoder__read_from(self, a_src);
64291
      if (self->private_impl.f_output_wi > 0u) {
64292
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
64293
        status = wuffs_lzw__decoder__write_to(self, a_dst);
64294
        if (status.repr) {
64295
          goto suspend;
64296
        }
64297
      }
64298
      if (self->private_impl.f_read_from_return_value == 0u) {
64299
        break;
64300
      } else if (self->private_impl.f_read_from_return_value == 1u) {
64301
        continue;
64302
      } else if (self->private_impl.f_read_from_return_value == 2u) {
64303
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64304
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
64305
      } else if (self->private_impl.f_read_from_return_value == 3u) {
64306
        status = wuffs_base__make_status(wuffs_lzw__error__truncated_input);
64307
        goto exit;
64308
      } else if (self->private_impl.f_read_from_return_value == 4u) {
64309
        status = wuffs_base__make_status(wuffs_lzw__error__bad_code);
64310
        goto exit;
64311
      } else {
64312
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
64313
        goto exit;
64314
      }
64315
    }
64316
64317
    ok:
64318
    self->private_impl.p_transform_io = 0;
64319
    goto exit;
64320
  }
64321
64322
  goto suspend;
64323
  suspend:
64324
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64325
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
64326
64327
  goto exit;
64328
  exit:
64329
  if (wuffs_base__status__is_error(&status)) {
64330
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64331
  }
64332
  return status;
64333
}
64334
64335
// -------- func lzw.decoder.read_from
64336
64337
WUFFS_BASE__GENERATED_C_CODE
64338
static wuffs_base__empty_struct
64339
wuffs_lzw__decoder__read_from(
64340
    wuffs_lzw__decoder* self,
64341
    wuffs_base__io_buffer* a_src) {
64342
  uint32_t v_clear_code = 0;
64343
  uint32_t v_end_code = 0;
64344
  uint32_t v_save_code = 0;
64345
  uint32_t v_prev_code = 0;
64346
  uint32_t v_width = 0;
64347
  uint32_t v_bits = 0;
64348
  uint32_t v_n_bits = 0;
64349
  uint32_t v_output_wi = 0;
64350
  uint32_t v_code = 0;
64351
  uint32_t v_c = 0;
64352
  uint32_t v_o = 0;
64353
  uint32_t v_steps = 0;
64354
  uint8_t v_first_byte = 0;
64355
  uint16_t v_lm1_b = 0;
64356
  uint16_t v_lm1_a = 0;
64357
64358
  const uint8_t* iop_a_src = NULL;
64359
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64360
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64361
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64362
  if (a_src && a_src->data.ptr) {
64363
    io0_a_src = a_src->data.ptr;
64364
    io1_a_src = io0_a_src + a_src->meta.ri;
64365
    iop_a_src = io1_a_src;
64366
    io2_a_src = io0_a_src + a_src->meta.wi;
64367
  }
64368
64369
  v_clear_code = self->private_impl.f_clear_code;
64370
  v_end_code = self->private_impl.f_end_code;
64371
  v_save_code = self->private_impl.f_save_code;
64372
  v_prev_code = self->private_impl.f_prev_code;
64373
  v_width = self->private_impl.f_width;
64374
  v_bits = self->private_impl.f_bits;
64375
  v_n_bits = self->private_impl.f_n_bits;
64376
  v_output_wi = self->private_impl.f_output_wi;
64377
  while (true) {
64378
    if (v_n_bits < v_width) {
64379
      if (((uint64_t)(io2_a_src - iop_a_src)) >= 4u) {
64380
        v_bits |= ((uint32_t)(wuffs_base__peek_u32le__no_bounds_check(iop_a_src) << v_n_bits));
64381
        iop_a_src += ((31u - v_n_bits) >> 3u);
64382
        v_n_bits |= 24u;
64383
      } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
64384
        if (a_src && a_src->meta.closed) {
64385
          self->private_impl.f_read_from_return_value = 3u;
64386
        } else {
64387
          self->private_impl.f_read_from_return_value = 2u;
64388
        }
64389
        break;
64390
      } else {
64391
        v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
64392
        iop_a_src += 1u;
64393
        v_n_bits += 8u;
64394
        if (v_n_bits >= v_width) {
64395
        } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
64396
          if (a_src && a_src->meta.closed) {
64397
            self->private_impl.f_read_from_return_value = 3u;
64398
          } else {
64399
            self->private_impl.f_read_from_return_value = 2u;
64400
          }
64401
          break;
64402
        } else {
64403
          v_bits |= (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) << v_n_bits);
64404
          iop_a_src += 1u;
64405
          v_n_bits += 8u;
64406
          if (v_n_bits < v_width) {
64407
            self->private_impl.f_read_from_return_value = 5u;
64408
            break;
64409
          }
64410
        }
64411
      }
64412
    }
64413
    v_code = ((v_bits) & WUFFS_PRIVATE_IMPL__LOW_BITS_MASK__U32(v_width));
64414
    v_bits >>= v_width;
64415
    v_n_bits -= v_width;
64416
    if (v_code < v_clear_code) {
64417
      self->private_data.f_output[v_output_wi] = ((uint8_t)(v_code));
64418
      v_output_wi = ((v_output_wi + 1u) & 8191u);
64419
      if (v_save_code <= 4095u) {
64420
        v_lm1_a = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
64421
        self->private_data.f_lm1s[v_save_code] = v_lm1_a;
64422
        if (((uint16_t)(v_lm1_a % 8u)) != 0u) {
64423
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
64424
          memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code]));
64425
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_a % 8u))] = ((uint8_t)(v_code));
64426
        } else {
64427
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
64428
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_code));
64429
        }
64430
        v_save_code += 1u;
64431
        if (v_width < 12u) {
64432
          v_width += (1u & (v_save_code >> v_width));
64433
        }
64434
        v_prev_code = v_code;
64435
      }
64436
    } else if (v_code <= v_end_code) {
64437
      if (v_code == v_end_code) {
64438
        self->private_impl.f_read_from_return_value = 0u;
64439
        break;
64440
      }
64441
      v_save_code = v_end_code;
64442
      v_prev_code = v_end_code;
64443
      v_width = (self->private_impl.f_literal_width + 1u);
64444
    } else if (v_code <= v_save_code) {
64445
      v_c = v_code;
64446
      if (v_code == v_save_code) {
64447
        v_c = v_prev_code;
64448
      }
64449
      v_o = ((v_output_wi + (((uint32_t)(self->private_data.f_lm1s[v_c])) & 4294967288u)) & 8191u);
64450
      v_output_wi = ((v_output_wi + 1u + ((uint32_t)(self->private_data.f_lm1s[v_c]))) & 8191u);
64451
      v_steps = (((uint32_t)(self->private_data.f_lm1s[v_c])) >> 3u);
64452
      while (true) {
64453
        memcpy((self->private_data.f_output)+(v_o), (self->private_data.f_suffixes[v_c]), 8u);
64454
        if (v_steps <= 0u) {
64455
          break;
64456
        }
64457
        v_steps -= 1u;
64458
        v_o = (((uint32_t)(v_o - 8u)) & 8191u);
64459
        v_c = ((uint32_t)(self->private_impl.f_prefixes[v_c]));
64460
      }
64461
      v_first_byte = self->private_data.f_suffixes[v_c][0u];
64462
      if (v_code == v_save_code) {
64463
        self->private_data.f_output[v_output_wi] = v_first_byte;
64464
        v_output_wi = ((v_output_wi + 1u) & 8191u);
64465
      }
64466
      if (v_save_code <= 4095u) {
64467
        v_lm1_b = ((uint16_t)(((uint16_t)(self->private_data.f_lm1s[v_prev_code] + 1u)) & 4095u));
64468
        self->private_data.f_lm1s[v_save_code] = v_lm1_b;
64469
        if (((uint16_t)(v_lm1_b % 8u)) != 0u) {
64470
          self->private_impl.f_prefixes[v_save_code] = self->private_impl.f_prefixes[v_prev_code];
64471
          memcpy(self->private_data.f_suffixes[v_save_code],self->private_data.f_suffixes[v_prev_code], sizeof(self->private_data.f_suffixes[v_save_code]));
64472
          self->private_data.f_suffixes[v_save_code][((uint16_t)(v_lm1_b % 8u))] = v_first_byte;
64473
        } else {
64474
          self->private_impl.f_prefixes[v_save_code] = ((uint16_t)(v_prev_code));
64475
          self->private_data.f_suffixes[v_save_code][0u] = ((uint8_t)(v_first_byte));
64476
        }
64477
        v_save_code += 1u;
64478
        if (v_width < 12u) {
64479
          v_width += (1u & (v_save_code >> v_width));
64480
        }
64481
        v_prev_code = v_code;
64482
      }
64483
    } else {
64484
      self->private_impl.f_read_from_return_value = 4u;
64485
      break;
64486
    }
64487
    if (v_output_wi > 4095u) {
64488
      self->private_impl.f_read_from_return_value = 1u;
64489
      break;
64490
    }
64491
  }
64492
  if (self->private_impl.f_read_from_return_value != 2u) {
64493
    while (v_n_bits >= 8u) {
64494
      v_n_bits -= 8u;
64495
      if (iop_a_src > io1_a_src) {
64496
        iop_a_src--;
64497
      } else {
64498
        self->private_impl.f_read_from_return_value = 5u;
64499
        break;
64500
      }
64501
    }
64502
  }
64503
  self->private_impl.f_save_code = v_save_code;
64504
  self->private_impl.f_prev_code = v_prev_code;
64505
  self->private_impl.f_width = v_width;
64506
  self->private_impl.f_bits = v_bits;
64507
  self->private_impl.f_n_bits = v_n_bits;
64508
  self->private_impl.f_output_wi = v_output_wi;
64509
  if (a_src && a_src->data.ptr) {
64510
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
64511
  }
64512
64513
  return wuffs_base__make_empty_struct();
64514
}
64515
64516
// -------- func lzw.decoder.write_to
64517
64518
WUFFS_BASE__GENERATED_C_CODE
64519
static wuffs_base__status
64520
wuffs_lzw__decoder__write_to(
64521
    wuffs_lzw__decoder* self,
64522
    wuffs_base__io_buffer* a_dst) {
64523
  wuffs_base__status status = wuffs_base__make_status(NULL);
64524
64525
  wuffs_base__slice_u8 v_s = {0};
64526
  uint64_t v_n = 0;
64527
64528
  uint8_t* iop_a_dst = NULL;
64529
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64530
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64531
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64532
  if (a_dst && a_dst->data.ptr) {
64533
    io0_a_dst = a_dst->data.ptr;
64534
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
64535
    iop_a_dst = io1_a_dst;
64536
    io2_a_dst = io0_a_dst + a_dst->data.len;
64537
    if (a_dst->meta.closed) {
64538
      io2_a_dst = iop_a_dst;
64539
    }
64540
  }
64541
64542
  uint32_t coro_susp_point = self->private_impl.p_write_to;
64543
  switch (coro_susp_point) {
64544
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64545
64546
    while (self->private_impl.f_output_wi > 0u) {
64547
      if (self->private_impl.f_output_ri > self->private_impl.f_output_wi) {
64548
        status = wuffs_base__make_status(wuffs_lzw__error__internal_error_inconsistent_i_o);
64549
        goto exit;
64550
      }
64551
      v_s = wuffs_base__make_slice_u8_ij(self->private_data.f_output,
64552
          self->private_impl.f_output_ri,
64553
          self->private_impl.f_output_wi);
64554
      v_n = wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,v_s);
64555
      if (v_n == ((uint64_t)(v_s.len))) {
64556
        self->private_impl.f_output_ri = 0u;
64557
        self->private_impl.f_output_wi = 0u;
64558
        status = wuffs_base__make_status(NULL);
64559
        goto ok;
64560
      }
64561
      self->private_impl.f_output_ri = (((uint32_t)(self->private_impl.f_output_ri + ((uint32_t)(v_n)))) & 8191u);
64562
      status = wuffs_base__make_status(wuffs_base__suspension__short_write);
64563
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64564
    }
64565
64566
    ok:
64567
    self->private_impl.p_write_to = 0;
64568
    goto exit;
64569
  }
64570
64571
  goto suspend;
64572
  suspend:
64573
  self->private_impl.p_write_to = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64574
64575
  goto exit;
64576
  exit:
64577
  if (a_dst && a_dst->data.ptr) {
64578
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
64579
  }
64580
64581
  return status;
64582
}
64583
64584
// -------- func lzw.decoder.flush
64585
64586
WUFFS_BASE__GENERATED_C_CODE
64587
WUFFS_BASE__MAYBE_STATIC wuffs_base__slice_u8
64588
wuffs_lzw__decoder__flush(
64589
    wuffs_lzw__decoder* self) {
64590
  if (!self) {
64591
    return wuffs_base__empty_slice_u8();
64592
  }
64593
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64594
    return wuffs_base__empty_slice_u8();
64595
  }
64596
64597
  uint32_t v_ri = 0;
64598
  uint32_t v_wi = 0;
64599
64600
  v_ri = self->private_impl.f_output_ri;
64601
  v_wi = self->private_impl.f_output_wi;
64602
  self->private_impl.f_output_ri = 0u;
64603
  self->private_impl.f_output_wi = 0u;
64604
  if (v_ri <= v_wi) {
64605
    return wuffs_base__make_slice_u8_ij(self->private_data.f_output, v_ri, v_wi);
64606
  }
64607
  return wuffs_base__make_slice_u8(self->private_data.f_output, 0);
64608
}
64609
64610
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__LZW)
64611
64612
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
64613
64614
// ---------------- Status Codes Implementations
64615
64616
const char wuffs_netpbm__error__bad_header[] = "#netpbm: bad header";
64617
const char wuffs_netpbm__error__truncated_input[] = "#netpbm: truncated input";
64618
const char wuffs_netpbm__error__unsupported_netpbm_file[] = "#netpbm: unsupported Netpbm file";
64619
const char wuffs_netpbm__note__internal_note_short_read[] = "@netpbm: internal note: short read";
64620
64621
// ---------------- Private Consts
64622
64623
// ---------------- Private Initializer Prototypes
64624
64625
// ---------------- Private Function Prototypes
64626
64627
WUFFS_BASE__GENERATED_C_CODE
64628
static wuffs_base__status
64629
wuffs_netpbm__decoder__do_decode_image_config(
64630
    wuffs_netpbm__decoder* self,
64631
    wuffs_base__image_config* a_dst,
64632
    wuffs_base__io_buffer* a_src);
64633
64634
WUFFS_BASE__GENERATED_C_CODE
64635
static wuffs_base__status
64636
wuffs_netpbm__decoder__do_decode_frame_config(
64637
    wuffs_netpbm__decoder* self,
64638
    wuffs_base__frame_config* a_dst,
64639
    wuffs_base__io_buffer* a_src);
64640
64641
WUFFS_BASE__GENERATED_C_CODE
64642
static wuffs_base__status
64643
wuffs_netpbm__decoder__do_decode_frame(
64644
    wuffs_netpbm__decoder* self,
64645
    wuffs_base__pixel_buffer* a_dst,
64646
    wuffs_base__io_buffer* a_src,
64647
    wuffs_base__pixel_blend a_blend,
64648
    wuffs_base__slice_u8 a_workbuf,
64649
    wuffs_base__decode_frame_options* a_opts);
64650
64651
WUFFS_BASE__GENERATED_C_CODE
64652
static wuffs_base__status
64653
wuffs_netpbm__decoder__swizzle_easy(
64654
    wuffs_netpbm__decoder* self,
64655
    wuffs_base__pixel_buffer* a_dst,
64656
    wuffs_base__io_buffer* a_src);
64657
64658
WUFFS_BASE__GENERATED_C_CODE
64659
static wuffs_base__status
64660
wuffs_netpbm__decoder__swizzle_hard(
64661
    wuffs_netpbm__decoder* self,
64662
    wuffs_base__pixel_buffer* a_dst,
64663
    wuffs_base__io_buffer* a_src);
64664
64665
// ---------------- VTables
64666
64667
const wuffs_base__image_decoder__func_ptrs
64668
wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder = {
64669
  (wuffs_base__status(*)(void*,
64670
      wuffs_base__pixel_buffer*,
64671
      wuffs_base__io_buffer*,
64672
      wuffs_base__pixel_blend,
64673
      wuffs_base__slice_u8,
64674
      wuffs_base__decode_frame_options*))(&wuffs_netpbm__decoder__decode_frame),
64675
  (wuffs_base__status(*)(void*,
64676
      wuffs_base__frame_config*,
64677
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_frame_config),
64678
  (wuffs_base__status(*)(void*,
64679
      wuffs_base__image_config*,
64680
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__decode_image_config),
64681
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_netpbm__decoder__frame_dirty_rect),
64682
  (uint64_t(*)(const void*,
64683
      uint32_t))(&wuffs_netpbm__decoder__get_quirk),
64684
  (uint32_t(*)(const void*))(&wuffs_netpbm__decoder__num_animation_loops),
64685
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frame_configs),
64686
  (uint64_t(*)(const void*))(&wuffs_netpbm__decoder__num_decoded_frames),
64687
  (wuffs_base__status(*)(void*,
64688
      uint64_t,
64689
      uint64_t))(&wuffs_netpbm__decoder__restart_frame),
64690
  (wuffs_base__status(*)(void*,
64691
      uint32_t,
64692
      uint64_t))(&wuffs_netpbm__decoder__set_quirk),
64693
  (wuffs_base__empty_struct(*)(void*,
64694
      uint32_t,
64695
      bool))(&wuffs_netpbm__decoder__set_report_metadata),
64696
  (wuffs_base__status(*)(void*,
64697
      wuffs_base__io_buffer*,
64698
      wuffs_base__more_information*,
64699
      wuffs_base__io_buffer*))(&wuffs_netpbm__decoder__tell_me_more),
64700
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_netpbm__decoder__workbuf_len),
64701
};
64702
64703
// ---------------- Initializer Implementations
64704
64705
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
64706
wuffs_netpbm__decoder__initialize(
64707
    wuffs_netpbm__decoder* self,
64708
    size_t sizeof_star_self,
64709
    uint64_t wuffs_version,
64710
    uint32_t options){
64711
  if (!self) {
64712
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64713
  }
64714
  if (sizeof(*self) != sizeof_star_self) {
64715
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
64716
  }
64717
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
64718
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
64719
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
64720
  }
64721
64722
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
64723
    // The whole point of this if-check is to detect an uninitialized *self.
64724
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
64725
#if !defined(__clang__) && defined(__GNUC__)
64726
#pragma GCC diagnostic push
64727
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
64728
#endif
64729
    if (self->private_impl.magic != 0) {
64730
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
64731
    }
64732
#if !defined(__clang__) && defined(__GNUC__)
64733
#pragma GCC diagnostic pop
64734
#endif
64735
  } else {
64736
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
64737
      memset(self, 0, sizeof(*self));
64738
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
64739
    } else {
64740
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
64741
    }
64742
  }
64743
64744
  self->private_impl.magic = WUFFS_BASE__MAGIC;
64745
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
64746
      wuffs_base__image_decoder__vtable_name;
64747
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
64748
      (const void*)(&wuffs_netpbm__decoder__func_ptrs_for__wuffs_base__image_decoder);
64749
  return wuffs_base__make_status(NULL);
64750
}
64751
64752
wuffs_netpbm__decoder*
64753
wuffs_netpbm__decoder__alloc(void) {
64754
  wuffs_netpbm__decoder* x =
64755
      (wuffs_netpbm__decoder*)(calloc(1, sizeof(wuffs_netpbm__decoder)));
64756
  if (!x) {
64757
    return NULL;
64758
  }
64759
  if (wuffs_netpbm__decoder__initialize(
64760
      x, sizeof(wuffs_netpbm__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
64761
    free(x);
64762
    return NULL;
64763
  }
64764
  return x;
64765
}
64766
64767
size_t
64768
sizeof__wuffs_netpbm__decoder(void) {
64769
  return sizeof(wuffs_netpbm__decoder);
64770
}
64771
64772
// ---------------- Function Implementations
64773
64774
// -------- func netpbm.decoder.get_quirk
64775
64776
WUFFS_BASE__GENERATED_C_CODE
64777
WUFFS_BASE__MAYBE_STATIC uint64_t
64778
wuffs_netpbm__decoder__get_quirk(
64779
    const wuffs_netpbm__decoder* self,
64780
    uint32_t a_key) {
64781
  if (!self) {
64782
    return 0;
64783
  }
64784
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
64785
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
64786
    return 0;
64787
  }
64788
64789
  return 0u;
64790
}
64791
64792
// -------- func netpbm.decoder.set_quirk
64793
64794
WUFFS_BASE__GENERATED_C_CODE
64795
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64796
wuffs_netpbm__decoder__set_quirk(
64797
    wuffs_netpbm__decoder* self,
64798
    uint32_t a_key,
64799
    uint64_t a_value) {
64800
  if (!self) {
64801
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64802
  }
64803
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64804
    return wuffs_base__make_status(
64805
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64806
        ? wuffs_base__error__disabled_by_previous_error
64807
        : wuffs_base__error__initialize_not_called);
64808
  }
64809
64810
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
64811
}
64812
64813
// -------- func netpbm.decoder.decode_image_config
64814
64815
WUFFS_BASE__GENERATED_C_CODE
64816
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
64817
wuffs_netpbm__decoder__decode_image_config(
64818
    wuffs_netpbm__decoder* self,
64819
    wuffs_base__image_config* a_dst,
64820
    wuffs_base__io_buffer* a_src) {
64821
  if (!self) {
64822
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
64823
  }
64824
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
64825
    return wuffs_base__make_status(
64826
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
64827
        ? wuffs_base__error__disabled_by_previous_error
64828
        : wuffs_base__error__initialize_not_called);
64829
  }
64830
  if (!a_src) {
64831
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64832
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
64833
  }
64834
  if ((self->private_impl.active_coroutine != 0) &&
64835
      (self->private_impl.active_coroutine != 1)) {
64836
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64837
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
64838
  }
64839
  self->private_impl.active_coroutine = 0;
64840
  wuffs_base__status status = wuffs_base__make_status(NULL);
64841
64842
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
64843
64844
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
64845
  switch (coro_susp_point) {
64846
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64847
64848
    while (true) {
64849
      {
64850
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_image_config(self, a_dst, a_src);
64851
        v_status = t_0;
64852
      }
64853
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
64854
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
64855
        goto exit;
64856
      }
64857
      status = v_status;
64858
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
64859
    }
64860
64861
    ok:
64862
    self->private_impl.p_decode_image_config = 0;
64863
    goto exit;
64864
  }
64865
64866
  goto suspend;
64867
  suspend:
64868
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
64869
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
64870
64871
  goto exit;
64872
  exit:
64873
  if (wuffs_base__status__is_error(&status)) {
64874
    self->private_impl.magic = WUFFS_BASE__DISABLED;
64875
  }
64876
  return status;
64877
}
64878
64879
// -------- func netpbm.decoder.do_decode_image_config
64880
64881
WUFFS_BASE__GENERATED_C_CODE
64882
static wuffs_base__status
64883
wuffs_netpbm__decoder__do_decode_image_config(
64884
    wuffs_netpbm__decoder* self,
64885
    wuffs_base__image_config* a_dst,
64886
    wuffs_base__io_buffer* a_src) {
64887
  wuffs_base__status status = wuffs_base__make_status(NULL);
64888
64889
  uint8_t v_c8 = 0;
64890
  uint32_t v_n = 0;
64891
64892
  const uint8_t* iop_a_src = NULL;
64893
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64894
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64895
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
64896
  if (a_src && a_src->data.ptr) {
64897
    io0_a_src = a_src->data.ptr;
64898
    io1_a_src = io0_a_src + a_src->meta.ri;
64899
    iop_a_src = io1_a_src;
64900
    io2_a_src = io0_a_src + a_src->meta.wi;
64901
  }
64902
64903
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
64904
  switch (coro_susp_point) {
64905
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
64906
64907
    if (self->private_impl.f_call_sequence != 0u) {
64908
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
64909
      goto exit;
64910
    }
64911
    {
64912
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
64913
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64914
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64915
        goto suspend;
64916
      }
64917
      uint8_t t_0 = *iop_a_src++;
64918
      v_c8 = t_0;
64919
    }
64920
    if (v_c8 != 80u) {
64921
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
64922
      goto exit;
64923
    }
64924
    {
64925
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
64926
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64927
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64928
        goto suspend;
64929
      }
64930
      uint8_t t_1 = *iop_a_src++;
64931
      v_c8 = t_1;
64932
    }
64933
    if ((v_c8 < 49u) || (55u < v_c8)) {
64934
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
64935
      goto exit;
64936
    } else if (v_c8 == 53u) {
64937
      self->private_impl.f_pixfmt = 536870920u;
64938
    } else if (v_c8 == 54u) {
64939
      self->private_impl.f_pixfmt = 2684356744u;
64940
    } else {
64941
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
64942
      goto exit;
64943
    }
64944
    {
64945
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
64946
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64947
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64948
        goto suspend;
64949
      }
64950
      uint8_t t_2 = *iop_a_src++;
64951
      v_c8 = t_2;
64952
    }
64953
    if ((v_c8 != 32u) &&
64954
        (v_c8 != 9u) &&
64955
        (v_c8 != 10u) &&
64956
        (v_c8 != 13u)) {
64957
      status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
64958
      goto exit;
64959
    }
64960
    while (true) {
64961
      {
64962
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
64963
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64964
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64965
          goto suspend;
64966
        }
64967
        uint8_t t_3 = *iop_a_src++;
64968
        v_c8 = t_3;
64969
      }
64970
      if ((v_c8 == 32u) ||
64971
          (v_c8 == 9u) ||
64972
          (v_c8 == 10u) ||
64973
          (v_c8 == 13u)) {
64974
        continue;
64975
      } else if (v_c8 == 35u) {
64976
        while (true) {
64977
          {
64978
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
64979
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
64980
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
64981
              goto suspend;
64982
            }
64983
            uint8_t t_4 = *iop_a_src++;
64984
            v_c8 = t_4;
64985
          }
64986
          if (v_c8 == 10u) {
64987
            break;
64988
          }
64989
        }
64990
        continue;
64991
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
64992
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
64993
        goto exit;
64994
      }
64995
      self->private_impl.f_width = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
64996
      break;
64997
    }
64998
    while (true) {
64999
      {
65000
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
65001
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65002
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65003
          goto suspend;
65004
        }
65005
        uint8_t t_5 = *iop_a_src++;
65006
        v_c8 = t_5;
65007
      }
65008
      if ((v_c8 == 32u) ||
65009
          (v_c8 == 9u) ||
65010
          (v_c8 == 10u) ||
65011
          (v_c8 == 13u)) {
65012
        break;
65013
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65014
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65015
        goto exit;
65016
      }
65017
      v_n = ((10u * self->private_impl.f_width) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
65018
      if (v_n > 16777215u) {
65019
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65020
        goto exit;
65021
      }
65022
      self->private_impl.f_width = v_n;
65023
    }
65024
    while (true) {
65025
      {
65026
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
65027
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65028
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65029
          goto suspend;
65030
        }
65031
        uint8_t t_6 = *iop_a_src++;
65032
        v_c8 = t_6;
65033
      }
65034
      if ((v_c8 == 32u) ||
65035
          (v_c8 == 9u) ||
65036
          (v_c8 == 10u) ||
65037
          (v_c8 == 13u)) {
65038
        continue;
65039
      } else if (v_c8 == 35u) {
65040
        while (true) {
65041
          {
65042
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
65043
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65044
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65045
              goto suspend;
65046
            }
65047
            uint8_t t_7 = *iop_a_src++;
65048
            v_c8 = t_7;
65049
          }
65050
          if (v_c8 == 10u) {
65051
            break;
65052
          }
65053
        }
65054
        continue;
65055
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65056
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65057
        goto exit;
65058
      }
65059
      self->private_impl.f_height = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
65060
      break;
65061
    }
65062
    while (true) {
65063
      {
65064
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
65065
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65066
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65067
          goto suspend;
65068
        }
65069
        uint8_t t_8 = *iop_a_src++;
65070
        v_c8 = t_8;
65071
      }
65072
      if ((v_c8 == 32u) ||
65073
          (v_c8 == 9u) ||
65074
          (v_c8 == 10u) ||
65075
          (v_c8 == 13u)) {
65076
        break;
65077
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65078
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65079
        goto exit;
65080
      }
65081
      v_n = ((10u * self->private_impl.f_height) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
65082
      if (v_n > 16777215u) {
65083
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65084
        goto exit;
65085
      }
65086
      self->private_impl.f_height = v_n;
65087
    }
65088
    while (true) {
65089
      {
65090
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
65091
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65092
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65093
          goto suspend;
65094
        }
65095
        uint8_t t_9 = *iop_a_src++;
65096
        v_c8 = t_9;
65097
      }
65098
      if ((v_c8 == 32u) ||
65099
          (v_c8 == 9u) ||
65100
          (v_c8 == 10u) ||
65101
          (v_c8 == 13u)) {
65102
        continue;
65103
      } else if (v_c8 == 35u) {
65104
        while (true) {
65105
          {
65106
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
65107
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65108
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65109
              goto suspend;
65110
            }
65111
            uint8_t t_10 = *iop_a_src++;
65112
            v_c8 = t_10;
65113
          }
65114
          if (v_c8 == 10u) {
65115
            break;
65116
          }
65117
        }
65118
        continue;
65119
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65120
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65121
        goto exit;
65122
      }
65123
      self->private_impl.f_max_value = ((uint32_t)(((uint8_t)(v_c8 - 48u))));
65124
      break;
65125
    }
65126
    while (true) {
65127
      {
65128
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
65129
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
65130
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65131
          goto suspend;
65132
        }
65133
        uint8_t t_11 = *iop_a_src++;
65134
        v_c8 = t_11;
65135
      }
65136
      if ((v_c8 == 32u) ||
65137
          (v_c8 == 9u) ||
65138
          (v_c8 == 10u) ||
65139
          (v_c8 == 13u)) {
65140
        break;
65141
      } else if ((v_c8 < 48u) || (57u < v_c8)) {
65142
        status = wuffs_base__make_status(wuffs_netpbm__error__bad_header);
65143
        goto exit;
65144
      }
65145
      v_n = ((10u * self->private_impl.f_max_value) + ((uint32_t)(((uint8_t)(v_c8 - 48u)))));
65146
      if (v_n > 16777215u) {
65147
        status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65148
        goto exit;
65149
      }
65150
      self->private_impl.f_max_value = v_n;
65151
    }
65152
    if (self->private_impl.f_max_value == 255u) {
65153
    } else if (self->private_impl.f_max_value == 65535u) {
65154
      if (self->private_impl.f_pixfmt == 536870920u) {
65155
        self->private_impl.f_pixfmt = 537919499u;
65156
      } else if (self->private_impl.f_pixfmt == 2684356744u) {
65157
        self->private_impl.f_pixfmt = 2164308923u;
65158
      }
65159
    } else {
65160
      status = wuffs_base__make_status(wuffs_netpbm__error__unsupported_netpbm_file);
65161
      goto exit;
65162
    }
65163
    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)));
65164
    if (a_dst != NULL) {
65165
      wuffs_base__image_config__set(
65166
          a_dst,
65167
          self->private_impl.f_pixfmt,
65168
          0u,
65169
          self->private_impl.f_width,
65170
          self->private_impl.f_height,
65171
          self->private_impl.f_frame_config_io_position,
65172
          false);
65173
    }
65174
    self->private_impl.f_call_sequence = 32u;
65175
65176
    goto ok;
65177
    ok:
65178
    self->private_impl.p_do_decode_image_config = 0;
65179
    goto exit;
65180
  }
65181
65182
  goto suspend;
65183
  suspend:
65184
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65185
65186
  goto exit;
65187
  exit:
65188
  if (a_src && a_src->data.ptr) {
65189
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65190
  }
65191
65192
  return status;
65193
}
65194
65195
// -------- func netpbm.decoder.decode_frame_config
65196
65197
WUFFS_BASE__GENERATED_C_CODE
65198
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65199
wuffs_netpbm__decoder__decode_frame_config(
65200
    wuffs_netpbm__decoder* self,
65201
    wuffs_base__frame_config* a_dst,
65202
    wuffs_base__io_buffer* a_src) {
65203
  if (!self) {
65204
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65205
  }
65206
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65207
    return wuffs_base__make_status(
65208
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65209
        ? wuffs_base__error__disabled_by_previous_error
65210
        : wuffs_base__error__initialize_not_called);
65211
  }
65212
  if (!a_src) {
65213
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65214
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65215
  }
65216
  if ((self->private_impl.active_coroutine != 0) &&
65217
      (self->private_impl.active_coroutine != 2)) {
65218
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65219
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
65220
  }
65221
  self->private_impl.active_coroutine = 0;
65222
  wuffs_base__status status = wuffs_base__make_status(NULL);
65223
65224
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
65225
65226
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
65227
  switch (coro_susp_point) {
65228
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65229
65230
    while (true) {
65231
      {
65232
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame_config(self, a_dst, a_src);
65233
        v_status = t_0;
65234
      }
65235
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
65236
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
65237
        goto exit;
65238
      }
65239
      status = v_status;
65240
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
65241
    }
65242
65243
    ok:
65244
    self->private_impl.p_decode_frame_config = 0;
65245
    goto exit;
65246
  }
65247
65248
  goto suspend;
65249
  suspend:
65250
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65251
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
65252
65253
  goto exit;
65254
  exit:
65255
  if (wuffs_base__status__is_error(&status)) {
65256
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65257
  }
65258
  return status;
65259
}
65260
65261
// -------- func netpbm.decoder.do_decode_frame_config
65262
65263
WUFFS_BASE__GENERATED_C_CODE
65264
static wuffs_base__status
65265
wuffs_netpbm__decoder__do_decode_frame_config(
65266
    wuffs_netpbm__decoder* self,
65267
    wuffs_base__frame_config* a_dst,
65268
    wuffs_base__io_buffer* a_src) {
65269
  wuffs_base__status status = wuffs_base__make_status(NULL);
65270
65271
  const uint8_t* iop_a_src = NULL;
65272
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65273
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65274
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65275
  if (a_src && a_src->data.ptr) {
65276
    io0_a_src = a_src->data.ptr;
65277
    io1_a_src = io0_a_src + a_src->meta.ri;
65278
    iop_a_src = io1_a_src;
65279
    io2_a_src = io0_a_src + a_src->meta.wi;
65280
  }
65281
65282
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
65283
  switch (coro_susp_point) {
65284
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65285
65286
    if (self->private_impl.f_call_sequence == 32u) {
65287
    } else if (self->private_impl.f_call_sequence < 32u) {
65288
      if (a_src) {
65289
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65290
      }
65291
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
65292
      status = wuffs_netpbm__decoder__do_decode_image_config(self, NULL, a_src);
65293
      if (a_src) {
65294
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
65295
      }
65296
      if (status.repr) {
65297
        goto suspend;
65298
      }
65299
    } else if (self->private_impl.f_call_sequence == 40u) {
65300
      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)))) {
65301
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
65302
        goto exit;
65303
      }
65304
    } else if (self->private_impl.f_call_sequence == 64u) {
65305
      self->private_impl.f_call_sequence = 96u;
65306
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
65307
      goto ok;
65308
    } else {
65309
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
65310
      goto ok;
65311
    }
65312
    if (a_dst != NULL) {
65313
      wuffs_base__frame_config__set(
65314
          a_dst,
65315
          wuffs_base__utility__make_rect_ie_u32(
65316
          0u,
65317
          0u,
65318
          self->private_impl.f_width,
65319
          self->private_impl.f_height),
65320
          ((wuffs_base__flicks)(0u)),
65321
          0u,
65322
          self->private_impl.f_frame_config_io_position,
65323
          0u,
65324
          false,
65325
          false,
65326
          4278190080u);
65327
    }
65328
    self->private_impl.f_call_sequence = 64u;
65329
65330
    ok:
65331
    self->private_impl.p_do_decode_frame_config = 0;
65332
    goto exit;
65333
  }
65334
65335
  goto suspend;
65336
  suspend:
65337
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65338
65339
  goto exit;
65340
  exit:
65341
  if (a_src && a_src->data.ptr) {
65342
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65343
  }
65344
65345
  return status;
65346
}
65347
65348
// -------- func netpbm.decoder.decode_frame
65349
65350
WUFFS_BASE__GENERATED_C_CODE
65351
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65352
wuffs_netpbm__decoder__decode_frame(
65353
    wuffs_netpbm__decoder* self,
65354
    wuffs_base__pixel_buffer* a_dst,
65355
    wuffs_base__io_buffer* a_src,
65356
    wuffs_base__pixel_blend a_blend,
65357
    wuffs_base__slice_u8 a_workbuf,
65358
    wuffs_base__decode_frame_options* a_opts) {
65359
  if (!self) {
65360
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65361
  }
65362
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65363
    return wuffs_base__make_status(
65364
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65365
        ? wuffs_base__error__disabled_by_previous_error
65366
        : wuffs_base__error__initialize_not_called);
65367
  }
65368
  if (!a_dst || !a_src) {
65369
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65370
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65371
  }
65372
  if ((self->private_impl.active_coroutine != 0) &&
65373
      (self->private_impl.active_coroutine != 3)) {
65374
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65375
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
65376
  }
65377
  self->private_impl.active_coroutine = 0;
65378
  wuffs_base__status status = wuffs_base__make_status(NULL);
65379
65380
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
65381
65382
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
65383
  switch (coro_susp_point) {
65384
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65385
65386
    while (true) {
65387
      {
65388
        wuffs_base__status t_0 = wuffs_netpbm__decoder__do_decode_frame(self,
65389
            a_dst,
65390
            a_src,
65391
            a_blend,
65392
            a_workbuf,
65393
            a_opts);
65394
        v_status = t_0;
65395
      }
65396
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
65397
        status = wuffs_base__make_status(wuffs_netpbm__error__truncated_input);
65398
        goto exit;
65399
      }
65400
      status = v_status;
65401
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
65402
    }
65403
65404
    ok:
65405
    self->private_impl.p_decode_frame = 0;
65406
    goto exit;
65407
  }
65408
65409
  goto suspend;
65410
  suspend:
65411
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65412
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
65413
65414
  goto exit;
65415
  exit:
65416
  if (wuffs_base__status__is_error(&status)) {
65417
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65418
  }
65419
  return status;
65420
}
65421
65422
// -------- func netpbm.decoder.do_decode_frame
65423
65424
WUFFS_BASE__GENERATED_C_CODE
65425
static wuffs_base__status
65426
wuffs_netpbm__decoder__do_decode_frame(
65427
    wuffs_netpbm__decoder* self,
65428
    wuffs_base__pixel_buffer* a_dst,
65429
    wuffs_base__io_buffer* a_src,
65430
    wuffs_base__pixel_blend a_blend,
65431
    wuffs_base__slice_u8 a_workbuf,
65432
    wuffs_base__decode_frame_options* a_opts) {
65433
  wuffs_base__status status = wuffs_base__make_status(NULL);
65434
65435
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
65436
65437
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
65438
  switch (coro_susp_point) {
65439
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
65440
65441
    if (self->private_impl.f_call_sequence == 64u) {
65442
    } else if (self->private_impl.f_call_sequence < 64u) {
65443
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
65444
      status = wuffs_netpbm__decoder__do_decode_frame_config(self, NULL, a_src);
65445
      if (status.repr) {
65446
        goto suspend;
65447
      }
65448
    } else {
65449
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
65450
      goto ok;
65451
    }
65452
    self->private_impl.f_dst_x = 0u;
65453
    self->private_impl.f_dst_y = 0u;
65454
    self->private_data.f_buffer[6u] = 255u;
65455
    self->private_data.f_buffer[7u] = 255u;
65456
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
65457
        wuffs_base__pixel_buffer__pixel_format(a_dst),
65458
        wuffs_base__pixel_buffer__palette(a_dst),
65459
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
65460
        wuffs_base__utility__empty_slice_u8(),
65461
        a_blend);
65462
    if ( ! wuffs_base__status__is_ok(&v_status)) {
65463
      status = v_status;
65464
      if (wuffs_base__status__is_error(&status)) {
65465
        goto exit;
65466
      } else if (wuffs_base__status__is_suspension(&status)) {
65467
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
65468
        goto exit;
65469
      }
65470
      goto ok;
65471
    }
65472
    while (true) {
65473
      if (self->private_impl.f_pixfmt != 2164308923u) {
65474
        v_status = wuffs_netpbm__decoder__swizzle_easy(self, a_dst, a_src);
65475
      } else {
65476
        v_status = wuffs_netpbm__decoder__swizzle_hard(self, a_dst, a_src);
65477
      }
65478
      if (wuffs_base__status__is_ok(&v_status)) {
65479
        break;
65480
      } else if (v_status.repr != wuffs_netpbm__note__internal_note_short_read) {
65481
        status = v_status;
65482
        if (wuffs_base__status__is_error(&status)) {
65483
          goto exit;
65484
        } else if (wuffs_base__status__is_suspension(&status)) {
65485
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
65486
          goto exit;
65487
        }
65488
        goto ok;
65489
      }
65490
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
65491
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
65492
    }
65493
    self->private_impl.f_call_sequence = 96u;
65494
65495
    ok:
65496
    self->private_impl.p_do_decode_frame = 0;
65497
    goto exit;
65498
  }
65499
65500
  goto suspend;
65501
  suspend:
65502
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
65503
65504
  goto exit;
65505
  exit:
65506
  return status;
65507
}
65508
65509
// -------- func netpbm.decoder.swizzle_easy
65510
65511
WUFFS_BASE__GENERATED_C_CODE
65512
static wuffs_base__status
65513
wuffs_netpbm__decoder__swizzle_easy(
65514
    wuffs_netpbm__decoder* self,
65515
    wuffs_base__pixel_buffer* a_dst,
65516
    wuffs_base__io_buffer* a_src) {
65517
  wuffs_base__status status = wuffs_base__make_status(NULL);
65518
65519
  wuffs_base__pixel_format v_dst_pixfmt = {0};
65520
  uint32_t v_dst_bits_per_pixel = 0;
65521
  uint32_t v_dst_bytes_per_pixel = 0;
65522
  uint64_t v_dst_bytes_per_row = 0;
65523
  uint32_t v_src_bytes_per_pixel = 0;
65524
  wuffs_base__table_u8 v_tab = {0};
65525
  wuffs_base__slice_u8 v_dst = {0};
65526
  uint64_t v_i = 0;
65527
  uint64_t v_j = 0;
65528
  uint64_t v_n = 0;
65529
65530
  const uint8_t* iop_a_src = NULL;
65531
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65532
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65533
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65534
  if (a_src && a_src->data.ptr) {
65535
    io0_a_src = a_src->data.ptr;
65536
    io1_a_src = io0_a_src + a_src->meta.ri;
65537
    iop_a_src = io1_a_src;
65538
    io2_a_src = io0_a_src + a_src->meta.wi;
65539
  }
65540
65541
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
65542
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
65543
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
65544
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
65545
    goto exit;
65546
  }
65547
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
65548
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
65549
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
65550
  while (true) {
65551
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
65552
      self->private_impl.f_dst_x = 0u;
65553
      self->private_impl.f_dst_y += 1u;
65554
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
65555
        break;
65556
      }
65557
    }
65558
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
65559
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
65560
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
65561
    }
65562
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
65563
    if (v_i >= ((uint64_t)(v_dst.len))) {
65564
      v_src_bytes_per_pixel = 1u;
65565
      if (self->private_impl.f_pixfmt == 2684356744u) {
65566
        v_src_bytes_per_pixel = 3u;
65567
      } else if (self->private_impl.f_pixfmt == 537919499u) {
65568
        v_src_bytes_per_pixel = 2u;
65569
      }
65570
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
65571
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
65572
      v_j = v_n;
65573
      while (v_j >= 8u) {
65574
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
65575
          iop_a_src += (v_src_bytes_per_pixel * 8u);
65576
        }
65577
        v_j -= 8u;
65578
      }
65579
      while (v_j > 0u) {
65580
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
65581
          iop_a_src += (v_src_bytes_per_pixel * 1u);
65582
        }
65583
        v_j -= 1u;
65584
      }
65585
    } else {
65586
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
65587
          &self->private_impl.f_swizzler,
65588
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
65589
          wuffs_base__pixel_buffer__palette(a_dst),
65590
          &iop_a_src,
65591
          io2_a_src);
65592
    }
65593
    if (v_n == 0u) {
65594
      status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
65595
      goto ok;
65596
    }
65597
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
65598
  }
65599
  status = wuffs_base__make_status(NULL);
65600
  goto ok;
65601
65602
  ok:
65603
  goto exit;
65604
  exit:
65605
  if (a_src && a_src->data.ptr) {
65606
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65607
  }
65608
65609
  return status;
65610
}
65611
65612
// -------- func netpbm.decoder.swizzle_hard
65613
65614
WUFFS_BASE__GENERATED_C_CODE
65615
static wuffs_base__status
65616
wuffs_netpbm__decoder__swizzle_hard(
65617
    wuffs_netpbm__decoder* self,
65618
    wuffs_base__pixel_buffer* a_dst,
65619
    wuffs_base__io_buffer* a_src) {
65620
  wuffs_base__status status = wuffs_base__make_status(NULL);
65621
65622
  wuffs_base__pixel_format v_dst_pixfmt = {0};
65623
  uint32_t v_dst_bits_per_pixel = 0;
65624
  uint64_t v_dst_bytes_per_pixel = 0;
65625
  wuffs_base__table_u8 v_tab = {0};
65626
  wuffs_base__slice_u8 v_dst = {0};
65627
  uint64_t v_i = 0;
65628
65629
  const uint8_t* iop_a_src = NULL;
65630
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65631
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65632
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
65633
  if (a_src && a_src->data.ptr) {
65634
    io0_a_src = a_src->data.ptr;
65635
    io1_a_src = io0_a_src + a_src->meta.ri;
65636
    iop_a_src = io1_a_src;
65637
    io2_a_src = io0_a_src + a_src->meta.wi;
65638
  }
65639
65640
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
65641
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
65642
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
65643
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
65644
    goto exit;
65645
  }
65646
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
65647
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
65648
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
65649
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
65650
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * v_dst_bytes_per_pixel);
65651
    if (v_i <= ((uint64_t)(v_dst.len))) {
65652
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_i);
65653
    }
65654
    while (true) {
65655
      if (self->private_impl.f_dst_x >= self->private_impl.f_width) {
65656
        self->private_impl.f_dst_x = 0u;
65657
        self->private_impl.f_dst_y += 1u;
65658
        break;
65659
      }
65660
      if (((uint64_t)(io2_a_src - iop_a_src)) < 6u) {
65661
        status = wuffs_base__make_status(wuffs_netpbm__note__internal_note_short_read);
65662
        goto ok;
65663
      }
65664
      self->private_data.f_buffer[5u] = iop_a_src[0u];
65665
      self->private_data.f_buffer[4u] = iop_a_src[1u];
65666
      self->private_data.f_buffer[3u] = iop_a_src[2u];
65667
      self->private_data.f_buffer[2u] = iop_a_src[3u];
65668
      self->private_data.f_buffer[1u] = iop_a_src[4u];
65669
      self->private_data.f_buffer[0u] = iop_a_src[5u];
65670
      iop_a_src += 6u;
65671
      wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), wuffs_base__make_slice_u8(self->private_data.f_buffer, 8));
65672
      if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
65673
        v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
65674
      }
65675
      self->private_impl.f_dst_x += 1u;
65676
    }
65677
  }
65678
  status = wuffs_base__make_status(NULL);
65679
  goto ok;
65680
65681
  ok:
65682
  goto exit;
65683
  exit:
65684
  if (a_src && a_src->data.ptr) {
65685
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
65686
  }
65687
65688
  return status;
65689
}
65690
65691
// -------- func netpbm.decoder.frame_dirty_rect
65692
65693
WUFFS_BASE__GENERATED_C_CODE
65694
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
65695
wuffs_netpbm__decoder__frame_dirty_rect(
65696
    const wuffs_netpbm__decoder* self) {
65697
  if (!self) {
65698
    return wuffs_base__utility__empty_rect_ie_u32();
65699
  }
65700
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65701
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65702
    return wuffs_base__utility__empty_rect_ie_u32();
65703
  }
65704
65705
  return wuffs_base__utility__make_rect_ie_u32(
65706
      0u,
65707
      0u,
65708
      self->private_impl.f_width,
65709
      self->private_impl.f_height);
65710
}
65711
65712
// -------- func netpbm.decoder.num_animation_loops
65713
65714
WUFFS_BASE__GENERATED_C_CODE
65715
WUFFS_BASE__MAYBE_STATIC uint32_t
65716
wuffs_netpbm__decoder__num_animation_loops(
65717
    const wuffs_netpbm__decoder* self) {
65718
  if (!self) {
65719
    return 0;
65720
  }
65721
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65722
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65723
    return 0;
65724
  }
65725
65726
  return 0u;
65727
}
65728
65729
// -------- func netpbm.decoder.num_decoded_frame_configs
65730
65731
WUFFS_BASE__GENERATED_C_CODE
65732
WUFFS_BASE__MAYBE_STATIC uint64_t
65733
wuffs_netpbm__decoder__num_decoded_frame_configs(
65734
    const wuffs_netpbm__decoder* self) {
65735
  if (!self) {
65736
    return 0;
65737
  }
65738
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65739
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65740
    return 0;
65741
  }
65742
65743
  if (self->private_impl.f_call_sequence > 32u) {
65744
    return 1u;
65745
  }
65746
  return 0u;
65747
}
65748
65749
// -------- func netpbm.decoder.num_decoded_frames
65750
65751
WUFFS_BASE__GENERATED_C_CODE
65752
WUFFS_BASE__MAYBE_STATIC uint64_t
65753
wuffs_netpbm__decoder__num_decoded_frames(
65754
    const wuffs_netpbm__decoder* self) {
65755
  if (!self) {
65756
    return 0;
65757
  }
65758
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65759
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65760
    return 0;
65761
  }
65762
65763
  if (self->private_impl.f_call_sequence > 64u) {
65764
    return 1u;
65765
  }
65766
  return 0u;
65767
}
65768
65769
// -------- func netpbm.decoder.restart_frame
65770
65771
WUFFS_BASE__GENERATED_C_CODE
65772
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65773
wuffs_netpbm__decoder__restart_frame(
65774
    wuffs_netpbm__decoder* self,
65775
    uint64_t a_index,
65776
    uint64_t a_io_position) {
65777
  if (!self) {
65778
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65779
  }
65780
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65781
    return wuffs_base__make_status(
65782
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65783
        ? wuffs_base__error__disabled_by_previous_error
65784
        : wuffs_base__error__initialize_not_called);
65785
  }
65786
65787
  if (self->private_impl.f_call_sequence < 32u) {
65788
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
65789
  }
65790
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
65791
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65792
  }
65793
  self->private_impl.f_call_sequence = 40u;
65794
  return wuffs_base__make_status(NULL);
65795
}
65796
65797
// -------- func netpbm.decoder.set_report_metadata
65798
65799
WUFFS_BASE__GENERATED_C_CODE
65800
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
65801
wuffs_netpbm__decoder__set_report_metadata(
65802
    wuffs_netpbm__decoder* self,
65803
    uint32_t a_fourcc,
65804
    bool a_report) {
65805
  return wuffs_base__make_empty_struct();
65806
}
65807
65808
// -------- func netpbm.decoder.tell_me_more
65809
65810
WUFFS_BASE__GENERATED_C_CODE
65811
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
65812
wuffs_netpbm__decoder__tell_me_more(
65813
    wuffs_netpbm__decoder* self,
65814
    wuffs_base__io_buffer* a_dst,
65815
    wuffs_base__more_information* a_minfo,
65816
    wuffs_base__io_buffer* a_src) {
65817
  if (!self) {
65818
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65819
  }
65820
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
65821
    return wuffs_base__make_status(
65822
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
65823
        ? wuffs_base__error__disabled_by_previous_error
65824
        : wuffs_base__error__initialize_not_called);
65825
  }
65826
  if (!a_dst || !a_src) {
65827
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65828
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
65829
  }
65830
  if ((self->private_impl.active_coroutine != 0) &&
65831
      (self->private_impl.active_coroutine != 4)) {
65832
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65833
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
65834
  }
65835
  self->private_impl.active_coroutine = 0;
65836
  wuffs_base__status status = wuffs_base__make_status(NULL);
65837
65838
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
65839
  goto exit;
65840
65841
  goto ok;
65842
  ok:
65843
  goto exit;
65844
  exit:
65845
  if (wuffs_base__status__is_error(&status)) {
65846
    self->private_impl.magic = WUFFS_BASE__DISABLED;
65847
  }
65848
  return status;
65849
}
65850
65851
// -------- func netpbm.decoder.workbuf_len
65852
65853
WUFFS_BASE__GENERATED_C_CODE
65854
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
65855
wuffs_netpbm__decoder__workbuf_len(
65856
    const wuffs_netpbm__decoder* self) {
65857
  if (!self) {
65858
    return wuffs_base__utility__empty_range_ii_u64();
65859
  }
65860
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
65861
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
65862
    return wuffs_base__utility__empty_range_ii_u64();
65863
  }
65864
65865
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
65866
}
65867
65868
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
65869
65870
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
65871
65872
// ---------------- Status Codes Implementations
65873
65874
const char wuffs_nie__error__bad_header[] = "#nie: bad header";
65875
const char wuffs_nie__error__truncated_input[] = "#nie: truncated input";
65876
const char wuffs_nie__error__unsupported_nie_file[] = "#nie: unsupported NIE file";
65877
const char wuffs_nie__note__internal_note_short_read[] = "@nie: internal note: short read";
65878
65879
// ---------------- Private Consts
65880
65881
// ---------------- Private Initializer Prototypes
65882
65883
// ---------------- Private Function Prototypes
65884
65885
WUFFS_BASE__GENERATED_C_CODE
65886
static wuffs_base__status
65887
wuffs_nie__decoder__do_decode_image_config(
65888
    wuffs_nie__decoder* self,
65889
    wuffs_base__image_config* a_dst,
65890
    wuffs_base__io_buffer* a_src);
65891
65892
WUFFS_BASE__GENERATED_C_CODE
65893
static wuffs_base__status
65894
wuffs_nie__decoder__do_decode_frame_config(
65895
    wuffs_nie__decoder* self,
65896
    wuffs_base__frame_config* a_dst,
65897
    wuffs_base__io_buffer* a_src);
65898
65899
WUFFS_BASE__GENERATED_C_CODE
65900
static wuffs_base__status
65901
wuffs_nie__decoder__do_decode_frame(
65902
    wuffs_nie__decoder* self,
65903
    wuffs_base__pixel_buffer* a_dst,
65904
    wuffs_base__io_buffer* a_src,
65905
    wuffs_base__pixel_blend a_blend,
65906
    wuffs_base__slice_u8 a_workbuf,
65907
    wuffs_base__decode_frame_options* a_opts);
65908
65909
WUFFS_BASE__GENERATED_C_CODE
65910
static wuffs_base__status
65911
wuffs_nie__decoder__swizzle(
65912
    wuffs_nie__decoder* self,
65913
    wuffs_base__pixel_buffer* a_dst,
65914
    wuffs_base__io_buffer* a_src);
65915
65916
// ---------------- VTables
65917
65918
const wuffs_base__image_decoder__func_ptrs
65919
wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder = {
65920
  (wuffs_base__status(*)(void*,
65921
      wuffs_base__pixel_buffer*,
65922
      wuffs_base__io_buffer*,
65923
      wuffs_base__pixel_blend,
65924
      wuffs_base__slice_u8,
65925
      wuffs_base__decode_frame_options*))(&wuffs_nie__decoder__decode_frame),
65926
  (wuffs_base__status(*)(void*,
65927
      wuffs_base__frame_config*,
65928
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_frame_config),
65929
  (wuffs_base__status(*)(void*,
65930
      wuffs_base__image_config*,
65931
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__decode_image_config),
65932
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_nie__decoder__frame_dirty_rect),
65933
  (uint64_t(*)(const void*,
65934
      uint32_t))(&wuffs_nie__decoder__get_quirk),
65935
  (uint32_t(*)(const void*))(&wuffs_nie__decoder__num_animation_loops),
65936
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frame_configs),
65937
  (uint64_t(*)(const void*))(&wuffs_nie__decoder__num_decoded_frames),
65938
  (wuffs_base__status(*)(void*,
65939
      uint64_t,
65940
      uint64_t))(&wuffs_nie__decoder__restart_frame),
65941
  (wuffs_base__status(*)(void*,
65942
      uint32_t,
65943
      uint64_t))(&wuffs_nie__decoder__set_quirk),
65944
  (wuffs_base__empty_struct(*)(void*,
65945
      uint32_t,
65946
      bool))(&wuffs_nie__decoder__set_report_metadata),
65947
  (wuffs_base__status(*)(void*,
65948
      wuffs_base__io_buffer*,
65949
      wuffs_base__more_information*,
65950
      wuffs_base__io_buffer*))(&wuffs_nie__decoder__tell_me_more),
65951
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_nie__decoder__workbuf_len),
65952
};
65953
65954
// ---------------- Initializer Implementations
65955
65956
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
65957
wuffs_nie__decoder__initialize(
65958
    wuffs_nie__decoder* self,
65959
    size_t sizeof_star_self,
65960
    uint64_t wuffs_version,
65961
    uint32_t options){
65962
  if (!self) {
65963
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
65964
  }
65965
  if (sizeof(*self) != sizeof_star_self) {
65966
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
65967
  }
65968
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
65969
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
65970
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
65971
  }
65972
65973
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
65974
    // The whole point of this if-check is to detect an uninitialized *self.
65975
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
65976
#if !defined(__clang__) && defined(__GNUC__)
65977
#pragma GCC diagnostic push
65978
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
65979
#endif
65980
    if (self->private_impl.magic != 0) {
65981
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
65982
    }
65983
#if !defined(__clang__) && defined(__GNUC__)
65984
#pragma GCC diagnostic pop
65985
#endif
65986
  } else {
65987
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
65988
      memset(self, 0, sizeof(*self));
65989
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
65990
    } else {
65991
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
65992
    }
65993
  }
65994
65995
  self->private_impl.magic = WUFFS_BASE__MAGIC;
65996
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
65997
      wuffs_base__image_decoder__vtable_name;
65998
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
65999
      (const void*)(&wuffs_nie__decoder__func_ptrs_for__wuffs_base__image_decoder);
66000
  return wuffs_base__make_status(NULL);
66001
}
66002
66003
wuffs_nie__decoder*
66004
wuffs_nie__decoder__alloc(void) {
66005
  wuffs_nie__decoder* x =
66006
      (wuffs_nie__decoder*)(calloc(1, sizeof(wuffs_nie__decoder)));
66007
  if (!x) {
66008
    return NULL;
66009
  }
66010
  if (wuffs_nie__decoder__initialize(
66011
      x, sizeof(wuffs_nie__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
66012
    free(x);
66013
    return NULL;
66014
  }
66015
  return x;
66016
}
66017
66018
size_t
66019
sizeof__wuffs_nie__decoder(void) {
66020
  return sizeof(wuffs_nie__decoder);
66021
}
66022
66023
// ---------------- Function Implementations
66024
66025
// -------- func nie.decoder.get_quirk
66026
66027
WUFFS_BASE__GENERATED_C_CODE
66028
WUFFS_BASE__MAYBE_STATIC uint64_t
66029
wuffs_nie__decoder__get_quirk(
66030
    const wuffs_nie__decoder* self,
66031
    uint32_t a_key) {
66032
  if (!self) {
66033
    return 0;
66034
  }
66035
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66036
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66037
    return 0;
66038
  }
66039
66040
  return 0u;
66041
}
66042
66043
// -------- func nie.decoder.set_quirk
66044
66045
WUFFS_BASE__GENERATED_C_CODE
66046
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66047
wuffs_nie__decoder__set_quirk(
66048
    wuffs_nie__decoder* self,
66049
    uint32_t a_key,
66050
    uint64_t a_value) {
66051
  if (!self) {
66052
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66053
  }
66054
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66055
    return wuffs_base__make_status(
66056
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66057
        ? wuffs_base__error__disabled_by_previous_error
66058
        : wuffs_base__error__initialize_not_called);
66059
  }
66060
66061
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
66062
}
66063
66064
// -------- func nie.decoder.decode_image_config
66065
66066
WUFFS_BASE__GENERATED_C_CODE
66067
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66068
wuffs_nie__decoder__decode_image_config(
66069
    wuffs_nie__decoder* self,
66070
    wuffs_base__image_config* a_dst,
66071
    wuffs_base__io_buffer* a_src) {
66072
  if (!self) {
66073
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66074
  }
66075
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66076
    return wuffs_base__make_status(
66077
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66078
        ? wuffs_base__error__disabled_by_previous_error
66079
        : wuffs_base__error__initialize_not_called);
66080
  }
66081
  if (!a_src) {
66082
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66083
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66084
  }
66085
  if ((self->private_impl.active_coroutine != 0) &&
66086
      (self->private_impl.active_coroutine != 1)) {
66087
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66088
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66089
  }
66090
  self->private_impl.active_coroutine = 0;
66091
  wuffs_base__status status = wuffs_base__make_status(NULL);
66092
66093
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66094
66095
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
66096
  switch (coro_susp_point) {
66097
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66098
66099
    while (true) {
66100
      {
66101
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_image_config(self, a_dst, a_src);
66102
        v_status = t_0;
66103
      }
66104
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66105
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
66106
        goto exit;
66107
      }
66108
      status = v_status;
66109
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66110
    }
66111
66112
    ok:
66113
    self->private_impl.p_decode_image_config = 0;
66114
    goto exit;
66115
  }
66116
66117
  goto suspend;
66118
  suspend:
66119
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66120
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
66121
66122
  goto exit;
66123
  exit:
66124
  if (wuffs_base__status__is_error(&status)) {
66125
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66126
  }
66127
  return status;
66128
}
66129
66130
// -------- func nie.decoder.do_decode_image_config
66131
66132
WUFFS_BASE__GENERATED_C_CODE
66133
static wuffs_base__status
66134
wuffs_nie__decoder__do_decode_image_config(
66135
    wuffs_nie__decoder* self,
66136
    wuffs_base__image_config* a_dst,
66137
    wuffs_base__io_buffer* a_src) {
66138
  wuffs_base__status status = wuffs_base__make_status(NULL);
66139
66140
  uint32_t v_a = 0;
66141
66142
  const uint8_t* iop_a_src = NULL;
66143
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66144
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66145
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66146
  if (a_src && a_src->data.ptr) {
66147
    io0_a_src = a_src->data.ptr;
66148
    io1_a_src = io0_a_src + a_src->meta.ri;
66149
    iop_a_src = io1_a_src;
66150
    io2_a_src = io0_a_src + a_src->meta.wi;
66151
  }
66152
66153
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
66154
  switch (coro_susp_point) {
66155
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66156
66157
    if (self->private_impl.f_call_sequence != 0u) {
66158
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
66159
      goto exit;
66160
    }
66161
    {
66162
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66163
      uint32_t t_0;
66164
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
66165
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
66166
        iop_a_src += 4;
66167
      } else {
66168
        self->private_data.s_do_decode_image_config.scratch = 0;
66169
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
66170
        while (true) {
66171
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66172
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66173
            goto suspend;
66174
          }
66175
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66176
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
66177
          *scratch <<= 8;
66178
          *scratch >>= 8;
66179
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
66180
          if (num_bits_0 == 24) {
66181
            t_0 = ((uint32_t)(*scratch));
66182
            break;
66183
          }
66184
          num_bits_0 += 8u;
66185
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
66186
        }
66187
      }
66188
      v_a = t_0;
66189
    }
66190
    if (v_a != 1169146734u) {
66191
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
66192
      goto exit;
66193
    }
66194
    {
66195
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
66196
      uint32_t t_1;
66197
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
66198
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
66199
        iop_a_src += 4;
66200
      } else {
66201
        self->private_data.s_do_decode_image_config.scratch = 0;
66202
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
66203
        while (true) {
66204
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66205
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66206
            goto suspend;
66207
          }
66208
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66209
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
66210
          *scratch <<= 8;
66211
          *scratch >>= 8;
66212
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
66213
          if (num_bits_1 == 24) {
66214
            t_1 = ((uint32_t)(*scratch));
66215
            break;
66216
          }
66217
          num_bits_1 += 8u;
66218
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
66219
        }
66220
      }
66221
      v_a = t_1;
66222
    }
66223
    if (v_a == 879649535u) {
66224
      self->private_impl.f_pixfmt = 2164295816u;
66225
    } else if (v_a == 946758399u) {
66226
      self->private_impl.f_pixfmt = 2164308923u;
66227
    } else if (v_a == 879780607u) {
66228
      status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file);
66229
      goto exit;
66230
    } else if (v_a == 946889471u) {
66231
      status = wuffs_base__make_status(wuffs_nie__error__unsupported_nie_file);
66232
      goto exit;
66233
    } else {
66234
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
66235
      goto exit;
66236
    }
66237
    {
66238
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
66239
      uint32_t t_2;
66240
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
66241
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
66242
        iop_a_src += 4;
66243
      } else {
66244
        self->private_data.s_do_decode_image_config.scratch = 0;
66245
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
66246
        while (true) {
66247
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66248
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66249
            goto suspend;
66250
          }
66251
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66252
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
66253
          *scratch <<= 8;
66254
          *scratch >>= 8;
66255
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
66256
          if (num_bits_2 == 24) {
66257
            t_2 = ((uint32_t)(*scratch));
66258
            break;
66259
          }
66260
          num_bits_2 += 8u;
66261
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
66262
        }
66263
      }
66264
      v_a = t_2;
66265
    }
66266
    if (v_a > 2147483647u) {
66267
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
66268
      goto exit;
66269
    } else if (v_a > 16777215u) {
66270
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
66271
      goto exit;
66272
    }
66273
    self->private_impl.f_width = v_a;
66274
    {
66275
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
66276
      uint32_t t_3;
66277
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
66278
        t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
66279
        iop_a_src += 4;
66280
      } else {
66281
        self->private_data.s_do_decode_image_config.scratch = 0;
66282
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
66283
        while (true) {
66284
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
66285
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66286
            goto suspend;
66287
          }
66288
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
66289
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
66290
          *scratch <<= 8;
66291
          *scratch >>= 8;
66292
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
66293
          if (num_bits_3 == 24) {
66294
            t_3 = ((uint32_t)(*scratch));
66295
            break;
66296
          }
66297
          num_bits_3 += 8u;
66298
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
66299
        }
66300
      }
66301
      v_a = t_3;
66302
    }
66303
    if (v_a > 2147483647u) {
66304
      status = wuffs_base__make_status(wuffs_nie__error__bad_header);
66305
      goto exit;
66306
    } else if (v_a > 16777215u) {
66307
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
66308
      goto exit;
66309
    }
66310
    self->private_impl.f_height = v_a;
66311
    if (a_dst != NULL) {
66312
      wuffs_base__image_config__set(
66313
          a_dst,
66314
          self->private_impl.f_pixfmt,
66315
          0u,
66316
          self->private_impl.f_width,
66317
          self->private_impl.f_height,
66318
          16u,
66319
          false);
66320
    }
66321
    self->private_impl.f_call_sequence = 32u;
66322
66323
    goto ok;
66324
    ok:
66325
    self->private_impl.p_do_decode_image_config = 0;
66326
    goto exit;
66327
  }
66328
66329
  goto suspend;
66330
  suspend:
66331
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66332
66333
  goto exit;
66334
  exit:
66335
  if (a_src && a_src->data.ptr) {
66336
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66337
  }
66338
66339
  return status;
66340
}
66341
66342
// -------- func nie.decoder.decode_frame_config
66343
66344
WUFFS_BASE__GENERATED_C_CODE
66345
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66346
wuffs_nie__decoder__decode_frame_config(
66347
    wuffs_nie__decoder* self,
66348
    wuffs_base__frame_config* a_dst,
66349
    wuffs_base__io_buffer* a_src) {
66350
  if (!self) {
66351
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66352
  }
66353
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66354
    return wuffs_base__make_status(
66355
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66356
        ? wuffs_base__error__disabled_by_previous_error
66357
        : wuffs_base__error__initialize_not_called);
66358
  }
66359
  if (!a_src) {
66360
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66361
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66362
  }
66363
  if ((self->private_impl.active_coroutine != 0) &&
66364
      (self->private_impl.active_coroutine != 2)) {
66365
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66366
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66367
  }
66368
  self->private_impl.active_coroutine = 0;
66369
  wuffs_base__status status = wuffs_base__make_status(NULL);
66370
66371
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66372
66373
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
66374
  switch (coro_susp_point) {
66375
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66376
66377
    while (true) {
66378
      {
66379
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame_config(self, a_dst, a_src);
66380
        v_status = t_0;
66381
      }
66382
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66383
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
66384
        goto exit;
66385
      }
66386
      status = v_status;
66387
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66388
    }
66389
66390
    ok:
66391
    self->private_impl.p_decode_frame_config = 0;
66392
    goto exit;
66393
  }
66394
66395
  goto suspend;
66396
  suspend:
66397
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66398
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
66399
66400
  goto exit;
66401
  exit:
66402
  if (wuffs_base__status__is_error(&status)) {
66403
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66404
  }
66405
  return status;
66406
}
66407
66408
// -------- func nie.decoder.do_decode_frame_config
66409
66410
WUFFS_BASE__GENERATED_C_CODE
66411
static wuffs_base__status
66412
wuffs_nie__decoder__do_decode_frame_config(
66413
    wuffs_nie__decoder* self,
66414
    wuffs_base__frame_config* a_dst,
66415
    wuffs_base__io_buffer* a_src) {
66416
  wuffs_base__status status = wuffs_base__make_status(NULL);
66417
66418
  wuffs_base__pixel_format v_pixfmt = {0};
66419
66420
  const uint8_t* iop_a_src = NULL;
66421
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66422
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66423
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66424
  if (a_src && a_src->data.ptr) {
66425
    io0_a_src = a_src->data.ptr;
66426
    io1_a_src = io0_a_src + a_src->meta.ri;
66427
    iop_a_src = io1_a_src;
66428
    io2_a_src = io0_a_src + a_src->meta.wi;
66429
  }
66430
66431
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
66432
  switch (coro_susp_point) {
66433
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66434
66435
    if (self->private_impl.f_call_sequence == 32u) {
66436
    } else if (self->private_impl.f_call_sequence < 32u) {
66437
      if (a_src) {
66438
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66439
      }
66440
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66441
      status = wuffs_nie__decoder__do_decode_image_config(self, NULL, a_src);
66442
      if (a_src) {
66443
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
66444
      }
66445
      if (status.repr) {
66446
        goto suspend;
66447
      }
66448
    } else if (self->private_impl.f_call_sequence == 40u) {
66449
      if (16u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
66450
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
66451
        goto exit;
66452
      }
66453
    } else if (self->private_impl.f_call_sequence == 64u) {
66454
      self->private_impl.f_call_sequence = 96u;
66455
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66456
      goto ok;
66457
    } else {
66458
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66459
      goto ok;
66460
    }
66461
    if (a_dst != NULL) {
66462
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
66463
      wuffs_base__frame_config__set(
66464
          a_dst,
66465
          wuffs_base__utility__make_rect_ie_u32(
66466
          0u,
66467
          0u,
66468
          self->private_impl.f_width,
66469
          self->private_impl.f_height),
66470
          ((wuffs_base__flicks)(0u)),
66471
          0u,
66472
          16u,
66473
          0u,
66474
          false,
66475
          false,
66476
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
66477
    }
66478
    self->private_impl.f_call_sequence = 64u;
66479
66480
    ok:
66481
    self->private_impl.p_do_decode_frame_config = 0;
66482
    goto exit;
66483
  }
66484
66485
  goto suspend;
66486
  suspend:
66487
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66488
66489
  goto exit;
66490
  exit:
66491
  if (a_src && a_src->data.ptr) {
66492
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66493
  }
66494
66495
  return status;
66496
}
66497
66498
// -------- func nie.decoder.decode_frame
66499
66500
WUFFS_BASE__GENERATED_C_CODE
66501
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66502
wuffs_nie__decoder__decode_frame(
66503
    wuffs_nie__decoder* self,
66504
    wuffs_base__pixel_buffer* a_dst,
66505
    wuffs_base__io_buffer* a_src,
66506
    wuffs_base__pixel_blend a_blend,
66507
    wuffs_base__slice_u8 a_workbuf,
66508
    wuffs_base__decode_frame_options* a_opts) {
66509
  if (!self) {
66510
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66511
  }
66512
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66513
    return wuffs_base__make_status(
66514
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66515
        ? wuffs_base__error__disabled_by_previous_error
66516
        : wuffs_base__error__initialize_not_called);
66517
  }
66518
  if (!a_dst || !a_src) {
66519
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66520
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66521
  }
66522
  if ((self->private_impl.active_coroutine != 0) &&
66523
      (self->private_impl.active_coroutine != 3)) {
66524
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66525
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66526
  }
66527
  self->private_impl.active_coroutine = 0;
66528
  wuffs_base__status status = wuffs_base__make_status(NULL);
66529
66530
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66531
66532
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
66533
  switch (coro_susp_point) {
66534
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66535
66536
    while (true) {
66537
      {
66538
        wuffs_base__status t_0 = wuffs_nie__decoder__do_decode_frame(self,
66539
            a_dst,
66540
            a_src,
66541
            a_blend,
66542
            a_workbuf,
66543
            a_opts);
66544
        v_status = t_0;
66545
      }
66546
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
66547
        status = wuffs_base__make_status(wuffs_nie__error__truncated_input);
66548
        goto exit;
66549
      }
66550
      status = v_status;
66551
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
66552
    }
66553
66554
    ok:
66555
    self->private_impl.p_decode_frame = 0;
66556
    goto exit;
66557
  }
66558
66559
  goto suspend;
66560
  suspend:
66561
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66562
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
66563
66564
  goto exit;
66565
  exit:
66566
  if (wuffs_base__status__is_error(&status)) {
66567
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66568
  }
66569
  return status;
66570
}
66571
66572
// -------- func nie.decoder.do_decode_frame
66573
66574
WUFFS_BASE__GENERATED_C_CODE
66575
static wuffs_base__status
66576
wuffs_nie__decoder__do_decode_frame(
66577
    wuffs_nie__decoder* self,
66578
    wuffs_base__pixel_buffer* a_dst,
66579
    wuffs_base__io_buffer* a_src,
66580
    wuffs_base__pixel_blend a_blend,
66581
    wuffs_base__slice_u8 a_workbuf,
66582
    wuffs_base__decode_frame_options* a_opts) {
66583
  wuffs_base__status status = wuffs_base__make_status(NULL);
66584
66585
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
66586
66587
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
66588
  switch (coro_susp_point) {
66589
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
66590
66591
    if (self->private_impl.f_call_sequence == 64u) {
66592
    } else if (self->private_impl.f_call_sequence < 64u) {
66593
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
66594
      status = wuffs_nie__decoder__do_decode_frame_config(self, NULL, a_src);
66595
      if (status.repr) {
66596
        goto suspend;
66597
      }
66598
    } else {
66599
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
66600
      goto ok;
66601
    }
66602
    self->private_impl.f_dst_x = 0u;
66603
    self->private_impl.f_dst_y = 0u;
66604
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
66605
        wuffs_base__pixel_buffer__pixel_format(a_dst),
66606
        wuffs_base__pixel_buffer__palette(a_dst),
66607
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
66608
        wuffs_base__utility__empty_slice_u8(),
66609
        a_blend);
66610
    if ( ! wuffs_base__status__is_ok(&v_status)) {
66611
      status = v_status;
66612
      if (wuffs_base__status__is_error(&status)) {
66613
        goto exit;
66614
      } else if (wuffs_base__status__is_suspension(&status)) {
66615
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
66616
        goto exit;
66617
      }
66618
      goto ok;
66619
    }
66620
    while (true) {
66621
      v_status = wuffs_nie__decoder__swizzle(self, a_dst, a_src);
66622
      if (wuffs_base__status__is_ok(&v_status)) {
66623
        break;
66624
      } else if (v_status.repr != wuffs_nie__note__internal_note_short_read) {
66625
        status = v_status;
66626
        if (wuffs_base__status__is_error(&status)) {
66627
          goto exit;
66628
        } else if (wuffs_base__status__is_suspension(&status)) {
66629
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
66630
          goto exit;
66631
        }
66632
        goto ok;
66633
      }
66634
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
66635
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
66636
    }
66637
    self->private_impl.f_call_sequence = 96u;
66638
66639
    ok:
66640
    self->private_impl.p_do_decode_frame = 0;
66641
    goto exit;
66642
  }
66643
66644
  goto suspend;
66645
  suspend:
66646
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
66647
66648
  goto exit;
66649
  exit:
66650
  return status;
66651
}
66652
66653
// -------- func nie.decoder.swizzle
66654
66655
WUFFS_BASE__GENERATED_C_CODE
66656
static wuffs_base__status
66657
wuffs_nie__decoder__swizzle(
66658
    wuffs_nie__decoder* self,
66659
    wuffs_base__pixel_buffer* a_dst,
66660
    wuffs_base__io_buffer* a_src) {
66661
  wuffs_base__status status = wuffs_base__make_status(NULL);
66662
66663
  wuffs_base__pixel_format v_dst_pixfmt = {0};
66664
  uint32_t v_dst_bits_per_pixel = 0;
66665
  uint32_t v_dst_bytes_per_pixel = 0;
66666
  uint64_t v_dst_bytes_per_row = 0;
66667
  uint32_t v_src_bytes_per_pixel = 0;
66668
  wuffs_base__table_u8 v_tab = {0};
66669
  wuffs_base__slice_u8 v_dst = {0};
66670
  uint64_t v_i = 0;
66671
  uint64_t v_j = 0;
66672
  uint64_t v_n = 0;
66673
66674
  const uint8_t* iop_a_src = NULL;
66675
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66676
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66677
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
66678
  if (a_src && a_src->data.ptr) {
66679
    io0_a_src = a_src->data.ptr;
66680
    io1_a_src = io0_a_src + a_src->meta.ri;
66681
    iop_a_src = io1_a_src;
66682
    io2_a_src = io0_a_src + a_src->meta.wi;
66683
  }
66684
66685
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
66686
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
66687
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
66688
    status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
66689
    goto exit;
66690
  }
66691
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
66692
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
66693
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
66694
  while (true) {
66695
    if (self->private_impl.f_dst_x == self->private_impl.f_width) {
66696
      self->private_impl.f_dst_x = 0u;
66697
      self->private_impl.f_dst_y += 1u;
66698
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
66699
        break;
66700
      }
66701
    }
66702
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
66703
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
66704
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
66705
    }
66706
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
66707
    if (v_i >= ((uint64_t)(v_dst.len))) {
66708
      v_src_bytes_per_pixel = 4u;
66709
      if (self->private_impl.f_pixfmt == 2164308923u) {
66710
        v_src_bytes_per_pixel = 8u;
66711
      }
66712
      v_n = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(v_src_bytes_per_pixel)));
66713
      v_n = wuffs_base__u64__min(v_n, ((uint64_t)(((uint32_t)(self->private_impl.f_width - self->private_impl.f_dst_x)))));
66714
      v_j = v_n;
66715
      while (v_j >= 8u) {
66716
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 8u)))) {
66717
          iop_a_src += (v_src_bytes_per_pixel * 8u);
66718
        }
66719
        v_j -= 8u;
66720
      }
66721
      while (v_j > 0u) {
66722
        if (((uint64_t)(io2_a_src - iop_a_src)) >= ((uint64_t)((v_src_bytes_per_pixel * 1u)))) {
66723
          iop_a_src += (v_src_bytes_per_pixel * 1u);
66724
        }
66725
        v_j -= 1u;
66726
      }
66727
    } else {
66728
      v_n = wuffs_base__pixel_swizzler__swizzle_interleaved_from_reader(
66729
          &self->private_impl.f_swizzler,
66730
          wuffs_base__slice_u8__subslice_i(v_dst, v_i),
66731
          wuffs_base__pixel_buffer__palette(a_dst),
66732
          &iop_a_src,
66733
          io2_a_src);
66734
    }
66735
    if (v_n == 0u) {
66736
      status = wuffs_base__make_status(wuffs_nie__note__internal_note_short_read);
66737
      goto ok;
66738
    }
66739
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_dst_x, ((uint32_t)(v_n)));
66740
  }
66741
  status = wuffs_base__make_status(NULL);
66742
  goto ok;
66743
66744
  ok:
66745
  goto exit;
66746
  exit:
66747
  if (a_src && a_src->data.ptr) {
66748
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
66749
  }
66750
66751
  return status;
66752
}
66753
66754
// -------- func nie.decoder.frame_dirty_rect
66755
66756
WUFFS_BASE__GENERATED_C_CODE
66757
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
66758
wuffs_nie__decoder__frame_dirty_rect(
66759
    const wuffs_nie__decoder* self) {
66760
  if (!self) {
66761
    return wuffs_base__utility__empty_rect_ie_u32();
66762
  }
66763
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66764
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66765
    return wuffs_base__utility__empty_rect_ie_u32();
66766
  }
66767
66768
  return wuffs_base__utility__make_rect_ie_u32(
66769
      0u,
66770
      0u,
66771
      self->private_impl.f_width,
66772
      self->private_impl.f_height);
66773
}
66774
66775
// -------- func nie.decoder.num_animation_loops
66776
66777
WUFFS_BASE__GENERATED_C_CODE
66778
WUFFS_BASE__MAYBE_STATIC uint32_t
66779
wuffs_nie__decoder__num_animation_loops(
66780
    const wuffs_nie__decoder* self) {
66781
  if (!self) {
66782
    return 0;
66783
  }
66784
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66785
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66786
    return 0;
66787
  }
66788
66789
  return 0u;
66790
}
66791
66792
// -------- func nie.decoder.num_decoded_frame_configs
66793
66794
WUFFS_BASE__GENERATED_C_CODE
66795
WUFFS_BASE__MAYBE_STATIC uint64_t
66796
wuffs_nie__decoder__num_decoded_frame_configs(
66797
    const wuffs_nie__decoder* self) {
66798
  if (!self) {
66799
    return 0;
66800
  }
66801
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66802
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66803
    return 0;
66804
  }
66805
66806
  if (self->private_impl.f_call_sequence > 32u) {
66807
    return 1u;
66808
  }
66809
  return 0u;
66810
}
66811
66812
// -------- func nie.decoder.num_decoded_frames
66813
66814
WUFFS_BASE__GENERATED_C_CODE
66815
WUFFS_BASE__MAYBE_STATIC uint64_t
66816
wuffs_nie__decoder__num_decoded_frames(
66817
    const wuffs_nie__decoder* self) {
66818
  if (!self) {
66819
    return 0;
66820
  }
66821
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66822
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66823
    return 0;
66824
  }
66825
66826
  if (self->private_impl.f_call_sequence > 64u) {
66827
    return 1u;
66828
  }
66829
  return 0u;
66830
}
66831
66832
// -------- func nie.decoder.restart_frame
66833
66834
WUFFS_BASE__GENERATED_C_CODE
66835
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66836
wuffs_nie__decoder__restart_frame(
66837
    wuffs_nie__decoder* self,
66838
    uint64_t a_index,
66839
    uint64_t a_io_position) {
66840
  if (!self) {
66841
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66842
  }
66843
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66844
    return wuffs_base__make_status(
66845
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66846
        ? wuffs_base__error__disabled_by_previous_error
66847
        : wuffs_base__error__initialize_not_called);
66848
  }
66849
66850
  if (self->private_impl.f_call_sequence < 32u) {
66851
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
66852
  }
66853
  if ((a_index != 0u) || (a_io_position != 16u)) {
66854
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66855
  }
66856
  self->private_impl.f_call_sequence = 40u;
66857
  return wuffs_base__make_status(NULL);
66858
}
66859
66860
// -------- func nie.decoder.set_report_metadata
66861
66862
WUFFS_BASE__GENERATED_C_CODE
66863
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
66864
wuffs_nie__decoder__set_report_metadata(
66865
    wuffs_nie__decoder* self,
66866
    uint32_t a_fourcc,
66867
    bool a_report) {
66868
  return wuffs_base__make_empty_struct();
66869
}
66870
66871
// -------- func nie.decoder.tell_me_more
66872
66873
WUFFS_BASE__GENERATED_C_CODE
66874
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
66875
wuffs_nie__decoder__tell_me_more(
66876
    wuffs_nie__decoder* self,
66877
    wuffs_base__io_buffer* a_dst,
66878
    wuffs_base__more_information* a_minfo,
66879
    wuffs_base__io_buffer* a_src) {
66880
  if (!self) {
66881
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66882
  }
66883
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
66884
    return wuffs_base__make_status(
66885
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
66886
        ? wuffs_base__error__disabled_by_previous_error
66887
        : wuffs_base__error__initialize_not_called);
66888
  }
66889
  if (!a_dst || !a_src) {
66890
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66891
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
66892
  }
66893
  if ((self->private_impl.active_coroutine != 0) &&
66894
      (self->private_impl.active_coroutine != 4)) {
66895
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66896
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
66897
  }
66898
  self->private_impl.active_coroutine = 0;
66899
  wuffs_base__status status = wuffs_base__make_status(NULL);
66900
66901
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
66902
  goto exit;
66903
66904
  goto ok;
66905
  ok:
66906
  goto exit;
66907
  exit:
66908
  if (wuffs_base__status__is_error(&status)) {
66909
    self->private_impl.magic = WUFFS_BASE__DISABLED;
66910
  }
66911
  return status;
66912
}
66913
66914
// -------- func nie.decoder.workbuf_len
66915
66916
WUFFS_BASE__GENERATED_C_CODE
66917
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
66918
wuffs_nie__decoder__workbuf_len(
66919
    const wuffs_nie__decoder* self) {
66920
  if (!self) {
66921
    return wuffs_base__utility__empty_range_ii_u64();
66922
  }
66923
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
66924
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
66925
    return wuffs_base__utility__empty_range_ii_u64();
66926
  }
66927
66928
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
66929
}
66930
66931
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
66932
66933
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
66934
66935
// ---------------- Status Codes Implementations
66936
66937
const char wuffs_zlib__note__dictionary_required[] = "@zlib: dictionary required";
66938
const char wuffs_zlib__error__bad_checksum[] = "#zlib: bad checksum";
66939
const char wuffs_zlib__error__bad_compression_method[] = "#zlib: bad compression method";
66940
const char wuffs_zlib__error__bad_compression_window_size[] = "#zlib: bad compression window size";
66941
const char wuffs_zlib__error__bad_parity_check[] = "#zlib: bad parity check";
66942
const char wuffs_zlib__error__incorrect_dictionary[] = "#zlib: incorrect dictionary";
66943
const char wuffs_zlib__error__truncated_input[] = "#zlib: truncated input";
66944
66945
// ---------------- Private Consts
66946
66947
#define WUFFS_ZLIB__QUIRKS_BASE 2056083456u
66948
66949
#define WUFFS_ZLIB__QUIRKS_COUNT 1u
66950
66951
// ---------------- Private Initializer Prototypes
66952
66953
// ---------------- Private Function Prototypes
66954
66955
WUFFS_BASE__GENERATED_C_CODE
66956
static wuffs_base__status
66957
wuffs_zlib__decoder__do_transform_io(
66958
    wuffs_zlib__decoder* self,
66959
    wuffs_base__io_buffer* a_dst,
66960
    wuffs_base__io_buffer* a_src,
66961
    wuffs_base__slice_u8 a_workbuf);
66962
66963
// ---------------- VTables
66964
66965
const wuffs_base__io_transformer__func_ptrs
66966
wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer = {
66967
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_zlib__decoder__dst_history_retain_length),
66968
  (uint64_t(*)(const void*,
66969
      uint32_t))(&wuffs_zlib__decoder__get_quirk),
66970
  (wuffs_base__status(*)(void*,
66971
      uint32_t,
66972
      uint64_t))(&wuffs_zlib__decoder__set_quirk),
66973
  (wuffs_base__status(*)(void*,
66974
      wuffs_base__io_buffer*,
66975
      wuffs_base__io_buffer*,
66976
      wuffs_base__slice_u8))(&wuffs_zlib__decoder__transform_io),
66977
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_zlib__decoder__workbuf_len),
66978
};
66979
66980
// ---------------- Initializer Implementations
66981
66982
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
66983
wuffs_zlib__decoder__initialize(
66984
    wuffs_zlib__decoder* self,
66985
    size_t sizeof_star_self,
66986
    uint64_t wuffs_version,
66987
7.31k
    uint32_t options){
66988
7.31k
  if (!self) {
66989
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
66990
0
  }
66991
7.31k
  if (sizeof(*self) != sizeof_star_self) {
66992
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
66993
0
  }
66994
7.31k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
66995
7.31k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
66996
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
66997
0
  }
66998
66999
7.31k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
67000
    // The whole point of this if-check is to detect an uninitialized *self.
67001
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
67002
#if !defined(__clang__) && defined(__GNUC__)
67003
#pragma GCC diagnostic push
67004
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
67005
#endif
67006
2.82k
    if (self->private_impl.magic != 0) {
67007
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
67008
0
    }
67009
#if !defined(__clang__) && defined(__GNUC__)
67010
#pragma GCC diagnostic pop
67011
#endif
67012
4.49k
  } else {
67013
4.49k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
67014
0
      memset(self, 0, sizeof(*self));
67015
0
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
67016
4.49k
    } else {
67017
4.49k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
67018
4.49k
    }
67019
4.49k
  }
67020
67021
7.31k
  {
67022
7.31k
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
67023
7.31k
        &self->private_data.f_checksum, sizeof(self->private_data.f_checksum), WUFFS_VERSION, options);
67024
7.31k
    if (z.repr) {
67025
0
      return z;
67026
0
    }
67027
7.31k
  }
67028
7.31k
  {
67029
7.31k
    wuffs_base__status z = wuffs_adler32__hasher__initialize(
67030
7.31k
        &self->private_data.f_dict_id_hasher, sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION, options);
67031
7.31k
    if (z.repr) {
67032
0
      return z;
67033
0
    }
67034
7.31k
  }
67035
7.31k
  {
67036
7.31k
    wuffs_base__status z = wuffs_deflate__decoder__initialize(
67037
7.31k
        &self->private_data.f_flate, sizeof(self->private_data.f_flate), WUFFS_VERSION, options);
67038
7.31k
    if (z.repr) {
67039
0
      return z;
67040
0
    }
67041
7.31k
  }
67042
7.31k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
67043
7.31k
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
67044
7.31k
      wuffs_base__io_transformer__vtable_name;
67045
7.31k
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
67046
7.31k
      (const void*)(&wuffs_zlib__decoder__func_ptrs_for__wuffs_base__io_transformer);
67047
7.31k
  return wuffs_base__make_status(NULL);
67048
7.31k
}
67049
67050
wuffs_zlib__decoder*
67051
0
wuffs_zlib__decoder__alloc(void) {
67052
0
  wuffs_zlib__decoder* x =
67053
0
      (wuffs_zlib__decoder*)(calloc(1, sizeof(wuffs_zlib__decoder)));
67054
0
  if (!x) {
67055
0
    return NULL;
67056
0
  }
67057
0
  if (wuffs_zlib__decoder__initialize(
67058
0
      x, sizeof(wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
67059
0
    free(x);
67060
0
    return NULL;
67061
0
  }
67062
0
  return x;
67063
0
}
67064
67065
size_t
67066
0
sizeof__wuffs_zlib__decoder(void) {
67067
0
  return sizeof(wuffs_zlib__decoder);
67068
0
}
67069
67070
// ---------------- Function Implementations
67071
67072
// -------- func zlib.decoder.dictionary_id
67073
67074
WUFFS_BASE__GENERATED_C_CODE
67075
WUFFS_BASE__MAYBE_STATIC uint32_t
67076
wuffs_zlib__decoder__dictionary_id(
67077
0
    const wuffs_zlib__decoder* self) {
67078
0
  if (!self) {
67079
0
    return 0;
67080
0
  }
67081
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
67082
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
67083
0
    return 0;
67084
0
  }
67085
67086
0
  return self->private_impl.f_dict_id_want;
67087
0
}
67088
67089
// -------- func zlib.decoder.add_dictionary
67090
67091
WUFFS_BASE__GENERATED_C_CODE
67092
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
67093
wuffs_zlib__decoder__add_dictionary(
67094
    wuffs_zlib__decoder* self,
67095
0
    wuffs_base__slice_u8 a_dict) {
67096
0
  if (!self) {
67097
0
    return wuffs_base__make_empty_struct();
67098
0
  }
67099
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
67100
0
    return wuffs_base__make_empty_struct();
67101
0
  }
67102
67103
0
  if (self->private_impl.f_header_complete) {
67104
0
    self->private_impl.f_bad_call_sequence = true;
67105
0
  } else {
67106
0
    self->private_impl.f_dict_id_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_dict_id_hasher, a_dict);
67107
0
    wuffs_deflate__decoder__add_history(&self->private_data.f_flate, a_dict);
67108
0
  }
67109
0
  self->private_impl.f_got_dictionary = true;
67110
0
  return wuffs_base__make_empty_struct();
67111
0
}
67112
67113
// -------- func zlib.decoder.get_quirk
67114
67115
WUFFS_BASE__GENERATED_C_CODE
67116
WUFFS_BASE__MAYBE_STATIC uint64_t
67117
wuffs_zlib__decoder__get_quirk(
67118
    const wuffs_zlib__decoder* self,
67119
0
    uint32_t a_key) {
67120
0
  if (!self) {
67121
0
    return 0;
67122
0
  }
67123
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
67124
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
67125
0
    return 0;
67126
0
  }
67127
67128
0
  uint32_t v_key = 0;
67129
67130
0
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
67131
0
    return 1u;
67132
0
  } else if (a_key >= 2056083456u) {
67133
0
    v_key = (a_key - 2056083456u);
67134
0
    if (v_key < 1u) {
67135
0
      if (self->private_impl.f_quirks[v_key]) {
67136
0
        return 1u;
67137
0
      }
67138
0
    }
67139
0
  }
67140
0
  return 0u;
67141
0
}
67142
67143
// -------- func zlib.decoder.set_quirk
67144
67145
WUFFS_BASE__GENERATED_C_CODE
67146
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
67147
wuffs_zlib__decoder__set_quirk(
67148
    wuffs_zlib__decoder* self,
67149
    uint32_t a_key,
67150
0
    uint64_t a_value) {
67151
0
  if (!self) {
67152
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
67153
0
  }
67154
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
67155
0
    return wuffs_base__make_status(
67156
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
67157
0
        ? wuffs_base__error__disabled_by_previous_error
67158
0
        : wuffs_base__error__initialize_not_called);
67159
0
  }
67160
67161
0
  if (self->private_impl.f_header_complete) {
67162
0
    self->private_impl.f_bad_call_sequence = true;
67163
0
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
67164
0
  } else if (a_key == 1u) {
67165
0
    self->private_impl.f_ignore_checksum = (a_value > 0u);
67166
0
    return wuffs_base__make_status(NULL);
67167
0
  } else if (a_key >= 2056083456u) {
67168
0
    a_key -= 2056083456u;
67169
0
    if (a_key < 1u) {
67170
0
      self->private_impl.f_quirks[a_key] = (a_value > 0u);
67171
0
      return wuffs_base__make_status(NULL);
67172
0
    }
67173
0
  }
67174
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
67175
0
}
67176
67177
// -------- func zlib.decoder.dst_history_retain_length
67178
67179
WUFFS_BASE__GENERATED_C_CODE
67180
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
67181
wuffs_zlib__decoder__dst_history_retain_length(
67182
0
    const wuffs_zlib__decoder* self) {
67183
0
  if (!self) {
67184
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
67185
0
  }
67186
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
67187
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
67188
0
    return wuffs_base__utility__make_optional_u63(false, 0u);
67189
0
  }
67190
67191
0
  return wuffs_base__utility__make_optional_u63(true, 0u);
67192
0
}
67193
67194
// -------- func zlib.decoder.workbuf_len
67195
67196
WUFFS_BASE__GENERATED_C_CODE
67197
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
67198
wuffs_zlib__decoder__workbuf_len(
67199
0
    const wuffs_zlib__decoder* self) {
67200
0
  if (!self) {
67201
0
    return wuffs_base__utility__empty_range_ii_u64();
67202
0
  }
67203
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
67204
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
67205
0
    return wuffs_base__utility__empty_range_ii_u64();
67206
0
  }
67207
67208
0
  return wuffs_base__utility__make_range_ii_u64(1u, 1u);
67209
0
}
67210
67211
// -------- func zlib.decoder.transform_io
67212
67213
WUFFS_BASE__GENERATED_C_CODE
67214
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
67215
wuffs_zlib__decoder__transform_io(
67216
    wuffs_zlib__decoder* self,
67217
    wuffs_base__io_buffer* a_dst,
67218
    wuffs_base__io_buffer* a_src,
67219
19.8k
    wuffs_base__slice_u8 a_workbuf) {
67220
19.8k
  if (!self) {
67221
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
67222
0
  }
67223
19.8k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
67224
0
    return wuffs_base__make_status(
67225
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
67226
0
        ? wuffs_base__error__disabled_by_previous_error
67227
0
        : wuffs_base__error__initialize_not_called);
67228
0
  }
67229
19.8k
  if (!a_dst || !a_src) {
67230
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67231
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
67232
0
  }
67233
19.8k
  if ((self->private_impl.active_coroutine != 0) &&
67234
19.8k
      (self->private_impl.active_coroutine != 1)) {
67235
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67236
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
67237
0
  }
67238
19.8k
  self->private_impl.active_coroutine = 0;
67239
19.8k
  wuffs_base__status status = wuffs_base__make_status(NULL);
67240
67241
19.8k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
67242
67243
19.8k
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
67244
19.8k
  switch (coro_susp_point) {
67245
5.52k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67246
67247
19.8k
    while (true) {
67248
19.8k
      {
67249
19.8k
        wuffs_base__status t_0 = wuffs_zlib__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
67250
19.8k
        v_status = t_0;
67251
19.8k
      }
67252
19.8k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
67253
165
        status = wuffs_base__make_status(wuffs_zlib__error__truncated_input);
67254
165
        goto exit;
67255
165
      }
67256
19.7k
      status = v_status;
67257
19.7k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
67258
14.3k
    }
67259
67260
1.72k
    ok:
67261
1.72k
    self->private_impl.p_transform_io = 0;
67262
1.72k
    goto exit;
67263
19.8k
  }
67264
67265
0
  goto suspend;
67266
16.2k
  suspend:
67267
16.2k
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67268
16.2k
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
67269
67270
16.2k
  goto exit;
67271
19.8k
  exit:
67272
19.8k
  if (wuffs_base__status__is_error(&status)) {
67273
1.92k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
67274
1.92k
  }
67275
19.8k
  return status;
67276
19.8k
}
67277
67278
// -------- func zlib.decoder.do_transform_io
67279
67280
WUFFS_BASE__GENERATED_C_CODE
67281
static wuffs_base__status
67282
wuffs_zlib__decoder__do_transform_io(
67283
    wuffs_zlib__decoder* self,
67284
    wuffs_base__io_buffer* a_dst,
67285
    wuffs_base__io_buffer* a_src,
67286
19.8k
    wuffs_base__slice_u8 a_workbuf) {
67287
19.8k
  wuffs_base__status status = wuffs_base__make_status(NULL);
67288
67289
19.8k
  uint16_t v_x = 0;
67290
19.8k
  uint32_t v_checksum_have = 0;
67291
19.8k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
67292
19.8k
  uint32_t v_checksum_want = 0;
67293
19.8k
  uint64_t v_mark = 0;
67294
67295
19.8k
  uint8_t* iop_a_dst = NULL;
67296
19.8k
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67297
19.8k
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67298
19.8k
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67299
19.8k
  if (a_dst && a_dst->data.ptr) {
67300
19.8k
    io0_a_dst = a_dst->data.ptr;
67301
19.8k
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
67302
19.8k
    iop_a_dst = io1_a_dst;
67303
19.8k
    io2_a_dst = io0_a_dst + a_dst->data.len;
67304
19.8k
    if (a_dst->meta.closed) {
67305
0
      io2_a_dst = iop_a_dst;
67306
0
    }
67307
19.8k
  }
67308
19.8k
  const uint8_t* iop_a_src = NULL;
67309
19.8k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67310
19.8k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67311
19.8k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
67312
19.8k
  if (a_src && a_src->data.ptr) {
67313
19.8k
    io0_a_src = a_src->data.ptr;
67314
19.8k
    io1_a_src = io0_a_src + a_src->meta.ri;
67315
19.8k
    iop_a_src = io1_a_src;
67316
19.8k
    io2_a_src = io0_a_src + a_src->meta.wi;
67317
19.8k
  }
67318
67319
19.8k
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
67320
19.8k
  if (coro_susp_point) {
67321
14.3k
    v_checksum_have = self->private_data.s_do_transform_io.v_checksum_have;
67322
14.3k
  }
67323
19.8k
  switch (coro_susp_point) {
67324
5.52k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
67325
67326
5.52k
    if (self->private_impl.f_bad_call_sequence) {
67327
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
67328
0
      goto exit;
67329
5.52k
    } else if (self->private_impl.f_quirks[0u]) {
67330
5.52k
    } else if ( ! self->private_impl.f_want_dictionary) {
67331
5.52k
      {
67332
5.52k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
67333
5.52k
        uint16_t t_0;
67334
5.52k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
67335
5.05k
          t_0 = wuffs_base__peek_u16be__no_bounds_check(iop_a_src);
67336
5.05k
          iop_a_src += 2;
67337
5.05k
        } else {
67338
476
          self->private_data.s_do_transform_io.scratch = 0;
67339
1.42k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
67340
1.49k
          while (true) {
67341
1.49k
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67342
1.40k
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67343
1.40k
              goto suspend;
67344
1.40k
            }
67345
86
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
67346
86
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
67347
86
            *scratch >>= 8;
67348
86
            *scratch <<= 8;
67349
86
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
67350
86
            if (num_bits_0 == 8) {
67351
17
              t_0 = ((uint16_t)(*scratch >> 48));
67352
17
              break;
67353
17
            }
67354
69
            num_bits_0 += 8u;
67355
69
            *scratch |= ((uint64_t)(num_bits_0));
67356
69
          }
67357
1.42k
        }
67358
5.06k
        v_x = t_0;
67359
5.06k
      }
67360
5.06k
      if (((uint16_t)(((uint16_t)(v_x >> 8u)) & 15u)) != 8u) {
67361
22
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_method);
67362
22
        goto exit;
67363
22
      }
67364
5.04k
      if (((uint16_t)(v_x >> 12u)) > 7u) {
67365
5
        status = wuffs_base__make_status(wuffs_zlib__error__bad_compression_window_size);
67366
5
        goto exit;
67367
5
      }
67368
5.04k
      if (((uint16_t)(v_x % 31u)) != 0u) {
67369
14
        status = wuffs_base__make_status(wuffs_zlib__error__bad_parity_check);
67370
14
        goto exit;
67371
14
      }
67372
5.02k
      self->private_impl.f_want_dictionary = (((uint16_t)(v_x & 32u)) != 0u);
67373
5.02k
      if (self->private_impl.f_want_dictionary) {
67374
34
        self->private_impl.f_dict_id_have = 1u;
67375
34
        {
67376
34
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
67377
34
          uint32_t t_1;
67378
34
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67379
8
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67380
8
            iop_a_src += 4;
67381
26
          } else {
67382
26
            self->private_data.s_do_transform_io.scratch = 0;
67383
403
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
67384
468
            while (true) {
67385
468
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67386
402
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67387
402
                goto suspend;
67388
402
              }
67389
66
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
67390
66
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
67391
66
              *scratch >>= 8;
67392
66
              *scratch <<= 8;
67393
66
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
67394
66
              if (num_bits_1 == 24) {
67395
1
                t_1 = ((uint32_t)(*scratch >> 32));
67396
1
                break;
67397
1
              }
67398
65
              num_bits_1 += 8u;
67399
65
              *scratch |= ((uint64_t)(num_bits_1));
67400
65
            }
67401
403
          }
67402
9
          self->private_impl.f_dict_id_want = t_1;
67403
9
        }
67404
0
        status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
67405
9
        goto ok;
67406
4.99k
      } else if (self->private_impl.f_got_dictionary) {
67407
0
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
67408
0
        goto exit;
67409
0
      }
67410
5.02k
    } else if (self->private_impl.f_dict_id_have != self->private_impl.f_dict_id_want) {
67411
0
      if (self->private_impl.f_got_dictionary) {
67412
0
        status = wuffs_base__make_status(wuffs_zlib__error__incorrect_dictionary);
67413
0
        goto exit;
67414
0
      }
67415
0
      status = wuffs_base__make_status(wuffs_zlib__note__dictionary_required);
67416
0
      goto ok;
67417
0
    }
67418
4.99k
    self->private_impl.f_header_complete = true;
67419
17.6k
    while (true) {
67420
17.6k
      v_mark = ((uint64_t)(iop_a_dst - io0_a_dst));
67421
17.6k
      {
67422
17.6k
        if (a_dst) {
67423
17.6k
          a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
67424
17.6k
        }
67425
17.6k
        if (a_src) {
67426
17.6k
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67427
17.6k
        }
67428
17.6k
        wuffs_base__status t_2 = wuffs_deflate__decoder__transform_io(&self->private_data.f_flate, a_dst, a_src, a_workbuf);
67429
17.6k
        v_status = t_2;
67430
17.6k
        if (a_dst) {
67431
17.6k
          iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
67432
17.6k
        }
67433
17.6k
        if (a_src) {
67434
17.6k
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
67435
17.6k
        }
67436
17.6k
      }
67437
17.6k
      if ( ! self->private_impl.f_ignore_checksum &&  ! self->private_impl.f_quirks[0u]) {
67438
17.6k
        v_checksum_have = wuffs_adler32__hasher__update_u32(&self->private_data.f_checksum, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
67439
17.6k
      }
67440
17.6k
      if (wuffs_base__status__is_ok(&v_status)) {
67441
1.85k
        break;
67442
1.85k
      }
67443
15.7k
      status = v_status;
67444
15.7k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
67445
12.6k
    }
67446
1.85k
    if ( ! self->private_impl.f_quirks[0u]) {
67447
1.85k
      {
67448
1.85k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
67449
1.85k
        uint32_t t_3;
67450
1.85k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
67451
1.78k
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
67452
1.78k
          iop_a_src += 4;
67453
1.78k
        } else {
67454
73
          self->private_data.s_do_transform_io.scratch = 0;
67455
452
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
67456
536
          while (true) {
67457
536
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
67458
450
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
67459
450
              goto suspend;
67460
450
            }
67461
86
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
67462
86
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
67463
86
            *scratch >>= 8;
67464
86
            *scratch <<= 8;
67465
86
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
67466
86
            if (num_bits_3 == 24) {
67467
2
              t_3 = ((uint32_t)(*scratch >> 32));
67468
2
              break;
67469
2
            }
67470
84
            num_bits_3 += 8u;
67471
84
            *scratch |= ((uint64_t)(num_bits_3));
67472
84
          }
67473
452
        }
67474
1.78k
        v_checksum_want = t_3;
67475
1.78k
      }
67476
1.78k
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
67477
62
        status = wuffs_base__make_status(wuffs_zlib__error__bad_checksum);
67478
62
        goto exit;
67479
62
      }
67480
1.78k
    }
67481
67482
1.72k
    ok:
67483
1.72k
    self->private_impl.p_do_transform_io = 0;
67484
1.72k
    goto exit;
67485
19.8k
  }
67486
67487
0
  goto suspend;
67488
16.3k
  suspend:
67489
16.3k
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
67490
16.3k
  self->private_data.s_do_transform_io.v_checksum_have = v_checksum_have;
67491
67492
16.3k
  goto exit;
67493
19.8k
  exit:
67494
19.8k
  if (a_dst && a_dst->data.ptr) {
67495
19.8k
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
67496
19.8k
  }
67497
19.8k
  if (a_src && a_src->data.ptr) {
67498
19.8k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
67499
19.8k
  }
67500
67501
19.8k
  return status;
67502
19.8k
}
67503
67504
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ZLIB)
67505
67506
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
67507
67508
// ---------------- Status Codes Implementations
67509
67510
const char wuffs_png__error__bad_animation_sequence_number[] = "#png: bad animation sequence number";
67511
const char wuffs_png__error__bad_checksum[] = "#png: bad checksum";
67512
const char wuffs_png__error__bad_chunk[] = "#png: bad chunk";
67513
const char wuffs_png__error__bad_filter[] = "#png: bad filter";
67514
const char wuffs_png__error__bad_header[] = "#png: bad header";
67515
const char wuffs_png__error__bad_text_chunk_not_latin_1[] = "#png: bad text chunk (not Latin-1)";
67516
const char wuffs_png__error__missing_palette[] = "#png: missing palette";
67517
const char wuffs_png__error__truncated_input[] = "#png: truncated input";
67518
const char wuffs_png__error__unsupported_cgbi_extension[] = "#png: unsupported CgBI extension";
67519
const char wuffs_png__error__unsupported_png_compression_method[] = "#png: unsupported PNG compression method";
67520
const char wuffs_png__error__unsupported_png_file[] = "#png: unsupported PNG file";
67521
const char wuffs_png__error__internal_error_inconsistent_i_o[] = "#png: internal error: inconsistent I/O";
67522
const char wuffs_png__error__internal_error_inconsistent_chunk_type[] = "#png: internal error: inconsistent chunk type";
67523
const char wuffs_png__error__internal_error_inconsistent_workbuf_length[] = "#png: internal error: inconsistent workbuf length";
67524
const char wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input[] = "#png: internal error: zlib decoder did not exhaust its input";
67525
67526
// ---------------- Private Consts
67527
67528
#define WUFFS_PNG__ANCILLARY_BIT 32u
67529
67530
static const uint8_t
67531
WUFFS_PNG__INTERLACING[8][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
67532
  {
67533
    0u, 0u, 0u, 0u, 0u, 0u,
67534
  }, {
67535
    3u, 7u, 0u, 3u, 7u, 0u,
67536
  }, {
67537
    3u, 3u, 4u, 3u, 7u, 0u,
67538
  }, {
67539
    2u, 3u, 0u, 3u, 3u, 4u,
67540
  }, {
67541
    2u, 1u, 2u, 2u, 3u, 0u,
67542
  }, {
67543
    1u, 1u, 0u, 2u, 1u, 2u,
67544
  }, {
67545
    1u, 0u, 1u, 1u, 1u, 0u,
67546
  }, {
67547
    0u, 0u, 0u, 1u, 0u, 1u,
67548
  },
67549
};
67550
67551
static const uint8_t
67552
WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
67553
  0u, 255u, 85u, 0u, 17u, 0u, 0u, 0u,
67554
};
67555
67556
static const uint8_t
67557
WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
67558
  0u, 8u, 4u, 0u, 2u, 0u, 0u, 0u,
67559
};
67560
67561
static const uint8_t
67562
WUFFS_PNG__NUM_CHANNELS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
67563
  1u, 0u, 3u, 1u, 2u, 0u, 4u, 0u,
67564
};
67565
67566
static const uint16_t
67567
WUFFS_PNG__LATIN_1[256] WUFFS_BASE__POTENTIALLY_UNUSED = {
67568
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67569
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67570
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67571
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67572
  32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u,
67573
  40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u,
67574
  48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u,
67575
  56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u,
67576
  64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u,
67577
  72u, 73u, 74u, 75u, 76u, 77u, 78u, 79u,
67578
  80u, 81u, 82u, 83u, 84u, 85u, 86u, 87u,
67579
  88u, 89u, 90u, 91u, 92u, 93u, 94u, 95u,
67580
  96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u,
67581
  104u, 105u, 106u, 107u, 108u, 109u, 110u, 111u,
67582
  112u, 113u, 114u, 115u, 116u, 117u, 118u, 119u,
67583
  120u, 121u, 122u, 123u, 124u, 125u, 126u, 0u,
67584
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67585
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67586
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67587
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
67588
  0u, 41410u, 41666u, 41922u, 42178u, 42434u, 42690u, 42946u,
67589
  43202u, 43458u, 43714u, 43970u, 44226u, 44482u, 44738u, 44994u,
67590
  45250u, 45506u, 45762u, 46018u, 46274u, 46530u, 46786u, 47042u,
67591
  47298u, 47554u, 47810u, 48066u, 48322u, 48578u, 48834u, 49090u,
67592
  32963u, 33219u, 33475u, 33731u, 33987u, 34243u, 34499u, 34755u,
67593
  35011u, 35267u, 35523u, 35779u, 36035u, 36291u, 36547u, 36803u,
67594
  37059u, 37315u, 37571u, 37827u, 38083u, 38339u, 38595u, 38851u,
67595
  39107u, 39363u, 39619u, 39875u, 40131u, 40387u, 40643u, 40899u,
67596
  41155u, 41411u, 41667u, 41923u, 42179u, 42435u, 42691u, 42947u,
67597
  43203u, 43459u, 43715u, 43971u, 44227u, 44483u, 44739u, 44995u,
67598
  45251u, 45507u, 45763u, 46019u, 46275u, 46531u, 46787u, 47043u,
67599
  47299u, 47555u, 47811u, 48067u, 48323u, 48579u, 48835u, 49091u,
67600
};
67601
67602
// ---------------- Private Initializer Prototypes
67603
67604
// ---------------- Private Function Prototypes
67605
67606
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67607
WUFFS_BASE__GENERATED_C_CODE
67608
static wuffs_base__empty_struct
67609
wuffs_png__decoder__filter_1_distance_4_arm_neon(
67610
    wuffs_png__decoder* self,
67611
    wuffs_base__slice_u8 a_curr);
67612
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67613
67614
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67615
WUFFS_BASE__GENERATED_C_CODE
67616
static wuffs_base__empty_struct
67617
wuffs_png__decoder__filter_3_distance_4_arm_neon(
67618
    wuffs_png__decoder* self,
67619
    wuffs_base__slice_u8 a_curr,
67620
    wuffs_base__slice_u8 a_prev);
67621
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67622
67623
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67624
WUFFS_BASE__GENERATED_C_CODE
67625
static wuffs_base__empty_struct
67626
wuffs_png__decoder__filter_4_distance_3_arm_neon(
67627
    wuffs_png__decoder* self,
67628
    wuffs_base__slice_u8 a_curr,
67629
    wuffs_base__slice_u8 a_prev);
67630
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67631
67632
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67633
WUFFS_BASE__GENERATED_C_CODE
67634
static wuffs_base__empty_struct
67635
wuffs_png__decoder__filter_4_distance_4_arm_neon(
67636
    wuffs_png__decoder* self,
67637
    wuffs_base__slice_u8 a_curr,
67638
    wuffs_base__slice_u8 a_prev);
67639
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
67640
67641
WUFFS_BASE__GENERATED_C_CODE
67642
static wuffs_base__empty_struct
67643
wuffs_png__decoder__filter_1(
67644
    wuffs_png__decoder* self,
67645
    wuffs_base__slice_u8 a_curr);
67646
67647
WUFFS_BASE__GENERATED_C_CODE
67648
static wuffs_base__empty_struct
67649
wuffs_png__decoder__filter_1__choosy_default(
67650
    wuffs_png__decoder* self,
67651
    wuffs_base__slice_u8 a_curr);
67652
67653
WUFFS_BASE__GENERATED_C_CODE
67654
static wuffs_base__empty_struct
67655
wuffs_png__decoder__filter_1_distance_3_fallback(
67656
    wuffs_png__decoder* self,
67657
    wuffs_base__slice_u8 a_curr);
67658
67659
WUFFS_BASE__GENERATED_C_CODE
67660
static wuffs_base__empty_struct
67661
wuffs_png__decoder__filter_1_distance_4_fallback(
67662
    wuffs_png__decoder* self,
67663
    wuffs_base__slice_u8 a_curr);
67664
67665
WUFFS_BASE__GENERATED_C_CODE
67666
static wuffs_base__empty_struct
67667
wuffs_png__decoder__filter_2(
67668
    wuffs_png__decoder* self,
67669
    wuffs_base__slice_u8 a_curr,
67670
    wuffs_base__slice_u8 a_prev);
67671
67672
WUFFS_BASE__GENERATED_C_CODE
67673
static wuffs_base__empty_struct
67674
wuffs_png__decoder__filter_3(
67675
    wuffs_png__decoder* self,
67676
    wuffs_base__slice_u8 a_curr,
67677
    wuffs_base__slice_u8 a_prev);
67678
67679
WUFFS_BASE__GENERATED_C_CODE
67680
static wuffs_base__empty_struct
67681
wuffs_png__decoder__filter_3__choosy_default(
67682
    wuffs_png__decoder* self,
67683
    wuffs_base__slice_u8 a_curr,
67684
    wuffs_base__slice_u8 a_prev);
67685
67686
WUFFS_BASE__GENERATED_C_CODE
67687
static wuffs_base__empty_struct
67688
wuffs_png__decoder__filter_3_distance_3_fallback(
67689
    wuffs_png__decoder* self,
67690
    wuffs_base__slice_u8 a_curr,
67691
    wuffs_base__slice_u8 a_prev);
67692
67693
WUFFS_BASE__GENERATED_C_CODE
67694
static wuffs_base__empty_struct
67695
wuffs_png__decoder__filter_3_distance_4_fallback(
67696
    wuffs_png__decoder* self,
67697
    wuffs_base__slice_u8 a_curr,
67698
    wuffs_base__slice_u8 a_prev);
67699
67700
WUFFS_BASE__GENERATED_C_CODE
67701
static wuffs_base__empty_struct
67702
wuffs_png__decoder__filter_4(
67703
    wuffs_png__decoder* self,
67704
    wuffs_base__slice_u8 a_curr,
67705
    wuffs_base__slice_u8 a_prev);
67706
67707
WUFFS_BASE__GENERATED_C_CODE
67708
static wuffs_base__empty_struct
67709
wuffs_png__decoder__filter_4__choosy_default(
67710
    wuffs_png__decoder* self,
67711
    wuffs_base__slice_u8 a_curr,
67712
    wuffs_base__slice_u8 a_prev);
67713
67714
WUFFS_BASE__GENERATED_C_CODE
67715
static wuffs_base__empty_struct
67716
wuffs_png__decoder__filter_4_distance_3_fallback(
67717
    wuffs_png__decoder* self,
67718
    wuffs_base__slice_u8 a_curr,
67719
    wuffs_base__slice_u8 a_prev);
67720
67721
WUFFS_BASE__GENERATED_C_CODE
67722
static wuffs_base__empty_struct
67723
wuffs_png__decoder__filter_4_distance_4_fallback(
67724
    wuffs_png__decoder* self,
67725
    wuffs_base__slice_u8 a_curr,
67726
    wuffs_base__slice_u8 a_prev);
67727
67728
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67729
WUFFS_BASE__GENERATED_C_CODE
67730
static wuffs_base__empty_struct
67731
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
67732
    wuffs_png__decoder* self,
67733
    wuffs_base__slice_u8 a_curr);
67734
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67735
67736
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67737
WUFFS_BASE__GENERATED_C_CODE
67738
static wuffs_base__empty_struct
67739
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
67740
    wuffs_png__decoder* self,
67741
    wuffs_base__slice_u8 a_curr,
67742
    wuffs_base__slice_u8 a_prev);
67743
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67744
67745
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67746
WUFFS_BASE__GENERATED_C_CODE
67747
static wuffs_base__empty_struct
67748
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
67749
    wuffs_png__decoder* self,
67750
    wuffs_base__slice_u8 a_curr,
67751
    wuffs_base__slice_u8 a_prev);
67752
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67753
67754
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67755
WUFFS_BASE__GENERATED_C_CODE
67756
static wuffs_base__empty_struct
67757
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
67758
    wuffs_png__decoder* self,
67759
    wuffs_base__slice_u8 a_curr,
67760
    wuffs_base__slice_u8 a_prev);
67761
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
67762
67763
WUFFS_BASE__GENERATED_C_CODE
67764
static wuffs_base__status
67765
wuffs_png__decoder__do_decode_image_config(
67766
    wuffs_png__decoder* self,
67767
    wuffs_base__image_config* a_dst,
67768
    wuffs_base__io_buffer* a_src);
67769
67770
WUFFS_BASE__GENERATED_C_CODE
67771
static wuffs_base__status
67772
wuffs_png__decoder__decode_ihdr(
67773
    wuffs_png__decoder* self,
67774
    wuffs_base__io_buffer* a_src);
67775
67776
WUFFS_BASE__GENERATED_C_CODE
67777
static wuffs_base__empty_struct
67778
wuffs_png__decoder__assign_filter_distance(
67779
    wuffs_png__decoder* self);
67780
67781
WUFFS_BASE__GENERATED_C_CODE
67782
static uint64_t
67783
wuffs_png__decoder__calculate_bytes_per_row(
67784
    const wuffs_png__decoder* self,
67785
    uint32_t a_width);
67786
67787
WUFFS_BASE__GENERATED_C_CODE
67788
static wuffs_base__empty_struct
67789
wuffs_png__decoder__choose_filter_implementations(
67790
    wuffs_png__decoder* self);
67791
67792
WUFFS_BASE__GENERATED_C_CODE
67793
static wuffs_base__status
67794
wuffs_png__decoder__decode_other_chunk(
67795
    wuffs_png__decoder* self,
67796
    wuffs_base__io_buffer* a_src,
67797
    bool a_framy);
67798
67799
WUFFS_BASE__GENERATED_C_CODE
67800
static wuffs_base__status
67801
wuffs_png__decoder__decode_actl(
67802
    wuffs_png__decoder* self,
67803
    wuffs_base__io_buffer* a_src);
67804
67805
WUFFS_BASE__GENERATED_C_CODE
67806
static wuffs_base__status
67807
wuffs_png__decoder__decode_chrm(
67808
    wuffs_png__decoder* self,
67809
    wuffs_base__io_buffer* a_src);
67810
67811
WUFFS_BASE__GENERATED_C_CODE
67812
static wuffs_base__status
67813
wuffs_png__decoder__decode_exif(
67814
    wuffs_png__decoder* self,
67815
    wuffs_base__io_buffer* a_src);
67816
67817
WUFFS_BASE__GENERATED_C_CODE
67818
static wuffs_base__status
67819
wuffs_png__decoder__decode_fctl(
67820
    wuffs_png__decoder* self,
67821
    wuffs_base__io_buffer* a_src);
67822
67823
WUFFS_BASE__GENERATED_C_CODE
67824
static wuffs_base__status
67825
wuffs_png__decoder__decode_gama(
67826
    wuffs_png__decoder* self,
67827
    wuffs_base__io_buffer* a_src);
67828
67829
WUFFS_BASE__GENERATED_C_CODE
67830
static wuffs_base__status
67831
wuffs_png__decoder__decode_iccp(
67832
    wuffs_png__decoder* self,
67833
    wuffs_base__io_buffer* a_src);
67834
67835
WUFFS_BASE__GENERATED_C_CODE
67836
static wuffs_base__status
67837
wuffs_png__decoder__decode_plte(
67838
    wuffs_png__decoder* self,
67839
    wuffs_base__io_buffer* a_src);
67840
67841
WUFFS_BASE__GENERATED_C_CODE
67842
static wuffs_base__status
67843
wuffs_png__decoder__decode_srgb(
67844
    wuffs_png__decoder* self,
67845
    wuffs_base__io_buffer* a_src);
67846
67847
WUFFS_BASE__GENERATED_C_CODE
67848
static wuffs_base__status
67849
wuffs_png__decoder__decode_trns(
67850
    wuffs_png__decoder* self,
67851
    wuffs_base__io_buffer* a_src);
67852
67853
WUFFS_BASE__GENERATED_C_CODE
67854
static wuffs_base__status
67855
wuffs_png__decoder__do_decode_frame_config(
67856
    wuffs_png__decoder* self,
67857
    wuffs_base__frame_config* a_dst,
67858
    wuffs_base__io_buffer* a_src);
67859
67860
WUFFS_BASE__GENERATED_C_CODE
67861
static wuffs_base__status
67862
wuffs_png__decoder__skip_frame(
67863
    wuffs_png__decoder* self,
67864
    wuffs_base__io_buffer* a_src);
67865
67866
WUFFS_BASE__GENERATED_C_CODE
67867
static wuffs_base__status
67868
wuffs_png__decoder__do_decode_frame(
67869
    wuffs_png__decoder* self,
67870
    wuffs_base__pixel_buffer* a_dst,
67871
    wuffs_base__io_buffer* a_src,
67872
    wuffs_base__pixel_blend a_blend,
67873
    wuffs_base__slice_u8 a_workbuf,
67874
    wuffs_base__decode_frame_options* a_opts);
67875
67876
WUFFS_BASE__GENERATED_C_CODE
67877
static wuffs_base__status
67878
wuffs_png__decoder__decode_pass(
67879
    wuffs_png__decoder* self,
67880
    wuffs_base__io_buffer* a_src,
67881
    wuffs_base__slice_u8 a_workbuf);
67882
67883
WUFFS_BASE__GENERATED_C_CODE
67884
static wuffs_base__status
67885
wuffs_png__decoder__do_tell_me_more(
67886
    wuffs_png__decoder* self,
67887
    wuffs_base__io_buffer* a_dst,
67888
    wuffs_base__more_information* a_minfo,
67889
    wuffs_base__io_buffer* a_src);
67890
67891
WUFFS_BASE__GENERATED_C_CODE
67892
static wuffs_base__status
67893
wuffs_png__decoder__filter_and_swizzle(
67894
    wuffs_png__decoder* self,
67895
    wuffs_base__pixel_buffer* a_dst,
67896
    wuffs_base__slice_u8 a_workbuf);
67897
67898
WUFFS_BASE__GENERATED_C_CODE
67899
static wuffs_base__status
67900
wuffs_png__decoder__filter_and_swizzle__choosy_default(
67901
    wuffs_png__decoder* self,
67902
    wuffs_base__pixel_buffer* a_dst,
67903
    wuffs_base__slice_u8 a_workbuf);
67904
67905
WUFFS_BASE__GENERATED_C_CODE
67906
static wuffs_base__status
67907
wuffs_png__decoder__filter_and_swizzle_tricky(
67908
    wuffs_png__decoder* self,
67909
    wuffs_base__pixel_buffer* a_dst,
67910
    wuffs_base__slice_u8 a_workbuf);
67911
67912
// ---------------- VTables
67913
67914
const wuffs_base__image_decoder__func_ptrs
67915
wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder = {
67916
  (wuffs_base__status(*)(void*,
67917
      wuffs_base__pixel_buffer*,
67918
      wuffs_base__io_buffer*,
67919
      wuffs_base__pixel_blend,
67920
      wuffs_base__slice_u8,
67921
      wuffs_base__decode_frame_options*))(&wuffs_png__decoder__decode_frame),
67922
  (wuffs_base__status(*)(void*,
67923
      wuffs_base__frame_config*,
67924
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_frame_config),
67925
  (wuffs_base__status(*)(void*,
67926
      wuffs_base__image_config*,
67927
      wuffs_base__io_buffer*))(&wuffs_png__decoder__decode_image_config),
67928
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_png__decoder__frame_dirty_rect),
67929
  (uint64_t(*)(const void*,
67930
      uint32_t))(&wuffs_png__decoder__get_quirk),
67931
  (uint32_t(*)(const void*))(&wuffs_png__decoder__num_animation_loops),
67932
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frame_configs),
67933
  (uint64_t(*)(const void*))(&wuffs_png__decoder__num_decoded_frames),
67934
  (wuffs_base__status(*)(void*,
67935
      uint64_t,
67936
      uint64_t))(&wuffs_png__decoder__restart_frame),
67937
  (wuffs_base__status(*)(void*,
67938
      uint32_t,
67939
      uint64_t))(&wuffs_png__decoder__set_quirk),
67940
  (wuffs_base__empty_struct(*)(void*,
67941
      uint32_t,
67942
      bool))(&wuffs_png__decoder__set_report_metadata),
67943
  (wuffs_base__status(*)(void*,
67944
      wuffs_base__io_buffer*,
67945
      wuffs_base__more_information*,
67946
      wuffs_base__io_buffer*))(&wuffs_png__decoder__tell_me_more),
67947
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_png__decoder__workbuf_len),
67948
};
67949
67950
// ---------------- Initializer Implementations
67951
67952
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
67953
wuffs_png__decoder__initialize(
67954
    wuffs_png__decoder* self,
67955
    size_t sizeof_star_self,
67956
    uint64_t wuffs_version,
67957
5.56k
    uint32_t options){
67958
5.56k
  if (!self) {
67959
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
67960
0
  }
67961
5.56k
  if (sizeof(*self) != sizeof_star_self) {
67962
0
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
67963
0
  }
67964
5.56k
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
67965
5.56k
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
67966
0
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
67967
0
  }
67968
67969
5.56k
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
67970
    // The whole point of this if-check is to detect an uninitialized *self.
67971
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
67972
#if !defined(__clang__) && defined(__GNUC__)
67973
#pragma GCC diagnostic push
67974
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
67975
#endif
67976
0
    if (self->private_impl.magic != 0) {
67977
0
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
67978
0
    }
67979
#if !defined(__clang__) && defined(__GNUC__)
67980
#pragma GCC diagnostic pop
67981
#endif
67982
5.56k
  } else {
67983
5.56k
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
67984
2.82k
      memset(self, 0, sizeof(*self));
67985
2.82k
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
67986
2.82k
    } else {
67987
2.74k
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
67988
2.74k
    }
67989
5.56k
  }
67990
67991
5.56k
  self->private_impl.choosy_filter_1 = &wuffs_png__decoder__filter_1__choosy_default;
67992
5.56k
  self->private_impl.choosy_filter_3 = &wuffs_png__decoder__filter_3__choosy_default;
67993
5.56k
  self->private_impl.choosy_filter_4 = &wuffs_png__decoder__filter_4__choosy_default;
67994
5.56k
  self->private_impl.choosy_filter_and_swizzle = &wuffs_png__decoder__filter_and_swizzle__choosy_default;
67995
67996
5.56k
  {
67997
5.56k
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
67998
5.56k
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
67999
5.56k
    if (z.repr) {
68000
0
      return z;
68001
0
    }
68002
5.56k
  }
68003
5.56k
  {
68004
5.56k
    wuffs_base__status z = wuffs_zlib__decoder__initialize(
68005
5.56k
        &self->private_data.f_zlib, sizeof(self->private_data.f_zlib), WUFFS_VERSION, options);
68006
5.56k
    if (z.repr) {
68007
0
      return z;
68008
0
    }
68009
5.56k
  }
68010
5.56k
  self->private_impl.magic = WUFFS_BASE__MAGIC;
68011
5.56k
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
68012
5.56k
      wuffs_base__image_decoder__vtable_name;
68013
5.56k
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
68014
5.56k
      (const void*)(&wuffs_png__decoder__func_ptrs_for__wuffs_base__image_decoder);
68015
5.56k
  return wuffs_base__make_status(NULL);
68016
5.56k
}
68017
68018
wuffs_png__decoder*
68019
0
wuffs_png__decoder__alloc(void) {
68020
0
  wuffs_png__decoder* x =
68021
0
      (wuffs_png__decoder*)(calloc(1, sizeof(wuffs_png__decoder)));
68022
0
  if (!x) {
68023
0
    return NULL;
68024
0
  }
68025
0
  if (wuffs_png__decoder__initialize(
68026
0
      x, sizeof(wuffs_png__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
68027
0
    free(x);
68028
0
    return NULL;
68029
0
  }
68030
0
  return x;
68031
0
}
68032
68033
size_t
68034
0
sizeof__wuffs_png__decoder(void) {
68035
0
  return sizeof(wuffs_png__decoder);
68036
0
}
68037
68038
// ---------------- Function Implementations
68039
68040
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
68041
// -------- func png.decoder.filter_1_distance_4_arm_neon
68042
68043
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68044
WUFFS_BASE__GENERATED_C_CODE
68045
static wuffs_base__empty_struct
68046
wuffs_png__decoder__filter_1_distance_4_arm_neon(
68047
    wuffs_png__decoder* self,
68048
    wuffs_base__slice_u8 a_curr) {
68049
  wuffs_base__slice_u8 v_curr = {0};
68050
  uint8x8_t v_fa = {0};
68051
  uint8x8_t v_fx = {0};
68052
68053
  {
68054
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68055
    v_curr.ptr = i_slice_curr.ptr;
68056
    v_curr.len = 4;
68057
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
68058
    while (v_curr.ptr < i_end0_curr) {
68059
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68060
      v_fx = vadd_u8(v_fx, v_fa);
68061
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68062
      v_fa = v_fx;
68063
      v_curr.ptr += 4;
68064
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68065
      v_fx = vadd_u8(v_fx, v_fa);
68066
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68067
      v_fa = v_fx;
68068
      v_curr.ptr += 4;
68069
    }
68070
    v_curr.len = 4;
68071
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68072
    while (v_curr.ptr < i_end1_curr) {
68073
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68074
      v_fx = vadd_u8(v_fx, v_fa);
68075
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68076
      v_fa = v_fx;
68077
      v_curr.ptr += 4;
68078
    }
68079
    v_curr.len = 0;
68080
  }
68081
  return wuffs_base__make_empty_struct();
68082
}
68083
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68084
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
68085
68086
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
68087
// -------- func png.decoder.filter_3_distance_4_arm_neon
68088
68089
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68090
WUFFS_BASE__GENERATED_C_CODE
68091
static wuffs_base__empty_struct
68092
wuffs_png__decoder__filter_3_distance_4_arm_neon(
68093
    wuffs_png__decoder* self,
68094
    wuffs_base__slice_u8 a_curr,
68095
    wuffs_base__slice_u8 a_prev) {
68096
  wuffs_base__slice_u8 v_curr = {0};
68097
  wuffs_base__slice_u8 v_prev = {0};
68098
  uint8x8_t v_fa = {0};
68099
  uint8x8_t v_fb = {0};
68100
  uint8x8_t v_fx = {0};
68101
68102
  if (((uint64_t)(a_prev.len)) == 0u) {
68103
    {
68104
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68105
      v_curr.ptr = i_slice_curr.ptr;
68106
      v_curr.len = 4;
68107
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
68108
      while (v_curr.ptr < i_end0_curr) {
68109
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68110
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68111
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68112
        v_fa = v_fx;
68113
        v_curr.ptr += 4;
68114
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68115
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68116
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68117
        v_fa = v_fx;
68118
        v_curr.ptr += 4;
68119
      }
68120
      v_curr.len = 4;
68121
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68122
      while (v_curr.ptr < i_end1_curr) {
68123
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68124
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68125
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68126
        v_fa = v_fx;
68127
        v_curr.ptr += 4;
68128
      }
68129
      v_curr.len = 0;
68130
    }
68131
  } else {
68132
    {
68133
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68134
      v_curr.ptr = i_slice_curr.ptr;
68135
      wuffs_base__slice_u8 i_slice_prev = a_prev;
68136
      v_prev.ptr = i_slice_prev.ptr;
68137
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68138
      v_curr.len = 4;
68139
      v_prev.len = 4;
68140
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
68141
      while (v_curr.ptr < i_end0_curr) {
68142
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68143
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68144
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68145
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68146
        v_fa = v_fx;
68147
        v_curr.ptr += 4;
68148
        v_prev.ptr += 4;
68149
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68150
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68151
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68152
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68153
        v_fa = v_fx;
68154
        v_curr.ptr += 4;
68155
        v_prev.ptr += 4;
68156
      }
68157
      v_curr.len = 4;
68158
      v_prev.len = 4;
68159
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68160
      while (v_curr.ptr < i_end1_curr) {
68161
        v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68162
        v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68163
        v_fx = vadd_u8(v_fx, vhadd_u8(v_fa, v_fb));
68164
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68165
        v_fa = v_fx;
68166
        v_curr.ptr += 4;
68167
        v_prev.ptr += 4;
68168
      }
68169
      v_curr.len = 0;
68170
      v_prev.len = 0;
68171
    }
68172
  }
68173
  return wuffs_base__make_empty_struct();
68174
}
68175
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68176
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
68177
68178
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
68179
// -------- func png.decoder.filter_4_distance_3_arm_neon
68180
68181
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68182
WUFFS_BASE__GENERATED_C_CODE
68183
static wuffs_base__empty_struct
68184
wuffs_png__decoder__filter_4_distance_3_arm_neon(
68185
    wuffs_png__decoder* self,
68186
    wuffs_base__slice_u8 a_curr,
68187
    wuffs_base__slice_u8 a_prev) {
68188
  wuffs_base__slice_u8 v_curr = {0};
68189
  wuffs_base__slice_u8 v_prev = {0};
68190
  uint8x8_t v_fa = {0};
68191
  uint8x8_t v_fb = {0};
68192
  uint8x8_t v_fc = {0};
68193
  uint8x8_t v_fx = {0};
68194
  uint16x8_t v_fafb = {0};
68195
  uint16x8_t v_fcfc = {0};
68196
  uint16x8_t v_pa = {0};
68197
  uint16x8_t v_pb = {0};
68198
  uint16x8_t v_pc = {0};
68199
  uint16x8_t v_cmpab = {0};
68200
  uint16x8_t v_cmpac = {0};
68201
  uint8x8_t v_picka = {0};
68202
  uint8x8_t v_pickb = {0};
68203
68204
  {
68205
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68206
    v_curr.ptr = i_slice_curr.ptr;
68207
    wuffs_base__slice_u8 i_slice_prev = a_prev;
68208
    v_prev.ptr = i_slice_prev.ptr;
68209
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68210
    v_curr.len = 4;
68211
    v_prev.len = 4;
68212
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6));
68213
    while (v_curr.ptr < i_end0_curr) {
68214
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68215
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68216
      v_fafb = vaddl_u8(v_fa, v_fb);
68217
      v_fcfc = vaddl_u8(v_fc, v_fc);
68218
      v_pa = vabdl_u8(v_fb, v_fc);
68219
      v_pb = vabdl_u8(v_fa, v_fc);
68220
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68221
      v_cmpab = vcleq_u16(v_pa, v_pb);
68222
      v_cmpac = vcleq_u16(v_pa, v_pc);
68223
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68224
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68225
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68226
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68227
      v_fc = v_fb;
68228
      v_fa = v_fx;
68229
      v_curr.ptr += 3;
68230
      v_prev.ptr += 3;
68231
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68232
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68233
      v_fafb = vaddl_u8(v_fa, v_fb);
68234
      v_fcfc = vaddl_u8(v_fc, v_fc);
68235
      v_pa = vabdl_u8(v_fb, v_fc);
68236
      v_pb = vabdl_u8(v_fa, v_fc);
68237
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68238
      v_cmpab = vcleq_u16(v_pa, v_pb);
68239
      v_cmpac = vcleq_u16(v_pa, v_pc);
68240
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68241
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68242
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68243
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68244
      v_fc = v_fb;
68245
      v_fa = v_fx;
68246
      v_curr.ptr += 3;
68247
      v_prev.ptr += 3;
68248
    }
68249
    v_curr.len = 4;
68250
    v_prev.len = 4;
68251
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3));
68252
    while (v_curr.ptr < i_end1_curr) {
68253
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68254
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68255
      v_fafb = vaddl_u8(v_fa, v_fb);
68256
      v_fcfc = vaddl_u8(v_fc, v_fc);
68257
      v_pa = vabdl_u8(v_fb, v_fc);
68258
      v_pb = vabdl_u8(v_fa, v_fc);
68259
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68260
      v_cmpab = vcleq_u16(v_pa, v_pb);
68261
      v_cmpac = vcleq_u16(v_pa, v_pc);
68262
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68263
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68264
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68265
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68266
      v_fc = v_fb;
68267
      v_fa = v_fx;
68268
      v_curr.ptr += 3;
68269
      v_prev.ptr += 3;
68270
    }
68271
    v_curr.len = 3;
68272
    v_prev.len = 3;
68273
    const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
68274
    while (v_curr.ptr < i_end2_curr) {
68275
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
68276
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
68277
      v_fafb = vaddl_u8(v_fa, v_fb);
68278
      v_fcfc = vaddl_u8(v_fc, v_fc);
68279
      v_pa = vabdl_u8(v_fb, v_fc);
68280
      v_pb = vabdl_u8(v_fa, v_fc);
68281
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68282
      v_cmpab = vcleq_u16(v_pa, v_pb);
68283
      v_cmpac = vcleq_u16(v_pa, v_pc);
68284
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68285
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68286
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68287
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68288
      v_curr.ptr += 3;
68289
      v_prev.ptr += 3;
68290
    }
68291
    v_curr.len = 0;
68292
    v_prev.len = 0;
68293
  }
68294
  return wuffs_base__make_empty_struct();
68295
}
68296
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68297
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
68298
68299
// โ€ผ WUFFS MULTI-FILE SECTION +arm_neon
68300
// -------- func png.decoder.filter_4_distance_4_arm_neon
68301
68302
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68303
WUFFS_BASE__GENERATED_C_CODE
68304
static wuffs_base__empty_struct
68305
wuffs_png__decoder__filter_4_distance_4_arm_neon(
68306
    wuffs_png__decoder* self,
68307
    wuffs_base__slice_u8 a_curr,
68308
    wuffs_base__slice_u8 a_prev) {
68309
  wuffs_base__slice_u8 v_curr = {0};
68310
  wuffs_base__slice_u8 v_prev = {0};
68311
  uint8x8_t v_fa = {0};
68312
  uint8x8_t v_fb = {0};
68313
  uint8x8_t v_fc = {0};
68314
  uint8x8_t v_fx = {0};
68315
  uint16x8_t v_fafb = {0};
68316
  uint16x8_t v_fcfc = {0};
68317
  uint16x8_t v_pa = {0};
68318
  uint16x8_t v_pb = {0};
68319
  uint16x8_t v_pc = {0};
68320
  uint16x8_t v_cmpab = {0};
68321
  uint16x8_t v_cmpac = {0};
68322
  uint8x8_t v_picka = {0};
68323
  uint8x8_t v_pickb = {0};
68324
68325
  {
68326
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68327
    v_curr.ptr = i_slice_curr.ptr;
68328
    wuffs_base__slice_u8 i_slice_prev = a_prev;
68329
    v_prev.ptr = i_slice_prev.ptr;
68330
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68331
    v_curr.len = 4;
68332
    v_prev.len = 4;
68333
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
68334
    while (v_curr.ptr < i_end0_curr) {
68335
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68336
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68337
      v_fafb = vaddl_u8(v_fa, v_fb);
68338
      v_fcfc = vaddl_u8(v_fc, v_fc);
68339
      v_pa = vabdl_u8(v_fb, v_fc);
68340
      v_pb = vabdl_u8(v_fa, v_fc);
68341
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68342
      v_cmpab = vcleq_u16(v_pa, v_pb);
68343
      v_cmpac = vcleq_u16(v_pa, v_pc);
68344
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68345
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68346
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68347
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68348
      v_fc = v_fb;
68349
      v_fa = v_fx;
68350
      v_curr.ptr += 4;
68351
      v_prev.ptr += 4;
68352
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68353
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68354
      v_fafb = vaddl_u8(v_fa, v_fb);
68355
      v_fcfc = vaddl_u8(v_fc, v_fc);
68356
      v_pa = vabdl_u8(v_fb, v_fc);
68357
      v_pb = vabdl_u8(v_fa, v_fc);
68358
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68359
      v_cmpab = vcleq_u16(v_pa, v_pb);
68360
      v_cmpac = vcleq_u16(v_pa, v_pc);
68361
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68362
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68363
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68364
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68365
      v_fc = v_fb;
68366
      v_fa = v_fx;
68367
      v_curr.ptr += 4;
68368
      v_prev.ptr += 4;
68369
    }
68370
    v_curr.len = 4;
68371
    v_prev.len = 4;
68372
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68373
    while (v_curr.ptr < i_end1_curr) {
68374
      v_fb = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
68375
      v_fx = vreinterpret_u8_u32(vdup_n_u32(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
68376
      v_fafb = vaddl_u8(v_fa, v_fb);
68377
      v_fcfc = vaddl_u8(v_fc, v_fc);
68378
      v_pa = vabdl_u8(v_fb, v_fc);
68379
      v_pb = vabdl_u8(v_fa, v_fc);
68380
      v_pc = vabdq_u16(v_fafb, v_fcfc);
68381
      v_cmpab = vcleq_u16(v_pa, v_pb);
68382
      v_cmpac = vcleq_u16(v_pa, v_pc);
68383
      v_picka = vmovn_u16(vandq_u16(v_cmpab, v_cmpac));
68384
      v_pickb = vmovn_u16(vcleq_u16(v_pb, v_pc));
68385
      v_fx = vadd_u8(v_fx, vbsl_u8(v_picka, v_fa, vbsl_u8(v_pickb, v_fb, v_fc)));
68386
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, vget_lane_u32(vreinterpret_u32_u8(v_fx), 0u));
68387
      v_fc = v_fb;
68388
      v_fa = v_fx;
68389
      v_curr.ptr += 4;
68390
      v_prev.ptr += 4;
68391
    }
68392
    v_curr.len = 0;
68393
    v_prev.len = 0;
68394
  }
68395
  return wuffs_base__make_empty_struct();
68396
}
68397
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
68398
// โ€ผ WUFFS MULTI-FILE SECTION -arm_neon
68399
68400
// -------- func png.decoder.filter_1
68401
68402
WUFFS_BASE__GENERATED_C_CODE
68403
static wuffs_base__empty_struct
68404
wuffs_png__decoder__filter_1(
68405
    wuffs_png__decoder* self,
68406
1.18M
    wuffs_base__slice_u8 a_curr) {
68407
1.18M
  return (*self->private_impl.choosy_filter_1)(self, a_curr);
68408
1.18M
}
68409
68410
WUFFS_BASE__GENERATED_C_CODE
68411
static wuffs_base__empty_struct
68412
wuffs_png__decoder__filter_1__choosy_default(
68413
    wuffs_png__decoder* self,
68414
4.92k
    wuffs_base__slice_u8 a_curr) {
68415
4.92k
  uint64_t v_filter_distance = 0;
68416
4.92k
  uint8_t v_fa = 0;
68417
4.92k
  uint64_t v_i_start = 0;
68418
4.92k
  uint64_t v_i = 0;
68419
68420
4.92k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
68421
4.92k
  v_i_start = 0u;
68422
12.2k
  while (v_i_start < v_filter_distance) {
68423
7.33k
    v_fa = 0u;
68424
7.33k
    v_i = v_i_start;
68425
47.0M
    while (v_i < ((uint64_t)(a_curr.len))) {
68426
47.0M
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + v_fa));
68427
47.0M
      v_fa = a_curr.ptr[v_i];
68428
47.0M
      v_i += v_filter_distance;
68429
47.0M
    }
68430
7.33k
    v_i_start += 1u;
68431
7.33k
  }
68432
4.92k
  return wuffs_base__make_empty_struct();
68433
4.92k
}
68434
68435
// -------- func png.decoder.filter_1_distance_3_fallback
68436
68437
WUFFS_BASE__GENERATED_C_CODE
68438
static wuffs_base__empty_struct
68439
wuffs_png__decoder__filter_1_distance_3_fallback(
68440
    wuffs_png__decoder* self,
68441
1.17M
    wuffs_base__slice_u8 a_curr) {
68442
1.17M
  wuffs_base__slice_u8 v_curr = {0};
68443
1.17M
  uint8_t v_fa0 = 0;
68444
1.17M
  uint8_t v_fa1 = 0;
68445
1.17M
  uint8_t v_fa2 = 0;
68446
68447
1.17M
  {
68448
1.17M
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68449
1.17M
    v_curr.ptr = i_slice_curr.ptr;
68450
1.17M
    v_curr.len = 3;
68451
1.17M
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
68452
3.89M
    while (v_curr.ptr < i_end0_curr) {
68453
2.72M
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
68454
2.72M
      v_curr.ptr[0u] = v_fa0;
68455
2.72M
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
68456
2.72M
      v_curr.ptr[1u] = v_fa1;
68457
2.72M
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
68458
2.72M
      v_curr.ptr[2u] = v_fa2;
68459
2.72M
      v_curr.ptr += 3;
68460
2.72M
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
68461
2.72M
      v_curr.ptr[0u] = v_fa0;
68462
2.72M
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
68463
2.72M
      v_curr.ptr[1u] = v_fa1;
68464
2.72M
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
68465
2.72M
      v_curr.ptr[2u] = v_fa2;
68466
2.72M
      v_curr.ptr += 3;
68467
2.72M
    }
68468
1.17M
    v_curr.len = 3;
68469
1.17M
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
68470
2.34M
    while (v_curr.ptr < i_end1_curr) {
68471
1.17M
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
68472
1.17M
      v_curr.ptr[0u] = v_fa0;
68473
1.17M
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
68474
1.17M
      v_curr.ptr[1u] = v_fa1;
68475
1.17M
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
68476
1.17M
      v_curr.ptr[2u] = v_fa2;
68477
1.17M
      v_curr.ptr += 3;
68478
1.17M
    }
68479
1.17M
    v_curr.len = 0;
68480
1.17M
  }
68481
1.17M
  return wuffs_base__make_empty_struct();
68482
1.17M
}
68483
68484
// -------- func png.decoder.filter_1_distance_4_fallback
68485
68486
WUFFS_BASE__GENERATED_C_CODE
68487
static wuffs_base__empty_struct
68488
wuffs_png__decoder__filter_1_distance_4_fallback(
68489
    wuffs_png__decoder* self,
68490
0
    wuffs_base__slice_u8 a_curr) {
68491
0
  wuffs_base__slice_u8 v_curr = {0};
68492
0
  uint8_t v_fa0 = 0;
68493
0
  uint8_t v_fa1 = 0;
68494
0
  uint8_t v_fa2 = 0;
68495
0
  uint8_t v_fa3 = 0;
68496
68497
0
  {
68498
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68499
0
    v_curr.ptr = i_slice_curr.ptr;
68500
0
    v_curr.len = 4;
68501
0
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68502
0
    while (v_curr.ptr < i_end0_curr) {
68503
0
      v_fa0 = ((uint8_t)(v_fa0 + v_curr.ptr[0u]));
68504
0
      v_curr.ptr[0u] = v_fa0;
68505
0
      v_fa1 = ((uint8_t)(v_fa1 + v_curr.ptr[1u]));
68506
0
      v_curr.ptr[1u] = v_fa1;
68507
0
      v_fa2 = ((uint8_t)(v_fa2 + v_curr.ptr[2u]));
68508
0
      v_curr.ptr[2u] = v_fa2;
68509
0
      v_fa3 = ((uint8_t)(v_fa3 + v_curr.ptr[3u]));
68510
0
      v_curr.ptr[3u] = v_fa3;
68511
0
      v_curr.ptr += 4;
68512
0
    }
68513
0
    v_curr.len = 0;
68514
0
  }
68515
0
  return wuffs_base__make_empty_struct();
68516
0
}
68517
68518
// -------- func png.decoder.filter_2
68519
68520
WUFFS_BASE__GENERATED_C_CODE
68521
static wuffs_base__empty_struct
68522
wuffs_png__decoder__filter_2(
68523
    wuffs_png__decoder* self,
68524
    wuffs_base__slice_u8 a_curr,
68525
827k
    wuffs_base__slice_u8 a_prev) {
68526
827k
  uint64_t v_n = 0;
68527
827k
  uint64_t v_i = 0;
68528
68529
827k
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
68530
827k
  v_i = 0u;
68531
20.7M
  while (v_i < v_n) {
68532
19.8M
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
68533
19.8M
    v_i += 1u;
68534
19.8M
  }
68535
827k
  return wuffs_base__make_empty_struct();
68536
827k
}
68537
68538
// -------- func png.decoder.filter_3
68539
68540
WUFFS_BASE__GENERATED_C_CODE
68541
static wuffs_base__empty_struct
68542
wuffs_png__decoder__filter_3(
68543
    wuffs_png__decoder* self,
68544
    wuffs_base__slice_u8 a_curr,
68545
1.09M
    wuffs_base__slice_u8 a_prev) {
68546
1.09M
  return (*self->private_impl.choosy_filter_3)(self, a_curr, a_prev);
68547
1.09M
}
68548
68549
WUFFS_BASE__GENERATED_C_CODE
68550
static wuffs_base__empty_struct
68551
wuffs_png__decoder__filter_3__choosy_default(
68552
    wuffs_png__decoder* self,
68553
    wuffs_base__slice_u8 a_curr,
68554
3.35k
    wuffs_base__slice_u8 a_prev) {
68555
3.35k
  uint64_t v_filter_distance = 0;
68556
3.35k
  uint64_t v_n = 0;
68557
3.35k
  uint64_t v_i = 0;
68558
68559
3.35k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
68560
3.35k
  if (((uint64_t)(a_prev.len)) == 0u) {
68561
315
    v_i = v_filter_distance;
68562
8.57M
    while (v_i < ((uint64_t)(a_curr.len))) {
68563
8.57M
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_curr.ptr[(v_i - v_filter_distance)] / 2u))));
68564
8.57M
      v_i += 1u;
68565
8.57M
    }
68566
3.04k
  } else {
68567
3.04k
    v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
68568
3.04k
    v_i = 0u;
68569
7.51k
    while ((v_i < v_n) && (v_i < v_filter_distance)) {
68570
4.47k
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(a_prev.ptr[v_i] / 2u))));
68571
4.47k
      v_i += 1u;
68572
4.47k
    }
68573
3.04k
    v_i = v_filter_distance;
68574
10.4M
    while (v_i < v_n) {
68575
10.4M
      a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(((((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)])) + ((uint32_t)(a_prev.ptr[v_i]))) / 2u)))));
68576
10.4M
      v_i += 1u;
68577
10.4M
    }
68578
3.04k
  }
68579
3.35k
  return wuffs_base__make_empty_struct();
68580
3.35k
}
68581
68582
// -------- func png.decoder.filter_3_distance_3_fallback
68583
68584
WUFFS_BASE__GENERATED_C_CODE
68585
static wuffs_base__empty_struct
68586
wuffs_png__decoder__filter_3_distance_3_fallback(
68587
    wuffs_png__decoder* self,
68588
    wuffs_base__slice_u8 a_curr,
68589
1.08M
    wuffs_base__slice_u8 a_prev) {
68590
1.08M
  wuffs_base__slice_u8 v_curr = {0};
68591
1.08M
  wuffs_base__slice_u8 v_prev = {0};
68592
1.08M
  uint8_t v_fa0 = 0;
68593
1.08M
  uint8_t v_fa1 = 0;
68594
1.08M
  uint8_t v_fa2 = 0;
68595
68596
1.08M
  if (((uint64_t)(a_prev.len)) == 0u) {
68597
113
    {
68598
113
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68599
113
      v_curr.ptr = i_slice_curr.ptr;
68600
113
      v_curr.len = 3;
68601
113
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
68602
138k
      while (v_curr.ptr < i_end0_curr) {
68603
138k
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
68604
138k
        v_curr.ptr[0u] = v_fa0;
68605
138k
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
68606
138k
        v_curr.ptr[1u] = v_fa1;
68607
138k
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
68608
138k
        v_curr.ptr[2u] = v_fa2;
68609
138k
        v_curr.ptr += 3;
68610
138k
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
68611
138k
        v_curr.ptr[0u] = v_fa0;
68612
138k
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
68613
138k
        v_curr.ptr[1u] = v_fa1;
68614
138k
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
68615
138k
        v_curr.ptr[2u] = v_fa2;
68616
138k
        v_curr.ptr += 3;
68617
138k
      }
68618
113
      v_curr.len = 3;
68619
113
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
68620
178
      while (v_curr.ptr < i_end1_curr) {
68621
65
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
68622
65
        v_curr.ptr[0u] = v_fa0;
68623
65
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
68624
65
        v_curr.ptr[1u] = v_fa1;
68625
65
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
68626
65
        v_curr.ptr[2u] = v_fa2;
68627
65
        v_curr.ptr += 3;
68628
65
      }
68629
113
      v_curr.len = 0;
68630
113
    }
68631
1.08M
  } else {
68632
1.08M
    {
68633
1.08M
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68634
1.08M
      v_curr.ptr = i_slice_curr.ptr;
68635
1.08M
      wuffs_base__slice_u8 i_slice_prev = a_prev;
68636
1.08M
      v_prev.ptr = i_slice_prev.ptr;
68637
1.08M
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68638
1.08M
      v_curr.len = 3;
68639
1.08M
      v_prev.len = 3;
68640
1.08M
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 6) * 6));
68641
2.60M
      while (v_curr.ptr < i_end0_curr) {
68642
1.51M
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
68643
1.51M
        v_curr.ptr[0u] = v_fa0;
68644
1.51M
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
68645
1.51M
        v_curr.ptr[1u] = v_fa1;
68646
1.51M
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
68647
1.51M
        v_curr.ptr[2u] = v_fa2;
68648
1.51M
        v_curr.ptr += 3;
68649
1.51M
        v_prev.ptr += 3;
68650
1.51M
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
68651
1.51M
        v_curr.ptr[0u] = v_fa0;
68652
1.51M
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
68653
1.51M
        v_curr.ptr[1u] = v_fa1;
68654
1.51M
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
68655
1.51M
        v_curr.ptr[2u] = v_fa2;
68656
1.51M
        v_curr.ptr += 3;
68657
1.51M
        v_prev.ptr += 3;
68658
1.51M
      }
68659
1.08M
      v_curr.len = 3;
68660
1.08M
      v_prev.len = 3;
68661
1.08M
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
68662
2.17M
      while (v_curr.ptr < i_end1_curr) {
68663
1.08M
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
68664
1.08M
        v_curr.ptr[0u] = v_fa0;
68665
1.08M
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
68666
1.08M
        v_curr.ptr[1u] = v_fa1;
68667
1.08M
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
68668
1.08M
        v_curr.ptr[2u] = v_fa2;
68669
1.08M
        v_curr.ptr += 3;
68670
1.08M
        v_prev.ptr += 3;
68671
1.08M
      }
68672
1.08M
      v_curr.len = 0;
68673
1.08M
      v_prev.len = 0;
68674
1.08M
    }
68675
1.08M
  }
68676
1.08M
  return wuffs_base__make_empty_struct();
68677
1.08M
}
68678
68679
// -------- func png.decoder.filter_3_distance_4_fallback
68680
68681
WUFFS_BASE__GENERATED_C_CODE
68682
static wuffs_base__empty_struct
68683
wuffs_png__decoder__filter_3_distance_4_fallback(
68684
    wuffs_png__decoder* self,
68685
    wuffs_base__slice_u8 a_curr,
68686
0
    wuffs_base__slice_u8 a_prev) {
68687
0
  wuffs_base__slice_u8 v_curr = {0};
68688
0
  wuffs_base__slice_u8 v_prev = {0};
68689
0
  uint8_t v_fa0 = 0;
68690
0
  uint8_t v_fa1 = 0;
68691
0
  uint8_t v_fa2 = 0;
68692
0
  uint8_t v_fa3 = 0;
68693
68694
0
  if (((uint64_t)(a_prev.len)) == 0u) {
68695
0
    {
68696
0
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68697
0
      v_curr.ptr = i_slice_curr.ptr;
68698
0
      v_curr.len = 4;
68699
0
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68700
0
      while (v_curr.ptr < i_end0_curr) {
68701
0
        v_fa0 = ((uint8_t)(((uint8_t)(v_fa0 / 2u)) + v_curr.ptr[0u]));
68702
0
        v_curr.ptr[0u] = v_fa0;
68703
0
        v_fa1 = ((uint8_t)(((uint8_t)(v_fa1 / 2u)) + v_curr.ptr[1u]));
68704
0
        v_curr.ptr[1u] = v_fa1;
68705
0
        v_fa2 = ((uint8_t)(((uint8_t)(v_fa2 / 2u)) + v_curr.ptr[2u]));
68706
0
        v_curr.ptr[2u] = v_fa2;
68707
0
        v_fa3 = ((uint8_t)(((uint8_t)(v_fa3 / 2u)) + v_curr.ptr[3u]));
68708
0
        v_curr.ptr[3u] = v_fa3;
68709
0
        v_curr.ptr += 4;
68710
0
      }
68711
0
      v_curr.len = 0;
68712
0
    }
68713
0
  } else {
68714
0
    {
68715
0
      wuffs_base__slice_u8 i_slice_curr = a_curr;
68716
0
      v_curr.ptr = i_slice_curr.ptr;
68717
0
      wuffs_base__slice_u8 i_slice_prev = a_prev;
68718
0
      v_prev.ptr = i_slice_prev.ptr;
68719
0
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68720
0
      v_curr.len = 4;
68721
0
      v_prev.len = 4;
68722
0
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68723
0
      while (v_curr.ptr < i_end0_curr) {
68724
0
        v_fa0 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa0)) + ((uint32_t)(v_prev.ptr[0u]))) / 2u))) + v_curr.ptr[0u]));
68725
0
        v_curr.ptr[0u] = v_fa0;
68726
0
        v_fa1 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa1)) + ((uint32_t)(v_prev.ptr[1u]))) / 2u))) + v_curr.ptr[1u]));
68727
0
        v_curr.ptr[1u] = v_fa1;
68728
0
        v_fa2 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa2)) + ((uint32_t)(v_prev.ptr[2u]))) / 2u))) + v_curr.ptr[2u]));
68729
0
        v_curr.ptr[2u] = v_fa2;
68730
0
        v_fa3 = ((uint8_t)(((uint8_t)(((((uint32_t)(v_fa3)) + ((uint32_t)(v_prev.ptr[3u]))) / 2u))) + v_curr.ptr[3u]));
68731
0
        v_curr.ptr[3u] = v_fa3;
68732
0
        v_curr.ptr += 4;
68733
0
        v_prev.ptr += 4;
68734
0
      }
68735
0
      v_curr.len = 0;
68736
0
      v_prev.len = 0;
68737
0
    }
68738
0
  }
68739
0
  return wuffs_base__make_empty_struct();
68740
0
}
68741
68742
// -------- func png.decoder.filter_4
68743
68744
WUFFS_BASE__GENERATED_C_CODE
68745
static wuffs_base__empty_struct
68746
wuffs_png__decoder__filter_4(
68747
    wuffs_png__decoder* self,
68748
    wuffs_base__slice_u8 a_curr,
68749
635k
    wuffs_base__slice_u8 a_prev) {
68750
635k
  return (*self->private_impl.choosy_filter_4)(self, a_curr, a_prev);
68751
635k
}
68752
68753
WUFFS_BASE__GENERATED_C_CODE
68754
static wuffs_base__empty_struct
68755
wuffs_png__decoder__filter_4__choosy_default(
68756
    wuffs_png__decoder* self,
68757
    wuffs_base__slice_u8 a_curr,
68758
5.55k
    wuffs_base__slice_u8 a_prev) {
68759
5.55k
  uint64_t v_filter_distance = 0;
68760
5.55k
  uint64_t v_n = 0;
68761
5.55k
  uint64_t v_i = 0;
68762
5.55k
  uint32_t v_fa = 0;
68763
5.55k
  uint32_t v_fb = 0;
68764
5.55k
  uint32_t v_fc = 0;
68765
5.55k
  uint32_t v_pp = 0;
68766
5.55k
  uint32_t v_pa = 0;
68767
5.55k
  uint32_t v_pb = 0;
68768
5.55k
  uint32_t v_pc = 0;
68769
68770
5.55k
  v_filter_distance = ((uint64_t)(self->private_impl.f_filter_distance));
68771
5.55k
  v_n = wuffs_base__u64__min(((uint64_t)(a_curr.len)), ((uint64_t)(a_prev.len)));
68772
5.55k
  v_i = 0u;
68773
14.6k
  while ((v_i < v_n) && (v_i < v_filter_distance)) {
68774
9.14k
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + a_prev.ptr[v_i]));
68775
9.14k
    v_i += 1u;
68776
9.14k
  }
68777
5.55k
  v_i = v_filter_distance;
68778
62.9M
  while (v_i < v_n) {
68779
62.9M
    v_fa = ((uint32_t)(a_curr.ptr[(v_i - v_filter_distance)]));
68780
62.9M
    v_fb = ((uint32_t)(a_prev.ptr[v_i]));
68781
62.9M
    v_fc = ((uint32_t)(a_prev.ptr[(v_i - v_filter_distance)]));
68782
62.9M
    v_pp = ((uint32_t)(((uint32_t)(v_fa + v_fb)) - v_fc));
68783
62.9M
    v_pa = ((uint32_t)(v_pp - v_fa));
68784
62.9M
    if (v_pa >= 2147483648u) {
68785
1.12M
      v_pa = ((uint32_t)(0u - v_pa));
68786
1.12M
    }
68787
62.9M
    v_pb = ((uint32_t)(v_pp - v_fb));
68788
62.9M
    if (v_pb >= 2147483648u) {
68789
2.35M
      v_pb = ((uint32_t)(0u - v_pb));
68790
2.35M
    }
68791
62.9M
    v_pc = ((uint32_t)(v_pp - v_fc));
68792
62.9M
    if (v_pc >= 2147483648u) {
68793
2.46M
      v_pc = ((uint32_t)(0u - v_pc));
68794
2.46M
    }
68795
62.9M
    if ((v_pa <= v_pb) && (v_pa <= v_pc)) {
68796
60.6M
    } else if (v_pb <= v_pc) {
68797
2.29M
      v_fa = v_fb;
68798
2.29M
    } else {
68799
25.3k
      v_fa = v_fc;
68800
25.3k
    }
68801
62.9M
    a_curr.ptr[v_i] = ((uint8_t)(a_curr.ptr[v_i] + ((uint8_t)(v_fa))));
68802
62.9M
    v_i += 1u;
68803
62.9M
  }
68804
5.55k
  return wuffs_base__make_empty_struct();
68805
5.55k
}
68806
68807
// -------- func png.decoder.filter_4_distance_3_fallback
68808
68809
WUFFS_BASE__GENERATED_C_CODE
68810
static wuffs_base__empty_struct
68811
wuffs_png__decoder__filter_4_distance_3_fallback(
68812
    wuffs_png__decoder* self,
68813
    wuffs_base__slice_u8 a_curr,
68814
0
    wuffs_base__slice_u8 a_prev) {
68815
0
  wuffs_base__slice_u8 v_curr = {0};
68816
0
  wuffs_base__slice_u8 v_prev = {0};
68817
0
  uint32_t v_fa0 = 0;
68818
0
  uint32_t v_fa1 = 0;
68819
0
  uint32_t v_fa2 = 0;
68820
0
  uint32_t v_fb0 = 0;
68821
0
  uint32_t v_fb1 = 0;
68822
0
  uint32_t v_fb2 = 0;
68823
0
  uint32_t v_fc0 = 0;
68824
0
  uint32_t v_fc1 = 0;
68825
0
  uint32_t v_fc2 = 0;
68826
0
  uint32_t v_pp0 = 0;
68827
0
  uint32_t v_pp1 = 0;
68828
0
  uint32_t v_pp2 = 0;
68829
0
  uint32_t v_pa0 = 0;
68830
0
  uint32_t v_pa1 = 0;
68831
0
  uint32_t v_pa2 = 0;
68832
0
  uint32_t v_pb0 = 0;
68833
0
  uint32_t v_pb1 = 0;
68834
0
  uint32_t v_pb2 = 0;
68835
0
  uint32_t v_pc0 = 0;
68836
0
  uint32_t v_pc1 = 0;
68837
0
  uint32_t v_pc2 = 0;
68838
68839
0
  {
68840
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68841
0
    v_curr.ptr = i_slice_curr.ptr;
68842
0
    wuffs_base__slice_u8 i_slice_prev = a_prev;
68843
0
    v_prev.ptr = i_slice_prev.ptr;
68844
0
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68845
0
    v_curr.len = 3;
68846
0
    v_prev.len = 3;
68847
0
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
68848
0
    while (v_curr.ptr < i_end0_curr) {
68849
0
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
68850
0
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
68851
0
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
68852
0
      if (v_pa0 >= 2147483648u) {
68853
0
        v_pa0 = ((uint32_t)(0u - v_pa0));
68854
0
      }
68855
0
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
68856
0
      if (v_pb0 >= 2147483648u) {
68857
0
        v_pb0 = ((uint32_t)(0u - v_pb0));
68858
0
      }
68859
0
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
68860
0
      if (v_pc0 >= 2147483648u) {
68861
0
        v_pc0 = ((uint32_t)(0u - v_pc0));
68862
0
      }
68863
0
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
68864
0
      } else if (v_pb0 <= v_pc0) {
68865
0
        v_fa0 = v_fb0;
68866
0
      } else {
68867
0
        v_fa0 = v_fc0;
68868
0
      }
68869
0
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
68870
0
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
68871
0
      v_fc0 = v_fb0;
68872
0
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
68873
0
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
68874
0
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
68875
0
      if (v_pa1 >= 2147483648u) {
68876
0
        v_pa1 = ((uint32_t)(0u - v_pa1));
68877
0
      }
68878
0
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
68879
0
      if (v_pb1 >= 2147483648u) {
68880
0
        v_pb1 = ((uint32_t)(0u - v_pb1));
68881
0
      }
68882
0
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
68883
0
      if (v_pc1 >= 2147483648u) {
68884
0
        v_pc1 = ((uint32_t)(0u - v_pc1));
68885
0
      }
68886
0
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
68887
0
      } else if (v_pb1 <= v_pc1) {
68888
0
        v_fa1 = v_fb1;
68889
0
      } else {
68890
0
        v_fa1 = v_fc1;
68891
0
      }
68892
0
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
68893
0
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
68894
0
      v_fc1 = v_fb1;
68895
0
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
68896
0
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
68897
0
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
68898
0
      if (v_pa2 >= 2147483648u) {
68899
0
        v_pa2 = ((uint32_t)(0u - v_pa2));
68900
0
      }
68901
0
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
68902
0
      if (v_pb2 >= 2147483648u) {
68903
0
        v_pb2 = ((uint32_t)(0u - v_pb2));
68904
0
      }
68905
0
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
68906
0
      if (v_pc2 >= 2147483648u) {
68907
0
        v_pc2 = ((uint32_t)(0u - v_pc2));
68908
0
      }
68909
0
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
68910
0
      } else if (v_pb2 <= v_pc2) {
68911
0
        v_fa2 = v_fb2;
68912
0
      } else {
68913
0
        v_fa2 = v_fc2;
68914
0
      }
68915
0
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
68916
0
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
68917
0
      v_fc2 = v_fb2;
68918
0
      v_curr.ptr += 3;
68919
0
      v_prev.ptr += 3;
68920
0
    }
68921
0
    v_curr.len = 0;
68922
0
    v_prev.len = 0;
68923
0
  }
68924
0
  return wuffs_base__make_empty_struct();
68925
0
}
68926
68927
// -------- func png.decoder.filter_4_distance_4_fallback
68928
68929
WUFFS_BASE__GENERATED_C_CODE
68930
static wuffs_base__empty_struct
68931
wuffs_png__decoder__filter_4_distance_4_fallback(
68932
    wuffs_png__decoder* self,
68933
    wuffs_base__slice_u8 a_curr,
68934
0
    wuffs_base__slice_u8 a_prev) {
68935
0
  wuffs_base__slice_u8 v_curr = {0};
68936
0
  wuffs_base__slice_u8 v_prev = {0};
68937
0
  uint32_t v_fa0 = 0;
68938
0
  uint32_t v_fa1 = 0;
68939
0
  uint32_t v_fa2 = 0;
68940
0
  uint32_t v_fa3 = 0;
68941
0
  uint32_t v_fb0 = 0;
68942
0
  uint32_t v_fb1 = 0;
68943
0
  uint32_t v_fb2 = 0;
68944
0
  uint32_t v_fb3 = 0;
68945
0
  uint32_t v_fc0 = 0;
68946
0
  uint32_t v_fc1 = 0;
68947
0
  uint32_t v_fc2 = 0;
68948
0
  uint32_t v_fc3 = 0;
68949
0
  uint32_t v_pp0 = 0;
68950
0
  uint32_t v_pp1 = 0;
68951
0
  uint32_t v_pp2 = 0;
68952
0
  uint32_t v_pp3 = 0;
68953
0
  uint32_t v_pa0 = 0;
68954
0
  uint32_t v_pa1 = 0;
68955
0
  uint32_t v_pa2 = 0;
68956
0
  uint32_t v_pa3 = 0;
68957
0
  uint32_t v_pb0 = 0;
68958
0
  uint32_t v_pb1 = 0;
68959
0
  uint32_t v_pb2 = 0;
68960
0
  uint32_t v_pb3 = 0;
68961
0
  uint32_t v_pc0 = 0;
68962
0
  uint32_t v_pc1 = 0;
68963
0
  uint32_t v_pc2 = 0;
68964
0
  uint32_t v_pc3 = 0;
68965
68966
0
  {
68967
0
    wuffs_base__slice_u8 i_slice_curr = a_curr;
68968
0
    v_curr.ptr = i_slice_curr.ptr;
68969
0
    wuffs_base__slice_u8 i_slice_prev = a_prev;
68970
0
    v_prev.ptr = i_slice_prev.ptr;
68971
0
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
68972
0
    v_curr.len = 4;
68973
0
    v_prev.len = 4;
68974
0
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
68975
0
    while (v_curr.ptr < i_end0_curr) {
68976
0
      v_fb0 = ((uint32_t)(v_prev.ptr[0u]));
68977
0
      v_pp0 = ((uint32_t)(((uint32_t)(v_fa0 + v_fb0)) - v_fc0));
68978
0
      v_pa0 = ((uint32_t)(v_pp0 - v_fa0));
68979
0
      if (v_pa0 >= 2147483648u) {
68980
0
        v_pa0 = ((uint32_t)(0u - v_pa0));
68981
0
      }
68982
0
      v_pb0 = ((uint32_t)(v_pp0 - v_fb0));
68983
0
      if (v_pb0 >= 2147483648u) {
68984
0
        v_pb0 = ((uint32_t)(0u - v_pb0));
68985
0
      }
68986
0
      v_pc0 = ((uint32_t)(v_pp0 - v_fc0));
68987
0
      if (v_pc0 >= 2147483648u) {
68988
0
        v_pc0 = ((uint32_t)(0u - v_pc0));
68989
0
      }
68990
0
      if ((v_pa0 <= v_pb0) && (v_pa0 <= v_pc0)) {
68991
0
      } else if (v_pb0 <= v_pc0) {
68992
0
        v_fa0 = v_fb0;
68993
0
      } else {
68994
0
        v_fa0 = v_fc0;
68995
0
      }
68996
0
      v_curr.ptr[0u] = ((uint8_t)(v_curr.ptr[0u] + ((uint8_t)(v_fa0))));
68997
0
      v_fa0 = ((uint32_t)(v_curr.ptr[0u]));
68998
0
      v_fc0 = v_fb0;
68999
0
      v_fb1 = ((uint32_t)(v_prev.ptr[1u]));
69000
0
      v_pp1 = ((uint32_t)(((uint32_t)(v_fa1 + v_fb1)) - v_fc1));
69001
0
      v_pa1 = ((uint32_t)(v_pp1 - v_fa1));
69002
0
      if (v_pa1 >= 2147483648u) {
69003
0
        v_pa1 = ((uint32_t)(0u - v_pa1));
69004
0
      }
69005
0
      v_pb1 = ((uint32_t)(v_pp1 - v_fb1));
69006
0
      if (v_pb1 >= 2147483648u) {
69007
0
        v_pb1 = ((uint32_t)(0u - v_pb1));
69008
0
      }
69009
0
      v_pc1 = ((uint32_t)(v_pp1 - v_fc1));
69010
0
      if (v_pc1 >= 2147483648u) {
69011
0
        v_pc1 = ((uint32_t)(0u - v_pc1));
69012
0
      }
69013
0
      if ((v_pa1 <= v_pb1) && (v_pa1 <= v_pc1)) {
69014
0
      } else if (v_pb1 <= v_pc1) {
69015
0
        v_fa1 = v_fb1;
69016
0
      } else {
69017
0
        v_fa1 = v_fc1;
69018
0
      }
69019
0
      v_curr.ptr[1u] = ((uint8_t)(v_curr.ptr[1u] + ((uint8_t)(v_fa1))));
69020
0
      v_fa1 = ((uint32_t)(v_curr.ptr[1u]));
69021
0
      v_fc1 = v_fb1;
69022
0
      v_fb2 = ((uint32_t)(v_prev.ptr[2u]));
69023
0
      v_pp2 = ((uint32_t)(((uint32_t)(v_fa2 + v_fb2)) - v_fc2));
69024
0
      v_pa2 = ((uint32_t)(v_pp2 - v_fa2));
69025
0
      if (v_pa2 >= 2147483648u) {
69026
0
        v_pa2 = ((uint32_t)(0u - v_pa2));
69027
0
      }
69028
0
      v_pb2 = ((uint32_t)(v_pp2 - v_fb2));
69029
0
      if (v_pb2 >= 2147483648u) {
69030
0
        v_pb2 = ((uint32_t)(0u - v_pb2));
69031
0
      }
69032
0
      v_pc2 = ((uint32_t)(v_pp2 - v_fc2));
69033
0
      if (v_pc2 >= 2147483648u) {
69034
0
        v_pc2 = ((uint32_t)(0u - v_pc2));
69035
0
      }
69036
0
      if ((v_pa2 <= v_pb2) && (v_pa2 <= v_pc2)) {
69037
0
      } else if (v_pb2 <= v_pc2) {
69038
0
        v_fa2 = v_fb2;
69039
0
      } else {
69040
0
        v_fa2 = v_fc2;
69041
0
      }
69042
0
      v_curr.ptr[2u] = ((uint8_t)(v_curr.ptr[2u] + ((uint8_t)(v_fa2))));
69043
0
      v_fa2 = ((uint32_t)(v_curr.ptr[2u]));
69044
0
      v_fc2 = v_fb2;
69045
0
      v_fb3 = ((uint32_t)(v_prev.ptr[3u]));
69046
0
      v_pp3 = ((uint32_t)(((uint32_t)(v_fa3 + v_fb3)) - v_fc3));
69047
0
      v_pa3 = ((uint32_t)(v_pp3 - v_fa3));
69048
0
      if (v_pa3 >= 2147483648u) {
69049
0
        v_pa3 = ((uint32_t)(0u - v_pa3));
69050
0
      }
69051
0
      v_pb3 = ((uint32_t)(v_pp3 - v_fb3));
69052
0
      if (v_pb3 >= 2147483648u) {
69053
0
        v_pb3 = ((uint32_t)(0u - v_pb3));
69054
0
      }
69055
0
      v_pc3 = ((uint32_t)(v_pp3 - v_fc3));
69056
0
      if (v_pc3 >= 2147483648u) {
69057
0
        v_pc3 = ((uint32_t)(0u - v_pc3));
69058
0
      }
69059
0
      if ((v_pa3 <= v_pb3) && (v_pa3 <= v_pc3)) {
69060
0
      } else if (v_pb3 <= v_pc3) {
69061
0
        v_fa3 = v_fb3;
69062
0
      } else {
69063
0
        v_fa3 = v_fc3;
69064
0
      }
69065
0
      v_curr.ptr[3u] = ((uint8_t)(v_curr.ptr[3u] + ((uint8_t)(v_fa3))));
69066
0
      v_fa3 = ((uint32_t)(v_curr.ptr[3u]));
69067
0
      v_fc3 = v_fb3;
69068
0
      v_curr.ptr += 4;
69069
0
      v_prev.ptr += 4;
69070
0
    }
69071
0
    v_curr.len = 0;
69072
0
    v_prev.len = 0;
69073
0
  }
69074
0
  return wuffs_base__make_empty_struct();
69075
0
}
69076
69077
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
69078
// -------- func png.decoder.filter_1_distance_4_x86_sse42
69079
69080
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69081
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
69082
WUFFS_BASE__GENERATED_C_CODE
69083
static wuffs_base__empty_struct
69084
wuffs_png__decoder__filter_1_distance_4_x86_sse42(
69085
    wuffs_png__decoder* self,
69086
7.72k
    wuffs_base__slice_u8 a_curr) {
69087
7.72k
  wuffs_base__slice_u8 v_curr = {0};
69088
7.72k
  __m128i v_x128 = {0};
69089
7.72k
  __m128i v_a128 = {0};
69090
69091
7.72k
  {
69092
7.72k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69093
7.72k
    v_curr.ptr = i_slice_curr.ptr;
69094
7.72k
    v_curr.len = 4;
69095
7.72k
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
69096
19.7M
    while (v_curr.ptr < i_end0_curr) {
69097
19.7M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69098
19.7M
      v_x128 = _mm_add_epi8(v_x128, v_a128);
69099
19.7M
      v_a128 = v_x128;
69100
19.7M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69101
19.7M
      v_curr.ptr += 4;
69102
19.7M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69103
19.7M
      v_x128 = _mm_add_epi8(v_x128, v_a128);
69104
19.7M
      v_a128 = v_x128;
69105
19.7M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69106
19.7M
      v_curr.ptr += 4;
69107
19.7M
    }
69108
7.72k
    v_curr.len = 4;
69109
7.72k
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
69110
10.6k
    while (v_curr.ptr < i_end1_curr) {
69111
2.94k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69112
2.94k
      v_x128 = _mm_add_epi8(v_x128, v_a128);
69113
2.94k
      v_a128 = v_x128;
69114
2.94k
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69115
2.94k
      v_curr.ptr += 4;
69116
2.94k
    }
69117
7.72k
    v_curr.len = 0;
69118
7.72k
  }
69119
7.72k
  return wuffs_base__make_empty_struct();
69120
7.72k
}
69121
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69122
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
69123
69124
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
69125
// -------- func png.decoder.filter_3_distance_4_x86_sse42
69126
69127
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69128
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
69129
WUFFS_BASE__GENERATED_C_CODE
69130
static wuffs_base__empty_struct
69131
wuffs_png__decoder__filter_3_distance_4_x86_sse42(
69132
    wuffs_png__decoder* self,
69133
    wuffs_base__slice_u8 a_curr,
69134
7.91k
    wuffs_base__slice_u8 a_prev) {
69135
7.91k
  wuffs_base__slice_u8 v_curr = {0};
69136
7.91k
  wuffs_base__slice_u8 v_prev = {0};
69137
7.91k
  __m128i v_x128 = {0};
69138
7.91k
  __m128i v_a128 = {0};
69139
7.91k
  __m128i v_b128 = {0};
69140
7.91k
  __m128i v_p128 = {0};
69141
7.91k
  __m128i v_k128 = {0};
69142
69143
7.91k
  if (((uint64_t)(a_prev.len)) == 0u) {
69144
184
    v_k128 = _mm_set1_epi8((int8_t)(254u));
69145
184
    {
69146
184
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69147
184
      v_curr.ptr = i_slice_curr.ptr;
69148
184
      v_curr.len = 4;
69149
184
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
69150
1.19M
      while (v_curr.ptr < i_end0_curr) {
69151
1.18M
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
69152
1.18M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69153
1.18M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69154
1.18M
        v_a128 = v_x128;
69155
1.18M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69156
1.18M
        v_curr.ptr += 4;
69157
1.18M
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
69158
1.18M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69159
1.18M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69160
1.18M
        v_a128 = v_x128;
69161
1.18M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69162
1.18M
        v_curr.ptr += 4;
69163
1.18M
      }
69164
184
      v_curr.len = 4;
69165
184
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
69166
276
      while (v_curr.ptr < i_end1_curr) {
69167
92
        v_p128 = _mm_avg_epu8(_mm_and_si128(v_a128, v_k128), v_b128);
69168
92
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69169
92
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69170
92
        v_a128 = v_x128;
69171
92
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69172
92
        v_curr.ptr += 4;
69173
92
      }
69174
184
      v_curr.len = 0;
69175
184
    }
69176
7.73k
  } else {
69177
7.73k
    v_k128 = _mm_set1_epi8((int8_t)(1u));
69178
7.73k
    {
69179
7.73k
      wuffs_base__slice_u8 i_slice_curr = a_curr;
69180
7.73k
      v_curr.ptr = i_slice_curr.ptr;
69181
7.73k
      wuffs_base__slice_u8 i_slice_prev = a_prev;
69182
7.73k
      v_prev.ptr = i_slice_prev.ptr;
69183
7.73k
      i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69184
7.73k
      v_curr.len = 4;
69185
7.73k
      v_prev.len = 4;
69186
7.73k
      const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
69187
1.29M
      while (v_curr.ptr < i_end0_curr) {
69188
1.28M
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69189
1.28M
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
69190
1.28M
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
69191
1.28M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69192
1.28M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69193
1.28M
        v_a128 = v_x128;
69194
1.28M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69195
1.28M
        v_curr.ptr += 4;
69196
1.28M
        v_prev.ptr += 4;
69197
1.28M
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69198
1.28M
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
69199
1.28M
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
69200
1.28M
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69201
1.28M
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69202
1.28M
        v_a128 = v_x128;
69203
1.28M
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69204
1.28M
        v_curr.ptr += 4;
69205
1.28M
        v_prev.ptr += 4;
69206
1.28M
      }
69207
7.73k
      v_curr.len = 4;
69208
7.73k
      v_prev.len = 4;
69209
7.73k
      const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
69210
10.4k
      while (v_curr.ptr < i_end1_curr) {
69211
2.75k
        v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69212
2.75k
        v_p128 = _mm_avg_epu8(v_a128, v_b128);
69213
2.75k
        v_p128 = _mm_sub_epi8(v_p128, _mm_and_si128(v_k128, _mm_xor_si128(v_a128, v_b128)));
69214
2.75k
        v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69215
2.75k
        v_x128 = _mm_add_epi8(v_x128, v_p128);
69216
2.75k
        v_a128 = v_x128;
69217
2.75k
        wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69218
2.75k
        v_curr.ptr += 4;
69219
2.75k
        v_prev.ptr += 4;
69220
2.75k
      }
69221
7.73k
      v_curr.len = 0;
69222
7.73k
      v_prev.len = 0;
69223
7.73k
    }
69224
7.73k
  }
69225
7.91k
  return wuffs_base__make_empty_struct();
69226
7.91k
}
69227
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69228
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
69229
69230
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
69231
// -------- func png.decoder.filter_4_distance_3_x86_sse42
69232
69233
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69234
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
69235
WUFFS_BASE__GENERATED_C_CODE
69236
static wuffs_base__empty_struct
69237
wuffs_png__decoder__filter_4_distance_3_x86_sse42(
69238
    wuffs_png__decoder* self,
69239
    wuffs_base__slice_u8 a_curr,
69240
624k
    wuffs_base__slice_u8 a_prev) {
69241
624k
  wuffs_base__slice_u8 v_curr = {0};
69242
624k
  wuffs_base__slice_u8 v_prev = {0};
69243
624k
  __m128i v_x128 = {0};
69244
624k
  __m128i v_a128 = {0};
69245
624k
  __m128i v_b128 = {0};
69246
624k
  __m128i v_c128 = {0};
69247
624k
  __m128i v_p128 = {0};
69248
624k
  __m128i v_pa128 = {0};
69249
624k
  __m128i v_pb128 = {0};
69250
624k
  __m128i v_pc128 = {0};
69251
624k
  __m128i v_smallest128 = {0};
69252
624k
  __m128i v_z128 = {0};
69253
69254
624k
  {
69255
624k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69256
624k
    v_curr.ptr = i_slice_curr.ptr;
69257
624k
    wuffs_base__slice_u8 i_slice_prev = a_prev;
69258
624k
    v_prev.ptr = i_slice_prev.ptr;
69259
624k
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69260
624k
    v_curr.len = 4;
69261
624k
    v_prev.len = 4;
69262
624k
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 7, 6));
69263
1.59M
    while (v_curr.ptr < i_end0_curr) {
69264
968k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69265
968k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69266
968k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69267
968k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69268
968k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69269
968k
      v_pa128 = _mm_abs_epi16(v_pa128);
69270
968k
      v_pb128 = _mm_abs_epi16(v_pb128);
69271
968k
      v_pc128 = _mm_abs_epi16(v_pc128);
69272
968k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69273
968k
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69274
968k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69275
968k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69276
968k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69277
968k
      v_a128 = v_x128;
69278
968k
      v_c128 = v_b128;
69279
968k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69280
968k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69281
968k
      v_curr.ptr += 3;
69282
968k
      v_prev.ptr += 3;
69283
968k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69284
968k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69285
968k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69286
968k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69287
968k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69288
968k
      v_pa128 = _mm_abs_epi16(v_pa128);
69289
968k
      v_pb128 = _mm_abs_epi16(v_pb128);
69290
968k
      v_pc128 = _mm_abs_epi16(v_pc128);
69291
968k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69292
968k
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69293
968k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69294
968k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69295
968k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69296
968k
      v_a128 = v_x128;
69297
968k
      v_c128 = v_b128;
69298
968k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69299
968k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69300
968k
      v_curr.ptr += 3;
69301
968k
      v_prev.ptr += 3;
69302
968k
    }
69303
624k
    v_curr.len = 4;
69304
624k
    v_prev.len = 4;
69305
624k
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, wuffs_private_impl__iterate_total_advance((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)), 4, 3));
69306
625k
    while (v_curr.ptr < i_end1_curr) {
69307
924
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69308
924
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69309
924
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69310
924
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69311
924
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69312
924
      v_pa128 = _mm_abs_epi16(v_pa128);
69313
924
      v_pb128 = _mm_abs_epi16(v_pb128);
69314
924
      v_pc128 = _mm_abs_epi16(v_pc128);
69315
924
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69316
924
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69317
924
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69318
924
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69319
924
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69320
924
      v_a128 = v_x128;
69321
924
      v_c128 = v_b128;
69322
924
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69323
924
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69324
924
      v_curr.ptr += 3;
69325
924
      v_prev.ptr += 3;
69326
924
    }
69327
624k
    v_curr.len = 3;
69328
624k
    v_prev.len = 3;
69329
624k
    const uint8_t* i_end2_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 3) * 3));
69330
1.24M
    while (v_curr.ptr < i_end2_curr) {
69331
624k
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_prev.ptr)));
69332
624k
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69333
624k
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69334
624k
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69335
624k
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69336
624k
      v_pa128 = _mm_abs_epi16(v_pa128);
69337
624k
      v_pb128 = _mm_abs_epi16(v_pb128);
69338
624k
      v_pc128 = _mm_abs_epi16(v_pc128);
69339
624k
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69340
624k
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69341
624k
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u24le__no_bounds_check(v_curr.ptr)));
69342
624k
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69343
624k
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69344
624k
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69345
624k
      wuffs_base__poke_u24le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69346
624k
      v_curr.ptr += 3;
69347
624k
      v_prev.ptr += 3;
69348
624k
    }
69349
624k
    v_curr.len = 0;
69350
624k
    v_prev.len = 0;
69351
624k
  }
69352
624k
  return wuffs_base__make_empty_struct();
69353
624k
}
69354
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69355
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
69356
69357
// โ€ผ WUFFS MULTI-FILE SECTION +x86_sse42
69358
// -------- func png.decoder.filter_4_distance_4_x86_sse42
69359
69360
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69361
WUFFS_BASE__MAYBE_ATTRIBUTE_TARGET("pclmul,popcnt,sse4.2")
69362
WUFFS_BASE__GENERATED_C_CODE
69363
static wuffs_base__empty_struct
69364
wuffs_png__decoder__filter_4_distance_4_x86_sse42(
69365
    wuffs_png__decoder* self,
69366
    wuffs_base__slice_u8 a_curr,
69367
5.22k
    wuffs_base__slice_u8 a_prev) {
69368
5.22k
  wuffs_base__slice_u8 v_curr = {0};
69369
5.22k
  wuffs_base__slice_u8 v_prev = {0};
69370
5.22k
  __m128i v_x128 = {0};
69371
5.22k
  __m128i v_a128 = {0};
69372
5.22k
  __m128i v_b128 = {0};
69373
5.22k
  __m128i v_c128 = {0};
69374
5.22k
  __m128i v_p128 = {0};
69375
5.22k
  __m128i v_pa128 = {0};
69376
5.22k
  __m128i v_pb128 = {0};
69377
5.22k
  __m128i v_pc128 = {0};
69378
5.22k
  __m128i v_smallest128 = {0};
69379
5.22k
  __m128i v_z128 = {0};
69380
69381
5.22k
  {
69382
5.22k
    wuffs_base__slice_u8 i_slice_curr = a_curr;
69383
5.22k
    v_curr.ptr = i_slice_curr.ptr;
69384
5.22k
    wuffs_base__slice_u8 i_slice_prev = a_prev;
69385
5.22k
    v_prev.ptr = i_slice_prev.ptr;
69386
5.22k
    i_slice_curr.len = ((size_t)(wuffs_base__u64__min(i_slice_curr.len, i_slice_prev.len)));
69387
5.22k
    v_curr.len = 4;
69388
5.22k
    v_prev.len = 4;
69389
5.22k
    const uint8_t* i_end0_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 8) * 8));
69390
1.21M
    while (v_curr.ptr < i_end0_curr) {
69391
1.20M
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69392
1.20M
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69393
1.20M
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69394
1.20M
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69395
1.20M
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69396
1.20M
      v_pa128 = _mm_abs_epi16(v_pa128);
69397
1.20M
      v_pb128 = _mm_abs_epi16(v_pb128);
69398
1.20M
      v_pc128 = _mm_abs_epi16(v_pc128);
69399
1.20M
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69400
1.20M
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69401
1.20M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69402
1.20M
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69403
1.20M
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69404
1.20M
      v_a128 = v_x128;
69405
1.20M
      v_c128 = v_b128;
69406
1.20M
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69407
1.20M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69408
1.20M
      v_curr.ptr += 4;
69409
1.20M
      v_prev.ptr += 4;
69410
1.20M
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69411
1.20M
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69412
1.20M
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69413
1.20M
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69414
1.20M
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69415
1.20M
      v_pa128 = _mm_abs_epi16(v_pa128);
69416
1.20M
      v_pb128 = _mm_abs_epi16(v_pb128);
69417
1.20M
      v_pc128 = _mm_abs_epi16(v_pc128);
69418
1.20M
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69419
1.20M
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69420
1.20M
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69421
1.20M
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69422
1.20M
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69423
1.20M
      v_a128 = v_x128;
69424
1.20M
      v_c128 = v_b128;
69425
1.20M
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69426
1.20M
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69427
1.20M
      v_curr.ptr += 4;
69428
1.20M
      v_prev.ptr += 4;
69429
1.20M
    }
69430
5.22k
    v_curr.len = 4;
69431
5.22k
    v_prev.len = 4;
69432
5.22k
    const uint8_t* i_end1_curr = wuffs_private_impl__ptr_u8_plus_len(v_curr.ptr, (((i_slice_curr.len - (size_t)(v_curr.ptr - i_slice_curr.ptr)) / 4) * 4));
69433
6.10k
    while (v_curr.ptr < i_end1_curr) {
69434
873
      v_b128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_prev.ptr)));
69435
873
      v_b128 = _mm_unpacklo_epi8(v_b128, v_z128);
69436
873
      v_pa128 = _mm_sub_epi16(v_b128, v_c128);
69437
873
      v_pb128 = _mm_sub_epi16(v_a128, v_c128);
69438
873
      v_pc128 = _mm_add_epi16(v_pa128, v_pb128);
69439
873
      v_pa128 = _mm_abs_epi16(v_pa128);
69440
873
      v_pb128 = _mm_abs_epi16(v_pb128);
69441
873
      v_pc128 = _mm_abs_epi16(v_pc128);
69442
873
      v_smallest128 = _mm_min_epi16(v_pc128, _mm_min_epi16(v_pb128, v_pa128));
69443
873
      v_p128 = _mm_blendv_epi8(_mm_blendv_epi8(v_c128, v_b128, _mm_cmpeq_epi16(v_smallest128, v_pb128)), v_a128, _mm_cmpeq_epi16(v_smallest128, v_pa128));
69444
873
      v_x128 = _mm_cvtsi32_si128((int32_t)(wuffs_base__peek_u32le__no_bounds_check(v_curr.ptr)));
69445
873
      v_x128 = _mm_unpacklo_epi8(v_x128, v_z128);
69446
873
      v_x128 = _mm_add_epi8(v_x128, v_p128);
69447
873
      v_a128 = v_x128;
69448
873
      v_c128 = v_b128;
69449
873
      v_x128 = _mm_packus_epi16(v_x128, v_x128);
69450
873
      wuffs_base__poke_u32le__no_bounds_check(v_curr.ptr, ((uint32_t)(_mm_cvtsi128_si32(v_x128))));
69451
873
      v_curr.ptr += 4;
69452
873
      v_prev.ptr += 4;
69453
873
    }
69454
5.22k
    v_curr.len = 0;
69455
5.22k
    v_prev.len = 0;
69456
5.22k
  }
69457
5.22k
  return wuffs_base__make_empty_struct();
69458
5.22k
}
69459
#endif  // defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
69460
// โ€ผ WUFFS MULTI-FILE SECTION -x86_sse42
69461
69462
// -------- func png.decoder.get_quirk
69463
69464
WUFFS_BASE__GENERATED_C_CODE
69465
WUFFS_BASE__MAYBE_STATIC uint64_t
69466
wuffs_png__decoder__get_quirk(
69467
    const wuffs_png__decoder* self,
69468
0
    uint32_t a_key) {
69469
0
  if (!self) {
69470
0
    return 0;
69471
0
  }
69472
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
69473
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
69474
0
    return 0;
69475
0
  }
69476
69477
0
  if ((a_key == 1u) && self->private_impl.f_ignore_checksum) {
69478
0
    return 1u;
69479
0
  }
69480
0
  return 0u;
69481
0
}
69482
69483
// -------- func png.decoder.set_quirk
69484
69485
WUFFS_BASE__GENERATED_C_CODE
69486
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
69487
wuffs_png__decoder__set_quirk(
69488
    wuffs_png__decoder* self,
69489
    uint32_t a_key,
69490
0
    uint64_t a_value) {
69491
0
  if (!self) {
69492
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
69493
0
  }
69494
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
69495
0
    return wuffs_base__make_status(
69496
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
69497
0
        ? wuffs_base__error__disabled_by_previous_error
69498
0
        : wuffs_base__error__initialize_not_called);
69499
0
  }
69500
69501
0
  if (a_key == 1u) {
69502
0
    self->private_impl.f_ignore_checksum = (a_value > 0u);
69503
0
    wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, a_key, a_value);
69504
0
    return wuffs_base__make_status(NULL);
69505
0
  }
69506
0
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
69507
0
}
69508
69509
// -------- func png.decoder.decode_image_config
69510
69511
WUFFS_BASE__GENERATED_C_CODE
69512
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
69513
wuffs_png__decoder__decode_image_config(
69514
    wuffs_png__decoder* self,
69515
    wuffs_base__image_config* a_dst,
69516
5.56k
    wuffs_base__io_buffer* a_src) {
69517
5.56k
  if (!self) {
69518
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
69519
0
  }
69520
5.56k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
69521
0
    return wuffs_base__make_status(
69522
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
69523
0
        ? wuffs_base__error__disabled_by_previous_error
69524
0
        : wuffs_base__error__initialize_not_called);
69525
0
  }
69526
5.56k
  if (!a_src) {
69527
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69528
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
69529
0
  }
69530
5.56k
  if ((self->private_impl.active_coroutine != 0) &&
69531
5.56k
      (self->private_impl.active_coroutine != 1)) {
69532
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69533
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
69534
0
  }
69535
5.56k
  self->private_impl.active_coroutine = 0;
69536
5.56k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69537
69538
5.56k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
69539
69540
5.56k
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
69541
5.56k
  switch (coro_susp_point) {
69542
5.56k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69543
69544
5.56k
    while (true) {
69545
5.56k
      {
69546
5.56k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_image_config(self, a_dst, a_src);
69547
5.56k
        v_status = t_0;
69548
5.56k
      }
69549
5.56k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
69550
360
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
69551
360
        goto exit;
69552
360
      }
69553
5.20k
      status = v_status;
69554
5.20k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
69555
0
    }
69556
69557
3.90k
    ok:
69558
3.90k
    self->private_impl.p_decode_image_config = 0;
69559
3.90k
    goto exit;
69560
5.56k
  }
69561
69562
0
  goto suspend;
69563
316
  suspend:
69564
316
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69565
316
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
69566
69567
316
  goto exit;
69568
5.56k
  exit:
69569
5.56k
  if (wuffs_base__status__is_error(&status)) {
69570
1.35k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
69571
1.35k
  }
69572
5.56k
  return status;
69573
5.56k
}
69574
69575
// -------- func png.decoder.do_decode_image_config
69576
69577
WUFFS_BASE__GENERATED_C_CODE
69578
static wuffs_base__status
69579
wuffs_png__decoder__do_decode_image_config(
69580
    wuffs_png__decoder* self,
69581
    wuffs_base__image_config* a_dst,
69582
5.56k
    wuffs_base__io_buffer* a_src) {
69583
5.56k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69584
69585
5.56k
  uint64_t v_magic = 0;
69586
5.56k
  uint64_t v_mark = 0;
69587
5.56k
  uint32_t v_checksum_have = 0;
69588
5.56k
  uint32_t v_checksum_want = 0;
69589
5.56k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
69590
69591
5.56k
  const uint8_t* iop_a_src = NULL;
69592
5.56k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69593
5.56k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69594
5.56k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69595
5.56k
  if (a_src && a_src->data.ptr) {
69596
5.56k
    io0_a_src = a_src->data.ptr;
69597
5.56k
    io1_a_src = io0_a_src + a_src->meta.ri;
69598
5.56k
    iop_a_src = io1_a_src;
69599
5.56k
    io2_a_src = io0_a_src + a_src->meta.wi;
69600
5.56k
  }
69601
69602
5.56k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
69603
5.56k
  if (coro_susp_point) {
69604
0
    v_checksum_have = self->private_data.s_do_decode_image_config.v_checksum_have;
69605
0
  }
69606
5.56k
  switch (coro_susp_point) {
69607
5.56k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69608
69609
5.56k
    if (self->private_impl.f_call_sequence != 0u) {
69610
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
69611
0
      goto exit;
69612
5.56k
    } else if ( ! self->private_impl.f_seen_ihdr) {
69613
5.56k
      {
69614
5.56k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
69615
5.56k
        uint64_t t_0;
69616
5.56k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
69617
5.56k
          t_0 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
69618
5.56k
          iop_a_src += 8;
69619
5.56k
        } else {
69620
9
          self->private_data.s_do_decode_image_config.scratch = 0;
69621
9
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
69622
41
          while (true) {
69623
41
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69624
9
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69625
9
              goto suspend;
69626
9
            }
69627
32
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
69628
32
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
69629
32
            *scratch <<= 8;
69630
32
            *scratch >>= 8;
69631
32
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
69632
32
            if (num_bits_0 == 56) {
69633
0
              t_0 = ((uint64_t)(*scratch));
69634
0
              break;
69635
0
            }
69636
32
            num_bits_0 += 8u;
69637
32
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
69638
32
          }
69639
9
        }
69640
5.56k
        v_magic = t_0;
69641
5.56k
      }
69642
5.56k
      if (v_magic != 727905341920923785u) {
69643
99
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
69644
99
        goto exit;
69645
99
      }
69646
5.46k
      {
69647
5.46k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69648
5.46k
        uint64_t t_1;
69649
5.46k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
69650
5.45k
          t_1 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
69651
5.45k
          iop_a_src += 8;
69652
5.45k
        } else {
69653
8
          self->private_data.s_do_decode_image_config.scratch = 0;
69654
8
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69655
36
          while (true) {
69656
36
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69657
8
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69658
8
              goto suspend;
69659
8
            }
69660
28
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
69661
28
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
69662
28
            *scratch <<= 8;
69663
28
            *scratch >>= 8;
69664
28
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
69665
28
            if (num_bits_1 == 56) {
69666
0
              t_1 = ((uint64_t)(*scratch));
69667
0
              break;
69668
0
            }
69669
28
            num_bits_1 += 8u;
69670
28
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
69671
28
          }
69672
8
        }
69673
5.45k
        v_magic = t_1;
69674
5.45k
      }
69675
5.45k
      if (v_magic != 5927942488114331648u) {
69676
146
        if (v_magic == 5278895250759221248u) {
69677
1
          status = wuffs_base__make_status(wuffs_png__error__unsupported_cgbi_extension);
69678
1
          goto exit;
69679
1
        }
69680
145
        status = wuffs_base__make_status(wuffs_png__error__bad_header);
69681
145
        goto exit;
69682
146
      }
69683
5.30k
      self->private_impl.f_chunk_type_array[0u] = 73u;
69684
5.30k
      self->private_impl.f_chunk_type_array[1u] = 72u;
69685
5.30k
      self->private_impl.f_chunk_type_array[2u] = 68u;
69686
5.30k
      self->private_impl.f_chunk_type_array[3u] = 82u;
69687
5.30k
      wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
69688
5.30k
          sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
69689
5.30k
      wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
69690
5.30k
      while (true) {
69691
5.30k
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
69692
5.30k
        {
69693
5.30k
          if (a_src) {
69694
5.30k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69695
5.30k
          }
69696
5.30k
          wuffs_base__status t_2 = wuffs_png__decoder__decode_ihdr(self, a_src);
69697
5.30k
          v_status = t_2;
69698
5.30k
          if (a_src) {
69699
5.30k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
69700
5.30k
          }
69701
5.30k
        }
69702
5.30k
        if ( ! self->private_impl.f_ignore_checksum) {
69703
5.30k
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
69704
5.30k
        }
69705
5.30k
        if (wuffs_base__status__is_ok(&v_status)) {
69706
5.08k
          break;
69707
5.08k
        }
69708
225
        status = v_status;
69709
225
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
69710
0
      }
69711
5.08k
      {
69712
5.08k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
69713
5.08k
        uint32_t t_3;
69714
5.08k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69715
5.06k
          t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69716
5.06k
          iop_a_src += 4;
69717
5.06k
        } else {
69718
16
          self->private_data.s_do_decode_image_config.scratch = 0;
69719
16
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
69720
25
          while (true) {
69721
25
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69722
16
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69723
16
              goto suspend;
69724
16
            }
69725
9
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
69726
9
            uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
69727
9
            *scratch >>= 8;
69728
9
            *scratch <<= 8;
69729
9
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
69730
9
            if (num_bits_3 == 24) {
69731
0
              t_3 = ((uint32_t)(*scratch >> 32));
69732
0
              break;
69733
0
            }
69734
9
            num_bits_3 += 8u;
69735
9
            *scratch |= ((uint64_t)(num_bits_3));
69736
9
          }
69737
16
        }
69738
5.06k
        v_checksum_want = t_3;
69739
5.06k
      }
69740
5.06k
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != v_checksum_want)) {
69741
45
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
69742
45
        goto exit;
69743
45
      }
69744
5.02k
      self->private_impl.f_seen_ihdr = true;
69745
5.02k
    } else if (self->private_impl.f_metadata_fourcc != 0u) {
69746
0
      self->private_impl.f_call_sequence = 16u;
69747
0
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
69748
0
      goto ok;
69749
0
    }
69750
8.53k
    while (true) {
69751
8.53k
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
69752
21
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69753
21
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
69754
0
        continue;
69755
21
      }
69756
8.51k
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69757
8.51k
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
69758
8.51k
      if (self->private_impl.f_chunk_type == 1413563465u) {
69759
4.18k
        if ( ! self->private_impl.f_seen_actl || self->private_impl.f_seen_fctl) {
69760
3.89k
          break;
69761
3.89k
        }
69762
294
        self->private_impl.f_seen_idat = true;
69763
4.32k
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
69764
15
        if (self->private_impl.f_seen_idat && self->private_impl.f_seen_fctl) {
69765
13
          break;
69766
13
        }
69767
2
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
69768
2
        goto exit;
69769
15
      }
69770
4.60k
      iop_a_src += 8u;
69771
4.60k
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
69772
741
        self->private_impl.f_chunk_type_array[0u] = ((uint8_t)((self->private_impl.f_chunk_type >> 0u)));
69773
741
        self->private_impl.f_chunk_type_array[1u] = ((uint8_t)((self->private_impl.f_chunk_type >> 8u)));
69774
741
        self->private_impl.f_chunk_type_array[2u] = ((uint8_t)((self->private_impl.f_chunk_type >> 16u)));
69775
741
        self->private_impl.f_chunk_type_array[3u] = ((uint8_t)((self->private_impl.f_chunk_type >> 24u)));
69776
741
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
69777
741
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
69778
741
        wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
69779
741
      }
69780
4.60k
      while (true) {
69781
4.60k
        v_mark = ((uint64_t)(iop_a_src - io0_a_src));
69782
4.60k
        {
69783
4.60k
          if (a_src) {
69784
4.60k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69785
4.60k
          }
69786
4.60k
          wuffs_base__status t_4 = wuffs_png__decoder__decode_other_chunk(self, a_src, false);
69787
4.60k
          v_status = t_4;
69788
4.60k
          if (a_src) {
69789
4.60k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
69790
4.60k
          }
69791
4.60k
        }
69792
4.60k
        if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u)) {
69793
741
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
69794
741
        }
69795
4.60k
        if (wuffs_base__status__is_ok(&v_status)) {
69796
3.62k
          break;
69797
3.62k
        }
69798
981
        status = v_status;
69799
981
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
69800
0
      }
69801
3.62k
      if (self->private_impl.f_metadata_fourcc != 0u) {
69802
0
        self->private_impl.f_call_sequence = 16u;
69803
0
        status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
69804
0
        goto ok;
69805
0
      }
69806
3.62k
      {
69807
3.62k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
69808
3.62k
        uint32_t t_5;
69809
3.62k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69810
3.52k
          t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69811
3.52k
          iop_a_src += 4;
69812
3.52k
        } else {
69813
98
          self->private_data.s_do_decode_image_config.scratch = 0;
69814
98
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
69815
119
          while (true) {
69816
119
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69817
98
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69818
98
              goto suspend;
69819
98
            }
69820
21
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
69821
21
            uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
69822
21
            *scratch >>= 8;
69823
21
            *scratch <<= 8;
69824
21
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
69825
21
            if (num_bits_5 == 24) {
69826
0
              t_5 = ((uint32_t)(*scratch >> 32));
69827
0
              break;
69828
0
            }
69829
21
            num_bits_5 += 8u;
69830
21
            *scratch |= ((uint64_t)(num_bits_5));
69831
21
          }
69832
98
        }
69833
3.52k
        v_checksum_want = t_5;
69834
3.52k
      }
69835
3.52k
      if ( ! self->private_impl.f_ignore_checksum && ((self->private_impl.f_chunk_type & 32u) == 0u) && (v_checksum_have != v_checksum_want)) {
69836
15
        status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
69837
15
        goto exit;
69838
15
      }
69839
3.52k
    }
69840
3.90k
    if ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte) {
69841
1
      status = wuffs_base__make_status(wuffs_png__error__missing_palette);
69842
1
      goto exit;
69843
1
    }
69844
3.90k
    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)));
69845
3.90k
    self->private_impl.f_first_config_io_position = self->private_impl.f_frame_config_io_position;
69846
3.90k
    if (a_dst != NULL) {
69847
3.90k
      wuffs_base__image_config__set(
69848
3.90k
          a_dst,
69849
3.90k
          self->private_impl.f_dst_pixfmt,
69850
3.90k
          0u,
69851
3.90k
          self->private_impl.f_width,
69852
3.90k
          self->private_impl.f_height,
69853
3.90k
          self->private_impl.f_first_config_io_position,
69854
3.90k
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns));
69855
3.90k
    }
69856
3.90k
    if ( ! self->private_impl.f_seen_actl) {
69857
3.63k
      self->private_impl.f_num_animation_frames_value = 1u;
69858
3.63k
      self->private_impl.f_first_rect_x0 = 0u;
69859
3.63k
      self->private_impl.f_first_rect_y0 = 0u;
69860
3.63k
      self->private_impl.f_first_rect_x1 = self->private_impl.f_width;
69861
3.63k
      self->private_impl.f_first_rect_y1 = self->private_impl.f_height;
69862
3.63k
      self->private_impl.f_first_duration = 0u;
69863
3.63k
      self->private_impl.f_first_disposal = 0u;
69864
3.63k
      self->private_impl.f_first_overwrite_instead_of_blend = false;
69865
3.63k
    }
69866
3.90k
    self->private_impl.f_call_sequence = 32u;
69867
69868
3.90k
    ok:
69869
3.90k
    self->private_impl.p_do_decode_image_config = 0;
69870
3.90k
    goto exit;
69871
5.56k
  }
69872
69873
0
  goto suspend;
69874
676
  suspend:
69875
676
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
69876
676
  self->private_data.s_do_decode_image_config.v_checksum_have = v_checksum_have;
69877
69878
676
  goto exit;
69879
5.56k
  exit:
69880
5.56k
  if (a_src && a_src->data.ptr) {
69881
5.56k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
69882
5.56k
  }
69883
69884
5.56k
  return status;
69885
5.56k
}
69886
69887
// -------- func png.decoder.decode_ihdr
69888
69889
WUFFS_BASE__GENERATED_C_CODE
69890
static wuffs_base__status
69891
wuffs_png__decoder__decode_ihdr(
69892
    wuffs_png__decoder* self,
69893
5.30k
    wuffs_base__io_buffer* a_src) {
69894
5.30k
  wuffs_base__status status = wuffs_base__make_status(NULL);
69895
69896
5.30k
  uint32_t v_a32 = 0;
69897
5.30k
  uint8_t v_a8 = 0;
69898
69899
5.30k
  const uint8_t* iop_a_src = NULL;
69900
5.30k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69901
5.30k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69902
5.30k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
69903
5.30k
  if (a_src && a_src->data.ptr) {
69904
5.30k
    io0_a_src = a_src->data.ptr;
69905
5.30k
    io1_a_src = io0_a_src + a_src->meta.ri;
69906
5.30k
    iop_a_src = io1_a_src;
69907
5.30k
    io2_a_src = io0_a_src + a_src->meta.wi;
69908
5.30k
  }
69909
69910
5.30k
  uint32_t coro_susp_point = self->private_impl.p_decode_ihdr;
69911
5.30k
  switch (coro_susp_point) {
69912
5.30k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
69913
69914
5.30k
    {
69915
5.30k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
69916
5.30k
      uint32_t t_0;
69917
5.30k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69918
5.30k
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69919
5.30k
        iop_a_src += 4;
69920
5.30k
      } else {
69921
4
        self->private_data.s_decode_ihdr.scratch = 0;
69922
4
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
69923
10
        while (true) {
69924
10
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69925
4
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69926
4
            goto suspend;
69927
4
          }
69928
6
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
69929
6
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
69930
6
          *scratch >>= 8;
69931
6
          *scratch <<= 8;
69932
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
69933
6
          if (num_bits_0 == 24) {
69934
0
            t_0 = ((uint32_t)(*scratch >> 32));
69935
0
            break;
69936
0
          }
69937
6
          num_bits_0 += 8u;
69938
6
          *scratch |= ((uint64_t)(num_bits_0));
69939
6
        }
69940
4
      }
69941
5.30k
      v_a32 = t_0;
69942
5.30k
    }
69943
5.30k
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
69944
31
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
69945
31
      goto exit;
69946
5.27k
    } else if (v_a32 > 16777215u) {
69947
11
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
69948
11
      goto exit;
69949
11
    }
69950
5.26k
    self->private_impl.f_width = v_a32;
69951
5.26k
    {
69952
5.26k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
69953
5.26k
      uint32_t t_1;
69954
5.26k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
69955
5.22k
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
69956
5.22k
        iop_a_src += 4;
69957
5.22k
      } else {
69958
32
        self->private_data.s_decode_ihdr.scratch = 0;
69959
32
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
69960
38
        while (true) {
69961
38
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69962
32
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69963
32
            goto suspend;
69964
32
          }
69965
6
          uint64_t* scratch = &self->private_data.s_decode_ihdr.scratch;
69966
6
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
69967
6
          *scratch >>= 8;
69968
6
          *scratch <<= 8;
69969
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
69970
6
          if (num_bits_1 == 24) {
69971
0
            t_1 = ((uint32_t)(*scratch >> 32));
69972
0
            break;
69973
0
          }
69974
6
          num_bits_1 += 8u;
69975
6
          *scratch |= ((uint64_t)(num_bits_1));
69976
6
        }
69977
32
      }
69978
5.22k
      v_a32 = t_1;
69979
5.22k
    }
69980
5.22k
    if ((v_a32 == 0u) || (v_a32 > 2147483647u)) {
69981
33
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
69982
33
      goto exit;
69983
5.19k
    } else if (v_a32 > 16777215u) {
69984
11
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
69985
11
      goto exit;
69986
11
    }
69987
5.18k
    self->private_impl.f_height = v_a32;
69988
5.18k
    {
69989
5.18k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
69990
5.18k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
69991
30
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
69992
30
        goto suspend;
69993
30
      }
69994
5.15k
      uint8_t t_2 = *iop_a_src++;
69995
5.15k
      v_a8 = t_2;
69996
5.15k
    }
69997
5.15k
    if (v_a8 > 16u) {
69998
3
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
69999
3
      goto exit;
70000
3
    }
70001
5.15k
    self->private_impl.f_depth = v_a8;
70002
5.15k
    {
70003
5.15k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
70004
5.15k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70005
6
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70006
6
        goto suspend;
70007
6
      }
70008
5.14k
      uint8_t t_3 = *iop_a_src++;
70009
5.14k
      v_a8 = t_3;
70010
5.14k
    }
70011
5.14k
    if ((v_a8 == 1u) || (v_a8 == 5u) || (v_a8 > 6u)) {
70012
9
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
70013
9
      goto exit;
70014
9
    }
70015
5.13k
    self->private_impl.f_color_type = v_a8;
70016
5.13k
    {
70017
5.13k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
70018
5.13k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70019
5
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70020
5
        goto suspend;
70021
5
      }
70022
5.13k
      uint8_t t_4 = *iop_a_src++;
70023
5.13k
      v_a8 = t_4;
70024
5.13k
    }
70025
5.13k
    if (v_a8 != 0u) {
70026
9
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
70027
9
      goto exit;
70028
9
    }
70029
5.12k
    {
70030
5.12k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
70031
5.12k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70032
1
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70033
1
        goto suspend;
70034
1
      }
70035
5.12k
      uint8_t t_5 = *iop_a_src++;
70036
5.12k
      v_a8 = t_5;
70037
5.12k
    }
70038
5.12k
    if (v_a8 != 0u) {
70039
8
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
70040
8
      goto exit;
70041
8
    }
70042
5.11k
    {
70043
5.11k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
70044
5.11k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70045
1
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70046
1
        goto suspend;
70047
1
      }
70048
5.11k
      uint8_t t_6 = *iop_a_src++;
70049
5.11k
      v_a8 = t_6;
70050
5.11k
    }
70051
5.11k
    if (v_a8 == 0u) {
70052
2.63k
      self->private_impl.f_interlace_pass = 0u;
70053
2.63k
    } else if (v_a8 == 1u) {
70054
2.46k
      self->private_impl.f_interlace_pass = 1u;
70055
2.46k
      self->private_impl.choosy_filter_and_swizzle = (
70056
2.46k
          &wuffs_png__decoder__filter_and_swizzle_tricky);
70057
2.46k
    } else {
70058
10
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
70059
10
      goto exit;
70060
10
    }
70061
5.10k
    self->private_impl.f_filter_distance = 0u;
70062
5.10k
    wuffs_png__decoder__assign_filter_distance(self);
70063
5.10k
    if (self->private_impl.f_filter_distance == 0u) {
70064
21
      status = wuffs_base__make_status(wuffs_png__error__bad_header);
70065
21
      goto exit;
70066
21
    }
70067
5.08k
    self->private_impl.f_overall_workbuf_length = (((uint64_t)(self->private_impl.f_height)) * (1u + wuffs_png__decoder__calculate_bytes_per_row(self, self->private_impl.f_width)));
70068
5.08k
    wuffs_png__decoder__choose_filter_implementations(self);
70069
70070
5.08k
    goto ok;
70071
5.08k
    ok:
70072
5.08k
    self->private_impl.p_decode_ihdr = 0;
70073
5.08k
    goto exit;
70074
5.30k
  }
70075
70076
0
  goto suspend;
70077
79
  suspend:
70078
79
  self->private_impl.p_decode_ihdr = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70079
70080
79
  goto exit;
70081
5.30k
  exit:
70082
5.30k
  if (a_src && a_src->data.ptr) {
70083
5.30k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70084
5.30k
  }
70085
70086
5.30k
  return status;
70087
5.30k
}
70088
70089
// -------- func png.decoder.assign_filter_distance
70090
70091
WUFFS_BASE__GENERATED_C_CODE
70092
static wuffs_base__empty_struct
70093
wuffs_png__decoder__assign_filter_distance(
70094
5.10k
    wuffs_png__decoder* self) {
70095
5.10k
  if (self->private_impl.f_depth < 8u) {
70096
1.33k
    if ((self->private_impl.f_depth != 1u) && (self->private_impl.f_depth != 2u) && (self->private_impl.f_depth != 4u)) {
70097
4
      return wuffs_base__make_empty_struct();
70098
1.33k
    } else if (self->private_impl.f_color_type == 0u) {
70099
1.16k
      self->private_impl.f_dst_pixfmt = 536870920u;
70100
1.16k
      self->private_impl.f_src_pixfmt = 536870920u;
70101
1.16k
    } else if (self->private_impl.f_color_type == 3u) {
70102
166
      self->private_impl.f_dst_pixfmt = 2198077448u;
70103
166
      self->private_impl.f_src_pixfmt = 2198077448u;
70104
166
    } else {
70105
3
      return wuffs_base__make_empty_struct();
70106
3
    }
70107
1.33k
    self->private_impl.f_filter_distance = 1u;
70108
1.33k
    self->private_impl.choosy_filter_and_swizzle = (
70109
1.33k
        &wuffs_png__decoder__filter_and_swizzle_tricky);
70110
3.76k
  } else if (self->private_impl.f_color_type == 0u) {
70111
565
    if (self->private_impl.f_depth == 8u) {
70112
242
      self->private_impl.f_dst_pixfmt = 536870920u;
70113
242
      self->private_impl.f_src_pixfmt = 536870920u;
70114
242
      self->private_impl.f_filter_distance = 1u;
70115
323
    } else if (self->private_impl.f_depth == 16u) {
70116
320
      if (self->private_impl.f_interlace_pass == 0u) {
70117
179
        self->private_impl.f_dst_pixfmt = 536870923u;
70118
179
        self->private_impl.f_src_pixfmt = 537919499u;
70119
179
      } else {
70120
141
        self->private_impl.f_dst_pixfmt = 2164308923u;
70121
141
        self->private_impl.f_src_pixfmt = 2164308923u;
70122
141
      }
70123
320
      self->private_impl.f_filter_distance = 2u;
70124
320
    }
70125
3.20k
  } else if (self->private_impl.f_color_type == 2u) {
70126
1.39k
    if (self->private_impl.f_depth == 8u) {
70127
1.19k
      self->private_impl.f_dst_pixfmt = 2147485832u;
70128
1.19k
      self->private_impl.f_src_pixfmt = 2684356744u;
70129
1.19k
      self->private_impl.f_filter_distance = 3u;
70130
1.19k
    } else if (self->private_impl.f_depth == 16u) {
70131
206
      self->private_impl.f_dst_pixfmt = 2164308923u;
70132
206
      self->private_impl.f_src_pixfmt = 2164308923u;
70133
206
      self->private_impl.f_filter_distance = 6u;
70134
206
      self->private_impl.choosy_filter_and_swizzle = (
70135
206
          &wuffs_png__decoder__filter_and_swizzle_tricky);
70136
206
    }
70137
1.80k
  } else if (self->private_impl.f_color_type == 3u) {
70138
316
    if (self->private_impl.f_depth == 8u) {
70139
314
      self->private_impl.f_dst_pixfmt = 2198077448u;
70140
314
      self->private_impl.f_src_pixfmt = 2198077448u;
70141
314
      self->private_impl.f_filter_distance = 1u;
70142
314
    }
70143
1.48k
  } else if (self->private_impl.f_color_type == 4u) {
70144
175
    if (self->private_impl.f_depth == 8u) {
70145
105
      self->private_impl.f_dst_pixfmt = 553648264u;
70146
105
      self->private_impl.f_src_pixfmt = 553648264u;
70147
105
      self->private_impl.f_filter_distance = 2u;
70148
105
    } else if (self->private_impl.f_depth == 16u) {
70149
67
      self->private_impl.f_dst_pixfmt = 2164308923u;
70150
67
      self->private_impl.f_src_pixfmt = 2164308923u;
70151
67
      self->private_impl.f_filter_distance = 4u;
70152
67
      self->private_impl.choosy_filter_and_swizzle = (
70153
67
          &wuffs_png__decoder__filter_and_swizzle_tricky);
70154
67
    }
70155
1.31k
  } else if (self->private_impl.f_color_type == 6u) {
70156
1.31k
    if (self->private_impl.f_depth == 8u) {
70157
1.19k
      self->private_impl.f_dst_pixfmt = 2164295816u;
70158
1.19k
      self->private_impl.f_src_pixfmt = 2701166728u;
70159
1.19k
      self->private_impl.f_filter_distance = 4u;
70160
1.19k
    } else if (self->private_impl.f_depth == 16u) {
70161
111
      self->private_impl.f_dst_pixfmt = 2164308923u;
70162
111
      self->private_impl.f_src_pixfmt = 2164308923u;
70163
111
      self->private_impl.f_filter_distance = 8u;
70164
111
      self->private_impl.choosy_filter_and_swizzle = (
70165
111
          &wuffs_png__decoder__filter_and_swizzle_tricky);
70166
111
    }
70167
1.31k
  }
70168
5.09k
  return wuffs_base__make_empty_struct();
70169
5.10k
}
70170
70171
// -------- func png.decoder.calculate_bytes_per_row
70172
70173
WUFFS_BASE__GENERATED_C_CODE
70174
static uint64_t
70175
wuffs_png__decoder__calculate_bytes_per_row(
70176
    const wuffs_png__decoder* self,
70177
14.8k
    uint32_t a_width) {
70178
14.8k
  uint64_t v_bytes_per_channel = 0;
70179
70180
14.8k
  if (self->private_impl.f_depth == 1u) {
70181
331
    return ((uint64_t)(((a_width + 7u) / 8u)));
70182
14.5k
  } else if (self->private_impl.f_depth == 2u) {
70183
4.46k
    return ((uint64_t)(((a_width + 3u) / 4u)));
70184
10.0k
  } else if (self->private_impl.f_depth == 4u) {
70185
226
    return ((uint64_t)(((a_width + 1u) / 2u)));
70186
226
  }
70187
9.83k
  v_bytes_per_channel = ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u))));
70188
9.83k
  return (((uint64_t)(a_width)) * v_bytes_per_channel * ((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])));
70189
14.8k
}
70190
70191
// -------- func png.decoder.choose_filter_implementations
70192
70193
WUFFS_BASE__GENERATED_C_CODE
70194
static wuffs_base__empty_struct
70195
wuffs_png__decoder__choose_filter_implementations(
70196
5.08k
    wuffs_png__decoder* self) {
70197
5.08k
  if (self->private_impl.f_filter_distance == 3u) {
70198
1.19k
    self->private_impl.choosy_filter_1 = (
70199
1.19k
        &wuffs_png__decoder__filter_1_distance_3_fallback);
70200
1.19k
    self->private_impl.choosy_filter_3 = (
70201
1.19k
        &wuffs_png__decoder__filter_3_distance_3_fallback);
70202
1.19k
    self->private_impl.choosy_filter_4 = (
70203
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
70204
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_3_arm_neon :
70205
#endif
70206
1.19k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70207
1.19k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_3_x86_sse42 :
70208
1.19k
#endif
70209
1.19k
        &wuffs_png__decoder__filter_4_distance_3_fallback);
70210
3.89k
  } else if (self->private_impl.f_filter_distance == 4u) {
70211
1.26k
    self->private_impl.choosy_filter_1 = (
70212
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
70213
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_1_distance_4_arm_neon :
70214
#endif
70215
1.26k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70216
1.26k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_1_distance_4_x86_sse42 :
70217
1.26k
#endif
70218
1.26k
        &wuffs_png__decoder__filter_1_distance_4_fallback);
70219
1.26k
    self->private_impl.choosy_filter_3 = (
70220
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
70221
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_3_distance_4_arm_neon :
70222
#endif
70223
1.26k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70224
1.26k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_3_distance_4_x86_sse42 :
70225
1.26k
#endif
70226
1.26k
        &wuffs_png__decoder__filter_3_distance_4_fallback);
70227
1.26k
    self->private_impl.choosy_filter_4 = (
70228
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__ARM_NEON)
70229
        wuffs_base__cpu_arch__have_arm_neon() ? &wuffs_png__decoder__filter_4_distance_4_arm_neon :
70230
#endif
70231
1.26k
#if defined(WUFFS_PRIVATE_IMPL__CPU_ARCH__X86_64_V2)
70232
1.26k
        wuffs_base__cpu_arch__have_x86_sse42() ? &wuffs_png__decoder__filter_4_distance_4_x86_sse42 :
70233
1.26k
#endif
70234
1.26k
        &wuffs_png__decoder__filter_4_distance_4_fallback);
70235
1.26k
  }
70236
5.08k
  return wuffs_base__make_empty_struct();
70237
5.08k
}
70238
70239
// -------- func png.decoder.decode_other_chunk
70240
70241
WUFFS_BASE__GENERATED_C_CODE
70242
static wuffs_base__status
70243
wuffs_png__decoder__decode_other_chunk(
70244
    wuffs_png__decoder* self,
70245
    wuffs_base__io_buffer* a_src,
70246
5.19k
    bool a_framy) {
70247
5.19k
  wuffs_base__status status = wuffs_base__make_status(NULL);
70248
70249
5.19k
  const uint8_t* iop_a_src = NULL;
70250
5.19k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70251
5.19k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70252
5.19k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70253
5.19k
  if (a_src && a_src->data.ptr) {
70254
5.19k
    io0_a_src = a_src->data.ptr;
70255
5.19k
    io1_a_src = io0_a_src + a_src->meta.ri;
70256
5.19k
    iop_a_src = io1_a_src;
70257
5.19k
    io2_a_src = io0_a_src + a_src->meta.wi;
70258
5.19k
  }
70259
70260
5.19k
  uint32_t coro_susp_point = self->private_impl.p_decode_other_chunk;
70261
5.19k
  switch (coro_susp_point) {
70262
5.19k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70263
70264
5.19k
    if ((self->private_impl.f_chunk_type == 1163152464u) &&  ! a_framy) {
70265
343
      if (self->private_impl.f_seen_plte) {
70266
1
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70267
1
        goto exit;
70268
342
      } else if (self->private_impl.f_color_type == 3u) {
70269
326
        if (a_src) {
70270
326
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70271
326
        }
70272
326
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
70273
326
        status = wuffs_png__decoder__decode_plte(self, a_src);
70274
326
        if (a_src) {
70275
326
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
70276
326
        }
70277
326
        if (status.repr) {
70278
62
          goto suspend;
70279
62
        }
70280
326
      } else if ((self->private_impl.f_color_type == 2u) || (self->private_impl.f_color_type == 6u)) {
70281
14
      } else {
70282
2
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70283
2
        goto exit;
70284
2
      }
70285
278
      self->private_impl.f_seen_plte = true;
70286
4.85k
    } else if ((self->private_impl.f_chunk_type & 32u) == 0u) {
70287
876
      if (self->private_impl.f_chunk_type != 1413563465u) {
70288
183
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70289
183
        goto exit;
70290
183
      }
70291
876
    }
70292
4.94k
    if (self->private_impl.f_chunk_type == 1716082789u) {
70293
329
      if (self->private_impl.f_report_metadata_exif) {
70294
0
        if (self->private_impl.f_seen_exif) {
70295
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70296
0
          goto exit;
70297
0
        }
70298
0
        if (a_src) {
70299
0
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70300
0
        }
70301
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70302
0
        status = wuffs_png__decoder__decode_exif(self, a_src);
70303
0
        if (a_src) {
70304
0
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
70305
0
        }
70306
0
        if (status.repr) {
70307
0
          goto suspend;
70308
0
        }
70309
0
        self->private_impl.f_seen_exif = true;
70310
0
      }
70311
4.61k
    } else if ((self->private_impl.f_chunk_type == 1951945833u) || (self->private_impl.f_chunk_type == 1951942004u) || (self->private_impl.f_chunk_type == 1951945850u)) {
70312
958
      if (self->private_impl.f_report_metadata_kvp) {
70313
0
        self->private_impl.f_metadata_flavor = 4u;
70314
0
        self->private_impl.f_metadata_fourcc = 1263947851u;
70315
0
        self->private_impl.f_metadata_x = 0u;
70316
0
        self->private_impl.f_metadata_y = 0u;
70317
0
        self->private_impl.f_metadata_z = 0u;
70318
0
      }
70319
3.65k
    } else if ( ! a_framy) {
70320
3.16k
      if (self->private_impl.f_chunk_type == 1280598881u) {
70321
407
        if (self->private_impl.f_seen_actl) {
70322
1
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70323
1
          goto exit;
70324
1
        }
70325
406
        if (a_src) {
70326
406
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70327
406
        }
70328
406
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
70329
406
        status = wuffs_png__decoder__decode_actl(self, a_src);
70330
406
        if (a_src) {
70331
406
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
70332
406
        }
70333
406
        if (status.repr) {
70334
95
          goto suspend;
70335
95
        }
70336
311
        self->private_impl.f_seen_actl = true;
70337
2.75k
      } else if (self->private_impl.f_chunk_type == 1297238115u) {
70338
222
        if (self->private_impl.f_report_metadata_chrm) {
70339
0
          if (self->private_impl.f_seen_chrm) {
70340
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70341
0
            goto exit;
70342
0
          }
70343
0
          if (a_src) {
70344
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70345
0
          }
70346
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
70347
0
          status = wuffs_png__decoder__decode_chrm(self, a_src);
70348
0
          if (a_src) {
70349
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70350
0
          }
70351
0
          if (status.repr) {
70352
0
            goto suspend;
70353
0
          }
70354
0
          self->private_impl.f_seen_chrm = true;
70355
0
        }
70356
2.53k
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
70357
627
        if (self->private_impl.f_seen_fctl) {
70358
2
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70359
2
          goto exit;
70360
2
        }
70361
625
        if (a_src) {
70362
625
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70363
625
        }
70364
625
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
70365
625
        status = wuffs_png__decoder__decode_fctl(self, a_src);
70366
625
        if (a_src) {
70367
625
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
70368
625
        }
70369
625
        if (status.repr) {
70370
269
          goto suspend;
70371
269
        }
70372
356
        self->private_impl.f_seen_fctl = true;
70373
1.90k
      } else if (self->private_impl.f_chunk_type == 1095582055u) {
70374
76
        if (self->private_impl.f_report_metadata_gama) {
70375
0
          if (self->private_impl.f_seen_gama) {
70376
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70377
0
            goto exit;
70378
0
          }
70379
0
          if (a_src) {
70380
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70381
0
          }
70382
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
70383
0
          status = wuffs_png__decoder__decode_gama(self, a_src);
70384
0
          if (a_src) {
70385
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70386
0
          }
70387
0
          if (status.repr) {
70388
0
            goto suspend;
70389
0
          }
70390
0
          self->private_impl.f_seen_gama = true;
70391
0
        }
70392
1.82k
      } else if (self->private_impl.f_chunk_type == 1346585449u) {
70393
110
        if (self->private_impl.f_report_metadata_iccp) {
70394
0
          if (self->private_impl.f_seen_iccp) {
70395
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70396
0
            goto exit;
70397
0
          }
70398
0
          if (a_src) {
70399
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70400
0
          }
70401
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
70402
0
          status = wuffs_png__decoder__decode_iccp(self, a_src);
70403
0
          if (a_src) {
70404
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70405
0
          }
70406
0
          if (status.repr) {
70407
0
            goto suspend;
70408
0
          }
70409
0
          self->private_impl.f_seen_iccp = true;
70410
0
        }
70411
1.71k
      } else if (self->private_impl.f_chunk_type == 1111970419u) {
70412
195
        if (self->private_impl.f_report_metadata_srgb) {
70413
0
          if (self->private_impl.f_seen_srgb) {
70414
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70415
0
            goto exit;
70416
0
          }
70417
0
          if (a_src) {
70418
0
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70419
0
          }
70420
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
70421
0
          status = wuffs_png__decoder__decode_srgb(self, a_src);
70422
0
          if (a_src) {
70423
0
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70424
0
          }
70425
0
          if (status.repr) {
70426
0
            goto suspend;
70427
0
          }
70428
0
          self->private_impl.f_seen_srgb = true;
70429
0
        }
70430
1.52k
      } else if (self->private_impl.f_chunk_type == 1397641844u) {
70431
357
        if (self->private_impl.f_seen_trns || ((self->private_impl.f_color_type == 3u) &&  ! self->private_impl.f_seen_plte)) {
70432
2
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70433
2
          goto exit;
70434
355
        } else if (self->private_impl.f_color_type > 3u) {
70435
354
        } else {
70436
354
          if (a_src) {
70437
354
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70438
354
          }
70439
354
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
70440
354
          status = wuffs_png__decoder__decode_trns(self, a_src);
70441
354
          if (a_src) {
70442
354
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
70443
354
          }
70444
354
          if (status.repr) {
70445
140
            goto suspend;
70446
140
          }
70447
354
        }
70448
215
        self->private_impl.f_seen_trns = true;
70449
215
      }
70450
3.16k
    }
70451
4.43k
    if (self->private_impl.f_metadata_fourcc == 0u) {
70452
4.43k
      self->private_data.s_decode_other_chunk.scratch = self->private_impl.f_chunk_length;
70453
4.43k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
70454
4.43k
      if (self->private_data.s_decode_other_chunk.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
70455
339
        self->private_data.s_decode_other_chunk.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
70456
339
        iop_a_src = io2_a_src;
70457
339
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70458
339
        goto suspend;
70459
339
      }
70460
4.09k
      iop_a_src += self->private_data.s_decode_other_chunk.scratch;
70461
4.09k
    }
70462
70463
4.09k
    goto ok;
70464
4.09k
    ok:
70465
4.09k
    self->private_impl.p_decode_other_chunk = 0;
70466
4.09k
    goto exit;
70467
5.19k
  }
70468
70469
0
  goto suspend;
70470
905
  suspend:
70471
905
  self->private_impl.p_decode_other_chunk = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70472
70473
905
  goto exit;
70474
5.19k
  exit:
70475
5.19k
  if (a_src && a_src->data.ptr) {
70476
5.19k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70477
5.19k
  }
70478
70479
5.19k
  return status;
70480
5.19k
}
70481
70482
// -------- func png.decoder.decode_actl
70483
70484
WUFFS_BASE__GENERATED_C_CODE
70485
static wuffs_base__status
70486
wuffs_png__decoder__decode_actl(
70487
    wuffs_png__decoder* self,
70488
406
    wuffs_base__io_buffer* a_src) {
70489
406
  wuffs_base__status status = wuffs_base__make_status(NULL);
70490
70491
406
  const uint8_t* iop_a_src = NULL;
70492
406
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70493
406
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70494
406
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70495
406
  if (a_src && a_src->data.ptr) {
70496
406
    io0_a_src = a_src->data.ptr;
70497
406
    io1_a_src = io0_a_src + a_src->meta.ri;
70498
406
    iop_a_src = io1_a_src;
70499
406
    io2_a_src = io0_a_src + a_src->meta.wi;
70500
406
  }
70501
70502
406
  uint32_t coro_susp_point = self->private_impl.p_decode_actl;
70503
406
  switch (coro_susp_point) {
70504
406
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70505
70506
406
    if (self->private_impl.f_chunk_length != 8u) {
70507
40
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70508
40
      goto exit;
70509
366
    } else if (self->private_impl.f_interlace_pass > 0u) {
70510
1
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
70511
1
      goto exit;
70512
1
    }
70513
365
    self->private_impl.f_chunk_length = 0u;
70514
365
    {
70515
365
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
70516
365
      uint32_t t_0;
70517
365
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70518
362
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70519
362
        iop_a_src += 4;
70520
362
      } else {
70521
3
        self->private_data.s_decode_actl.scratch = 0;
70522
3
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70523
9
        while (true) {
70524
9
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70525
3
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70526
3
            goto suspend;
70527
3
          }
70528
6
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
70529
6
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
70530
6
          *scratch >>= 8;
70531
6
          *scratch <<= 8;
70532
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
70533
6
          if (num_bits_0 == 24) {
70534
0
            t_0 = ((uint32_t)(*scratch >> 32));
70535
0
            break;
70536
0
          }
70537
6
          num_bits_0 += 8u;
70538
6
          *scratch |= ((uint64_t)(num_bits_0));
70539
6
        }
70540
3
      }
70541
362
      self->private_impl.f_num_animation_frames_value = t_0;
70542
362
    }
70543
362
    if (self->private_impl.f_num_animation_frames_value == 0u) {
70544
2
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70545
2
      goto exit;
70546
2
    }
70547
360
    {
70548
360
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
70549
360
      uint32_t t_1;
70550
360
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70551
311
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70552
311
        iop_a_src += 4;
70553
311
      } else {
70554
49
        self->private_data.s_decode_actl.scratch = 0;
70555
49
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
70556
55
        while (true) {
70557
55
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70558
49
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70559
49
            goto suspend;
70560
49
          }
70561
6
          uint64_t* scratch = &self->private_data.s_decode_actl.scratch;
70562
6
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
70563
6
          *scratch >>= 8;
70564
6
          *scratch <<= 8;
70565
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
70566
6
          if (num_bits_1 == 24) {
70567
0
            t_1 = ((uint32_t)(*scratch >> 32));
70568
0
            break;
70569
0
          }
70570
6
          num_bits_1 += 8u;
70571
6
          *scratch |= ((uint64_t)(num_bits_1));
70572
6
        }
70573
49
      }
70574
311
      self->private_impl.f_num_animation_loops_value = t_1;
70575
311
    }
70576
70577
0
    goto ok;
70578
311
    ok:
70579
311
    self->private_impl.p_decode_actl = 0;
70580
311
    goto exit;
70581
406
  }
70582
70583
0
  goto suspend;
70584
52
  suspend:
70585
52
  self->private_impl.p_decode_actl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70586
70587
52
  goto exit;
70588
406
  exit:
70589
406
  if (a_src && a_src->data.ptr) {
70590
406
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70591
406
  }
70592
70593
406
  return status;
70594
406
}
70595
70596
// -------- func png.decoder.decode_chrm
70597
70598
WUFFS_BASE__GENERATED_C_CODE
70599
static wuffs_base__status
70600
wuffs_png__decoder__decode_chrm(
70601
    wuffs_png__decoder* self,
70602
0
    wuffs_base__io_buffer* a_src) {
70603
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
70604
70605
0
  uint64_t v_u = 0;
70606
70607
0
  const uint8_t* iop_a_src = NULL;
70608
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70609
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70610
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70611
0
  if (a_src && a_src->data.ptr) {
70612
0
    io0_a_src = a_src->data.ptr;
70613
0
    io1_a_src = io0_a_src + a_src->meta.ri;
70614
0
    iop_a_src = io1_a_src;
70615
0
    io2_a_src = io0_a_src + a_src->meta.wi;
70616
0
  }
70617
70618
0
  uint32_t coro_susp_point = self->private_impl.p_decode_chrm;
70619
0
  switch (coro_susp_point) {
70620
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70621
70622
0
    if (self->private_impl.f_chunk_length != 32u) {
70623
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70624
0
      goto exit;
70625
0
    }
70626
0
    self->private_impl.f_chunk_length = 0u;
70627
0
    self->private_impl.f_metadata_flavor = 5u;
70628
0
    self->private_impl.f_metadata_fourcc = 1128813133u;
70629
0
    self->private_impl.f_metadata_x = 0u;
70630
0
    self->private_impl.f_metadata_y = 0u;
70631
0
    self->private_impl.f_metadata_z = 0u;
70632
0
    {
70633
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
70634
0
      uint64_t t_0;
70635
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70636
0
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70637
0
        iop_a_src += 4;
70638
0
      } else {
70639
0
        self->private_data.s_decode_chrm.scratch = 0;
70640
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70641
0
        while (true) {
70642
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70643
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70644
0
            goto suspend;
70645
0
          }
70646
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70647
0
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
70648
0
          *scratch >>= 8;
70649
0
          *scratch <<= 8;
70650
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
70651
0
          if (num_bits_0 == 24) {
70652
0
            t_0 = ((uint64_t)(*scratch >> 32));
70653
0
            break;
70654
0
          }
70655
0
          num_bits_0 += 8u;
70656
0
          *scratch |= ((uint64_t)(num_bits_0));
70657
0
        }
70658
0
      }
70659
0
      v_u = t_0;
70660
0
    }
70661
0
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 0u);
70662
0
    {
70663
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
70664
0
      uint64_t t_1;
70665
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70666
0
        t_1 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70667
0
        iop_a_src += 4;
70668
0
      } else {
70669
0
        self->private_data.s_decode_chrm.scratch = 0;
70670
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
70671
0
        while (true) {
70672
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70673
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70674
0
            goto suspend;
70675
0
          }
70676
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70677
0
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
70678
0
          *scratch >>= 8;
70679
0
          *scratch <<= 8;
70680
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
70681
0
          if (num_bits_1 == 24) {
70682
0
            t_1 = ((uint64_t)(*scratch >> 32));
70683
0
            break;
70684
0
          }
70685
0
          num_bits_1 += 8u;
70686
0
          *scratch |= ((uint64_t)(num_bits_1));
70687
0
        }
70688
0
      }
70689
0
      v_u = t_1;
70690
0
    }
70691
0
    self->private_impl.f_metadata_x |= ((16777215u & v_u) << 24u);
70692
0
    {
70693
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
70694
0
      uint64_t t_2;
70695
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70696
0
        t_2 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70697
0
        iop_a_src += 4;
70698
0
      } else {
70699
0
        self->private_data.s_decode_chrm.scratch = 0;
70700
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
70701
0
        while (true) {
70702
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70703
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70704
0
            goto suspend;
70705
0
          }
70706
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70707
0
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
70708
0
          *scratch >>= 8;
70709
0
          *scratch <<= 8;
70710
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
70711
0
          if (num_bits_2 == 24) {
70712
0
            t_2 = ((uint64_t)(*scratch >> 32));
70713
0
            break;
70714
0
          }
70715
0
          num_bits_2 += 8u;
70716
0
          *scratch |= ((uint64_t)(num_bits_2));
70717
0
        }
70718
0
      }
70719
0
      v_u = t_2;
70720
0
    }
70721
0
    self->private_impl.f_metadata_x |= ((uint64_t)((16777215u & v_u) << 48u));
70722
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) >> 16u);
70723
0
    {
70724
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
70725
0
      uint64_t t_3;
70726
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70727
0
        t_3 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70728
0
        iop_a_src += 4;
70729
0
      } else {
70730
0
        self->private_data.s_decode_chrm.scratch = 0;
70731
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
70732
0
        while (true) {
70733
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70734
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70735
0
            goto suspend;
70736
0
          }
70737
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70738
0
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
70739
0
          *scratch >>= 8;
70740
0
          *scratch <<= 8;
70741
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
70742
0
          if (num_bits_3 == 24) {
70743
0
            t_3 = ((uint64_t)(*scratch >> 32));
70744
0
            break;
70745
0
          }
70746
0
          num_bits_3 += 8u;
70747
0
          *scratch |= ((uint64_t)(num_bits_3));
70748
0
        }
70749
0
      }
70750
0
      v_u = t_3;
70751
0
    }
70752
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 8u);
70753
0
    {
70754
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
70755
0
      uint64_t t_4;
70756
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70757
0
        t_4 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70758
0
        iop_a_src += 4;
70759
0
      } else {
70760
0
        self->private_data.s_decode_chrm.scratch = 0;
70761
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
70762
0
        while (true) {
70763
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70764
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70765
0
            goto suspend;
70766
0
          }
70767
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70768
0
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
70769
0
          *scratch >>= 8;
70770
0
          *scratch <<= 8;
70771
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
70772
0
          if (num_bits_4 == 24) {
70773
0
            t_4 = ((uint64_t)(*scratch >> 32));
70774
0
            break;
70775
0
          }
70776
0
          num_bits_4 += 8u;
70777
0
          *scratch |= ((uint64_t)(num_bits_4));
70778
0
        }
70779
0
      }
70780
0
      v_u = t_4;
70781
0
    }
70782
0
    self->private_impl.f_metadata_y |= ((16777215u & v_u) << 32u);
70783
0
    {
70784
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
70785
0
      uint64_t t_5;
70786
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70787
0
        t_5 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70788
0
        iop_a_src += 4;
70789
0
      } else {
70790
0
        self->private_data.s_decode_chrm.scratch = 0;
70791
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
70792
0
        while (true) {
70793
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70794
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70795
0
            goto suspend;
70796
0
          }
70797
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70798
0
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
70799
0
          *scratch >>= 8;
70800
0
          *scratch <<= 8;
70801
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
70802
0
          if (num_bits_5 == 24) {
70803
0
            t_5 = ((uint64_t)(*scratch >> 32));
70804
0
            break;
70805
0
          }
70806
0
          num_bits_5 += 8u;
70807
0
          *scratch |= ((uint64_t)(num_bits_5));
70808
0
        }
70809
0
      }
70810
0
      v_u = t_5;
70811
0
    }
70812
0
    self->private_impl.f_metadata_y |= ((uint64_t)((16777215u & v_u) << 56u));
70813
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) >> 8u);
70814
0
    {
70815
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
70816
0
      uint64_t t_6;
70817
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70818
0
        t_6 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70819
0
        iop_a_src += 4;
70820
0
      } else {
70821
0
        self->private_data.s_decode_chrm.scratch = 0;
70822
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
70823
0
        while (true) {
70824
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70825
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70826
0
            goto suspend;
70827
0
          }
70828
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70829
0
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
70830
0
          *scratch >>= 8;
70831
0
          *scratch <<= 8;
70832
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
70833
0
          if (num_bits_6 == 24) {
70834
0
            t_6 = ((uint64_t)(*scratch >> 32));
70835
0
            break;
70836
0
          }
70837
0
          num_bits_6 += 8u;
70838
0
          *scratch |= ((uint64_t)(num_bits_6));
70839
0
        }
70840
0
      }
70841
0
      v_u = t_6;
70842
0
    }
70843
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 16u);
70844
0
    {
70845
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
70846
0
      uint64_t t_7;
70847
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70848
0
        t_7 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
70849
0
        iop_a_src += 4;
70850
0
      } else {
70851
0
        self->private_data.s_decode_chrm.scratch = 0;
70852
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
70853
0
        while (true) {
70854
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70855
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70856
0
            goto suspend;
70857
0
          }
70858
0
          uint64_t* scratch = &self->private_data.s_decode_chrm.scratch;
70859
0
          uint32_t num_bits_7 = ((uint32_t)(*scratch & 0xFFu));
70860
0
          *scratch >>= 8;
70861
0
          *scratch <<= 8;
70862
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_7);
70863
0
          if (num_bits_7 == 24) {
70864
0
            t_7 = ((uint64_t)(*scratch >> 32));
70865
0
            break;
70866
0
          }
70867
0
          num_bits_7 += 8u;
70868
0
          *scratch |= ((uint64_t)(num_bits_7));
70869
0
        }
70870
0
      }
70871
0
      v_u = t_7;
70872
0
    }
70873
0
    self->private_impl.f_metadata_z |= ((16777215u & v_u) << 40u);
70874
70875
0
    goto ok;
70876
0
    ok:
70877
0
    self->private_impl.p_decode_chrm = 0;
70878
0
    goto exit;
70879
0
  }
70880
70881
0
  goto suspend;
70882
0
  suspend:
70883
0
  self->private_impl.p_decode_chrm = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
70884
70885
0
  goto exit;
70886
0
  exit:
70887
0
  if (a_src && a_src->data.ptr) {
70888
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70889
0
  }
70890
70891
0
  return status;
70892
0
}
70893
70894
// -------- func png.decoder.decode_exif
70895
70896
WUFFS_BASE__GENERATED_C_CODE
70897
static wuffs_base__status
70898
wuffs_png__decoder__decode_exif(
70899
    wuffs_png__decoder* self,
70900
0
    wuffs_base__io_buffer* a_src) {
70901
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
70902
70903
0
  const uint8_t* iop_a_src = NULL;
70904
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70905
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70906
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70907
0
  if (a_src && a_src->data.ptr) {
70908
0
    io0_a_src = a_src->data.ptr;
70909
0
    io1_a_src = io0_a_src + a_src->meta.ri;
70910
0
    iop_a_src = io1_a_src;
70911
0
    io2_a_src = io0_a_src + a_src->meta.wi;
70912
0
  }
70913
70914
0
  if (self->private_impl.f_chunk_length < 4u) {
70915
0
    status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70916
0
    goto exit;
70917
0
  }
70918
0
  self->private_impl.f_metadata_flavor = 3u;
70919
0
  self->private_impl.f_metadata_fourcc = 1163413830u;
70920
0
  self->private_impl.f_metadata_x = 0u;
70921
0
  self->private_impl.f_metadata_y = wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)));
70922
0
  self->private_impl.f_metadata_z = wuffs_base__u64__sat_add(self->private_impl.f_metadata_y, ((uint64_t)(self->private_impl.f_chunk_length)));
70923
0
  self->private_impl.f_chunk_length = 0u;
70924
70925
0
  goto ok;
70926
0
  ok:
70927
0
  goto exit;
70928
0
  exit:
70929
0
  if (a_src && a_src->data.ptr) {
70930
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
70931
0
  }
70932
70933
0
  return status;
70934
0
}
70935
70936
// -------- func png.decoder.decode_fctl
70937
70938
WUFFS_BASE__GENERATED_C_CODE
70939
static wuffs_base__status
70940
wuffs_png__decoder__decode_fctl(
70941
    wuffs_png__decoder* self,
70942
2.73k
    wuffs_base__io_buffer* a_src) {
70943
2.73k
  wuffs_base__status status = wuffs_base__make_status(NULL);
70944
70945
2.73k
  uint32_t v_x0 = 0;
70946
2.73k
  uint32_t v_y0 = 0;
70947
2.73k
  uint32_t v_x1 = 0;
70948
2.73k
  uint32_t v_y1 = 0;
70949
70950
2.73k
  const uint8_t* iop_a_src = NULL;
70951
2.73k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70952
2.73k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70953
2.73k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
70954
2.73k
  if (a_src && a_src->data.ptr) {
70955
2.73k
    io0_a_src = a_src->data.ptr;
70956
2.73k
    io1_a_src = io0_a_src + a_src->meta.ri;
70957
2.73k
    iop_a_src = io1_a_src;
70958
2.73k
    io2_a_src = io0_a_src + a_src->meta.wi;
70959
2.73k
  }
70960
70961
2.73k
  uint32_t coro_susp_point = self->private_impl.p_decode_fctl;
70962
2.73k
  if (coro_susp_point) {
70963
0
    v_x0 = self->private_data.s_decode_fctl.v_x0;
70964
0
    v_x1 = self->private_data.s_decode_fctl.v_x1;
70965
0
    v_y1 = self->private_data.s_decode_fctl.v_y1;
70966
0
  }
70967
2.73k
  switch (coro_susp_point) {
70968
2.73k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
70969
70970
2.73k
    if (self->private_impl.f_chunk_length != 26u) {
70971
5
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
70972
5
      goto exit;
70973
5
    }
70974
2.73k
    self->private_impl.f_chunk_length = 0u;
70975
2.73k
    {
70976
2.73k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
70977
2.73k
      uint32_t t_0;
70978
2.73k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
70979
2.72k
        t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
70980
2.72k
        iop_a_src += 4;
70981
2.72k
      } else {
70982
8
        self->private_data.s_decode_fctl.scratch = 0;
70983
8
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
70984
15
        while (true) {
70985
15
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
70986
8
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
70987
8
            goto suspend;
70988
8
          }
70989
7
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
70990
7
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
70991
7
          *scratch >>= 8;
70992
7
          *scratch <<= 8;
70993
7
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
70994
7
          if (num_bits_0 == 24) {
70995
0
            t_0 = ((uint32_t)(*scratch >> 32));
70996
0
            break;
70997
0
          }
70998
7
          num_bits_0 += 8u;
70999
7
          *scratch |= ((uint64_t)(num_bits_0));
71000
7
        }
71001
8
      }
71002
2.72k
      v_x0 = t_0;
71003
2.72k
    }
71004
2.72k
    if (v_x0 != self->private_impl.f_next_animation_seq_num) {
71005
56
      status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
71006
56
      goto exit;
71007
2.67k
    } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
71008
0
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
71009
0
      goto exit;
71010
0
    }
71011
2.67k
    self->private_impl.f_next_animation_seq_num += 1u;
71012
2.67k
    {
71013
2.67k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71014
2.67k
      uint32_t t_1;
71015
2.67k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71016
2.66k
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71017
2.66k
        iop_a_src += 4;
71018
2.66k
      } else {
71019
9
        self->private_data.s_decode_fctl.scratch = 0;
71020
9
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71021
20
        while (true) {
71022
20
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71023
9
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71024
9
            goto suspend;
71025
9
          }
71026
11
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71027
11
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71028
11
          *scratch >>= 8;
71029
11
          *scratch <<= 8;
71030
11
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71031
11
          if (num_bits_1 == 24) {
71032
0
            t_1 = ((uint32_t)(*scratch >> 32));
71033
0
            break;
71034
0
          }
71035
11
          num_bits_1 += 8u;
71036
11
          *scratch |= ((uint64_t)(num_bits_1));
71037
11
        }
71038
9
      }
71039
2.66k
      v_x1 = t_1;
71040
2.66k
    }
71041
0
    {
71042
2.66k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71043
2.66k
      uint32_t t_2;
71044
2.66k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71045
2.65k
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71046
2.65k
        iop_a_src += 4;
71047
2.65k
      } else {
71048
7
        self->private_data.s_decode_fctl.scratch = 0;
71049
7
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71050
13
        while (true) {
71051
13
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71052
7
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71053
7
            goto suspend;
71054
7
          }
71055
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71056
6
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
71057
6
          *scratch >>= 8;
71058
6
          *scratch <<= 8;
71059
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
71060
6
          if (num_bits_2 == 24) {
71061
0
            t_2 = ((uint32_t)(*scratch >> 32));
71062
0
            break;
71063
0
          }
71064
6
          num_bits_2 += 8u;
71065
6
          *scratch |= ((uint64_t)(num_bits_2));
71066
6
        }
71067
7
      }
71068
2.65k
      v_y1 = t_2;
71069
2.65k
    }
71070
0
    {
71071
2.65k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
71072
2.65k
      uint32_t t_3;
71073
2.65k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71074
2.64k
        t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71075
2.64k
        iop_a_src += 4;
71076
2.64k
      } else {
71077
8
        self->private_data.s_decode_fctl.scratch = 0;
71078
8
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
71079
14
        while (true) {
71080
14
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71081
8
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71082
8
            goto suspend;
71083
8
          }
71084
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71085
6
          uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
71086
6
          *scratch >>= 8;
71087
6
          *scratch <<= 8;
71088
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
71089
6
          if (num_bits_3 == 24) {
71090
0
            t_3 = ((uint32_t)(*scratch >> 32));
71091
0
            break;
71092
0
          }
71093
6
          num_bits_3 += 8u;
71094
6
          *scratch |= ((uint64_t)(num_bits_3));
71095
6
        }
71096
8
      }
71097
2.64k
      v_x0 = t_3;
71098
2.64k
    }
71099
0
    {
71100
2.64k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
71101
2.64k
      uint32_t t_4;
71102
2.64k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71103
2.64k
        t_4 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71104
2.64k
        iop_a_src += 4;
71105
2.64k
      } else {
71106
6
        self->private_data.s_decode_fctl.scratch = 0;
71107
6
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
71108
12
        while (true) {
71109
12
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71110
6
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71111
6
            goto suspend;
71112
6
          }
71113
6
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71114
6
          uint32_t num_bits_4 = ((uint32_t)(*scratch & 0xFFu));
71115
6
          *scratch >>= 8;
71116
6
          *scratch <<= 8;
71117
6
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_4);
71118
6
          if (num_bits_4 == 24) {
71119
0
            t_4 = ((uint32_t)(*scratch >> 32));
71120
0
            break;
71121
0
          }
71122
6
          num_bits_4 += 8u;
71123
6
          *scratch |= ((uint64_t)(num_bits_4));
71124
6
        }
71125
6
      }
71126
2.64k
      v_y0 = t_4;
71127
2.64k
    }
71128
0
    v_x1 += v_x0;
71129
2.64k
    v_y1 += v_y0;
71130
2.64k
    if ((v_x0 >= v_x1) ||
71131
2.64k
        (v_x0 > self->private_impl.f_width) ||
71132
2.64k
        (v_x1 > self->private_impl.f_width) ||
71133
2.64k
        (v_y0 >= v_y1) ||
71134
2.64k
        (v_y0 > self->private_impl.f_height) ||
71135
2.64k
        (v_y1 > self->private_impl.f_height)) {
71136
187
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71137
187
      goto exit;
71138
187
    }
71139
2.45k
    self->private_impl.f_frame_rect_x0 = v_x0;
71140
2.45k
    self->private_impl.f_frame_rect_y0 = v_y0;
71141
2.45k
    self->private_impl.f_frame_rect_x1 = v_x1;
71142
2.45k
    self->private_impl.f_frame_rect_y1 = v_y1;
71143
2.45k
    {
71144
2.45k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
71145
2.45k
      uint32_t t_5;
71146
2.45k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
71147
2.44k
        t_5 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
71148
2.44k
        iop_a_src += 2;
71149
2.44k
      } else {
71150
5
        self->private_data.s_decode_fctl.scratch = 0;
71151
5
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
71152
8
        while (true) {
71153
8
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71154
5
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71155
5
            goto suspend;
71156
5
          }
71157
3
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71158
3
          uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
71159
3
          *scratch >>= 8;
71160
3
          *scratch <<= 8;
71161
3
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
71162
3
          if (num_bits_5 == 8) {
71163
0
            t_5 = ((uint32_t)(*scratch >> 48));
71164
0
            break;
71165
0
          }
71166
3
          num_bits_5 += 8u;
71167
3
          *scratch |= ((uint64_t)(num_bits_5));
71168
3
        }
71169
5
      }
71170
2.44k
      v_x0 = t_5;
71171
2.44k
    }
71172
0
    {
71173
2.44k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
71174
2.44k
      uint32_t t_6;
71175
2.44k
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
71176
2.44k
        t_6 = ((uint32_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
71177
2.44k
        iop_a_src += 2;
71178
2.44k
      } else {
71179
7
        self->private_data.s_decode_fctl.scratch = 0;
71180
7
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
71181
10
        while (true) {
71182
10
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71183
7
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71184
7
            goto suspend;
71185
7
          }
71186
3
          uint64_t* scratch = &self->private_data.s_decode_fctl.scratch;
71187
3
          uint32_t num_bits_6 = ((uint32_t)(*scratch & 0xFFu));
71188
3
          *scratch >>= 8;
71189
3
          *scratch <<= 8;
71190
3
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_6);
71191
3
          if (num_bits_6 == 8) {
71192
0
            t_6 = ((uint32_t)(*scratch >> 48));
71193
0
            break;
71194
0
          }
71195
3
          num_bits_6 += 8u;
71196
3
          *scratch |= ((uint64_t)(num_bits_6));
71197
3
        }
71198
7
      }
71199
2.44k
      v_x1 = t_6;
71200
2.44k
    }
71201
2.44k
    if (v_x1 <= 0u) {
71202
401
      self->private_impl.f_frame_duration = (((uint64_t)(v_x0)) * 7056000u);
71203
2.04k
    } else {
71204
2.04k
      self->private_impl.f_frame_duration = ((((uint64_t)(v_x0)) * 705600000u) / ((uint64_t)(v_x1)));
71205
2.04k
    }
71206
2.44k
    {
71207
2.44k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
71208
2.44k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71209
18
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71210
18
        goto suspend;
71211
18
      }
71212
2.42k
      uint32_t t_7 = *iop_a_src++;
71213
2.42k
      v_x0 = t_7;
71214
2.42k
    }
71215
2.42k
    if (v_x0 == 0u) {
71216
1.03k
      self->private_impl.f_frame_disposal = 0u;
71217
1.38k
    } else if (v_x0 == 1u) {
71218
1.31k
      self->private_impl.f_frame_disposal = 1u;
71219
1.31k
    } else if (v_x0 == 2u) {
71220
64
      self->private_impl.f_frame_disposal = 2u;
71221
64
    } else {
71222
11
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71223
11
      goto exit;
71224
11
    }
71225
2.41k
    {
71226
2.41k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
71227
2.41k
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71228
8
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71229
8
        goto suspend;
71230
8
      }
71231
2.40k
      uint32_t t_8 = *iop_a_src++;
71232
2.40k
      v_x0 = t_8;
71233
2.40k
    }
71234
2.40k
    if (v_x0 == 0u) {
71235
2.20k
      self->private_impl.f_frame_overwrite_instead_of_blend = true;
71236
2.20k
    } else if (v_x0 == 1u) {
71237
186
      self->private_impl.f_frame_overwrite_instead_of_blend = false;
71238
186
    } else {
71239
11
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71240
11
      goto exit;
71241
11
    }
71242
2.39k
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
71243
356
      self->private_impl.f_first_rect_x0 = self->private_impl.f_frame_rect_x0;
71244
356
      self->private_impl.f_first_rect_y0 = self->private_impl.f_frame_rect_y0;
71245
356
      self->private_impl.f_first_rect_x1 = self->private_impl.f_frame_rect_x1;
71246
356
      self->private_impl.f_first_rect_y1 = self->private_impl.f_frame_rect_y1;
71247
356
      self->private_impl.f_first_duration = self->private_impl.f_frame_duration;
71248
356
      self->private_impl.f_first_disposal = self->private_impl.f_frame_disposal;
71249
356
      self->private_impl.f_first_overwrite_instead_of_blend = self->private_impl.f_frame_overwrite_instead_of_blend;
71250
356
    }
71251
71252
2.39k
    goto ok;
71253
2.39k
    ok:
71254
2.39k
    self->private_impl.p_decode_fctl = 0;
71255
2.39k
    goto exit;
71256
2.73k
  }
71257
71258
0
  goto suspend;
71259
76
  suspend:
71260
76
  self->private_impl.p_decode_fctl = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71261
76
  self->private_data.s_decode_fctl.v_x0 = v_x0;
71262
76
  self->private_data.s_decode_fctl.v_x1 = v_x1;
71263
76
  self->private_data.s_decode_fctl.v_y1 = v_y1;
71264
71265
76
  goto exit;
71266
2.73k
  exit:
71267
2.73k
  if (a_src && a_src->data.ptr) {
71268
2.73k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71269
2.73k
  }
71270
71271
2.73k
  return status;
71272
2.73k
}
71273
71274
// -------- func png.decoder.decode_gama
71275
71276
WUFFS_BASE__GENERATED_C_CODE
71277
static wuffs_base__status
71278
wuffs_png__decoder__decode_gama(
71279
    wuffs_png__decoder* self,
71280
0
    wuffs_base__io_buffer* a_src) {
71281
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
71282
71283
0
  const uint8_t* iop_a_src = NULL;
71284
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71285
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71286
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71287
0
  if (a_src && a_src->data.ptr) {
71288
0
    io0_a_src = a_src->data.ptr;
71289
0
    io1_a_src = io0_a_src + a_src->meta.ri;
71290
0
    iop_a_src = io1_a_src;
71291
0
    io2_a_src = io0_a_src + a_src->meta.wi;
71292
0
  }
71293
71294
0
  uint32_t coro_susp_point = self->private_impl.p_decode_gama;
71295
0
  switch (coro_susp_point) {
71296
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71297
71298
0
    if (self->private_impl.f_chunk_length != 4u) {
71299
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71300
0
      goto exit;
71301
0
    }
71302
0
    self->private_impl.f_chunk_length = 0u;
71303
0
    self->private_impl.f_metadata_flavor = 5u;
71304
0
    self->private_impl.f_metadata_fourcc = 1195461953u;
71305
0
    {
71306
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71307
0
      uint64_t t_0;
71308
0
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71309
0
        t_0 = ((uint64_t)(wuffs_base__peek_u32be__no_bounds_check(iop_a_src)));
71310
0
        iop_a_src += 4;
71311
0
      } else {
71312
0
        self->private_data.s_decode_gama.scratch = 0;
71313
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71314
0
        while (true) {
71315
0
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71316
0
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71317
0
            goto suspend;
71318
0
          }
71319
0
          uint64_t* scratch = &self->private_data.s_decode_gama.scratch;
71320
0
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71321
0
          *scratch >>= 8;
71322
0
          *scratch <<= 8;
71323
0
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71324
0
          if (num_bits_0 == 24) {
71325
0
            t_0 = ((uint64_t)(*scratch >> 32));
71326
0
            break;
71327
0
          }
71328
0
          num_bits_0 += 8u;
71329
0
          *scratch |= ((uint64_t)(num_bits_0));
71330
0
        }
71331
0
      }
71332
0
      self->private_impl.f_metadata_x = t_0;
71333
0
    }
71334
0
    self->private_impl.f_metadata_y = 0u;
71335
0
    self->private_impl.f_metadata_z = 0u;
71336
71337
0
    goto ok;
71338
0
    ok:
71339
0
    self->private_impl.p_decode_gama = 0;
71340
0
    goto exit;
71341
0
  }
71342
71343
0
  goto suspend;
71344
0
  suspend:
71345
0
  self->private_impl.p_decode_gama = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71346
71347
0
  goto exit;
71348
0
  exit:
71349
0
  if (a_src && a_src->data.ptr) {
71350
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71351
0
  }
71352
71353
0
  return status;
71354
0
}
71355
71356
// -------- func png.decoder.decode_iccp
71357
71358
WUFFS_BASE__GENERATED_C_CODE
71359
static wuffs_base__status
71360
wuffs_png__decoder__decode_iccp(
71361
    wuffs_png__decoder* self,
71362
0
    wuffs_base__io_buffer* a_src) {
71363
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
71364
71365
0
  uint8_t v_c8 = 0;
71366
71367
0
  const uint8_t* iop_a_src = NULL;
71368
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71369
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71370
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71371
0
  if (a_src && a_src->data.ptr) {
71372
0
    io0_a_src = a_src->data.ptr;
71373
0
    io1_a_src = io0_a_src + a_src->meta.ri;
71374
0
    iop_a_src = io1_a_src;
71375
0
    io2_a_src = io0_a_src + a_src->meta.wi;
71376
0
  }
71377
71378
0
  uint32_t coro_susp_point = self->private_impl.p_decode_iccp;
71379
0
  switch (coro_susp_point) {
71380
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71381
71382
0
    while (true) {
71383
0
      if (self->private_impl.f_chunk_length <= 0u) {
71384
0
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71385
0
        goto exit;
71386
0
      }
71387
0
      self->private_impl.f_chunk_length -= 1u;
71388
0
      {
71389
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71390
0
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71391
0
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71392
0
          goto suspend;
71393
0
        }
71394
0
        uint8_t t_0 = *iop_a_src++;
71395
0
        v_c8 = t_0;
71396
0
      }
71397
0
      if (v_c8 == 0u) {
71398
0
        break;
71399
0
      }
71400
0
    }
71401
0
    if (self->private_impl.f_chunk_length <= 0u) {
71402
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71403
0
      goto exit;
71404
0
    }
71405
0
    self->private_impl.f_chunk_length -= 1u;
71406
0
    {
71407
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71408
0
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71409
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71410
0
        goto suspend;
71411
0
      }
71412
0
      uint8_t t_1 = *iop_a_src++;
71413
0
      v_c8 = t_1;
71414
0
    }
71415
0
    if (v_c8 != 0u) {
71416
0
      status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
71417
0
      goto exit;
71418
0
    }
71419
0
    self->private_impl.f_metadata_is_zlib_compressed = true;
71420
0
    self->private_impl.f_metadata_flavor = 4u;
71421
0
    self->private_impl.f_metadata_fourcc = 1229144912u;
71422
0
    self->private_impl.f_metadata_x = 0u;
71423
0
    self->private_impl.f_metadata_y = 0u;
71424
0
    self->private_impl.f_metadata_z = 0u;
71425
71426
0
    goto ok;
71427
0
    ok:
71428
0
    self->private_impl.p_decode_iccp = 0;
71429
0
    goto exit;
71430
0
  }
71431
71432
0
  goto suspend;
71433
0
  suspend:
71434
0
  self->private_impl.p_decode_iccp = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71435
71436
0
  goto exit;
71437
0
  exit:
71438
0
  if (a_src && a_src->data.ptr) {
71439
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71440
0
  }
71441
71442
0
  return status;
71443
0
}
71444
71445
// -------- func png.decoder.decode_plte
71446
71447
WUFFS_BASE__GENERATED_C_CODE
71448
static wuffs_base__status
71449
wuffs_png__decoder__decode_plte(
71450
    wuffs_png__decoder* self,
71451
326
    wuffs_base__io_buffer* a_src) {
71452
326
  wuffs_base__status status = wuffs_base__make_status(NULL);
71453
71454
326
  uint32_t v_num_entries = 0;
71455
326
  uint32_t v_i = 0;
71456
326
  uint32_t v_argb = 0;
71457
71458
326
  const uint8_t* iop_a_src = NULL;
71459
326
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71460
326
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71461
326
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71462
326
  if (a_src && a_src->data.ptr) {
71463
326
    io0_a_src = a_src->data.ptr;
71464
326
    io1_a_src = io0_a_src + a_src->meta.ri;
71465
326
    iop_a_src = io1_a_src;
71466
326
    io2_a_src = io0_a_src + a_src->meta.wi;
71467
326
  }
71468
71469
326
  uint32_t coro_susp_point = self->private_impl.p_decode_plte;
71470
326
  if (coro_susp_point) {
71471
0
    v_num_entries = self->private_data.s_decode_plte.v_num_entries;
71472
0
    v_i = self->private_data.s_decode_plte.v_i;
71473
0
  }
71474
326
  switch (coro_susp_point) {
71475
326
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71476
71477
326
    if ((self->private_impl.f_chunk_length > 768u) || ((self->private_impl.f_chunk_length % 3u) != 0u)) {
71478
36
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71479
36
      goto exit;
71480
36
    }
71481
290
    v_num_entries = (((uint32_t)(self->private_impl.f_chunk_length)) / 3u);
71482
290
    self->private_impl.f_chunk_length = 0u;
71483
7.20k
    while (v_i < v_num_entries) {
71484
6.94k
      {
71485
6.94k
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71486
6.94k
        uint32_t t_0;
71487
6.94k
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
71488
6.91k
          t_0 = ((uint32_t)(wuffs_base__peek_u24be__no_bounds_check(iop_a_src)));
71489
6.91k
          iop_a_src += 3;
71490
6.91k
        } else {
71491
26
          self->private_data.s_decode_plte.scratch = 0;
71492
26
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71493
42
          while (true) {
71494
42
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71495
26
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71496
26
              goto suspend;
71497
26
            }
71498
16
            uint64_t* scratch = &self->private_data.s_decode_plte.scratch;
71499
16
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71500
16
            *scratch >>= 8;
71501
16
            *scratch <<= 8;
71502
16
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71503
16
            if (num_bits_0 == 16) {
71504
0
              t_0 = ((uint32_t)(*scratch >> 40));
71505
0
              break;
71506
0
            }
71507
16
            num_bits_0 += 8u;
71508
16
            *scratch |= ((uint64_t)(num_bits_0));
71509
16
          }
71510
26
        }
71511
6.91k
        v_argb = t_0;
71512
6.91k
      }
71513
0
      v_argb |= 4278190080u;
71514
6.91k
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = ((uint8_t)((v_argb >> 0u)));
71515
6.91k
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = ((uint8_t)((v_argb >> 8u)));
71516
6.91k
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = ((uint8_t)((v_argb >> 16u)));
71517
6.91k
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = ((uint8_t)((v_argb >> 24u)));
71518
6.91k
      v_i += 1u;
71519
6.91k
    }
71520
61.7k
    while (v_i < 256u) {
71521
61.4k
      self->private_data.f_src_palette[((4u * v_i) + 0u)] = 0u;
71522
61.4k
      self->private_data.f_src_palette[((4u * v_i) + 1u)] = 0u;
71523
61.4k
      self->private_data.f_src_palette[((4u * v_i) + 2u)] = 0u;
71524
61.4k
      self->private_data.f_src_palette[((4u * v_i) + 3u)] = 255u;
71525
61.4k
      v_i += 1u;
71526
61.4k
    }
71527
71528
264
    goto ok;
71529
264
    ok:
71530
264
    self->private_impl.p_decode_plte = 0;
71531
264
    goto exit;
71532
326
  }
71533
71534
0
  goto suspend;
71535
26
  suspend:
71536
26
  self->private_impl.p_decode_plte = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71537
26
  self->private_data.s_decode_plte.v_num_entries = v_num_entries;
71538
26
  self->private_data.s_decode_plte.v_i = v_i;
71539
71540
26
  goto exit;
71541
326
  exit:
71542
326
  if (a_src && a_src->data.ptr) {
71543
326
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71544
326
  }
71545
71546
326
  return status;
71547
326
}
71548
71549
// -------- func png.decoder.decode_srgb
71550
71551
WUFFS_BASE__GENERATED_C_CODE
71552
static wuffs_base__status
71553
wuffs_png__decoder__decode_srgb(
71554
    wuffs_png__decoder* self,
71555
0
    wuffs_base__io_buffer* a_src) {
71556
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
71557
71558
0
  const uint8_t* iop_a_src = NULL;
71559
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71560
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71561
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71562
0
  if (a_src && a_src->data.ptr) {
71563
0
    io0_a_src = a_src->data.ptr;
71564
0
    io1_a_src = io0_a_src + a_src->meta.ri;
71565
0
    iop_a_src = io1_a_src;
71566
0
    io2_a_src = io0_a_src + a_src->meta.wi;
71567
0
  }
71568
71569
0
  uint32_t coro_susp_point = self->private_impl.p_decode_srgb;
71570
0
  switch (coro_susp_point) {
71571
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71572
71573
0
    if (self->private_impl.f_chunk_length != 1u) {
71574
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71575
0
      goto exit;
71576
0
    }
71577
0
    self->private_impl.f_chunk_length = 0u;
71578
0
    self->private_impl.f_metadata_flavor = 5u;
71579
0
    self->private_impl.f_metadata_fourcc = 1397901122u;
71580
0
    {
71581
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71582
0
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71583
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71584
0
        goto suspend;
71585
0
      }
71586
0
      uint64_t t_0 = *iop_a_src++;
71587
0
      self->private_impl.f_metadata_x = t_0;
71588
0
    }
71589
0
    self->private_impl.f_metadata_y = 0u;
71590
0
    self->private_impl.f_metadata_z = 0u;
71591
71592
0
    goto ok;
71593
0
    ok:
71594
0
    self->private_impl.p_decode_srgb = 0;
71595
0
    goto exit;
71596
0
  }
71597
71598
0
  goto suspend;
71599
0
  suspend:
71600
0
  self->private_impl.p_decode_srgb = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71601
71602
0
  goto exit;
71603
0
  exit:
71604
0
  if (a_src && a_src->data.ptr) {
71605
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71606
0
  }
71607
71608
0
  return status;
71609
0
}
71610
71611
// -------- func png.decoder.decode_trns
71612
71613
WUFFS_BASE__GENERATED_C_CODE
71614
static wuffs_base__status
71615
wuffs_png__decoder__decode_trns(
71616
    wuffs_png__decoder* self,
71617
354
    wuffs_base__io_buffer* a_src) {
71618
354
  wuffs_base__status status = wuffs_base__make_status(NULL);
71619
71620
354
  uint32_t v_i = 0;
71621
354
  uint32_t v_n = 0;
71622
354
  uint64_t v_u = 0;
71623
71624
354
  const uint8_t* iop_a_src = NULL;
71625
354
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71626
354
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71627
354
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71628
354
  if (a_src && a_src->data.ptr) {
71629
354
    io0_a_src = a_src->data.ptr;
71630
354
    io1_a_src = io0_a_src + a_src->meta.ri;
71631
354
    iop_a_src = io1_a_src;
71632
354
    io2_a_src = io0_a_src + a_src->meta.wi;
71633
354
  }
71634
71635
354
  uint32_t coro_susp_point = self->private_impl.p_decode_trns;
71636
354
  if (coro_susp_point) {
71637
0
    v_i = self->private_data.s_decode_trns.v_i;
71638
0
    v_n = self->private_data.s_decode_trns.v_n;
71639
0
  }
71640
354
  switch (coro_susp_point) {
71641
354
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71642
71643
354
    if (self->private_impl.f_color_type == 0u) {
71644
126
      self->private_impl.choosy_filter_and_swizzle = (
71645
126
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71646
126
      if (self->private_impl.f_depth <= 8u) {
71647
103
        self->private_impl.f_dst_pixfmt = 2164295816u;
71648
103
        self->private_impl.f_src_pixfmt = 2164295816u;
71649
103
      } else {
71650
23
        self->private_impl.f_dst_pixfmt = 2164308923u;
71651
23
        self->private_impl.f_src_pixfmt = 2164308923u;
71652
23
      }
71653
126
      if (self->private_impl.f_chunk_length != 2u) {
71654
43
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71655
43
        goto exit;
71656
43
      }
71657
83
      self->private_impl.f_chunk_length = 0u;
71658
83
      {
71659
83
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71660
83
        uint64_t t_0;
71661
83
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
71662
81
          t_0 = ((uint64_t)(wuffs_base__peek_u16be__no_bounds_check(iop_a_src)));
71663
81
          iop_a_src += 2;
71664
81
        } else {
71665
2
          self->private_data.s_decode_trns.scratch = 0;
71666
2
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71667
3
          while (true) {
71668
3
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71669
2
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71670
2
              goto suspend;
71671
2
            }
71672
1
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
71673
1
            uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71674
1
            *scratch >>= 8;
71675
1
            *scratch <<= 8;
71676
1
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71677
1
            if (num_bits_0 == 8) {
71678
0
              t_0 = ((uint64_t)(*scratch >> 48));
71679
0
              break;
71680
0
            }
71681
1
            num_bits_0 += 8u;
71682
1
            *scratch |= ((uint64_t)(num_bits_0));
71683
1
          }
71684
2
        }
71685
81
        v_u = t_0;
71686
81
      }
71687
81
      if (self->private_impl.f_depth <= 1u) {
71688
13
        self->private_impl.f_remap_transparency = (((v_u & 1u) * 16777215u) | 4278190080u);
71689
68
      } else if (self->private_impl.f_depth <= 2u) {
71690
19
        self->private_impl.f_remap_transparency = (((v_u & 3u) * 5592405u) | 4278190080u);
71691
49
      } else if (self->private_impl.f_depth <= 4u) {
71692
9
        self->private_impl.f_remap_transparency = (((v_u & 15u) * 1118481u) | 4278190080u);
71693
40
      } else if (self->private_impl.f_depth <= 8u) {
71694
26
        self->private_impl.f_remap_transparency = (((v_u & 255u) * 65793u) | 4278190080u);
71695
26
      } else {
71696
14
        self->private_impl.f_remap_transparency = ((v_u * 4295032833u) | 18446462598732840960u);
71697
14
      }
71698
228
    } else if (self->private_impl.f_color_type == 2u) {
71699
141
      self->private_impl.choosy_filter_and_swizzle = (
71700
141
          &wuffs_png__decoder__filter_and_swizzle_tricky);
71701
141
      if (self->private_impl.f_depth <= 8u) {
71702
125
        self->private_impl.f_dst_pixfmt = 2164295816u;
71703
125
        self->private_impl.f_src_pixfmt = 2164295816u;
71704
125
      } else {
71705
16
        self->private_impl.f_dst_pixfmt = 2164308923u;
71706
16
        self->private_impl.f_src_pixfmt = 2164308923u;
71707
16
      }
71708
141
      if (self->private_impl.f_chunk_length != 6u) {
71709
42
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71710
42
        goto exit;
71711
42
      }
71712
99
      self->private_impl.f_chunk_length = 0u;
71713
99
      {
71714
99
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71715
99
        uint64_t t_1;
71716
99
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
71717
94
          t_1 = ((uint64_t)(wuffs_base__peek_u48be__no_bounds_check(iop_a_src)));
71718
94
          iop_a_src += 6;
71719
94
        } else {
71720
5
          self->private_data.s_decode_trns.scratch = 0;
71721
5
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71722
15
          while (true) {
71723
15
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71724
5
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71725
5
              goto suspend;
71726
5
            }
71727
10
            uint64_t* scratch = &self->private_data.s_decode_trns.scratch;
71728
10
            uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
71729
10
            *scratch >>= 8;
71730
10
            *scratch <<= 8;
71731
10
            *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
71732
10
            if (num_bits_1 == 40) {
71733
0
              t_1 = ((uint64_t)(*scratch >> 16));
71734
0
              break;
71735
0
            }
71736
10
            num_bits_1 += 8u;
71737
10
            *scratch |= ((uint64_t)(num_bits_1));
71738
10
          }
71739
5
        }
71740
94
        v_u = t_1;
71741
94
      }
71742
94
      if (self->private_impl.f_depth <= 8u) {
71743
81
        self->private_impl.f_remap_transparency = ((255u & (v_u >> 0u)) |
71744
81
            (65280u & (v_u >> 8u)) |
71745
81
            (16711680u & (v_u >> 16u)) |
71746
81
            4278190080u);
71747
81
      } else {
71748
13
        self->private_impl.f_remap_transparency = (v_u | 18446462598732840960u);
71749
13
      }
71750
94
    } else if (self->private_impl.f_color_type == 3u) {
71751
87
      self->private_impl.f_dst_pixfmt = 2164523016u;
71752
87
      self->private_impl.f_src_pixfmt = 2164523016u;
71753
87
      if (self->private_impl.f_chunk_length > 256u) {
71754
29
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71755
29
        goto exit;
71756
29
      }
71757
58
      v_n = ((uint32_t)(self->private_impl.f_chunk_length));
71758
58
      self->private_impl.f_chunk_length = 0u;
71759
730
      while (v_i < v_n) {
71760
691
        {
71761
691
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71762
691
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71763
19
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71764
19
            goto suspend;
71765
19
          }
71766
672
          uint8_t t_2 = *iop_a_src++;
71767
672
          self->private_data.f_src_palette[((4u * v_i) + 3u)] = t_2;
71768
672
        }
71769
0
        v_i += 1u;
71770
672
      }
71771
58
    } else {
71772
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
71773
0
      goto exit;
71774
0
    }
71775
71776
214
    goto ok;
71777
214
    ok:
71778
214
    self->private_impl.p_decode_trns = 0;
71779
214
    goto exit;
71780
354
  }
71781
71782
0
  goto suspend;
71783
26
  suspend:
71784
26
  self->private_impl.p_decode_trns = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71785
26
  self->private_data.s_decode_trns.v_i = v_i;
71786
26
  self->private_data.s_decode_trns.v_n = v_n;
71787
71788
26
  goto exit;
71789
354
  exit:
71790
354
  if (a_src && a_src->data.ptr) {
71791
354
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71792
354
  }
71793
71794
354
  return status;
71795
354
}
71796
71797
// -------- func png.decoder.decode_frame_config
71798
71799
WUFFS_BASE__GENERATED_C_CODE
71800
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
71801
wuffs_png__decoder__decode_frame_config(
71802
    wuffs_png__decoder* self,
71803
    wuffs_base__frame_config* a_dst,
71804
6.30k
    wuffs_base__io_buffer* a_src) {
71805
6.30k
  if (!self) {
71806
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
71807
0
  }
71808
6.30k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
71809
0
    return wuffs_base__make_status(
71810
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
71811
0
        ? wuffs_base__error__disabled_by_previous_error
71812
0
        : wuffs_base__error__initialize_not_called);
71813
0
  }
71814
6.30k
  if (!a_src) {
71815
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71816
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
71817
0
  }
71818
6.30k
  if ((self->private_impl.active_coroutine != 0) &&
71819
6.30k
      (self->private_impl.active_coroutine != 2)) {
71820
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71821
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
71822
0
  }
71823
6.30k
  self->private_impl.active_coroutine = 0;
71824
6.30k
  wuffs_base__status status = wuffs_base__make_status(NULL);
71825
71826
6.30k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
71827
71828
6.30k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
71829
6.30k
  switch (coro_susp_point) {
71830
6.30k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71831
71832
6.30k
    while (true) {
71833
6.30k
      {
71834
6.30k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame_config(self, a_dst, a_src);
71835
6.30k
        v_status = t_0;
71836
6.30k
      }
71837
6.30k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
71838
65
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
71839
65
        goto exit;
71840
65
      }
71841
6.24k
      status = v_status;
71842
6.24k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
71843
0
    }
71844
71845
5.92k
    ok:
71846
5.92k
    self->private_impl.p_decode_frame_config = 0;
71847
5.92k
    goto exit;
71848
6.30k
  }
71849
71850
0
  goto suspend;
71851
99
  suspend:
71852
99
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
71853
99
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
71854
71855
99
  goto exit;
71856
6.30k
  exit:
71857
6.30k
  if (wuffs_base__status__is_error(&status)) {
71858
283
    self->private_impl.magic = WUFFS_BASE__DISABLED;
71859
283
  }
71860
6.30k
  return status;
71861
6.30k
}
71862
71863
// -------- func png.decoder.do_decode_frame_config
71864
71865
WUFFS_BASE__GENERATED_C_CODE
71866
static wuffs_base__status
71867
wuffs_png__decoder__do_decode_frame_config(
71868
    wuffs_png__decoder* self,
71869
    wuffs_base__frame_config* a_dst,
71870
6.30k
    wuffs_base__io_buffer* a_src) {
71871
6.30k
  wuffs_base__status status = wuffs_base__make_status(NULL);
71872
71873
6.30k
  uint32_t v_checksum_have = 0;
71874
6.30k
  wuffs_base__pixel_format v_pixfmt = {0};
71875
71876
6.30k
  const uint8_t* iop_a_src = NULL;
71877
6.30k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71878
6.30k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71879
6.30k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
71880
6.30k
  if (a_src && a_src->data.ptr) {
71881
6.30k
    io0_a_src = a_src->data.ptr;
71882
6.30k
    io1_a_src = io0_a_src + a_src->meta.ri;
71883
6.30k
    iop_a_src = io1_a_src;
71884
6.30k
    io2_a_src = io0_a_src + a_src->meta.wi;
71885
6.30k
  }
71886
71887
6.30k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
71888
6.30k
  switch (coro_susp_point) {
71889
6.30k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
71890
71891
6.30k
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
71892
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
71893
0
      goto exit;
71894
6.30k
    } else if (self->private_impl.f_call_sequence == 32u) {
71895
6.30k
    } else if (self->private_impl.f_call_sequence < 32u) {
71896
0
      if (a_src) {
71897
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71898
0
      }
71899
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
71900
0
      status = wuffs_png__decoder__do_decode_image_config(self, NULL, a_src);
71901
0
      if (a_src) {
71902
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
71903
0
      }
71904
0
      if (status.repr) {
71905
0
        goto suspend;
71906
0
      }
71907
0
    } else if (self->private_impl.f_call_sequence == 40u) {
71908
0
      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)))) {
71909
0
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
71910
0
        goto exit;
71911
0
      }
71912
0
    } else if (self->private_impl.f_call_sequence == 64u) {
71913
0
      if (a_src) {
71914
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
71915
0
      }
71916
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
71917
0
      status = wuffs_png__decoder__skip_frame(self, a_src);
71918
0
      if (a_src) {
71919
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
71920
0
      }
71921
0
      if (status.repr) {
71922
0
        goto suspend;
71923
0
      }
71924
0
    } else {
71925
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
71926
0
      goto ok;
71927
0
    }
71928
6.30k
    if (self->private_impl.f_metadata_fourcc != 0u) {
71929
0
      self->private_impl.f_call_sequence = 48u;
71930
0
      status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
71931
0
      goto ok;
71932
0
    }
71933
6.30k
    if (self->private_impl.f_num_decoded_frame_configs_value == 0u) {
71934
3.89k
      self->private_impl.f_frame_rect_x0 = self->private_impl.f_first_rect_x0;
71935
3.89k
      self->private_impl.f_frame_rect_y0 = self->private_impl.f_first_rect_y0;
71936
3.89k
      self->private_impl.f_frame_rect_x1 = self->private_impl.f_first_rect_x1;
71937
3.89k
      self->private_impl.f_frame_rect_y1 = self->private_impl.f_first_rect_y1;
71938
3.89k
      self->private_impl.f_frame_config_io_position = self->private_impl.f_first_config_io_position;
71939
3.89k
      self->private_impl.f_frame_duration = self->private_impl.f_first_duration;
71940
3.89k
      self->private_impl.f_frame_disposal = self->private_impl.f_first_disposal;
71941
3.89k
      self->private_impl.f_frame_overwrite_instead_of_blend = self->private_impl.f_first_overwrite_instead_of_blend;
71942
3.89k
    } else {
71943
2.87k
      while (true) {
71944
2.87k
        {
71945
2.87k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
71946
2.87k
          uint32_t t_0;
71947
2.87k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71948
2.81k
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
71949
2.81k
            iop_a_src += 4;
71950
2.81k
          } else {
71951
55
            self->private_data.s_do_decode_frame_config.scratch = 0;
71952
55
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
71953
80
            while (true) {
71954
80
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71955
55
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71956
55
                goto suspend;
71957
55
              }
71958
25
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
71959
25
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
71960
25
              *scratch >>= 8;
71961
25
              *scratch <<= 8;
71962
25
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
71963
25
              if (num_bits_0 == 24) {
71964
0
                t_0 = ((uint32_t)(*scratch >> 32));
71965
0
                break;
71966
0
              }
71967
25
              num_bits_0 += 8u;
71968
25
              *scratch |= ((uint64_t)(num_bits_0));
71969
25
            }
71970
55
          }
71971
2.81k
          self->private_impl.f_chunk_length = t_0;
71972
2.81k
        }
71973
0
        {
71974
2.81k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
71975
2.81k
          uint32_t t_1;
71976
2.81k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
71977
2.80k
            t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
71978
2.80k
            iop_a_src += 4;
71979
2.80k
          } else {
71980
11
            self->private_data.s_do_decode_frame_config.scratch = 0;
71981
11
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
71982
23
            while (true) {
71983
23
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
71984
11
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
71985
11
                goto suspend;
71986
11
              }
71987
12
              uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
71988
12
              uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
71989
12
              *scratch <<= 8;
71990
12
              *scratch >>= 8;
71991
12
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
71992
12
              if (num_bits_1 == 24) {
71993
0
                t_1 = ((uint32_t)(*scratch));
71994
0
                break;
71995
0
              }
71996
12
              num_bits_1 += 8u;
71997
12
              *scratch |= ((uint64_t)(num_bits_1)) << 56;
71998
12
            }
71999
11
          }
72000
2.80k
          self->private_impl.f_chunk_type = t_1;
72001
2.80k
        }
72002
2.80k
        if (self->private_impl.f_chunk_type == 1145980233u) {
72003
105
          if (self->private_impl.f_chunk_length != 0u) {
72004
38
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72005
38
            goto exit;
72006
38
          }
72007
67
          {
72008
67
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
72009
67
            uint32_t t_2;
72010
67
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72011
63
              t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
72012
63
              iop_a_src += 4;
72013
63
            } else {
72014
4
              self->private_data.s_do_decode_frame_config.scratch = 0;
72015
4
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
72016
10
              while (true) {
72017
10
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72018
4
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72019
4
                  goto suspend;
72020
4
                }
72021
6
                uint64_t* scratch = &self->private_data.s_do_decode_frame_config.scratch;
72022
6
                uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
72023
6
                *scratch <<= 8;
72024
6
                *scratch >>= 8;
72025
6
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
72026
6
                if (num_bits_2 == 24) {
72027
0
                  t_2 = ((uint32_t)(*scratch));
72028
0
                  break;
72029
0
                }
72030
6
                num_bits_2 += 8u;
72031
6
                *scratch |= ((uint64_t)(num_bits_2)) << 56;
72032
6
              }
72033
4
            }
72034
63
            v_checksum_have = t_2;
72035
63
          }
72036
63
          if ( ! self->private_impl.f_ignore_checksum && (v_checksum_have != 2187346606u)) {
72037
61
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
72038
61
            goto exit;
72039
61
          }
72040
2
          self->private_impl.f_call_sequence = 96u;
72041
2
          status = wuffs_base__make_status(wuffs_base__note__end_of_data);
72042
2
          goto ok;
72043
2.70k
        } else if (self->private_impl.f_chunk_type == 1413571686u) {
72044
1
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72045
1
          goto exit;
72046
2.70k
        } else if (self->private_impl.f_chunk_type == 1280598886u) {
72047
2.11k
          self->private_impl.f_frame_config_io_position = ((uint64_t)(wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) - 8u));
72048
2.11k
          if (a_src) {
72049
2.11k
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72050
2.11k
          }
72051
2.11k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
72052
2.11k
          status = wuffs_png__decoder__decode_fctl(self, a_src);
72053
2.11k
          if (a_src) {
72054
2.11k
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
72055
2.11k
          }
72056
2.11k
          if (status.repr) {
72057
77
            goto suspend;
72058
77
          }
72059
2.03k
          self->private_data.s_do_decode_frame_config.scratch = 4u;
72060
2.03k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
72061
2.03k
          if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
72062
10
            self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
72063
10
            iop_a_src = io2_a_src;
72064
10
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72065
10
            goto suspend;
72066
10
          }
72067
2.02k
          iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
72068
2.02k
          break;
72069
2.03k
        }
72070
587
        if (a_src) {
72071
587
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72072
587
        }
72073
587
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
72074
587
        status = wuffs_png__decoder__decode_other_chunk(self, a_src, true);
72075
587
        if (a_src) {
72076
587
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
72077
587
        }
72078
587
        if (status.repr) {
72079
115
          goto suspend;
72080
115
        }
72081
472
        if (self->private_impl.f_metadata_fourcc != 0u) {
72082
0
          self->private_impl.f_call_sequence = 48u;
72083
0
          status = wuffs_base__make_status(wuffs_base__note__metadata_reported);
72084
0
          goto ok;
72085
0
        }
72086
472
        self->private_data.s_do_decode_frame_config.scratch = 4u;
72087
472
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
72088
472
        if (self->private_data.s_do_decode_frame_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
72089
10
          self->private_data.s_do_decode_frame_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
72090
10
          iop_a_src = io2_a_src;
72091
10
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72092
10
          goto suspend;
72093
10
        }
72094
462
        iop_a_src += self->private_data.s_do_decode_frame_config.scratch;
72095
462
        self->private_impl.f_chunk_length = 0u;
72096
462
      }
72097
2.41k
    }
72098
5.92k
    if (a_dst != NULL) {
72099
5.92k
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
72100
5.92k
      wuffs_base__frame_config__set(
72101
5.92k
          a_dst,
72102
5.92k
          wuffs_base__utility__make_rect_ie_u32(
72103
5.92k
          self->private_impl.f_frame_rect_x0,
72104
5.92k
          self->private_impl.f_frame_rect_y0,
72105
5.92k
          self->private_impl.f_frame_rect_x1,
72106
5.92k
          self->private_impl.f_frame_rect_y1),
72107
5.92k
          ((wuffs_base__flicks)(self->private_impl.f_frame_duration)),
72108
5.92k
          ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value)),
72109
5.92k
          self->private_impl.f_frame_config_io_position,
72110
5.92k
          self->private_impl.f_frame_disposal,
72111
5.92k
          ((self->private_impl.f_color_type <= 3u) &&  ! self->private_impl.f_seen_trns),
72112
5.92k
          self->private_impl.f_frame_overwrite_instead_of_blend,
72113
5.92k
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
72114
5.92k
    }
72115
5.92k
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frame_configs_value, 1u);
72116
5.92k
    self->private_impl.f_call_sequence = 64u;
72117
72118
5.92k
    ok:
72119
5.92k
    self->private_impl.p_do_decode_frame_config = 0;
72120
5.92k
    goto exit;
72121
6.30k
  }
72122
72123
0
  goto suspend;
72124
282
  suspend:
72125
282
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72126
72127
282
  goto exit;
72128
6.30k
  exit:
72129
6.30k
  if (a_src && a_src->data.ptr) {
72130
6.30k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72131
6.30k
  }
72132
72133
6.30k
  return status;
72134
6.30k
}
72135
72136
// -------- func png.decoder.skip_frame
72137
72138
WUFFS_BASE__GENERATED_C_CODE
72139
static wuffs_base__status
72140
wuffs_png__decoder__skip_frame(
72141
    wuffs_png__decoder* self,
72142
0
    wuffs_base__io_buffer* a_src) {
72143
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
72144
72145
0
  uint32_t v_seq_num = 0;
72146
72147
0
  const uint8_t* iop_a_src = NULL;
72148
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72149
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72150
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72151
0
  if (a_src && a_src->data.ptr) {
72152
0
    io0_a_src = a_src->data.ptr;
72153
0
    io1_a_src = io0_a_src + a_src->meta.ri;
72154
0
    iop_a_src = io1_a_src;
72155
0
    io2_a_src = io0_a_src + a_src->meta.wi;
72156
0
  }
72157
72158
0
  uint32_t coro_susp_point = self->private_impl.p_skip_frame;
72159
0
  switch (coro_susp_point) {
72160
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72161
72162
0
    self->private_impl.f_chunk_type_array[0u] = 0u;
72163
0
    self->private_impl.f_chunk_type_array[1u] = 0u;
72164
0
    self->private_impl.f_chunk_type_array[2u] = 0u;
72165
0
    self->private_impl.f_chunk_type_array[3u] = 0u;
72166
0
    while (true) {
72167
0
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
72168
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72169
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
72170
0
        continue;
72171
0
      }
72172
0
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72173
0
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
72174
0
      if (self->private_impl.f_chunk_type == 1413563465u) {
72175
0
        if (self->private_impl.f_chunk_type_array[0u] == 102u) {
72176
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72177
0
          goto exit;
72178
0
        }
72179
0
        self->private_impl.f_chunk_type_array[0u] = 73u;
72180
0
        self->private_impl.f_chunk_type_array[1u] = 68u;
72181
0
        self->private_impl.f_chunk_type_array[2u] = 65u;
72182
0
        self->private_impl.f_chunk_type_array[3u] = 84u;
72183
0
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
72184
0
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
72185
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72186
0
          goto exit;
72187
0
        }
72188
0
        self->private_impl.f_chunk_type_array[0u] = 102u;
72189
0
        self->private_impl.f_chunk_type_array[1u] = 100u;
72190
0
        self->private_impl.f_chunk_type_array[2u] = 65u;
72191
0
        self->private_impl.f_chunk_type_array[3u] = 84u;
72192
0
        if (self->private_impl.f_chunk_length < 4u) {
72193
0
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72194
0
          goto exit;
72195
0
        }
72196
0
        self->private_impl.f_chunk_length -= 4u;
72197
0
        iop_a_src += 8u;
72198
0
        {
72199
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72200
0
          uint32_t t_0;
72201
0
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72202
0
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72203
0
            iop_a_src += 4;
72204
0
          } else {
72205
0
            self->private_data.s_skip_frame.scratch = 0;
72206
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72207
0
            while (true) {
72208
0
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72209
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72210
0
                goto suspend;
72211
0
              }
72212
0
              uint64_t* scratch = &self->private_data.s_skip_frame.scratch;
72213
0
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72214
0
              *scratch >>= 8;
72215
0
              *scratch <<= 8;
72216
0
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72217
0
              if (num_bits_0 == 24) {
72218
0
                t_0 = ((uint32_t)(*scratch >> 32));
72219
0
                break;
72220
0
              }
72221
0
              num_bits_0 += 8u;
72222
0
              *scratch |= ((uint64_t)(num_bits_0));
72223
0
            }
72224
0
          }
72225
0
          v_seq_num = t_0;
72226
0
        }
72227
0
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
72228
0
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
72229
0
          goto exit;
72230
0
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
72231
0
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
72232
0
          goto exit;
72233
0
        }
72234
0
        self->private_impl.f_next_animation_seq_num += 1u;
72235
0
        self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 4u);
72236
0
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72237
0
        if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
72238
0
          self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
72239
0
          iop_a_src = io2_a_src;
72240
0
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72241
0
          goto suspend;
72242
0
        }
72243
0
        iop_a_src += self->private_data.s_skip_frame.scratch;
72244
0
        self->private_impl.f_chunk_length = 0u;
72245
0
        continue;
72246
0
      } else if (self->private_impl.f_chunk_type_array[0u] != 0u) {
72247
0
        break;
72248
0
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
72249
0
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72250
0
        goto exit;
72251
0
      }
72252
0
      self->private_data.s_skip_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
72253
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
72254
0
      if (self->private_data.s_skip_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
72255
0
        self->private_data.s_skip_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
72256
0
        iop_a_src = io2_a_src;
72257
0
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72258
0
        goto suspend;
72259
0
      }
72260
0
      iop_a_src += self->private_data.s_skip_frame.scratch;
72261
0
      self->private_impl.f_chunk_length = 0u;
72262
0
    }
72263
0
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
72264
0
    self->private_impl.f_call_sequence = 32u;
72265
72266
0
    ok:
72267
0
    self->private_impl.p_skip_frame = 0;
72268
0
    goto exit;
72269
0
  }
72270
72271
0
  goto suspend;
72272
0
  suspend:
72273
0
  self->private_impl.p_skip_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72274
72275
0
  goto exit;
72276
0
  exit:
72277
0
  if (a_src && a_src->data.ptr) {
72278
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72279
0
  }
72280
72281
0
  return status;
72282
0
}
72283
72284
// -------- func png.decoder.decode_frame
72285
72286
WUFFS_BASE__GENERATED_C_CODE
72287
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
72288
wuffs_png__decoder__decode_frame(
72289
    wuffs_png__decoder* self,
72290
    wuffs_base__pixel_buffer* a_dst,
72291
    wuffs_base__io_buffer* a_src,
72292
    wuffs_base__pixel_blend a_blend,
72293
    wuffs_base__slice_u8 a_workbuf,
72294
5.92k
    wuffs_base__decode_frame_options* a_opts) {
72295
5.92k
  if (!self) {
72296
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
72297
0
  }
72298
5.92k
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
72299
0
    return wuffs_base__make_status(
72300
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
72301
0
        ? wuffs_base__error__disabled_by_previous_error
72302
0
        : wuffs_base__error__initialize_not_called);
72303
0
  }
72304
5.92k
  if (!a_dst || !a_src) {
72305
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72306
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
72307
0
  }
72308
5.92k
  if ((self->private_impl.active_coroutine != 0) &&
72309
5.92k
      (self->private_impl.active_coroutine != 3)) {
72310
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72311
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
72312
0
  }
72313
5.92k
  self->private_impl.active_coroutine = 0;
72314
5.92k
  wuffs_base__status status = wuffs_base__make_status(NULL);
72315
72316
5.92k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
72317
72318
5.92k
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
72319
5.92k
  switch (coro_susp_point) {
72320
5.92k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72321
72322
5.92k
    while (true) {
72323
5.92k
      {
72324
5.92k
        wuffs_base__status t_0 = wuffs_png__decoder__do_decode_frame(self,
72325
5.92k
            a_dst,
72326
5.92k
            a_src,
72327
5.92k
            a_blend,
72328
5.92k
            a_workbuf,
72329
5.92k
            a_opts);
72330
5.92k
        v_status = t_0;
72331
5.92k
      }
72332
5.92k
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
72333
115
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
72334
115
        goto exit;
72335
115
      }
72336
5.80k
      status = v_status;
72337
5.80k
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
72338
0
    }
72339
72340
2.41k
    ok:
72341
2.41k
    self->private_impl.p_decode_frame = 0;
72342
2.41k
    goto exit;
72343
5.92k
  }
72344
72345
0
  goto suspend;
72346
825
  suspend:
72347
825
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72348
825
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
72349
72350
825
  goto exit;
72351
5.92k
  exit:
72352
5.92k
  if (wuffs_base__status__is_error(&status)) {
72353
2.67k
    self->private_impl.magic = WUFFS_BASE__DISABLED;
72354
2.67k
  }
72355
5.92k
  return status;
72356
5.92k
}
72357
72358
// -------- func png.decoder.do_decode_frame
72359
72360
WUFFS_BASE__GENERATED_C_CODE
72361
static wuffs_base__status
72362
wuffs_png__decoder__do_decode_frame(
72363
    wuffs_png__decoder* self,
72364
    wuffs_base__pixel_buffer* a_dst,
72365
    wuffs_base__io_buffer* a_src,
72366
    wuffs_base__pixel_blend a_blend,
72367
    wuffs_base__slice_u8 a_workbuf,
72368
5.92k
    wuffs_base__decode_frame_options* a_opts) {
72369
5.92k
  wuffs_base__status status = wuffs_base__make_status(NULL);
72370
72371
5.92k
  uint32_t v_seq_num = 0;
72372
5.92k
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
72373
5.92k
  uint32_t v_pass_width = 0;
72374
5.92k
  uint32_t v_pass_height = 0;
72375
72376
5.92k
  const uint8_t* iop_a_src = NULL;
72377
5.92k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72378
5.92k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72379
5.92k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72380
5.92k
  if (a_src && a_src->data.ptr) {
72381
5.92k
    io0_a_src = a_src->data.ptr;
72382
5.92k
    io1_a_src = io0_a_src + a_src->meta.ri;
72383
5.92k
    iop_a_src = io1_a_src;
72384
5.92k
    io2_a_src = io0_a_src + a_src->meta.wi;
72385
5.92k
  }
72386
72387
5.92k
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
72388
5.92k
  switch (coro_susp_point) {
72389
5.92k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72390
72391
5.92k
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) != 0u) {
72392
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
72393
0
      goto exit;
72394
5.92k
    } else if (self->private_impl.f_call_sequence >= 96u) {
72395
0
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
72396
0
      goto ok;
72397
5.92k
    } else if (self->private_impl.f_call_sequence != 64u) {
72398
0
      if (a_src) {
72399
0
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72400
0
      }
72401
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72402
0
      status = wuffs_png__decoder__do_decode_frame_config(self, NULL, a_src);
72403
0
      if (a_src) {
72404
0
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
72405
0
      }
72406
0
      if (status.repr) {
72407
0
        goto suspend;
72408
0
      }
72409
0
    }
72410
6.60k
    while (true) {
72411
6.60k
      if (((uint64_t)(io2_a_src - iop_a_src)) < 8u) {
72412
26
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72413
26
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
72414
0
        continue;
72415
26
      }
72416
6.57k
      self->private_impl.f_chunk_length = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72417
6.57k
      self->private_impl.f_chunk_type = ((uint32_t)((wuffs_base__peek_u64le__no_bounds_check(iop_a_src) >> 32u)));
72418
6.57k
      if (self->private_impl.f_chunk_type == 1413563465u) {
72419
4.18k
        self->private_impl.f_chunk_type_array[0u] = 73u;
72420
4.18k
        self->private_impl.f_chunk_type_array[1u] = 68u;
72421
4.18k
        self->private_impl.f_chunk_type_array[2u] = 65u;
72422
4.18k
        self->private_impl.f_chunk_type_array[3u] = 84u;
72423
4.18k
        iop_a_src += 8u;
72424
4.18k
        if ( ! self->private_impl.f_ignore_checksum) {
72425
4.18k
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
72426
4.18k
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
72427
4.18k
          wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
72428
4.18k
        }
72429
4.18k
        break;
72430
4.18k
      } else if (self->private_impl.f_chunk_type == 1413571686u) {
72431
1.55k
        self->private_impl.f_chunk_type_array[0u] = 102u;
72432
1.55k
        self->private_impl.f_chunk_type_array[1u] = 100u;
72433
1.55k
        self->private_impl.f_chunk_type_array[2u] = 65u;
72434
1.55k
        self->private_impl.f_chunk_type_array[3u] = 84u;
72435
1.55k
        if (self->private_impl.f_chunk_length < 4u) {
72436
3
          status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72437
3
          goto exit;
72438
3
        }
72439
1.55k
        self->private_impl.f_chunk_length -= 4u;
72440
1.55k
        iop_a_src += 8u;
72441
1.55k
        {
72442
1.55k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72443
1.55k
          uint32_t t_0;
72444
1.55k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72445
1.51k
            t_0 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72446
1.51k
            iop_a_src += 4;
72447
1.51k
          } else {
72448
40
            self->private_data.s_do_decode_frame.scratch = 0;
72449
40
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72450
62
            while (true) {
72451
62
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72452
40
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72453
40
                goto suspend;
72454
40
              }
72455
22
              uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
72456
22
              uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
72457
22
              *scratch >>= 8;
72458
22
              *scratch <<= 8;
72459
22
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
72460
22
              if (num_bits_0 == 24) {
72461
0
                t_0 = ((uint32_t)(*scratch >> 32));
72462
0
                break;
72463
0
              }
72464
22
              num_bits_0 += 8u;
72465
22
              *scratch |= ((uint64_t)(num_bits_0));
72466
22
            }
72467
40
          }
72468
1.51k
          v_seq_num = t_0;
72469
1.51k
        }
72470
1.51k
        if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
72471
57
          status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
72472
57
          goto exit;
72473
1.45k
        } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
72474
0
          status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
72475
0
          goto exit;
72476
0
        }
72477
1.45k
        self->private_impl.f_next_animation_seq_num += 1u;
72478
1.45k
        break;
72479
1.51k
      } else if (self->private_impl.f_chunk_type == 1280598886u) {
72480
1
        status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72481
1
        goto exit;
72482
1
      }
72483
833
      self->private_data.s_do_decode_frame.scratch = (((uint64_t)(self->private_impl.f_chunk_length)) + 12u);
72484
833
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
72485
833
      if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
72486
151
        self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
72487
151
        iop_a_src = io2_a_src;
72488
151
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72489
151
        goto suspend;
72490
151
      }
72491
682
      iop_a_src += self->private_data.s_do_decode_frame.scratch;
72492
682
      self->private_impl.f_chunk_length = 0u;
72493
682
    }
72494
5.64k
    if (self->private_impl.f_zlib_is_dirty) {
72495
1.75k
      wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
72496
1.75k
          sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
72497
1.75k
      if (self->private_impl.f_ignore_checksum) {
72498
0
        wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
72499
0
      }
72500
1.75k
    }
72501
5.64k
    self->private_impl.f_zlib_is_dirty = true;
72502
5.64k
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
72503
5.64k
        wuffs_base__pixel_buffer__pixel_format(a_dst),
72504
5.64k
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
72505
5.64k
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
72506
5.64k
        wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024),
72507
5.64k
        a_blend);
72508
5.64k
    if ( ! wuffs_base__status__is_ok(&v_status)) {
72509
0
      status = v_status;
72510
0
      if (wuffs_base__status__is_error(&status)) {
72511
0
        goto exit;
72512
0
      } else if (wuffs_base__status__is_suspension(&status)) {
72513
0
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
72514
0
        goto exit;
72515
0
      }
72516
0
      goto ok;
72517
0
    }
72518
5.64k
    self->private_impl.f_workbuf_hist_pos_base = 0u;
72519
12.1k
    while (true) {
72520
12.1k
      if (self->private_impl.f_chunk_type_array[0u] == 73u) {
72521
10.6k
        v_pass_width = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][1u])) + self->private_impl.f_width) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]));
72522
10.6k
        v_pass_height = (16777215u & ((((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][4u])) + self->private_impl.f_height) >> WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]));
72523
10.6k
      } else {
72524
1.45k
        v_pass_width = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_x1 - self->private_impl.f_frame_rect_x0)));
72525
1.45k
        v_pass_height = (16777215u & ((uint32_t)(self->private_impl.f_frame_rect_y1 - self->private_impl.f_frame_rect_y0)));
72526
1.45k
      }
72527
12.1k
      if ((v_pass_width > 0u) && (v_pass_height > 0u)) {
72528
9.77k
        self->private_impl.f_pass_bytes_per_row = wuffs_png__decoder__calculate_bytes_per_row(self, v_pass_width);
72529
9.77k
        self->private_impl.f_pass_workbuf_length = (((uint64_t)(v_pass_height)) * (1u + self->private_impl.f_pass_bytes_per_row));
72530
9.77k
        while (true) {
72531
9.77k
          {
72532
9.77k
            if (a_src) {
72533
9.77k
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72534
9.77k
            }
72535
9.77k
            wuffs_base__status t_1 = wuffs_png__decoder__decode_pass(self, a_src, a_workbuf);
72536
9.77k
            v_status = t_1;
72537
9.77k
            if (a_src) {
72538
9.77k
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
72539
9.77k
            }
72540
9.77k
          }
72541
9.77k
          if (wuffs_base__status__is_ok(&v_status)) {
72542
6.58k
            break;
72543
6.58k
          } else if (wuffs_base__status__is_error(&v_status) || ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed))) {
72544
2.45k
            if (self->private_impl.f_workbuf_wi <= ((uint64_t)(a_workbuf.len))) {
72545
2.45k
              wuffs_png__decoder__filter_and_swizzle(self, a_dst, wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_workbuf_wi));
72546
2.45k
            }
72547
2.45k
            if (v_status.repr == wuffs_base__suspension__short_read) {
72548
46
              status = wuffs_base__make_status(wuffs_png__error__truncated_input);
72549
46
              goto exit;
72550
46
            }
72551
2.45k
          }
72552
3.13k
          status = v_status;
72553
3.13k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
72554
0
        }
72555
6.58k
        v_status = wuffs_png__decoder__filter_and_swizzle(self, a_dst, a_workbuf);
72556
6.58k
        if ( ! wuffs_base__status__is_ok(&v_status)) {
72557
51
          status = v_status;
72558
51
          if (wuffs_base__status__is_error(&status)) {
72559
51
            goto exit;
72560
51
          } else if (wuffs_base__status__is_suspension(&status)) {
72561
0
            status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
72562
0
            goto exit;
72563
0
          }
72564
0
          goto ok;
72565
51
        }
72566
6.53k
        self->private_impl.f_workbuf_hist_pos_base += self->private_impl.f_pass_workbuf_length;
72567
6.53k
      }
72568
8.90k
      if ((self->private_impl.f_interlace_pass == 0u) || (self->private_impl.f_interlace_pass >= 7u)) {
72569
2.41k
        break;
72570
2.41k
      }
72571
6.49k
#if defined(__GNUC__)
72572
6.49k
#pragma GCC diagnostic push
72573
6.49k
#pragma GCC diagnostic ignored "-Wconversion"
72574
6.49k
#endif
72575
6.49k
      self->private_impl.f_interlace_pass += 1u;
72576
6.49k
#if defined(__GNUC__)
72577
6.49k
#pragma GCC diagnostic pop
72578
6.49k
#endif
72579
6.49k
    }
72580
2.41k
    wuffs_private_impl__u32__sat_add_indirect(&self->private_impl.f_num_decoded_frames_value, 1u);
72581
2.41k
    self->private_impl.f_call_sequence = 32u;
72582
72583
2.41k
    ok:
72584
2.41k
    self->private_impl.p_do_decode_frame = 0;
72585
2.41k
    goto exit;
72586
5.92k
  }
72587
72588
0
  goto suspend;
72589
940
  suspend:
72590
940
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72591
72592
940
  goto exit;
72593
5.92k
  exit:
72594
5.92k
  if (a_src && a_src->data.ptr) {
72595
5.92k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72596
5.92k
  }
72597
72598
5.92k
  return status;
72599
5.92k
}
72600
72601
// -------- func png.decoder.decode_pass
72602
72603
WUFFS_BASE__GENERATED_C_CODE
72604
static wuffs_base__status
72605
wuffs_png__decoder__decode_pass(
72606
    wuffs_png__decoder* self,
72607
    wuffs_base__io_buffer* a_src,
72608
9.77k
    wuffs_base__slice_u8 a_workbuf) {
72609
9.77k
  wuffs_base__status status = wuffs_base__make_status(NULL);
72610
72611
9.77k
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
72612
9.77k
  wuffs_base__io_buffer* v_w = &u_w;
72613
9.77k
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72614
9.77k
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72615
9.77k
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72616
9.77k
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72617
9.77k
  uint64_t v_w_mark = 0;
72618
9.77k
  uint64_t v_r_mark = 0;
72619
9.77k
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
72620
9.77k
  uint32_t v_checksum_have = 0;
72621
9.77k
  uint32_t v_checksum_want = 0;
72622
9.77k
  uint32_t v_seq_num = 0;
72623
72624
9.77k
  const uint8_t* iop_a_src = NULL;
72625
9.77k
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72626
9.77k
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72627
9.77k
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
72628
9.77k
  if (a_src && a_src->data.ptr) {
72629
9.77k
    io0_a_src = a_src->data.ptr;
72630
9.77k
    io1_a_src = io0_a_src + a_src->meta.ri;
72631
9.77k
    iop_a_src = io1_a_src;
72632
9.77k
    io2_a_src = io0_a_src + a_src->meta.wi;
72633
9.77k
  }
72634
72635
9.77k
  uint32_t coro_susp_point = self->private_impl.p_decode_pass;
72636
9.77k
  switch (coro_susp_point) {
72637
9.77k
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
72638
72639
9.77k
    self->private_impl.f_workbuf_wi = 0u;
72640
19.8k
    while (true) {
72641
19.8k
      if ((self->private_impl.f_workbuf_wi > self->private_impl.f_pass_workbuf_length) || (self->private_impl.f_pass_workbuf_length > ((uint64_t)(a_workbuf.len)))) {
72642
0
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
72643
0
        goto exit;
72644
0
      }
72645
19.8k
      {
72646
19.8k
        wuffs_base__io_buffer* o_0_v_w = v_w;
72647
19.8k
        uint8_t* o_0_iop_v_w = iop_v_w;
72648
19.8k
        uint8_t* o_0_io0_v_w = io0_v_w;
72649
19.8k
        uint8_t* o_0_io1_v_w = io1_v_w;
72650
19.8k
        uint8_t* o_0_io2_v_w = io2_v_w;
72651
19.8k
        v_w = wuffs_private_impl__io_writer__set(
72652
19.8k
            &u_w,
72653
19.8k
            &iop_v_w,
72654
19.8k
            &io0_v_w,
72655
19.8k
            &io1_v_w,
72656
19.8k
            &io2_v_w,
72657
19.8k
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
72658
19.8k
            self->private_impl.f_workbuf_wi,
72659
19.8k
            self->private_impl.f_pass_workbuf_length),
72660
19.8k
            ((uint64_t)(self->private_impl.f_workbuf_hist_pos_base + self->private_impl.f_workbuf_wi)));
72661
19.8k
        {
72662
19.8k
          const bool o_1_closed_a_src = a_src->meta.closed;
72663
19.8k
          const uint8_t* o_1_io2_a_src = io2_a_src;
72664
19.8k
          wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
72665
19.8k
              ((uint64_t)(self->private_impl.f_chunk_length)));
72666
19.8k
          if (a_src) {
72667
19.8k
            size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
72668
19.8k
            a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
72669
19.8k
            a_src->meta.wi = n;
72670
19.8k
          }
72671
19.8k
          v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
72672
19.8k
          v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
72673
19.8k
          {
72674
19.8k
            u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
72675
19.8k
            if (a_src) {
72676
19.8k
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72677
19.8k
            }
72678
19.8k
            wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8());
72679
19.8k
            v_zlib_status = t_0;
72680
19.8k
            iop_v_w = u_w.data.ptr + u_w.meta.wi;
72681
19.8k
            if (a_src) {
72682
19.8k
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
72683
19.8k
            }
72684
19.8k
          }
72685
19.8k
          if ( ! self->private_impl.f_ignore_checksum) {
72686
19.8k
            wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
72687
19.8k
          }
72688
19.8k
          wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
72689
19.8k
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_workbuf_wi, wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w))));
72690
19.8k
          io2_a_src = o_1_io2_a_src;
72691
19.8k
          if (a_src) {
72692
19.8k
            a_src->meta.closed = o_1_closed_a_src;
72693
19.8k
            a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
72694
19.8k
          }
72695
19.8k
        }
72696
19.8k
        v_w = o_0_v_w;
72697
19.8k
        iop_v_w = o_0_iop_v_w;
72698
19.8k
        io0_v_w = o_0_io0_v_w;
72699
19.8k
        io1_v_w = o_0_io1_v_w;
72700
19.8k
        io2_v_w = o_0_io2_v_w;
72701
19.8k
      }
72702
19.8k
      if (wuffs_base__status__is_ok(&v_zlib_status)) {
72703
1.72k
        if (self->private_impl.f_chunk_length > 0u) {
72704
56
          status = wuffs_base__make_status(wuffs_base__error__too_much_data);
72705
56
          goto exit;
72706
56
        }
72707
1.66k
        {
72708
1.66k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
72709
1.66k
          uint32_t t_1;
72710
1.66k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72711
1.65k
            t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72712
1.65k
            iop_a_src += 4;
72713
1.65k
          } else {
72714
8
            self->private_data.s_decode_pass.scratch = 0;
72715
8
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
72716
15
            while (true) {
72717
15
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72718
8
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72719
8
                goto suspend;
72720
8
              }
72721
7
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
72722
7
              uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
72723
7
              *scratch >>= 8;
72724
7
              *scratch <<= 8;
72725
7
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
72726
7
              if (num_bits_1 == 24) {
72727
0
                t_1 = ((uint32_t)(*scratch >> 32));
72728
0
                break;
72729
0
              }
72730
7
              num_bits_1 += 8u;
72731
7
              *scratch |= ((uint64_t)(num_bits_1));
72732
7
            }
72733
8
          }
72734
1.65k
          v_checksum_want = t_1;
72735
1.65k
        }
72736
1.65k
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
72737
427
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
72738
427
          if (v_checksum_have != v_checksum_want) {
72739
59
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
72740
59
            goto exit;
72741
59
          }
72742
427
        }
72743
1.59k
        break;
72744
18.1k
      } else if (v_zlib_status.repr == wuffs_base__suspension__short_write) {
72745
5.06k
        if ((1u <= self->private_impl.f_interlace_pass) && (self->private_impl.f_interlace_pass <= 6u)) {
72746
4.99k
          break;
72747
4.99k
        }
72748
69
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
72749
69
        goto exit;
72750
13.0k
      } else if (v_zlib_status.repr != wuffs_base__suspension__short_read) {
72751
1.93k
        status = v_zlib_status;
72752
1.93k
        if (wuffs_base__status__is_error(&status)) {
72753
1.92k
          goto exit;
72754
1.92k
        } else if (wuffs_base__status__is_suspension(&status)) {
72755
0
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
72756
0
          goto exit;
72757
0
        }
72758
9
        goto ok;
72759
11.1k
      } else if (self->private_impl.f_chunk_length == 0u) {
72760
10.5k
        {
72761
10.5k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
72762
10.5k
          uint32_t t_2;
72763
10.5k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72764
10.4k
            t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72765
10.4k
            iop_a_src += 4;
72766
10.4k
          } else {
72767
105
            self->private_data.s_decode_pass.scratch = 0;
72768
105
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
72769
140
            while (true) {
72770
140
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72771
105
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72772
105
                goto suspend;
72773
105
              }
72774
35
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
72775
35
              uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
72776
35
              *scratch >>= 8;
72777
35
              *scratch <<= 8;
72778
35
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
72779
35
              if (num_bits_2 == 24) {
72780
0
                t_2 = ((uint32_t)(*scratch >> 32));
72781
0
                break;
72782
0
              }
72783
35
              num_bits_2 += 8u;
72784
35
              *scratch |= ((uint64_t)(num_bits_2));
72785
35
            }
72786
105
          }
72787
10.4k
          v_checksum_want = t_2;
72788
10.4k
        }
72789
10.4k
        if ( ! self->private_impl.f_ignore_checksum && (self->private_impl.f_chunk_type_array[0u] == 73u)) {
72790
10.1k
          v_checksum_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__utility__empty_slice_u8());
72791
10.1k
          if (v_checksum_have != v_checksum_want) {
72792
119
            status = wuffs_base__make_status(wuffs_png__error__bad_checksum);
72793
119
            goto exit;
72794
119
          }
72795
10.1k
        }
72796
10.3k
        {
72797
10.3k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
72798
10.3k
          uint32_t t_3;
72799
10.3k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72800
10.3k
            t_3 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72801
10.3k
            iop_a_src += 4;
72802
10.3k
          } else {
72803
19
            self->private_data.s_decode_pass.scratch = 0;
72804
19
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
72805
27
            while (true) {
72806
27
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72807
19
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72808
19
                goto suspend;
72809
19
              }
72810
8
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
72811
8
              uint32_t num_bits_3 = ((uint32_t)(*scratch & 0xFFu));
72812
8
              *scratch >>= 8;
72813
8
              *scratch <<= 8;
72814
8
              *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_3);
72815
8
              if (num_bits_3 == 24) {
72816
0
                t_3 = ((uint32_t)(*scratch >> 32));
72817
0
                break;
72818
0
              }
72819
8
              num_bits_3 += 8u;
72820
8
              *scratch |= ((uint64_t)(num_bits_3));
72821
8
            }
72822
19
          }
72823
10.3k
          self->private_impl.f_chunk_length = t_3;
72824
10.3k
        }
72825
0
        {
72826
10.3k
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
72827
10.3k
          uint32_t t_4;
72828
10.3k
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72829
10.3k
            t_4 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
72830
10.3k
            iop_a_src += 4;
72831
10.3k
          } else {
72832
12
            self->private_data.s_decode_pass.scratch = 0;
72833
12
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
72834
18
            while (true) {
72835
18
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72836
12
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72837
12
                goto suspend;
72838
12
              }
72839
6
              uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
72840
6
              uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
72841
6
              *scratch <<= 8;
72842
6
              *scratch >>= 8;
72843
6
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
72844
6
              if (num_bits_4 == 24) {
72845
0
                t_4 = ((uint32_t)(*scratch));
72846
0
                break;
72847
0
              }
72848
6
              num_bits_4 += 8u;
72849
6
              *scratch |= ((uint64_t)(num_bits_4)) << 56;
72850
6
            }
72851
12
          }
72852
10.3k
          self->private_impl.f_chunk_type = t_4;
72853
10.3k
        }
72854
10.3k
        if (self->private_impl.f_chunk_type_array[0u] == 73u) {
72855
9.96k
          if (self->private_impl.f_chunk_type != 1413563465u) {
72856
59
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72857
59
            goto exit;
72858
59
          }
72859
9.90k
          if ( ! self->private_impl.f_ignore_checksum) {
72860
9.90k
            wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
72861
9.90k
                sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
72862
9.90k
            wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_base__make_slice_u8(self->private_impl.f_chunk_type_array, 4));
72863
9.90k
          }
72864
9.90k
        } else {
72865
346
          if ((self->private_impl.f_chunk_type != 1413571686u) || (self->private_impl.f_chunk_length < 4u)) {
72866
56
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
72867
56
            goto exit;
72868
56
          }
72869
290
          self->private_impl.f_chunk_length -= 4u;
72870
290
          {
72871
290
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
72872
290
            uint32_t t_5;
72873
290
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
72874
263
              t_5 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
72875
263
              iop_a_src += 4;
72876
263
            } else {
72877
27
              self->private_data.s_decode_pass.scratch = 0;
72878
27
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
72879
41
              while (true) {
72880
41
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
72881
27
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72882
27
                  goto suspend;
72883
27
                }
72884
14
                uint64_t* scratch = &self->private_data.s_decode_pass.scratch;
72885
14
                uint32_t num_bits_5 = ((uint32_t)(*scratch & 0xFFu));
72886
14
                *scratch >>= 8;
72887
14
                *scratch <<= 8;
72888
14
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_5);
72889
14
                if (num_bits_5 == 24) {
72890
0
                  t_5 = ((uint32_t)(*scratch >> 32));
72891
0
                  break;
72892
0
                }
72893
14
                num_bits_5 += 8u;
72894
14
                *scratch |= ((uint64_t)(num_bits_5));
72895
14
              }
72896
27
            }
72897
263
            v_seq_num = t_5;
72898
263
          }
72899
263
          if (v_seq_num != self->private_impl.f_next_animation_seq_num) {
72900
57
            status = wuffs_base__make_status(wuffs_png__error__bad_animation_sequence_number);
72901
57
            goto exit;
72902
206
          } else if (self->private_impl.f_next_animation_seq_num >= 4294967295u) {
72903
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_file);
72904
0
            goto exit;
72905
0
          }
72906
206
          self->private_impl.f_next_animation_seq_num += 1u;
72907
206
        }
72908
10.1k
        continue;
72909
10.3k
      } else if (((uint64_t)(io2_a_src - iop_a_src)) > 0u) {
72910
0
        status = wuffs_base__make_status(wuffs_png__error__internal_error_zlib_decoder_did_not_exhaust_its_input);
72911
0
        goto exit;
72912
0
      }
72913
598
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
72914
598
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
72915
0
    }
72916
6.59k
    if (self->private_impl.f_workbuf_wi != self->private_impl.f_pass_workbuf_length) {
72917
3
      status = wuffs_base__make_status(wuffs_base__error__not_enough_data);
72918
3
      goto exit;
72919
6.58k
    } else if (0u < ((uint64_t)(a_workbuf.len))) {
72920
6.58k
      if (a_workbuf.ptr[0u] == 4u) {
72921
3.06k
        a_workbuf.ptr[0u] = 1u;
72922
3.06k
      }
72923
6.58k
    }
72924
72925
6.59k
    ok:
72926
6.59k
    self->private_impl.p_decode_pass = 0;
72927
6.59k
    goto exit;
72928
9.77k
  }
72929
72930
0
  goto suspend;
72931
769
  suspend:
72932
769
  self->private_impl.p_decode_pass = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
72933
72934
769
  goto exit;
72935
9.77k
  exit:
72936
9.77k
  if (a_src && a_src->data.ptr) {
72937
9.77k
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
72938
9.77k
  }
72939
72940
9.77k
  return status;
72941
9.77k
}
72942
72943
// -------- func png.decoder.frame_dirty_rect
72944
72945
WUFFS_BASE__GENERATED_C_CODE
72946
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
72947
wuffs_png__decoder__frame_dirty_rect(
72948
5.92k
    const wuffs_png__decoder* self) {
72949
5.92k
  if (!self) {
72950
0
    return wuffs_base__utility__empty_rect_ie_u32();
72951
0
  }
72952
5.92k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72953
5.92k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72954
0
    return wuffs_base__utility__empty_rect_ie_u32();
72955
0
  }
72956
72957
5.92k
  return wuffs_base__utility__make_rect_ie_u32(
72958
5.92k
      self->private_impl.f_frame_rect_x0,
72959
5.92k
      self->private_impl.f_frame_rect_y0,
72960
5.92k
      self->private_impl.f_frame_rect_x1,
72961
5.92k
      self->private_impl.f_frame_rect_y1);
72962
5.92k
}
72963
72964
// -------- func png.decoder.num_animation_loops
72965
72966
WUFFS_BASE__GENERATED_C_CODE
72967
WUFFS_BASE__MAYBE_STATIC uint32_t
72968
wuffs_png__decoder__num_animation_loops(
72969
0
    const wuffs_png__decoder* self) {
72970
0
  if (!self) {
72971
0
    return 0;
72972
0
  }
72973
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72974
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72975
0
    return 0;
72976
0
  }
72977
72978
0
  return self->private_impl.f_num_animation_loops_value;
72979
0
}
72980
72981
// -------- func png.decoder.num_decoded_frame_configs
72982
72983
WUFFS_BASE__GENERATED_C_CODE
72984
WUFFS_BASE__MAYBE_STATIC uint64_t
72985
wuffs_png__decoder__num_decoded_frame_configs(
72986
0
    const wuffs_png__decoder* self) {
72987
0
  if (!self) {
72988
0
    return 0;
72989
0
  }
72990
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
72991
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
72992
0
    return 0;
72993
0
  }
72994
72995
0
  return ((uint64_t)(self->private_impl.f_num_decoded_frame_configs_value));
72996
0
}
72997
72998
// -------- func png.decoder.num_decoded_frames
72999
73000
WUFFS_BASE__GENERATED_C_CODE
73001
WUFFS_BASE__MAYBE_STATIC uint64_t
73002
wuffs_png__decoder__num_decoded_frames(
73003
0
    const wuffs_png__decoder* self) {
73004
0
  if (!self) {
73005
0
    return 0;
73006
0
  }
73007
0
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
73008
0
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
73009
0
    return 0;
73010
0
  }
73011
73012
0
  return ((uint64_t)(self->private_impl.f_num_decoded_frames_value));
73013
0
}
73014
73015
// -------- func png.decoder.restart_frame
73016
73017
WUFFS_BASE__GENERATED_C_CODE
73018
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73019
wuffs_png__decoder__restart_frame(
73020
    wuffs_png__decoder* self,
73021
    uint64_t a_index,
73022
0
    uint64_t a_io_position) {
73023
0
  if (!self) {
73024
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73025
0
  }
73026
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73027
0
    return wuffs_base__make_status(
73028
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73029
0
        ? wuffs_base__error__disabled_by_previous_error
73030
0
        : wuffs_base__error__initialize_not_called);
73031
0
  }
73032
73033
0
  if (self->private_impl.f_call_sequence < 32u) {
73034
0
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
73035
0
  } else if ((a_index >= ((uint64_t)(self->private_impl.f_num_animation_frames_value))) || ((a_index == 0u) && (a_io_position != self->private_impl.f_first_config_io_position))) {
73036
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73037
0
  }
73038
0
  self->private_impl.f_call_sequence = 40u;
73039
0
  if (self->private_impl.f_interlace_pass >= 1u) {
73040
0
    self->private_impl.f_interlace_pass = 1u;
73041
0
  }
73042
0
  self->private_impl.f_frame_config_io_position = a_io_position;
73043
0
  self->private_impl.f_num_decoded_frame_configs_value = ((uint32_t)(a_index));
73044
0
  self->private_impl.f_num_decoded_frames_value = self->private_impl.f_num_decoded_frame_configs_value;
73045
0
  return wuffs_base__make_status(NULL);
73046
0
}
73047
73048
// -------- func png.decoder.set_report_metadata
73049
73050
WUFFS_BASE__GENERATED_C_CODE
73051
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
73052
wuffs_png__decoder__set_report_metadata(
73053
    wuffs_png__decoder* self,
73054
    uint32_t a_fourcc,
73055
0
    bool a_report) {
73056
0
  if (!self) {
73057
0
    return wuffs_base__make_empty_struct();
73058
0
  }
73059
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73060
0
    return wuffs_base__make_empty_struct();
73061
0
  }
73062
73063
0
  if (a_fourcc == 1128813133u) {
73064
0
    self->private_impl.f_report_metadata_chrm = a_report;
73065
0
  } else if (a_fourcc == 1163413830u) {
73066
0
    self->private_impl.f_report_metadata_exif = a_report;
73067
0
  } else if (a_fourcc == 1195461953u) {
73068
0
    self->private_impl.f_report_metadata_gama = a_report;
73069
0
  } else if (a_fourcc == 1229144912u) {
73070
0
    self->private_impl.f_report_metadata_iccp = a_report;
73071
0
  } else if (a_fourcc == 1263947808u) {
73072
0
    self->private_impl.f_report_metadata_kvp = a_report;
73073
0
  } else if (a_fourcc == 1397901122u) {
73074
0
    self->private_impl.f_report_metadata_srgb = a_report;
73075
0
  }
73076
0
  return wuffs_base__make_empty_struct();
73077
0
}
73078
73079
// -------- func png.decoder.tell_me_more
73080
73081
WUFFS_BASE__GENERATED_C_CODE
73082
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
73083
wuffs_png__decoder__tell_me_more(
73084
    wuffs_png__decoder* self,
73085
    wuffs_base__io_buffer* a_dst,
73086
    wuffs_base__more_information* a_minfo,
73087
0
    wuffs_base__io_buffer* a_src) {
73088
0
  if (!self) {
73089
0
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
73090
0
  }
73091
0
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
73092
0
    return wuffs_base__make_status(
73093
0
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
73094
0
        ? wuffs_base__error__disabled_by_previous_error
73095
0
        : wuffs_base__error__initialize_not_called);
73096
0
  }
73097
0
  if (!a_dst || !a_src) {
73098
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73099
0
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
73100
0
  }
73101
0
  if ((self->private_impl.active_coroutine != 0) &&
73102
0
      (self->private_impl.active_coroutine != 4)) {
73103
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73104
0
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
73105
0
  }
73106
0
  self->private_impl.active_coroutine = 0;
73107
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
73108
73109
0
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
73110
73111
0
  uint32_t coro_susp_point = self->private_impl.p_tell_me_more;
73112
0
  switch (coro_susp_point) {
73113
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73114
73115
0
    while (true) {
73116
0
      {
73117
0
        wuffs_base__status t_0 = wuffs_png__decoder__do_tell_me_more(self, a_dst, a_minfo, a_src);
73118
0
        v_status = t_0;
73119
0
      }
73120
0
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
73121
0
        status = wuffs_base__make_status(wuffs_png__error__truncated_input);
73122
0
        goto exit;
73123
0
      }
73124
0
      status = v_status;
73125
0
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73126
0
    }
73127
73128
0
    ok:
73129
0
    self->private_impl.p_tell_me_more = 0;
73130
0
    goto exit;
73131
0
  }
73132
73133
0
  goto suspend;
73134
0
  suspend:
73135
0
  self->private_impl.p_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73136
0
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 4 : 0;
73137
73138
0
  goto exit;
73139
0
  exit:
73140
0
  if (wuffs_base__status__is_error(&status)) {
73141
0
    self->private_impl.magic = WUFFS_BASE__DISABLED;
73142
0
  }
73143
0
  return status;
73144
0
}
73145
73146
// -------- func png.decoder.do_tell_me_more
73147
73148
WUFFS_BASE__GENERATED_C_CODE
73149
static wuffs_base__status
73150
wuffs_png__decoder__do_tell_me_more(
73151
    wuffs_png__decoder* self,
73152
    wuffs_base__io_buffer* a_dst,
73153
    wuffs_base__more_information* a_minfo,
73154
0
    wuffs_base__io_buffer* a_src) {
73155
0
  wuffs_base__status status = wuffs_base__make_status(NULL);
73156
73157
0
  uint8_t v_c8 = 0;
73158
0
  uint16_t v_c16 = 0;
73159
0
  wuffs_base__io_buffer u_w = wuffs_base__empty_io_buffer();
73160
0
  wuffs_base__io_buffer* v_w = &u_w;
73161
0
  uint8_t* iop_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73162
0
  uint8_t* io0_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73163
0
  uint8_t* io1_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73164
0
  uint8_t* io2_v_w WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73165
0
  uint64_t v_num_written = 0;
73166
0
  uint64_t v_w_mark = 0;
73167
0
  uint64_t v_r_mark = 0;
73168
0
  wuffs_base__status v_zlib_status = wuffs_base__make_status(NULL);
73169
73170
0
  uint8_t* iop_a_dst = NULL;
73171
0
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73172
0
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73173
0
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73174
0
  if (a_dst && a_dst->data.ptr) {
73175
0
    io0_a_dst = a_dst->data.ptr;
73176
0
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
73177
0
    iop_a_dst = io1_a_dst;
73178
0
    io2_a_dst = io0_a_dst + a_dst->data.len;
73179
0
    if (a_dst->meta.closed) {
73180
0
      io2_a_dst = iop_a_dst;
73181
0
    }
73182
0
  }
73183
0
  const uint8_t* iop_a_src = NULL;
73184
0
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73185
0
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73186
0
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
73187
0
  if (a_src && a_src->data.ptr) {
73188
0
    io0_a_src = a_src->data.ptr;
73189
0
    io1_a_src = io0_a_src + a_src->meta.ri;
73190
0
    iop_a_src = io1_a_src;
73191
0
    io2_a_src = io0_a_src + a_src->meta.wi;
73192
0
  }
73193
73194
0
  uint32_t coro_susp_point = self->private_impl.p_do_tell_me_more;
73195
0
  if (coro_susp_point) {
73196
0
    v_zlib_status = self->private_data.s_do_tell_me_more.v_zlib_status;
73197
0
  }
73198
0
  switch (coro_susp_point) {
73199
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
73200
73201
0
    if (((uint8_t)(self->private_impl.f_call_sequence & 16u)) == 0u) {
73202
0
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
73203
0
      goto exit;
73204
0
    }
73205
0
    if (self->private_impl.f_metadata_fourcc == 0u) {
73206
0
      status = wuffs_base__make_status(wuffs_base__error__no_more_information);
73207
0
      goto exit;
73208
0
    }
73209
0
    do {
73210
0
      if (self->private_impl.f_metadata_flavor == 3u) {
73211
0
        while (true) {
73212
0
          if (wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src))) != self->private_impl.f_metadata_y) {
73213
0
            status = wuffs_base__make_status(wuffs_base__error__bad_i_o_position);
73214
0
            goto exit;
73215
0
          } else if (a_minfo != NULL) {
73216
0
            wuffs_base__more_information__set(a_minfo,
73217
0
                self->private_impl.f_metadata_flavor,
73218
0
                self->private_impl.f_metadata_fourcc,
73219
0
                self->private_impl.f_metadata_x,
73220
0
                self->private_impl.f_metadata_y,
73221
0
                self->private_impl.f_metadata_z);
73222
0
          }
73223
0
          if (self->private_impl.f_metadata_y >= self->private_impl.f_metadata_z) {
73224
0
            goto label__goto_done__break;
73225
0
          }
73226
0
          self->private_impl.f_metadata_y = self->private_impl.f_metadata_z;
73227
0
          status = wuffs_base__make_status(wuffs_base__suspension__even_more_information);
73228
0
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
73229
0
        }
73230
0
      }
73231
0
      if (self->private_impl.f_metadata_is_zlib_compressed) {
73232
0
        if (self->private_impl.f_zlib_is_dirty) {
73233
0
          wuffs_private_impl__ignore_status(wuffs_zlib__decoder__initialize(&self->private_data.f_zlib,
73234
0
              sizeof (wuffs_zlib__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
73235
0
          if (self->private_impl.f_ignore_checksum) {
73236
0
            wuffs_zlib__decoder__set_quirk(&self->private_data.f_zlib, 1u, 1u);
73237
0
          }
73238
0
        }
73239
0
        self->private_impl.f_zlib_is_dirty = true;
73240
0
        self->private_impl.f_ztxt_hist_pos = 0u;
73241
0
      }
73242
0
      label__loop__continue:;
73243
0
      while (true) {
73244
0
        if (a_minfo != NULL) {
73245
0
          wuffs_base__more_information__set(a_minfo,
73246
0
              self->private_impl.f_metadata_flavor,
73247
0
              self->private_impl.f_metadata_fourcc,
73248
0
              self->private_impl.f_metadata_x,
73249
0
              self->private_impl.f_metadata_y,
73250
0
              self->private_impl.f_metadata_z);
73251
0
        }
73252
0
        if (self->private_impl.f_metadata_flavor != 4u) {
73253
0
          break;
73254
0
        }
73255
0
        if (self->private_impl.f_metadata_is_zlib_compressed) {
73256
0
          if (self->private_impl.f_chunk_type == 1346585449u) {
73257
0
            {
73258
0
              const bool o_0_closed_a_src = a_src->meta.closed;
73259
0
              const uint8_t* o_0_io2_a_src = io2_a_src;
73260
0
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
73261
0
                  ((uint64_t)(self->private_impl.f_chunk_length)));
73262
0
              if (a_src) {
73263
0
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
73264
0
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
73265
0
                a_src->meta.wi = n;
73266
0
              }
73267
0
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
73268
0
              {
73269
0
                if (a_dst) {
73270
0
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
73271
0
                }
73272
0
                if (a_src) {
73273
0
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73274
0
                }
73275
0
                wuffs_base__status t_0 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8());
73276
0
                v_zlib_status = t_0;
73277
0
                if (a_dst) {
73278
0
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
73279
0
                }
73280
0
                if (a_src) {
73281
0
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
73282
0
                }
73283
0
              }
73284
0
              wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
73285
0
              io2_a_src = o_0_io2_a_src;
73286
0
              if (a_src) {
73287
0
                a_src->meta.closed = o_0_closed_a_src;
73288
0
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
73289
0
              }
73290
0
            }
73291
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
73292
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
73293
0
              break;
73294
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
73295
0
              status = v_zlib_status;
73296
0
              if (wuffs_base__status__is_error(&status)) {
73297
0
                goto exit;
73298
0
              } else if (wuffs_base__status__is_suspension(&status)) {
73299
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
73300
0
                goto exit;
73301
0
              }
73302
0
              goto ok;
73303
0
            }
73304
0
            status = v_zlib_status;
73305
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
73306
0
          } else if (self->private_impl.f_chunk_type == 1951945833u) {
73307
0
            {
73308
0
              const bool o_1_closed_a_src = a_src->meta.closed;
73309
0
              const uint8_t* o_1_io2_a_src = io2_a_src;
73310
0
              wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
73311
0
                  ((uint64_t)(self->private_impl.f_chunk_length)));
73312
0
              if (a_src) {
73313
0
                size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
73314
0
                a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
73315
0
                a_src->meta.wi = n;
73316
0
              }
73317
0
              v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
73318
0
              {
73319
0
                if (a_dst) {
73320
0
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
73321
0
                }
73322
0
                if (a_src) {
73323
0
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73324
0
                }
73325
0
                wuffs_base__status t_1 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, a_dst, a_src, wuffs_base__utility__empty_slice_u8());
73326
0
                v_zlib_status = t_1;
73327
0
                if (a_dst) {
73328
0
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
73329
0
                }
73330
0
                if (a_src) {
73331
0
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
73332
0
                }
73333
0
              }
73334
0
              wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
73335
0
              io2_a_src = o_1_io2_a_src;
73336
0
              if (a_src) {
73337
0
                a_src->meta.closed = o_1_closed_a_src;
73338
0
                a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
73339
0
              }
73340
0
            }
73341
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
73342
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
73343
0
              break;
73344
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
73345
0
              status = v_zlib_status;
73346
0
              if (wuffs_base__status__is_error(&status)) {
73347
0
                goto exit;
73348
0
              } else if (wuffs_base__status__is_suspension(&status)) {
73349
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
73350
0
                goto exit;
73351
0
              }
73352
0
              goto ok;
73353
0
            }
73354
0
            status = v_zlib_status;
73355
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
73356
0
          } else if (self->private_impl.f_chunk_type == 1951945850u) {
73357
0
            if (self->private_impl.f_ztxt_ri == self->private_impl.f_ztxt_wi) {
73358
0
              {
73359
0
                wuffs_base__io_buffer* o_2_v_w = v_w;
73360
0
                uint8_t* o_2_iop_v_w = iop_v_w;
73361
0
                uint8_t* o_2_io0_v_w = io0_v_w;
73362
0
                uint8_t* o_2_io1_v_w = io1_v_w;
73363
0
                uint8_t* o_2_io2_v_w = io2_v_w;
73364
0
                v_w = wuffs_private_impl__io_writer__set(
73365
0
                    &u_w,
73366
0
                    &iop_v_w,
73367
0
                    &io0_v_w,
73368
0
                    &io1_v_w,
73369
0
                    &io2_v_w,
73370
0
                    wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024),
73371
0
                    self->private_impl.f_ztxt_hist_pos);
73372
0
                {
73373
0
                  const bool o_3_closed_a_src = a_src->meta.closed;
73374
0
                  const uint8_t* o_3_io2_a_src = io2_a_src;
73375
0
                  wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
73376
0
                      ((uint64_t)(self->private_impl.f_chunk_length)));
73377
0
                  if (a_src) {
73378
0
                    size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
73379
0
                    a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
73380
0
                    a_src->meta.wi = n;
73381
0
                  }
73382
0
                  v_w_mark = ((uint64_t)(iop_v_w - io0_v_w));
73383
0
                  v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
73384
0
                  {
73385
0
                    u_w.meta.wi = ((size_t)(iop_v_w - u_w.data.ptr));
73386
0
                    if (a_src) {
73387
0
                      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73388
0
                    }
73389
0
                    wuffs_base__status t_2 = wuffs_zlib__decoder__transform_io(&self->private_data.f_zlib, v_w, a_src, wuffs_base__utility__empty_slice_u8());
73390
0
                    v_zlib_status = t_2;
73391
0
                    iop_v_w = u_w.data.ptr + u_w.meta.wi;
73392
0
                    if (a_src) {
73393
0
                      iop_a_src = a_src->data.ptr + a_src->meta.ri;
73394
0
                    }
73395
0
                  }
73396
0
                  wuffs_private_impl__u32__sat_sub_indirect(&self->private_impl.f_chunk_length, ((uint32_t)(wuffs_private_impl__io__count_since(v_r_mark, ((uint64_t)(iop_a_src - io0_a_src))))));
73397
0
                  v_num_written = wuffs_private_impl__io__count_since(v_w_mark, ((uint64_t)(iop_v_w - io0_v_w)));
73398
0
                  io2_a_src = o_3_io2_a_src;
73399
0
                  if (a_src) {
73400
0
                    a_src->meta.closed = o_3_closed_a_src;
73401
0
                    a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
73402
0
                  }
73403
0
                }
73404
0
                v_w = o_2_v_w;
73405
0
                iop_v_w = o_2_iop_v_w;
73406
0
                io0_v_w = o_2_io0_v_w;
73407
0
                io1_v_w = o_2_io1_v_w;
73408
0
                io2_v_w = o_2_io2_v_w;
73409
0
              }
73410
0
              if (v_num_written > 1024u) {
73411
0
                status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_i_o);
73412
0
                goto exit;
73413
0
              }
73414
0
              self->private_impl.f_ztxt_ri = 0u;
73415
0
              self->private_impl.f_ztxt_wi = ((uint32_t)(v_num_written));
73416
0
              wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_ztxt_hist_pos, v_num_written);
73417
0
            }
73418
0
            while (self->private_impl.f_ztxt_ri < self->private_impl.f_ztxt_wi) {
73419
0
              v_c16 = WUFFS_PNG__LATIN_1[self->private_data.f_dst_palette[self->private_impl.f_ztxt_ri]];
73420
0
              if (v_c16 == 0u) {
73421
0
                status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
73422
0
                goto exit;
73423
0
              } else if (v_c16 <= 127u) {
73424
0
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
73425
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
73426
0
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
73427
0
                  goto label__loop__continue;
73428
0
                }
73429
0
                self->private_impl.f_ztxt_ri += 1u;
73430
0
                (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
73431
0
              } else {
73432
0
                if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
73433
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_write);
73434
0
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
73435
0
                  goto label__loop__continue;
73436
0
                }
73437
0
                self->private_impl.f_ztxt_ri += 1u;
73438
0
                (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
73439
0
              }
73440
0
            }
73441
0
            if (wuffs_base__status__is_ok(&v_zlib_status)) {
73442
0
              self->private_impl.f_metadata_is_zlib_compressed = false;
73443
0
              break;
73444
0
            } else if ( ! wuffs_base__status__is_suspension(&v_zlib_status)) {
73445
0
              status = v_zlib_status;
73446
0
              if (wuffs_base__status__is_error(&status)) {
73447
0
                goto exit;
73448
0
              } else if (wuffs_base__status__is_suspension(&status)) {
73449
0
                status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
73450
0
                goto exit;
73451
0
              }
73452
0
              goto ok;
73453
0
            } else if (v_zlib_status.repr != wuffs_base__suspension__short_write) {
73454
0
              status = v_zlib_status;
73455
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
73456
0
            }
73457
0
          } else {
73458
0
            status = wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_chunk_type);
73459
0
            goto exit;
73460
0
          }
73461
0
        } else if ((self->private_impl.f_chunk_type == 1951945833u) && (self->private_impl.f_metadata_fourcc == 1263947862u)) {
73462
0
          while (true) {
73463
0
            if (self->private_impl.f_chunk_length <= 0u) {
73464
0
              goto label__loop__break;
73465
0
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
73466
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73467
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
73468
0
              goto label__loop__continue;
73469
0
            } else if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
73470
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_write);
73471
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
73472
0
              goto label__loop__continue;
73473
0
            }
73474
0
            self->private_impl.f_chunk_length -= 1u;
73475
0
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
73476
0
            iop_a_src += 1u;
73477
0
            (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, v_c8), iop_a_dst += 1);
73478
0
          }
73479
0
        } else {
73480
0
          while (true) {
73481
0
            if (self->private_impl.f_chunk_length <= 0u) {
73482
0
              if (self->private_impl.f_metadata_fourcc == 1263947851u) {
73483
0
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73484
0
                goto exit;
73485
0
              }
73486
0
              goto label__loop__break;
73487
0
            } else if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
73488
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73489
0
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
73490
0
              goto label__loop__continue;
73491
0
            }
73492
0
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
73493
0
            if (v_c8 == 0u) {
73494
0
              self->private_impl.f_chunk_length -= 1u;
73495
0
              iop_a_src += 1u;
73496
0
              goto label__loop__break;
73497
0
            }
73498
0
            v_c16 = WUFFS_PNG__LATIN_1[v_c8];
73499
0
            if (v_c16 == 0u) {
73500
0
              status = wuffs_base__make_status(wuffs_png__error__bad_text_chunk_not_latin_1);
73501
0
              goto exit;
73502
0
            } else if (v_c16 <= 127u) {
73503
0
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 0u) {
73504
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
73505
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
73506
0
                goto label__loop__continue;
73507
0
              }
73508
0
              self->private_impl.f_chunk_length -= 1u;
73509
0
              iop_a_src += 1u;
73510
0
              (wuffs_base__poke_u8be__no_bounds_check(iop_a_dst, ((uint8_t)(v_c16))), iop_a_dst += 1);
73511
0
            } else {
73512
0
              if (((uint64_t)(io2_a_dst - iop_a_dst)) <= 1u) {
73513
0
                status = wuffs_base__make_status(wuffs_base__suspension__short_write);
73514
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(11);
73515
0
                goto label__loop__continue;
73516
0
              }
73517
0
              self->private_impl.f_chunk_length -= 1u;
73518
0
              iop_a_src += 1u;
73519
0
              (wuffs_base__poke_u16le__no_bounds_check(iop_a_dst, v_c16), iop_a_dst += 2);
73520
0
            }
73521
0
          }
73522
0
        }
73523
0
      }
73524
0
      label__loop__break:;
73525
0
      if (self->private_impl.f_metadata_fourcc == 1263947851u) {
73526
0
        self->private_impl.f_metadata_fourcc = 1263947862u;
73527
0
        if (self->private_impl.f_chunk_type == 1951945833u) {
73528
0
          if (self->private_impl.f_chunk_length <= 1u) {
73529
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73530
0
            goto exit;
73531
0
          }
73532
0
          self->private_impl.f_chunk_length -= 2u;
73533
0
          {
73534
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
73535
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73536
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73537
0
              goto suspend;
73538
0
            }
73539
0
            uint8_t t_3 = *iop_a_src++;
73540
0
            v_c8 = t_3;
73541
0
          }
73542
0
          if (v_c8 == 0u) {
73543
0
            self->private_impl.f_metadata_is_zlib_compressed = false;
73544
0
          } else if (v_c8 == 1u) {
73545
0
            self->private_impl.f_metadata_is_zlib_compressed = true;
73546
0
          } else {
73547
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73548
0
            goto exit;
73549
0
          }
73550
0
          {
73551
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
73552
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73553
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73554
0
              goto suspend;
73555
0
            }
73556
0
            uint8_t t_4 = *iop_a_src++;
73557
0
            v_c8 = t_4;
73558
0
          }
73559
0
          if ((v_c8 != 0u) && self->private_impl.f_metadata_is_zlib_compressed) {
73560
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
73561
0
            goto exit;
73562
0
          }
73563
0
          self->private_impl.f_metadata_fourcc -= 2u;
73564
0
          while (self->private_impl.f_metadata_fourcc != 1263947862u) {
73565
0
            self->private_impl.f_metadata_fourcc += 1u;
73566
0
            while (true) {
73567
0
              if (self->private_impl.f_chunk_length <= 0u) {
73568
0
                status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73569
0
                goto exit;
73570
0
              }
73571
0
              self->private_impl.f_chunk_length -= 1u;
73572
0
              {
73573
0
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
73574
0
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73575
0
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73576
0
                  goto suspend;
73577
0
                }
73578
0
                uint8_t t_5 = *iop_a_src++;
73579
0
                v_c8 = t_5;
73580
0
              }
73581
0
              if (v_c8 == 0u) {
73582
0
                break;
73583
0
              }
73584
0
            }
73585
0
          }
73586
0
        } else if (self->private_impl.f_chunk_type == 1951945850u) {
73587
0
          if (self->private_impl.f_chunk_length <= 0u) {
73588
0
            status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73589
0
            goto exit;
73590
0
          }
73591
0
          self->private_impl.f_chunk_length -= 1u;
73592
0
          {
73593
0
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
73594
0
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
73595
0
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73596
0
              goto suspend;
73597
0
            }
73598
0
            uint8_t t_6 = *iop_a_src++;
73599
0
            v_c8 = t_6;
73600
0
          }
73601
0
          if (v_c8 != 0u) {
73602
0
            status = wuffs_base__make_status(wuffs_png__error__unsupported_png_compression_method);
73603
0
            goto exit;
73604
0
          }
73605
0
          self->private_impl.f_metadata_is_zlib_compressed = true;
73606
0
        }
73607
0
        self->private_impl.f_call_sequence &= 239u;
73608
0
        status = wuffs_base__make_status(NULL);
73609
0
        goto ok;
73610
0
      }
73611
0
    } while (0);
73612
0
    label__goto_done__break:;
73613
0
    if (self->private_impl.f_chunk_length != 0u) {
73614
0
      status = wuffs_base__make_status(wuffs_png__error__bad_chunk);
73615
0
      goto exit;
73616
0
    }
73617
0
    self->private_data.s_do_tell_me_more.scratch = 4u;
73618
0
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
73619
0
    if (self->private_data.s_do_tell_me_more.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
73620
0
      self->private_data.s_do_tell_me_more.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
73621
0
      iop_a_src = io2_a_src;
73622
0
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
73623
0
      goto suspend;
73624
0
    }
73625
0
    iop_a_src += self->private_data.s_do_tell_me_more.scratch;
73626
0
    self->private_impl.f_metadata_flavor = 0u;
73627
0
    self->private_impl.f_metadata_fourcc = 0u;
73628
0
    self->private_impl.f_metadata_x = 0u;
73629
0
    self->private_impl.f_metadata_y = 0u;
73630
0
    self->private_impl.f_metadata_z = 0u;
73631
0
    self->private_impl.f_call_sequence &= 239u;
73632
0
    status = wuffs_base__make_status(NULL);
73633
0
    goto ok;
73634
73635
0
    ok:
73636
0
    self->private_impl.p_do_tell_me_more = 0;
73637
0
    goto exit;
73638
0
  }
73639
73640
0
  goto suspend;
73641
0
  suspend:
73642
0
  self->private_impl.p_do_tell_me_more = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
73643
0
  self->private_data.s_do_tell_me_more.v_zlib_status = v_zlib_status;
73644
73645
0
  goto exit;
73646
0
  exit:
73647
0
  if (a_dst && a_dst->data.ptr) {
73648
0
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
73649
0
  }
73650
0
  if (a_src && a_src->data.ptr) {
73651
0
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
73652
0
  }
73653
73654
0
  return status;
73655
0
}
73656
73657
// -------- func png.decoder.workbuf_len
73658
73659
WUFFS_BASE__GENERATED_C_CODE
73660
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
73661
wuffs_png__decoder__workbuf_len(
73662
3.90k
    const wuffs_png__decoder* self) {
73663
3.90k
  if (!self) {
73664
0
    return wuffs_base__utility__empty_range_ii_u64();
73665
0
  }
73666
3.90k
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
73667
3.90k
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
73668
0
    return wuffs_base__utility__empty_range_ii_u64();
73669
0
  }
73670
73671
3.90k
  return wuffs_base__utility__make_range_ii_u64(self->private_impl.f_overall_workbuf_length, self->private_impl.f_overall_workbuf_length);
73672
3.90k
}
73673
73674
// -------- func png.decoder.filter_and_swizzle
73675
73676
WUFFS_BASE__GENERATED_C_CODE
73677
static wuffs_base__status
73678
wuffs_png__decoder__filter_and_swizzle(
73679
    wuffs_png__decoder* self,
73680
    wuffs_base__pixel_buffer* a_dst,
73681
9.03k
    wuffs_base__slice_u8 a_workbuf) {
73682
9.03k
  return (*self->private_impl.choosy_filter_and_swizzle)(self, a_dst, a_workbuf);
73683
9.03k
}
73684
73685
WUFFS_BASE__GENERATED_C_CODE
73686
static wuffs_base__status
73687
wuffs_png__decoder__filter_and_swizzle__choosy_default(
73688
    wuffs_png__decoder* self,
73689
    wuffs_base__pixel_buffer* a_dst,
73690
2.85k
    wuffs_base__slice_u8 a_workbuf) {
73691
2.85k
  wuffs_base__pixel_format v_dst_pixfmt = {0};
73692
2.85k
  uint32_t v_dst_bits_per_pixel = 0;
73693
2.85k
  uint64_t v_dst_bytes_per_pixel = 0;
73694
2.85k
  uint64_t v_dst_bytes_per_row0 = 0;
73695
2.85k
  uint64_t v_dst_bytes_per_row1 = 0;
73696
2.85k
  wuffs_base__slice_u8 v_dst_palette = {0};
73697
2.85k
  wuffs_base__table_u8 v_tab = {0};
73698
2.85k
  uint32_t v_y = 0;
73699
2.85k
  wuffs_base__slice_u8 v_dst = {0};
73700
2.85k
  uint8_t v_filter = 0;
73701
2.85k
  wuffs_base__slice_u8 v_curr_row = {0};
73702
2.85k
  wuffs_base__slice_u8 v_prev_row = {0};
73703
73704
2.85k
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
73705
2.85k
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
73706
2.85k
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
73707
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
73708
0
  }
73709
2.85k
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
73710
2.85k
  v_dst_bytes_per_row0 = (((uint64_t)(self->private_impl.f_frame_rect_x0)) * v_dst_bytes_per_pixel);
73711
2.85k
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
73712
2.85k
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
73713
2.85k
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
73714
2.85k
  if (v_dst_bytes_per_row1 < ((uint64_t)(v_tab.width))) {
73715
1.18k
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
73716
1.18k
        0u,
73717
1.18k
        0u,
73718
1.18k
        v_dst_bytes_per_row1,
73719
1.18k
        ((uint64_t)(v_tab.height)));
73720
1.18k
  }
73721
2.85k
  if (v_dst_bytes_per_row0 < ((uint64_t)(v_tab.width))) {
73722
2.85k
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
73723
2.85k
        v_dst_bytes_per_row0,
73724
2.85k
        0u,
73725
2.85k
        ((uint64_t)(v_tab.width)),
73726
2.85k
        ((uint64_t)(v_tab.height)));
73727
2.85k
  } else {
73728
0
    v_tab = wuffs_base__table_u8__subtable_ij(v_tab,
73729
0
        0u,
73730
0
        0u,
73731
0
        0u,
73732
0
        0u);
73733
0
  }
73734
2.85k
  v_y = self->private_impl.f_frame_rect_y0;
73735
5.92M
  while (v_y < self->private_impl.f_frame_rect_y1) {
73736
5.92M
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
73737
5.92M
    if (1u > ((uint64_t)(a_workbuf.len))) {
73738
497
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
73739
497
    }
73740
5.91M
    v_filter = a_workbuf.ptr[0u];
73741
5.91M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
73742
5.91M
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
73743
584
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
73744
584
    }
73745
5.91M
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
73746
5.91M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
73747
5.91M
    if (v_filter == 0u) {
73748
4.50M
    } else if (v_filter == 1u) {
73749
643k
      wuffs_png__decoder__filter_1(self, v_curr_row);
73750
768k
    } else if (v_filter == 2u) {
73751
320k
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
73752
447k
    } else if (v_filter == 3u) {
73753
404k
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
73754
404k
    } else if (v_filter == 4u) {
73755
42.5k
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
73756
42.5k
    } else {
73757
94
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
73758
94
    }
73759
5.91M
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, v_curr_row);
73760
5.91M
    v_prev_row = v_curr_row;
73761
5.91M
    v_y += 1u;
73762
5.91M
  }
73763
1.67k
  return wuffs_base__make_status(NULL);
73764
2.85k
}
73765
73766
// -------- func png.decoder.filter_and_swizzle_tricky
73767
73768
WUFFS_BASE__GENERATED_C_CODE
73769
static wuffs_base__status
73770
wuffs_png__decoder__filter_and_swizzle_tricky(
73771
    wuffs_png__decoder* self,
73772
    wuffs_base__pixel_buffer* a_dst,
73773
6.18k
    wuffs_base__slice_u8 a_workbuf) {
73774
6.18k
  wuffs_base__pixel_format v_dst_pixfmt = {0};
73775
6.18k
  uint32_t v_dst_bits_per_pixel = 0;
73776
6.18k
  uint64_t v_dst_bytes_per_pixel = 0;
73777
6.18k
  uint64_t v_dst_bytes_per_row1 = 0;
73778
6.18k
  wuffs_base__slice_u8 v_dst_palette = {0};
73779
6.18k
  wuffs_base__table_u8 v_tab = {0};
73780
6.18k
  uint64_t v_src_bytes_per_pixel = 0;
73781
6.18k
  uint32_t v_x = 0;
73782
6.18k
  uint32_t v_y = 0;
73783
6.18k
  uint64_t v_i = 0;
73784
6.18k
  wuffs_base__slice_u8 v_dst = {0};
73785
6.18k
  uint8_t v_filter = 0;
73786
6.18k
  wuffs_base__slice_u8 v_s = {0};
73787
6.18k
  wuffs_base__slice_u8 v_curr_row = {0};
73788
6.18k
  wuffs_base__slice_u8 v_prev_row = {0};
73789
6.18k
  uint8_t v_bits_unpacked[8] = {0};
73790
6.18k
  uint8_t v_bits_packed = 0;
73791
6.18k
  uint8_t v_packs_remaining = 0;
73792
6.18k
  uint8_t v_multiplier = 0;
73793
6.18k
  uint8_t v_shift = 0;
73794
73795
6.18k
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
73796
6.18k
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
73797
6.18k
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
73798
0
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
73799
0
  }
73800
6.18k
  v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
73801
6.18k
  v_dst_bytes_per_row1 = (((uint64_t)(self->private_impl.f_frame_rect_x1)) * v_dst_bytes_per_pixel);
73802
6.18k
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
73803
6.18k
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
73804
6.18k
  v_src_bytes_per_pixel = 1u;
73805
6.18k
  if (self->private_impl.f_depth >= 8u) {
73806
2.59k
    v_src_bytes_per_pixel = (((uint64_t)(WUFFS_PNG__NUM_CHANNELS[self->private_impl.f_color_type])) * ((uint64_t)(((uint8_t)(self->private_impl.f_depth >> 3u)))));
73807
2.59k
  }
73808
6.18k
  if (self->private_impl.f_chunk_type_array[0u] == 73u) {
73809
6.04k
    v_y = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][5u]));
73810
6.04k
  } else {
73811
146
    v_y = self->private_impl.f_frame_rect_y0;
73812
146
  }
73813
7.30M
  while (v_y < self->private_impl.f_frame_rect_y1) {
73814
7.30M
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
73815
7.30M
    if (v_dst_bytes_per_row1 < ((uint64_t)(v_dst.len))) {
73816
688
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row1);
73817
688
    }
73818
7.30M
    if (1u > ((uint64_t)(a_workbuf.len))) {
73819
418
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
73820
418
    }
73821
7.30M
    v_filter = a_workbuf.ptr[0u];
73822
7.30M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, 1u);
73823
7.30M
    if (self->private_impl.f_pass_bytes_per_row > ((uint64_t)(a_workbuf.len))) {
73824
634
      return wuffs_base__make_status(wuffs_png__error__internal_error_inconsistent_workbuf_length);
73825
634
    }
73826
7.30M
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_workbuf, self->private_impl.f_pass_bytes_per_row);
73827
7.30M
    a_workbuf = wuffs_base__slice_u8__subslice_i(a_workbuf, self->private_impl.f_pass_bytes_per_row);
73828
7.30M
    if (v_filter == 0u) {
73829
4.96M
    } else if (v_filter == 1u) {
73830
544k
      wuffs_png__decoder__filter_1(self, v_curr_row);
73831
1.79M
    } else if (v_filter == 2u) {
73832
506k
      wuffs_png__decoder__filter_2(self, v_curr_row, v_prev_row);
73833
1.28M
    } else if (v_filter == 3u) {
73834
695k
      wuffs_png__decoder__filter_3(self, v_curr_row, v_prev_row);
73835
695k
    } else if (v_filter == 4u) {
73836
593k
      wuffs_png__decoder__filter_4(self, v_curr_row, v_prev_row);
73837
593k
    } else {
73838
115
      return wuffs_base__make_status(wuffs_png__error__bad_filter);
73839
115
    }
73840
7.30M
    v_s = v_curr_row;
73841
7.30M
    if (self->private_impl.f_chunk_type_array[0u] == 73u) {
73842
7.29M
      v_x = ((uint32_t)(WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][2u]));
73843
7.29M
    } else {
73844
291
      v_x = self->private_impl.f_frame_rect_x0;
73845
291
    }
73846
7.30M
    if (self->private_impl.f_depth == 8u) {
73847
121M
      while (v_x < self->private_impl.f_frame_rect_x1) {
73848
114M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
73849
114M
        if (v_i <= ((uint64_t)(v_dst.len))) {
73850
114M
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
73851
22.7M
            if (self->private_impl.f_color_type == 0u) {
73852
10.1k
              if (1u <= ((uint64_t)(v_s.len))) {
73853
10.1k
                v_bits_unpacked[0u] = v_s.ptr[0u];
73854
10.1k
                v_bits_unpacked[1u] = v_s.ptr[0u];
73855
10.1k
                v_bits_unpacked[2u] = v_s.ptr[0u];
73856
10.1k
                v_bits_unpacked[3u] = 255u;
73857
10.1k
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
73858
10.1k
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
73859
10.1k
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
73860
10.1k
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
73861
10.1k
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
73862
9.22k
                  v_bits_unpacked[0u] = 0u;
73863
9.22k
                  v_bits_unpacked[1u] = 0u;
73864
9.22k
                  v_bits_unpacked[2u] = 0u;
73865
9.22k
                  v_bits_unpacked[3u] = 0u;
73866
9.22k
                }
73867
10.1k
                wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4));
73868
10.1k
              }
73869
22.7M
            } else {
73870
22.7M
              if (3u <= ((uint64_t)(v_s.len))) {
73871
22.7M
                v_bits_unpacked[0u] = v_s.ptr[2u];
73872
22.7M
                v_bits_unpacked[1u] = v_s.ptr[1u];
73873
22.7M
                v_bits_unpacked[2u] = v_s.ptr[0u];
73874
22.7M
                v_bits_unpacked[3u] = 255u;
73875
22.7M
                v_s = wuffs_base__slice_u8__subslice_i(v_s, 3u);
73876
22.7M
                if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
73877
22.7M
                    (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
73878
22.7M
                    (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
73879
22.7M
                    (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
73880
3.63M
                  v_bits_unpacked[0u] = 0u;
73881
3.63M
                  v_bits_unpacked[1u] = 0u;
73882
3.63M
                  v_bits_unpacked[2u] = 0u;
73883
3.63M
                  v_bits_unpacked[3u] = 0u;
73884
3.63M
                }
73885
22.7M
                wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4));
73886
22.7M
              }
73887
22.7M
            }
73888
91.9M
          } else if (v_src_bytes_per_pixel <= ((uint64_t)(v_s.len))) {
73889
91.9M
            wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__slice_u8__subslice_j(v_s, v_src_bytes_per_pixel));
73890
91.9M
            v_s = wuffs_base__slice_u8__subslice_i(v_s, v_src_bytes_per_pixel);
73891
91.9M
          }
73892
114M
        }
73893
114M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
73894
114M
      }
73895
6.27M
    } else if (self->private_impl.f_depth < 8u) {
73896
1.01M
      v_multiplier = 1u;
73897
1.01M
      if (self->private_impl.f_color_type == 0u) {
73898
1.01M
        v_multiplier = WUFFS_PNG__LOW_BIT_DEPTH_MULTIPLIERS[self->private_impl.f_depth];
73899
1.01M
      }
73900
1.01M
      v_shift = ((uint8_t)(((uint8_t)(8u - self->private_impl.f_depth)) & 7u));
73901
1.01M
      v_packs_remaining = 0u;
73902
54.3M
      while (v_x < self->private_impl.f_frame_rect_x1) {
73903
53.3M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
73904
53.3M
        if (v_i <= ((uint64_t)(v_dst.len))) {
73905
53.3M
          if ((v_packs_remaining == 0u) && (1u <= ((uint64_t)(v_s.len)))) {
73906
18.6M
            v_packs_remaining = WUFFS_PNG__LOW_BIT_DEPTH_NUM_PACKS[self->private_impl.f_depth];
73907
18.6M
            v_bits_packed = v_s.ptr[0u];
73908
18.6M
            v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
73909
18.6M
          }
73910
53.3M
          v_bits_unpacked[0u] = ((uint8_t)(((uint8_t)(v_bits_packed >> v_shift)) * v_multiplier));
73911
53.3M
          v_bits_packed = ((uint8_t)(v_bits_packed << self->private_impl.f_depth));
73912
53.3M
          v_packs_remaining = ((uint8_t)(v_packs_remaining - 1u));
73913
53.3M
          if (((uint32_t)(self->private_impl.f_remap_transparency)) != 0u) {
73914
593k
            v_bits_unpacked[1u] = v_bits_unpacked[0u];
73915
593k
            v_bits_unpacked[2u] = v_bits_unpacked[0u];
73916
593k
            v_bits_unpacked[3u] = 255u;
73917
593k
            if (((uint32_t)(self->private_impl.f_remap_transparency)) == ((((uint32_t)(v_bits_unpacked[0u])) << 0u) |
73918
593k
                (((uint32_t)(v_bits_unpacked[1u])) << 8u) |
73919
593k
                (((uint32_t)(v_bits_unpacked[2u])) << 16u) |
73920
593k
                (((uint32_t)(v_bits_unpacked[3u])) << 24u))) {
73921
580k
              v_bits_unpacked[0u] = 0u;
73922
580k
              v_bits_unpacked[1u] = 0u;
73923
580k
              v_bits_unpacked[2u] = 0u;
73924
580k
              v_bits_unpacked[3u] = 0u;
73925
580k
            }
73926
593k
            wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 4));
73927
52.7M
          } else {
73928
52.7M
            wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 1));
73929
52.7M
          }
73930
53.3M
        }
73931
53.3M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
73932
53.3M
      }
73933
1.01M
    } else {
73934
37.9M
      while (v_x < self->private_impl.f_frame_rect_x1) {
73935
37.8M
        v_i = (((uint64_t)(v_x)) * v_dst_bytes_per_pixel);
73936
37.8M
        if (v_i <= ((uint64_t)(v_dst.len))) {
73937
37.8M
          if (self->private_impl.f_color_type == 0u) {
73938
2.02M
            if (2u <= ((uint64_t)(v_s.len))) {
73939
2.02M
              v_bits_unpacked[0u] = v_s.ptr[1u];
73940
2.02M
              v_bits_unpacked[1u] = v_s.ptr[0u];
73941
2.02M
              v_bits_unpacked[2u] = v_s.ptr[1u];
73942
2.02M
              v_bits_unpacked[3u] = v_s.ptr[0u];
73943
2.02M
              v_bits_unpacked[4u] = v_s.ptr[1u];
73944
2.02M
              v_bits_unpacked[5u] = v_s.ptr[0u];
73945
2.02M
              v_bits_unpacked[6u] = 255u;
73946
2.02M
              v_bits_unpacked[7u] = 255u;
73947
2.02M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
73948
2.02M
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
73949
2.02M
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
73950
2.02M
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
73951
2.02M
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
73952
2.02M
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
73953
2.02M
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
73954
2.02M
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
73955
2.02M
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
73956
350
                v_bits_unpacked[0u] = 0u;
73957
350
                v_bits_unpacked[1u] = 0u;
73958
350
                v_bits_unpacked[2u] = 0u;
73959
350
                v_bits_unpacked[3u] = 0u;
73960
350
                v_bits_unpacked[4u] = 0u;
73961
350
                v_bits_unpacked[5u] = 0u;
73962
350
                v_bits_unpacked[6u] = 0u;
73963
350
                v_bits_unpacked[7u] = 0u;
73964
350
              }
73965
2.02M
            }
73966
35.8M
          } else if (self->private_impl.f_color_type == 2u) {
73967
21.0M
            if (6u <= ((uint64_t)(v_s.len))) {
73968
21.0M
              v_bits_unpacked[0u] = v_s.ptr[5u];
73969
21.0M
              v_bits_unpacked[1u] = v_s.ptr[4u];
73970
21.0M
              v_bits_unpacked[2u] = v_s.ptr[3u];
73971
21.0M
              v_bits_unpacked[3u] = v_s.ptr[2u];
73972
21.0M
              v_bits_unpacked[4u] = v_s.ptr[1u];
73973
21.0M
              v_bits_unpacked[5u] = v_s.ptr[0u];
73974
21.0M
              v_bits_unpacked[6u] = 255u;
73975
21.0M
              v_bits_unpacked[7u] = 255u;
73976
21.0M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
73977
21.0M
              if (self->private_impl.f_remap_transparency == ((((uint64_t)(v_bits_unpacked[0u])) << 0u) |
73978
21.0M
                  (((uint64_t)(v_bits_unpacked[1u])) << 8u) |
73979
21.0M
                  (((uint64_t)(v_bits_unpacked[2u])) << 16u) |
73980
21.0M
                  (((uint64_t)(v_bits_unpacked[3u])) << 24u) |
73981
21.0M
                  (((uint64_t)(v_bits_unpacked[4u])) << 32u) |
73982
21.0M
                  (((uint64_t)(v_bits_unpacked[5u])) << 40u) |
73983
21.0M
                  (((uint64_t)(v_bits_unpacked[6u])) << 48u) |
73984
21.0M
                  (((uint64_t)(v_bits_unpacked[7u])) << 56u))) {
73985
224
                v_bits_unpacked[0u] = 0u;
73986
224
                v_bits_unpacked[1u] = 0u;
73987
224
                v_bits_unpacked[2u] = 0u;
73988
224
                v_bits_unpacked[3u] = 0u;
73989
224
                v_bits_unpacked[4u] = 0u;
73990
224
                v_bits_unpacked[5u] = 0u;
73991
224
                v_bits_unpacked[6u] = 0u;
73992
224
                v_bits_unpacked[7u] = 0u;
73993
224
              }
73994
21.0M
            }
73995
21.0M
          } else if (self->private_impl.f_color_type == 4u) {
73996
6.58M
            if (4u <= ((uint64_t)(v_s.len))) {
73997
6.58M
              v_bits_unpacked[0u] = v_s.ptr[1u];
73998
6.58M
              v_bits_unpacked[1u] = v_s.ptr[0u];
73999
6.58M
              v_bits_unpacked[2u] = v_s.ptr[1u];
74000
6.58M
              v_bits_unpacked[3u] = v_s.ptr[0u];
74001
6.58M
              v_bits_unpacked[4u] = v_s.ptr[1u];
74002
6.58M
              v_bits_unpacked[5u] = v_s.ptr[0u];
74003
6.58M
              v_bits_unpacked[6u] = v_s.ptr[3u];
74004
6.58M
              v_bits_unpacked[7u] = v_s.ptr[2u];
74005
6.58M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
74006
6.58M
            }
74007
8.25M
          } else {
74008
8.25M
            if (8u <= ((uint64_t)(v_s.len))) {
74009
8.25M
              v_bits_unpacked[0u] = v_s.ptr[5u];
74010
8.25M
              v_bits_unpacked[1u] = v_s.ptr[4u];
74011
8.25M
              v_bits_unpacked[2u] = v_s.ptr[3u];
74012
8.25M
              v_bits_unpacked[3u] = v_s.ptr[2u];
74013
8.25M
              v_bits_unpacked[4u] = v_s.ptr[1u];
74014
8.25M
              v_bits_unpacked[5u] = v_s.ptr[0u];
74015
8.25M
              v_bits_unpacked[6u] = v_s.ptr[7u];
74016
8.25M
              v_bits_unpacked[7u] = v_s.ptr[6u];
74017
8.25M
              v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
74018
8.25M
            }
74019
8.25M
          }
74020
37.8M
          wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), v_dst_palette, wuffs_base__make_slice_u8(v_bits_unpacked, 8));
74021
37.8M
        }
74022
37.8M
        v_x += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][0u]);
74023
37.8M
      }
74024
11.0k
    }
74025
7.30M
    v_prev_row = v_curr_row;
74026
7.30M
    v_y += (((uint32_t)(1u)) << WUFFS_PNG__INTERLACING[self->private_impl.f_interlace_pass][3u]);
74027
7.30M
  }
74028
5.02k
  return wuffs_base__make_status(NULL);
74029
6.18k
}
74030
74031
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
74032
74033
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
74034
74035
// ---------------- Status Codes Implementations
74036
74037
const char wuffs_qoi__error__bad_footer[] = "#qoi: bad footer";
74038
const char wuffs_qoi__error__bad_header[] = "#qoi: bad header";
74039
const char wuffs_qoi__error__truncated_input[] = "#qoi: truncated input";
74040
74041
// ---------------- Private Consts
74042
74043
// ---------------- Private Initializer Prototypes
74044
74045
// ---------------- Private Function Prototypes
74046
74047
WUFFS_BASE__GENERATED_C_CODE
74048
static wuffs_base__status
74049
wuffs_qoi__decoder__do_decode_image_config(
74050
    wuffs_qoi__decoder* self,
74051
    wuffs_base__image_config* a_dst,
74052
    wuffs_base__io_buffer* a_src);
74053
74054
WUFFS_BASE__GENERATED_C_CODE
74055
static wuffs_base__status
74056
wuffs_qoi__decoder__do_decode_frame_config(
74057
    wuffs_qoi__decoder* self,
74058
    wuffs_base__frame_config* a_dst,
74059
    wuffs_base__io_buffer* a_src);
74060
74061
WUFFS_BASE__GENERATED_C_CODE
74062
static wuffs_base__status
74063
wuffs_qoi__decoder__do_decode_frame(
74064
    wuffs_qoi__decoder* self,
74065
    wuffs_base__pixel_buffer* a_dst,
74066
    wuffs_base__io_buffer* a_src,
74067
    wuffs_base__pixel_blend a_blend,
74068
    wuffs_base__slice_u8 a_workbuf,
74069
    wuffs_base__decode_frame_options* a_opts);
74070
74071
WUFFS_BASE__GENERATED_C_CODE
74072
static wuffs_base__status
74073
wuffs_qoi__decoder__from_src_to_buffer(
74074
    wuffs_qoi__decoder* self,
74075
    wuffs_base__io_buffer* a_src);
74076
74077
WUFFS_BASE__GENERATED_C_CODE
74078
static wuffs_base__status
74079
wuffs_qoi__decoder__from_buffer_to_dst(
74080
    wuffs_qoi__decoder* self,
74081
    wuffs_base__pixel_buffer* a_dst);
74082
74083
// ---------------- VTables
74084
74085
const wuffs_base__image_decoder__func_ptrs
74086
wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder = {
74087
  (wuffs_base__status(*)(void*,
74088
      wuffs_base__pixel_buffer*,
74089
      wuffs_base__io_buffer*,
74090
      wuffs_base__pixel_blend,
74091
      wuffs_base__slice_u8,
74092
      wuffs_base__decode_frame_options*))(&wuffs_qoi__decoder__decode_frame),
74093
  (wuffs_base__status(*)(void*,
74094
      wuffs_base__frame_config*,
74095
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_frame_config),
74096
  (wuffs_base__status(*)(void*,
74097
      wuffs_base__image_config*,
74098
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__decode_image_config),
74099
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_qoi__decoder__frame_dirty_rect),
74100
  (uint64_t(*)(const void*,
74101
      uint32_t))(&wuffs_qoi__decoder__get_quirk),
74102
  (uint32_t(*)(const void*))(&wuffs_qoi__decoder__num_animation_loops),
74103
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frame_configs),
74104
  (uint64_t(*)(const void*))(&wuffs_qoi__decoder__num_decoded_frames),
74105
  (wuffs_base__status(*)(void*,
74106
      uint64_t,
74107
      uint64_t))(&wuffs_qoi__decoder__restart_frame),
74108
  (wuffs_base__status(*)(void*,
74109
      uint32_t,
74110
      uint64_t))(&wuffs_qoi__decoder__set_quirk),
74111
  (wuffs_base__empty_struct(*)(void*,
74112
      uint32_t,
74113
      bool))(&wuffs_qoi__decoder__set_report_metadata),
74114
  (wuffs_base__status(*)(void*,
74115
      wuffs_base__io_buffer*,
74116
      wuffs_base__more_information*,
74117
      wuffs_base__io_buffer*))(&wuffs_qoi__decoder__tell_me_more),
74118
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_qoi__decoder__workbuf_len),
74119
};
74120
74121
// ---------------- Initializer Implementations
74122
74123
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
74124
wuffs_qoi__decoder__initialize(
74125
    wuffs_qoi__decoder* self,
74126
    size_t sizeof_star_self,
74127
    uint64_t wuffs_version,
74128
    uint32_t options){
74129
  if (!self) {
74130
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74131
  }
74132
  if (sizeof(*self) != sizeof_star_self) {
74133
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
74134
  }
74135
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
74136
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
74137
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
74138
  }
74139
74140
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
74141
    // The whole point of this if-check is to detect an uninitialized *self.
74142
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
74143
#if !defined(__clang__) && defined(__GNUC__)
74144
#pragma GCC diagnostic push
74145
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
74146
#endif
74147
    if (self->private_impl.magic != 0) {
74148
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
74149
    }
74150
#if !defined(__clang__) && defined(__GNUC__)
74151
#pragma GCC diagnostic pop
74152
#endif
74153
  } else {
74154
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
74155
      memset(self, 0, sizeof(*self));
74156
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
74157
    } else {
74158
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
74159
    }
74160
  }
74161
74162
  self->private_impl.magic = WUFFS_BASE__MAGIC;
74163
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
74164
      wuffs_base__image_decoder__vtable_name;
74165
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
74166
      (const void*)(&wuffs_qoi__decoder__func_ptrs_for__wuffs_base__image_decoder);
74167
  return wuffs_base__make_status(NULL);
74168
}
74169
74170
wuffs_qoi__decoder*
74171
wuffs_qoi__decoder__alloc(void) {
74172
  wuffs_qoi__decoder* x =
74173
      (wuffs_qoi__decoder*)(calloc(1, sizeof(wuffs_qoi__decoder)));
74174
  if (!x) {
74175
    return NULL;
74176
  }
74177
  if (wuffs_qoi__decoder__initialize(
74178
      x, sizeof(wuffs_qoi__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
74179
    free(x);
74180
    return NULL;
74181
  }
74182
  return x;
74183
}
74184
74185
size_t
74186
sizeof__wuffs_qoi__decoder(void) {
74187
  return sizeof(wuffs_qoi__decoder);
74188
}
74189
74190
// ---------------- Function Implementations
74191
74192
// -------- func qoi.decoder.get_quirk
74193
74194
WUFFS_BASE__GENERATED_C_CODE
74195
WUFFS_BASE__MAYBE_STATIC uint64_t
74196
wuffs_qoi__decoder__get_quirk(
74197
    const wuffs_qoi__decoder* self,
74198
    uint32_t a_key) {
74199
  if (!self) {
74200
    return 0;
74201
  }
74202
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
74203
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
74204
    return 0;
74205
  }
74206
74207
  return 0u;
74208
}
74209
74210
// -------- func qoi.decoder.set_quirk
74211
74212
WUFFS_BASE__GENERATED_C_CODE
74213
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74214
wuffs_qoi__decoder__set_quirk(
74215
    wuffs_qoi__decoder* self,
74216
    uint32_t a_key,
74217
    uint64_t a_value) {
74218
  if (!self) {
74219
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74220
  }
74221
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74222
    return wuffs_base__make_status(
74223
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74224
        ? wuffs_base__error__disabled_by_previous_error
74225
        : wuffs_base__error__initialize_not_called);
74226
  }
74227
74228
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
74229
}
74230
74231
// -------- func qoi.decoder.decode_image_config
74232
74233
WUFFS_BASE__GENERATED_C_CODE
74234
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74235
wuffs_qoi__decoder__decode_image_config(
74236
    wuffs_qoi__decoder* self,
74237
    wuffs_base__image_config* a_dst,
74238
    wuffs_base__io_buffer* a_src) {
74239
  if (!self) {
74240
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74241
  }
74242
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74243
    return wuffs_base__make_status(
74244
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74245
        ? wuffs_base__error__disabled_by_previous_error
74246
        : wuffs_base__error__initialize_not_called);
74247
  }
74248
  if (!a_src) {
74249
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74250
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74251
  }
74252
  if ((self->private_impl.active_coroutine != 0) &&
74253
      (self->private_impl.active_coroutine != 1)) {
74254
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74255
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74256
  }
74257
  self->private_impl.active_coroutine = 0;
74258
  wuffs_base__status status = wuffs_base__make_status(NULL);
74259
74260
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74261
74262
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
74263
  switch (coro_susp_point) {
74264
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74265
74266
    while (true) {
74267
      {
74268
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_image_config(self, a_dst, a_src);
74269
        v_status = t_0;
74270
      }
74271
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
74272
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
74273
        goto exit;
74274
      }
74275
      status = v_status;
74276
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74277
    }
74278
74279
    ok:
74280
    self->private_impl.p_decode_image_config = 0;
74281
    goto exit;
74282
  }
74283
74284
  goto suspend;
74285
  suspend:
74286
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74287
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
74288
74289
  goto exit;
74290
  exit:
74291
  if (wuffs_base__status__is_error(&status)) {
74292
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74293
  }
74294
  return status;
74295
}
74296
74297
// -------- func qoi.decoder.do_decode_image_config
74298
74299
WUFFS_BASE__GENERATED_C_CODE
74300
static wuffs_base__status
74301
wuffs_qoi__decoder__do_decode_image_config(
74302
    wuffs_qoi__decoder* self,
74303
    wuffs_base__image_config* a_dst,
74304
    wuffs_base__io_buffer* a_src) {
74305
  wuffs_base__status status = wuffs_base__make_status(NULL);
74306
74307
  uint32_t v_a = 0;
74308
74309
  const uint8_t* iop_a_src = NULL;
74310
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74311
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74312
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74313
  if (a_src && a_src->data.ptr) {
74314
    io0_a_src = a_src->data.ptr;
74315
    io1_a_src = io0_a_src + a_src->meta.ri;
74316
    iop_a_src = io1_a_src;
74317
    io2_a_src = io0_a_src + a_src->meta.wi;
74318
  }
74319
74320
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
74321
  switch (coro_susp_point) {
74322
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74323
74324
    if (self->private_impl.f_call_sequence != 0u) {
74325
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
74326
      goto exit;
74327
    }
74328
    {
74329
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74330
      uint32_t t_0;
74331
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74332
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
74333
        iop_a_src += 4;
74334
      } else {
74335
        self->private_data.s_do_decode_image_config.scratch = 0;
74336
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
74337
        while (true) {
74338
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74339
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74340
            goto suspend;
74341
          }
74342
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
74343
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
74344
          *scratch <<= 8;
74345
          *scratch >>= 8;
74346
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
74347
          if (num_bits_0 == 24) {
74348
            t_0 = ((uint32_t)(*scratch));
74349
            break;
74350
          }
74351
          num_bits_0 += 8u;
74352
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
74353
        }
74354
      }
74355
      v_a = t_0;
74356
    }
74357
    if (v_a != 1718185841u) {
74358
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
74359
      goto exit;
74360
    }
74361
    {
74362
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
74363
      uint32_t t_1;
74364
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74365
        t_1 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
74366
        iop_a_src += 4;
74367
      } else {
74368
        self->private_data.s_do_decode_image_config.scratch = 0;
74369
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
74370
        while (true) {
74371
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74372
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74373
            goto suspend;
74374
          }
74375
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
74376
          uint32_t num_bits_1 = ((uint32_t)(*scratch & 0xFFu));
74377
          *scratch >>= 8;
74378
          *scratch <<= 8;
74379
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_1);
74380
          if (num_bits_1 == 24) {
74381
            t_1 = ((uint32_t)(*scratch >> 32));
74382
            break;
74383
          }
74384
          num_bits_1 += 8u;
74385
          *scratch |= ((uint64_t)(num_bits_1));
74386
        }
74387
      }
74388
      v_a = t_1;
74389
    }
74390
    if (v_a > 16777215u) {
74391
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
74392
      goto exit;
74393
    }
74394
    self->private_impl.f_width = v_a;
74395
    {
74396
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
74397
      uint32_t t_2;
74398
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
74399
        t_2 = wuffs_base__peek_u32be__no_bounds_check(iop_a_src);
74400
        iop_a_src += 4;
74401
      } else {
74402
        self->private_data.s_do_decode_image_config.scratch = 0;
74403
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
74404
        while (true) {
74405
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74406
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74407
            goto suspend;
74408
          }
74409
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
74410
          uint32_t num_bits_2 = ((uint32_t)(*scratch & 0xFFu));
74411
          *scratch >>= 8;
74412
          *scratch <<= 8;
74413
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_2);
74414
          if (num_bits_2 == 24) {
74415
            t_2 = ((uint32_t)(*scratch >> 32));
74416
            break;
74417
          }
74418
          num_bits_2 += 8u;
74419
          *scratch |= ((uint64_t)(num_bits_2));
74420
        }
74421
      }
74422
      v_a = t_2;
74423
    }
74424
    if (v_a > 16777215u) {
74425
      status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
74426
      goto exit;
74427
    }
74428
    self->private_impl.f_height = v_a;
74429
    {
74430
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
74431
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74432
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74433
        goto suspend;
74434
      }
74435
      uint32_t t_3 = *iop_a_src++;
74436
      v_a = t_3;
74437
    }
74438
    if (v_a == 3u) {
74439
      self->private_impl.f_pixfmt = 2415954056u;
74440
    } else if (v_a == 4u) {
74441
      self->private_impl.f_pixfmt = 2164295816u;
74442
    } else {
74443
      status = wuffs_base__make_status(wuffs_qoi__error__bad_header);
74444
      goto exit;
74445
    }
74446
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
74447
    if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74448
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74449
      goto suspend;
74450
    }
74451
    iop_a_src++;
74452
    if (a_dst != NULL) {
74453
      wuffs_base__image_config__set(
74454
          a_dst,
74455
          self->private_impl.f_pixfmt,
74456
          0u,
74457
          self->private_impl.f_width,
74458
          self->private_impl.f_height,
74459
          14u,
74460
          (self->private_impl.f_pixfmt == 2415954056u));
74461
    }
74462
    self->private_impl.f_call_sequence = 32u;
74463
74464
    goto ok;
74465
    ok:
74466
    self->private_impl.p_do_decode_image_config = 0;
74467
    goto exit;
74468
  }
74469
74470
  goto suspend;
74471
  suspend:
74472
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74473
74474
  goto exit;
74475
  exit:
74476
  if (a_src && a_src->data.ptr) {
74477
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74478
  }
74479
74480
  return status;
74481
}
74482
74483
// -------- func qoi.decoder.decode_frame_config
74484
74485
WUFFS_BASE__GENERATED_C_CODE
74486
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74487
wuffs_qoi__decoder__decode_frame_config(
74488
    wuffs_qoi__decoder* self,
74489
    wuffs_base__frame_config* a_dst,
74490
    wuffs_base__io_buffer* a_src) {
74491
  if (!self) {
74492
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74493
  }
74494
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74495
    return wuffs_base__make_status(
74496
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74497
        ? wuffs_base__error__disabled_by_previous_error
74498
        : wuffs_base__error__initialize_not_called);
74499
  }
74500
  if (!a_src) {
74501
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74502
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74503
  }
74504
  if ((self->private_impl.active_coroutine != 0) &&
74505
      (self->private_impl.active_coroutine != 2)) {
74506
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74507
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74508
  }
74509
  self->private_impl.active_coroutine = 0;
74510
  wuffs_base__status status = wuffs_base__make_status(NULL);
74511
74512
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74513
74514
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
74515
  switch (coro_susp_point) {
74516
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74517
74518
    while (true) {
74519
      {
74520
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame_config(self, a_dst, a_src);
74521
        v_status = t_0;
74522
      }
74523
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
74524
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
74525
        goto exit;
74526
      }
74527
      status = v_status;
74528
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74529
    }
74530
74531
    ok:
74532
    self->private_impl.p_decode_frame_config = 0;
74533
    goto exit;
74534
  }
74535
74536
  goto suspend;
74537
  suspend:
74538
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74539
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
74540
74541
  goto exit;
74542
  exit:
74543
  if (wuffs_base__status__is_error(&status)) {
74544
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74545
  }
74546
  return status;
74547
}
74548
74549
// -------- func qoi.decoder.do_decode_frame_config
74550
74551
WUFFS_BASE__GENERATED_C_CODE
74552
static wuffs_base__status
74553
wuffs_qoi__decoder__do_decode_frame_config(
74554
    wuffs_qoi__decoder* self,
74555
    wuffs_base__frame_config* a_dst,
74556
    wuffs_base__io_buffer* a_src) {
74557
  wuffs_base__status status = wuffs_base__make_status(NULL);
74558
74559
  wuffs_base__pixel_format v_pixfmt = {0};
74560
74561
  const uint8_t* iop_a_src = NULL;
74562
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74563
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74564
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74565
  if (a_src && a_src->data.ptr) {
74566
    io0_a_src = a_src->data.ptr;
74567
    io1_a_src = io0_a_src + a_src->meta.ri;
74568
    iop_a_src = io1_a_src;
74569
    io2_a_src = io0_a_src + a_src->meta.wi;
74570
  }
74571
74572
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
74573
  switch (coro_susp_point) {
74574
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74575
74576
    if (self->private_impl.f_call_sequence == 32u) {
74577
    } else if (self->private_impl.f_call_sequence < 32u) {
74578
      if (a_src) {
74579
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74580
      }
74581
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74582
      status = wuffs_qoi__decoder__do_decode_image_config(self, NULL, a_src);
74583
      if (a_src) {
74584
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
74585
      }
74586
      if (status.repr) {
74587
        goto suspend;
74588
      }
74589
    } else if (self->private_impl.f_call_sequence == 40u) {
74590
      if (14u != wuffs_base__u64__sat_add((a_src ? a_src->meta.pos : 0), ((uint64_t)(iop_a_src - io0_a_src)))) {
74591
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
74592
        goto exit;
74593
      }
74594
    } else if (self->private_impl.f_call_sequence == 64u) {
74595
      self->private_impl.f_call_sequence = 96u;
74596
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74597
      goto ok;
74598
    } else {
74599
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74600
      goto ok;
74601
    }
74602
    if (a_dst != NULL) {
74603
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
74604
      wuffs_base__frame_config__set(
74605
          a_dst,
74606
          wuffs_base__utility__make_rect_ie_u32(
74607
          0u,
74608
          0u,
74609
          self->private_impl.f_width,
74610
          self->private_impl.f_height),
74611
          ((wuffs_base__flicks)(0u)),
74612
          0u,
74613
          14u,
74614
          0u,
74615
          (self->private_impl.f_pixfmt == 2415954056u),
74616
          false,
74617
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
74618
    }
74619
    self->private_impl.f_call_sequence = 64u;
74620
74621
    ok:
74622
    self->private_impl.p_do_decode_frame_config = 0;
74623
    goto exit;
74624
  }
74625
74626
  goto suspend;
74627
  suspend:
74628
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74629
74630
  goto exit;
74631
  exit:
74632
  if (a_src && a_src->data.ptr) {
74633
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74634
  }
74635
74636
  return status;
74637
}
74638
74639
// -------- func qoi.decoder.decode_frame
74640
74641
WUFFS_BASE__GENERATED_C_CODE
74642
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
74643
wuffs_qoi__decoder__decode_frame(
74644
    wuffs_qoi__decoder* self,
74645
    wuffs_base__pixel_buffer* a_dst,
74646
    wuffs_base__io_buffer* a_src,
74647
    wuffs_base__pixel_blend a_blend,
74648
    wuffs_base__slice_u8 a_workbuf,
74649
    wuffs_base__decode_frame_options* a_opts) {
74650
  if (!self) {
74651
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
74652
  }
74653
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
74654
    return wuffs_base__make_status(
74655
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
74656
        ? wuffs_base__error__disabled_by_previous_error
74657
        : wuffs_base__error__initialize_not_called);
74658
  }
74659
  if (!a_dst || !a_src) {
74660
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74661
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
74662
  }
74663
  if ((self->private_impl.active_coroutine != 0) &&
74664
      (self->private_impl.active_coroutine != 3)) {
74665
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74666
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
74667
  }
74668
  self->private_impl.active_coroutine = 0;
74669
  wuffs_base__status status = wuffs_base__make_status(NULL);
74670
74671
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74672
74673
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
74674
  switch (coro_susp_point) {
74675
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74676
74677
    while (true) {
74678
      {
74679
        wuffs_base__status t_0 = wuffs_qoi__decoder__do_decode_frame(self,
74680
            a_dst,
74681
            a_src,
74682
            a_blend,
74683
            a_workbuf,
74684
            a_opts);
74685
        v_status = t_0;
74686
      }
74687
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
74688
        status = wuffs_base__make_status(wuffs_qoi__error__truncated_input);
74689
        goto exit;
74690
      }
74691
      status = v_status;
74692
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
74693
    }
74694
74695
    ok:
74696
    self->private_impl.p_decode_frame = 0;
74697
    goto exit;
74698
  }
74699
74700
  goto suspend;
74701
  suspend:
74702
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74703
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
74704
74705
  goto exit;
74706
  exit:
74707
  if (wuffs_base__status__is_error(&status)) {
74708
    self->private_impl.magic = WUFFS_BASE__DISABLED;
74709
  }
74710
  return status;
74711
}
74712
74713
// -------- func qoi.decoder.do_decode_frame
74714
74715
WUFFS_BASE__GENERATED_C_CODE
74716
static wuffs_base__status
74717
wuffs_qoi__decoder__do_decode_frame(
74718
    wuffs_qoi__decoder* self,
74719
    wuffs_base__pixel_buffer* a_dst,
74720
    wuffs_base__io_buffer* a_src,
74721
    wuffs_base__pixel_blend a_blend,
74722
    wuffs_base__slice_u8 a_workbuf,
74723
    wuffs_base__decode_frame_options* a_opts) {
74724
  wuffs_base__status status = wuffs_base__make_status(NULL);
74725
74726
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
74727
  uint64_t v_c64 = 0;
74728
74729
  const uint8_t* iop_a_src = NULL;
74730
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74731
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74732
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74733
  if (a_src && a_src->data.ptr) {
74734
    io0_a_src = a_src->data.ptr;
74735
    io1_a_src = io0_a_src + a_src->meta.ri;
74736
    iop_a_src = io1_a_src;
74737
    io2_a_src = io0_a_src + a_src->meta.wi;
74738
  }
74739
74740
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
74741
  switch (coro_susp_point) {
74742
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74743
74744
    if (self->private_impl.f_call_sequence == 64u) {
74745
    } else if (self->private_impl.f_call_sequence < 64u) {
74746
      if (a_src) {
74747
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74748
      }
74749
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74750
      status = wuffs_qoi__decoder__do_decode_frame_config(self, NULL, a_src);
74751
      if (a_src) {
74752
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
74753
      }
74754
      if (status.repr) {
74755
        goto suspend;
74756
      }
74757
    } else {
74758
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
74759
      goto ok;
74760
    }
74761
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
74762
        wuffs_base__pixel_buffer__pixel_format(a_dst),
74763
        wuffs_base__pixel_buffer__palette(a_dst),
74764
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
74765
        wuffs_base__utility__empty_slice_u8(),
74766
        a_blend);
74767
    if ( ! wuffs_base__status__is_ok(&v_status)) {
74768
      status = v_status;
74769
      if (wuffs_base__status__is_error(&status)) {
74770
        goto exit;
74771
      } else if (wuffs_base__status__is_suspension(&status)) {
74772
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74773
        goto exit;
74774
      }
74775
      goto ok;
74776
    }
74777
    self->private_impl.f_dst_x = 0u;
74778
    self->private_impl.f_dst_y = 0u;
74779
    self->private_data.f_pixel[0u] = 0u;
74780
    self->private_data.f_pixel[1u] = 0u;
74781
    self->private_data.f_pixel[2u] = 0u;
74782
    self->private_data.f_pixel[3u] = 255u;
74783
    wuffs_private_impl__bulk_memset(&self->private_data.f_cache[0], 256u, 0u);
74784
    self->private_impl.f_remaining_pixels_times_4 = (((uint64_t)(self->private_impl.f_width)) * ((uint64_t)(self->private_impl.f_height)) * 4u);
74785
    while (self->private_impl.f_remaining_pixels_times_4 > 0u) {
74786
      if (a_src) {
74787
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74788
      }
74789
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
74790
      status = wuffs_qoi__decoder__from_src_to_buffer(self, a_src);
74791
      if (a_src) {
74792
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
74793
      }
74794
      if (status.repr) {
74795
        goto suspend;
74796
      }
74797
      if (self->private_impl.f_remaining_pixels_times_4 < ((uint64_t)(self->private_impl.f_buffer_index))) {
74798
        status = wuffs_base__make_status(wuffs_base__error__too_much_data);
74799
        goto exit;
74800
      }
74801
      self->private_impl.f_remaining_pixels_times_4 -= ((uint64_t)(self->private_impl.f_buffer_index));
74802
      v_status = wuffs_qoi__decoder__from_buffer_to_dst(self, a_dst);
74803
      if ( ! wuffs_base__status__is_ok(&v_status)) {
74804
        status = v_status;
74805
        if (wuffs_base__status__is_error(&status)) {
74806
          goto exit;
74807
        } else if (wuffs_base__status__is_suspension(&status)) {
74808
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
74809
          goto exit;
74810
        }
74811
        goto ok;
74812
      }
74813
    }
74814
    {
74815
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
74816
      uint64_t t_0;
74817
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
74818
        t_0 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
74819
        iop_a_src += 8;
74820
      } else {
74821
        self->private_data.s_do_decode_frame.scratch = 0;
74822
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
74823
        while (true) {
74824
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74825
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74826
            goto suspend;
74827
          }
74828
          uint64_t* scratch = &self->private_data.s_do_decode_frame.scratch;
74829
          uint32_t num_bits_0 = ((uint32_t)(*scratch & 0xFFu));
74830
          *scratch >>= 8;
74831
          *scratch <<= 8;
74832
          *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_0);
74833
          if (num_bits_0 == 56) {
74834
            t_0 = ((uint64_t)(*scratch >> 0));
74835
            break;
74836
          }
74837
          num_bits_0 += 8u;
74838
          *scratch |= ((uint64_t)(num_bits_0));
74839
        }
74840
      }
74841
      v_c64 = t_0;
74842
    }
74843
    if (v_c64 != 1u) {
74844
      status = wuffs_base__make_status(wuffs_qoi__error__bad_footer);
74845
      goto exit;
74846
    }
74847
    self->private_impl.f_call_sequence = 96u;
74848
74849
    ok:
74850
    self->private_impl.p_do_decode_frame = 0;
74851
    goto exit;
74852
  }
74853
74854
  goto suspend;
74855
  suspend:
74856
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
74857
74858
  goto exit;
74859
  exit:
74860
  if (a_src && a_src->data.ptr) {
74861
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
74862
  }
74863
74864
  return status;
74865
}
74866
74867
// -------- func qoi.decoder.from_src_to_buffer
74868
74869
WUFFS_BASE__GENERATED_C_CODE
74870
static wuffs_base__status
74871
wuffs_qoi__decoder__from_src_to_buffer(
74872
    wuffs_qoi__decoder* self,
74873
    wuffs_base__io_buffer* a_src) {
74874
  wuffs_base__status status = wuffs_base__make_status(NULL);
74875
74876
  uint8_t v_c8 = 0;
74877
  uint8_t v_dg = 0;
74878
  uint32_t v_bi = 0;
74879
  uint32_t v_bj = 0;
74880
  uint32_t v_bk = 0;
74881
  uint32_t v_ci = 0;
74882
  uint32_t v_hash4 = 0;
74883
74884
  const uint8_t* iop_a_src = NULL;
74885
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74886
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74887
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
74888
  if (a_src && a_src->data.ptr) {
74889
    io0_a_src = a_src->data.ptr;
74890
    io1_a_src = io0_a_src + a_src->meta.ri;
74891
    iop_a_src = io1_a_src;
74892
    io2_a_src = io0_a_src + a_src->meta.wi;
74893
  }
74894
74895
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_buffer;
74896
  if (coro_susp_point) {
74897
    v_dg = self->private_data.s_from_src_to_buffer.v_dg;
74898
    v_bi = self->private_data.s_from_src_to_buffer.v_bi;
74899
    v_bk = self->private_data.s_from_src_to_buffer.v_bk;
74900
  }
74901
  switch (coro_susp_point) {
74902
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
74903
74904
    v_bk = 7936u;
74905
    if (self->private_impl.f_remaining_pixels_times_4 < 7936u) {
74906
      v_bk = ((uint32_t)(self->private_impl.f_remaining_pixels_times_4));
74907
    }
74908
    while (v_bi < v_bk) {
74909
      {
74910
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
74911
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74912
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74913
          goto suspend;
74914
        }
74915
        uint8_t t_0 = *iop_a_src++;
74916
        v_c8 = t_0;
74917
      }
74918
      if (v_c8 == 254u) {
74919
        {
74920
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
74921
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74922
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74923
            goto suspend;
74924
          }
74925
          uint8_t t_1 = *iop_a_src++;
74926
          self->private_data.f_pixel[2u] = t_1;
74927
        }
74928
        {
74929
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
74930
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74931
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74932
            goto suspend;
74933
          }
74934
          uint8_t t_2 = *iop_a_src++;
74935
          self->private_data.f_pixel[1u] = t_2;
74936
        }
74937
        {
74938
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
74939
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74940
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74941
            goto suspend;
74942
          }
74943
          uint8_t t_3 = *iop_a_src++;
74944
          self->private_data.f_pixel[0u] = t_3;
74945
        }
74946
      } else if (v_c8 == 255u) {
74947
        {
74948
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
74949
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74950
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74951
            goto suspend;
74952
          }
74953
          uint8_t t_4 = *iop_a_src++;
74954
          self->private_data.f_pixel[2u] = t_4;
74955
        }
74956
        {
74957
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
74958
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74959
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74960
            goto suspend;
74961
          }
74962
          uint8_t t_5 = *iop_a_src++;
74963
          self->private_data.f_pixel[1u] = t_5;
74964
        }
74965
        {
74966
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
74967
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74968
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74969
            goto suspend;
74970
          }
74971
          uint8_t t_6 = *iop_a_src++;
74972
          self->private_data.f_pixel[0u] = t_6;
74973
        }
74974
        {
74975
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
74976
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
74977
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
74978
            goto suspend;
74979
          }
74980
          uint8_t t_7 = *iop_a_src++;
74981
          self->private_data.f_pixel[3u] = t_7;
74982
        }
74983
      } else if (((uint8_t)(v_c8 >> 6u)) == 0u) {
74984
        v_ci = (4u * ((uint32_t)(((uint8_t)(v_c8 & 63u)))));
74985
        self->private_data.f_pixel[0u] = self->private_data.f_cache[(v_ci + 0u)];
74986
        self->private_data.f_pixel[1u] = self->private_data.f_cache[(v_ci + 1u)];
74987
        self->private_data.f_pixel[2u] = self->private_data.f_cache[(v_ci + 2u)];
74988
        self->private_data.f_pixel[3u] = self->private_data.f_cache[(v_ci + 3u)];
74989
        self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
74990
        self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
74991
        self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
74992
        self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
74993
        v_bi += 4u;
74994
        continue;
74995
      } else if (((uint8_t)(v_c8 >> 6u)) == 1u) {
74996
#if defined(__GNUC__)
74997
#pragma GCC diagnostic push
74998
#pragma GCC diagnostic ignored "-Wconversion"
74999
#endif
75000
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 4u)) & 3u)) + 254u));
75001
        self->private_data.f_pixel[1u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 2u)) & 3u)) + 254u));
75002
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(((uint8_t)(v_c8 >> 0u)) & 3u)) + 254u));
75003
#if defined(__GNUC__)
75004
#pragma GCC diagnostic pop
75005
#endif
75006
      } else if (((uint8_t)(v_c8 >> 6u)) == 2u) {
75007
        v_dg = ((uint8_t)(((uint8_t)(v_c8 & 63u)) + 224u));
75008
        {
75009
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
75010
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
75011
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
75012
            goto suspend;
75013
          }
75014
          uint8_t t_8 = *iop_a_src++;
75015
          v_c8 = t_8;
75016
        }
75017
#if defined(__GNUC__)
75018
#pragma GCC diagnostic push
75019
#pragma GCC diagnostic ignored "-Wconversion"
75020
#endif
75021
        self->private_data.f_pixel[2u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 4u))))));
75022
        self->private_data.f_pixel[1u] += v_dg;
75023
        self->private_data.f_pixel[0u] += ((uint8_t)(((uint8_t)(v_dg + 248u)) + ((uint8_t)(15u & ((uint8_t)(v_c8 >> 0u))))));
75024
#if defined(__GNUC__)
75025
#pragma GCC diagnostic pop
75026
#endif
75027
      } else {
75028
        v_bj = (v_bi + (4u * (63u & (1u + ((uint32_t)(v_c8))))));
75029
        while (v_bi < v_bj) {
75030
          self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
75031
          self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
75032
          self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
75033
          self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
75034
          v_bi += 4u;
75035
        }
75036
        continue;
75037
      }
75038
      v_hash4 = (4u * (63u & ((((uint32_t)(self->private_data.f_pixel[2u])) * 3u) +
75039
          (((uint32_t)(self->private_data.f_pixel[1u])) * 5u) +
75040
          (((uint32_t)(self->private_data.f_pixel[0u])) * 7u) +
75041
          (((uint32_t)(self->private_data.f_pixel[3u])) * 11u))));
75042
      self->private_data.f_cache[(v_hash4 + 0u)] = self->private_data.f_pixel[0u];
75043
      self->private_data.f_cache[(v_hash4 + 1u)] = self->private_data.f_pixel[1u];
75044
      self->private_data.f_cache[(v_hash4 + 2u)] = self->private_data.f_pixel[2u];
75045
      self->private_data.f_cache[(v_hash4 + 3u)] = self->private_data.f_pixel[3u];
75046
      self->private_data.f_buffer[(v_bi + 0u)] = self->private_data.f_pixel[0u];
75047
      self->private_data.f_buffer[(v_bi + 1u)] = self->private_data.f_pixel[1u];
75048
      self->private_data.f_buffer[(v_bi + 2u)] = self->private_data.f_pixel[2u];
75049
      self->private_data.f_buffer[(v_bi + 3u)] = self->private_data.f_pixel[3u];
75050
      v_bi += 4u;
75051
    }
75052
    self->private_impl.f_buffer_index = v_bi;
75053
75054
    goto ok;
75055
    ok:
75056
    self->private_impl.p_from_src_to_buffer = 0;
75057
    goto exit;
75058
  }
75059
75060
  goto suspend;
75061
  suspend:
75062
  self->private_impl.p_from_src_to_buffer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
75063
  self->private_data.s_from_src_to_buffer.v_dg = v_dg;
75064
  self->private_data.s_from_src_to_buffer.v_bi = v_bi;
75065
  self->private_data.s_from_src_to_buffer.v_bk = v_bk;
75066
75067
  goto exit;
75068
  exit:
75069
  if (a_src && a_src->data.ptr) {
75070
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
75071
  }
75072
75073
  return status;
75074
}
75075
75076
// -------- func qoi.decoder.from_buffer_to_dst
75077
75078
WUFFS_BASE__GENERATED_C_CODE
75079
static wuffs_base__status
75080
wuffs_qoi__decoder__from_buffer_to_dst(
75081
    wuffs_qoi__decoder* self,
75082
    wuffs_base__pixel_buffer* a_dst) {
75083
  wuffs_base__pixel_format v_dst_pixfmt = {0};
75084
  uint32_t v_dst_bits_per_pixel = 0;
75085
  uint32_t v_dst_bytes_per_pixel = 0;
75086
  uint64_t v_dst_bytes_per_row = 0;
75087
  wuffs_base__table_u8 v_tab = {0};
75088
  uint32_t v_bi = 0;
75089
  uint32_t v_rem_x = 0;
75090
  wuffs_base__slice_u8 v_dst = {0};
75091
  wuffs_base__slice_u8 v_src = {0};
75092
  uint32_t v_src_length = 0;
75093
  uint64_t v_i = 0;
75094
75095
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
75096
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
75097
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
75098
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
75099
  }
75100
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
75101
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
75102
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
75103
  while (v_bi < self->private_impl.f_buffer_index) {
75104
    if (self->private_impl.f_width <= self->private_impl.f_dst_x) {
75105
      self->private_impl.f_dst_x = 0u;
75106
      self->private_impl.f_dst_y += 1u;
75107
      if (self->private_impl.f_dst_y >= self->private_impl.f_height) {
75108
        break;
75109
      }
75110
      v_rem_x = self->private_impl.f_width;
75111
    } else {
75112
      v_rem_x = (self->private_impl.f_width - self->private_impl.f_dst_x);
75113
    }
75114
    v_src = wuffs_base__make_slice_u8_ij(self->private_data.f_buffer, v_bi, self->private_impl.f_buffer_index);
75115
    if (((uint64_t)((4u * v_rem_x))) < ((uint64_t)(v_src.len))) {
75116
      v_src = wuffs_base__slice_u8__subslice_j(v_src, ((uint64_t)((4u * v_rem_x))));
75117
    }
75118
    v_src_length = ((uint32_t)(((uint64_t)(v_src.len))));
75119
    v_bi += v_src_length;
75120
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
75121
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
75122
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
75123
    }
75124
    v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
75125
    self->private_impl.f_dst_x += (v_src_length / 4u);
75126
    if (v_i < ((uint64_t)(v_dst.len))) {
75127
      wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), v_src);
75128
    }
75129
  }
75130
  return wuffs_base__make_status(NULL);
75131
}
75132
75133
// -------- func qoi.decoder.frame_dirty_rect
75134
75135
WUFFS_BASE__GENERATED_C_CODE
75136
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
75137
wuffs_qoi__decoder__frame_dirty_rect(
75138
    const wuffs_qoi__decoder* self) {
75139
  if (!self) {
75140
    return wuffs_base__utility__empty_rect_ie_u32();
75141
  }
75142
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75143
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75144
    return wuffs_base__utility__empty_rect_ie_u32();
75145
  }
75146
75147
  return wuffs_base__utility__make_rect_ie_u32(
75148
      0u,
75149
      0u,
75150
      self->private_impl.f_width,
75151
      self->private_impl.f_height);
75152
}
75153
75154
// -------- func qoi.decoder.num_animation_loops
75155
75156
WUFFS_BASE__GENERATED_C_CODE
75157
WUFFS_BASE__MAYBE_STATIC uint32_t
75158
wuffs_qoi__decoder__num_animation_loops(
75159
    const wuffs_qoi__decoder* self) {
75160
  if (!self) {
75161
    return 0;
75162
  }
75163
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75164
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75165
    return 0;
75166
  }
75167
75168
  return 0u;
75169
}
75170
75171
// -------- func qoi.decoder.num_decoded_frame_configs
75172
75173
WUFFS_BASE__GENERATED_C_CODE
75174
WUFFS_BASE__MAYBE_STATIC uint64_t
75175
wuffs_qoi__decoder__num_decoded_frame_configs(
75176
    const wuffs_qoi__decoder* self) {
75177
  if (!self) {
75178
    return 0;
75179
  }
75180
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75181
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75182
    return 0;
75183
  }
75184
75185
  if (self->private_impl.f_call_sequence > 32u) {
75186
    return 1u;
75187
  }
75188
  return 0u;
75189
}
75190
75191
// -------- func qoi.decoder.num_decoded_frames
75192
75193
WUFFS_BASE__GENERATED_C_CODE
75194
WUFFS_BASE__MAYBE_STATIC uint64_t
75195
wuffs_qoi__decoder__num_decoded_frames(
75196
    const wuffs_qoi__decoder* self) {
75197
  if (!self) {
75198
    return 0;
75199
  }
75200
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75201
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75202
    return 0;
75203
  }
75204
75205
  if (self->private_impl.f_call_sequence > 64u) {
75206
    return 1u;
75207
  }
75208
  return 0u;
75209
}
75210
75211
// -------- func qoi.decoder.restart_frame
75212
75213
WUFFS_BASE__GENERATED_C_CODE
75214
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75215
wuffs_qoi__decoder__restart_frame(
75216
    wuffs_qoi__decoder* self,
75217
    uint64_t a_index,
75218
    uint64_t a_io_position) {
75219
  if (!self) {
75220
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75221
  }
75222
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75223
    return wuffs_base__make_status(
75224
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75225
        ? wuffs_base__error__disabled_by_previous_error
75226
        : wuffs_base__error__initialize_not_called);
75227
  }
75228
75229
  if (self->private_impl.f_call_sequence < 32u) {
75230
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
75231
  }
75232
  if ((a_index != 0u) || (a_io_position != 14u)) {
75233
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75234
  }
75235
  self->private_impl.f_call_sequence = 40u;
75236
  return wuffs_base__make_status(NULL);
75237
}
75238
75239
// -------- func qoi.decoder.set_report_metadata
75240
75241
WUFFS_BASE__GENERATED_C_CODE
75242
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
75243
wuffs_qoi__decoder__set_report_metadata(
75244
    wuffs_qoi__decoder* self,
75245
    uint32_t a_fourcc,
75246
    bool a_report) {
75247
  return wuffs_base__make_empty_struct();
75248
}
75249
75250
// -------- func qoi.decoder.tell_me_more
75251
75252
WUFFS_BASE__GENERATED_C_CODE
75253
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75254
wuffs_qoi__decoder__tell_me_more(
75255
    wuffs_qoi__decoder* self,
75256
    wuffs_base__io_buffer* a_dst,
75257
    wuffs_base__more_information* a_minfo,
75258
    wuffs_base__io_buffer* a_src) {
75259
  if (!self) {
75260
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75261
  }
75262
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75263
    return wuffs_base__make_status(
75264
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75265
        ? wuffs_base__error__disabled_by_previous_error
75266
        : wuffs_base__error__initialize_not_called);
75267
  }
75268
  if (!a_dst || !a_src) {
75269
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75270
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
75271
  }
75272
  if ((self->private_impl.active_coroutine != 0) &&
75273
      (self->private_impl.active_coroutine != 4)) {
75274
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75275
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
75276
  }
75277
  self->private_impl.active_coroutine = 0;
75278
  wuffs_base__status status = wuffs_base__make_status(NULL);
75279
75280
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
75281
  goto exit;
75282
75283
  goto ok;
75284
  ok:
75285
  goto exit;
75286
  exit:
75287
  if (wuffs_base__status__is_error(&status)) {
75288
    self->private_impl.magic = WUFFS_BASE__DISABLED;
75289
  }
75290
  return status;
75291
}
75292
75293
// -------- func qoi.decoder.workbuf_len
75294
75295
WUFFS_BASE__GENERATED_C_CODE
75296
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
75297
wuffs_qoi__decoder__workbuf_len(
75298
    const wuffs_qoi__decoder* self) {
75299
  if (!self) {
75300
    return wuffs_base__utility__empty_range_ii_u64();
75301
  }
75302
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75303
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75304
    return wuffs_base__utility__empty_range_ii_u64();
75305
  }
75306
75307
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
75308
}
75309
75310
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
75311
75312
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
75313
75314
// ---------------- Status Codes Implementations
75315
75316
// ---------------- Private Consts
75317
75318
static const uint32_t
75319
WUFFS_SHA256__INITIAL_SHA256_H[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
75320
  1779033703u, 3144134277u, 1013904242u, 2773480762u, 1359893119u, 2600822924u, 528734635u, 1541459225u,
75321
};
75322
75323
static const uint32_t
75324
WUFFS_SHA256__K[64] WUFFS_BASE__POTENTIALLY_UNUSED = {
75325
  1116352408u, 1899447441u, 3049323471u, 3921009573u, 961987163u, 1508970993u, 2453635748u, 2870763221u,
75326
  3624381080u, 310598401u, 607225278u, 1426881987u, 1925078388u, 2162078206u, 2614888103u, 3248222580u,
75327
  3835390401u, 4022224774u, 264347078u, 604807628u, 770255983u, 1249150122u, 1555081692u, 1996064986u,
75328
  2554220882u, 2821834349u, 2952996808u, 3210313671u, 3336571891u, 3584528711u, 113926993u, 338241895u,
75329
  666307205u, 773529912u, 1294757372u, 1396182291u, 1695183700u, 1986661051u, 2177026350u, 2456956037u,
75330
  2730485921u, 2820302411u, 3259730800u, 3345764771u, 3516065817u, 3600352804u, 4094571909u, 275423344u,
75331
  430227734u, 506948616u, 659060556u, 883997877u, 958139571u, 1322822218u, 1537002063u, 1747873779u,
75332
  1955562222u, 2024104815u, 2227730452u, 2361852424u, 2428436474u, 2756734187u, 3204031479u, 3329325298u,
75333
};
75334
75335
// ---------------- Private Initializer Prototypes
75336
75337
// ---------------- Private Function Prototypes
75338
75339
WUFFS_BASE__GENERATED_C_CODE
75340
static wuffs_base__empty_struct
75341
wuffs_sha256__hasher__up(
75342
    wuffs_sha256__hasher* self,
75343
    wuffs_base__slice_u8 a_x);
75344
75345
// ---------------- VTables
75346
75347
const wuffs_base__hasher_bitvec256__func_ptrs
75348
wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256 = {
75349
  (wuffs_base__bitvec256(*)(const void*))(&wuffs_sha256__hasher__checksum_bitvec256),
75350
  (uint64_t(*)(const void*,
75351
      uint32_t))(&wuffs_sha256__hasher__get_quirk),
75352
  (wuffs_base__status(*)(void*,
75353
      uint32_t,
75354
      uint64_t))(&wuffs_sha256__hasher__set_quirk),
75355
  (wuffs_base__empty_struct(*)(void*,
75356
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update),
75357
  (wuffs_base__bitvec256(*)(void*,
75358
      wuffs_base__slice_u8))(&wuffs_sha256__hasher__update_bitvec256),
75359
};
75360
75361
// ---------------- Initializer Implementations
75362
75363
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
75364
wuffs_sha256__hasher__initialize(
75365
    wuffs_sha256__hasher* self,
75366
    size_t sizeof_star_self,
75367
    uint64_t wuffs_version,
75368
    uint32_t options){
75369
  if (!self) {
75370
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75371
  }
75372
  if (sizeof(*self) != sizeof_star_self) {
75373
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
75374
  }
75375
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
75376
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
75377
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
75378
  }
75379
75380
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
75381
    // The whole point of this if-check is to detect an uninitialized *self.
75382
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
75383
#if !defined(__clang__) && defined(__GNUC__)
75384
#pragma GCC diagnostic push
75385
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
75386
#endif
75387
    if (self->private_impl.magic != 0) {
75388
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
75389
    }
75390
#if !defined(__clang__) && defined(__GNUC__)
75391
#pragma GCC diagnostic pop
75392
#endif
75393
  } else {
75394
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
75395
      memset(self, 0, sizeof(*self));
75396
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
75397
    } else {
75398
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
75399
    }
75400
  }
75401
75402
  self->private_impl.magic = WUFFS_BASE__MAGIC;
75403
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.vtable_name =
75404
      wuffs_base__hasher_bitvec256__vtable_name;
75405
  self->private_impl.vtable_for__wuffs_base__hasher_bitvec256.function_pointers =
75406
      (const void*)(&wuffs_sha256__hasher__func_ptrs_for__wuffs_base__hasher_bitvec256);
75407
  return wuffs_base__make_status(NULL);
75408
}
75409
75410
wuffs_sha256__hasher*
75411
wuffs_sha256__hasher__alloc(void) {
75412
  wuffs_sha256__hasher* x =
75413
      (wuffs_sha256__hasher*)(calloc(1, sizeof(wuffs_sha256__hasher)));
75414
  if (!x) {
75415
    return NULL;
75416
  }
75417
  if (wuffs_sha256__hasher__initialize(
75418
      x, sizeof(wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
75419
    free(x);
75420
    return NULL;
75421
  }
75422
  return x;
75423
}
75424
75425
size_t
75426
sizeof__wuffs_sha256__hasher(void) {
75427
  return sizeof(wuffs_sha256__hasher);
75428
}
75429
75430
// ---------------- Function Implementations
75431
75432
// -------- func sha256.hasher.get_quirk
75433
75434
WUFFS_BASE__GENERATED_C_CODE
75435
WUFFS_BASE__MAYBE_STATIC uint64_t
75436
wuffs_sha256__hasher__get_quirk(
75437
    const wuffs_sha256__hasher* self,
75438
    uint32_t a_key) {
75439
  if (!self) {
75440
    return 0;
75441
  }
75442
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75443
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75444
    return 0;
75445
  }
75446
75447
  return 0u;
75448
}
75449
75450
// -------- func sha256.hasher.set_quirk
75451
75452
WUFFS_BASE__GENERATED_C_CODE
75453
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
75454
wuffs_sha256__hasher__set_quirk(
75455
    wuffs_sha256__hasher* self,
75456
    uint32_t a_key,
75457
    uint64_t a_value) {
75458
  if (!self) {
75459
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
75460
  }
75461
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75462
    return wuffs_base__make_status(
75463
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
75464
        ? wuffs_base__error__disabled_by_previous_error
75465
        : wuffs_base__error__initialize_not_called);
75466
  }
75467
75468
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
75469
}
75470
75471
// -------- func sha256.hasher.update
75472
75473
WUFFS_BASE__GENERATED_C_CODE
75474
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
75475
wuffs_sha256__hasher__update(
75476
    wuffs_sha256__hasher* self,
75477
    wuffs_base__slice_u8 a_x) {
75478
  if (!self) {
75479
    return wuffs_base__make_empty_struct();
75480
  }
75481
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75482
    return wuffs_base__make_empty_struct();
75483
  }
75484
75485
  uint64_t v_new_lmu = 0;
75486
75487
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
75488
    self->private_impl.f_h0 = WUFFS_SHA256__INITIAL_SHA256_H[0u];
75489
    self->private_impl.f_h1 = WUFFS_SHA256__INITIAL_SHA256_H[1u];
75490
    self->private_impl.f_h2 = WUFFS_SHA256__INITIAL_SHA256_H[2u];
75491
    self->private_impl.f_h3 = WUFFS_SHA256__INITIAL_SHA256_H[3u];
75492
    self->private_impl.f_h4 = WUFFS_SHA256__INITIAL_SHA256_H[4u];
75493
    self->private_impl.f_h5 = WUFFS_SHA256__INITIAL_SHA256_H[5u];
75494
    self->private_impl.f_h6 = WUFFS_SHA256__INITIAL_SHA256_H[6u];
75495
    self->private_impl.f_h7 = WUFFS_SHA256__INITIAL_SHA256_H[7u];
75496
  }
75497
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
75498
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
75499
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
75500
  if (self->private_impl.f_buf_len != 0u) {
75501
    while (self->private_impl.f_buf_len < 64u) {
75502
      if (((uint64_t)(a_x.len)) <= 0u) {
75503
        return wuffs_base__make_empty_struct();
75504
      }
75505
      self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
75506
      self->private_impl.f_buf_len += 1u;
75507
      a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
75508
    }
75509
    self->private_impl.f_buf_len = 0u;
75510
    wuffs_sha256__hasher__up(self, wuffs_base__make_slice_u8(self->private_impl.f_buf_data, 64));
75511
  }
75512
  wuffs_sha256__hasher__up(self, a_x);
75513
  return wuffs_base__make_empty_struct();
75514
}
75515
75516
// -------- func sha256.hasher.update_bitvec256
75517
75518
WUFFS_BASE__GENERATED_C_CODE
75519
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
75520
wuffs_sha256__hasher__update_bitvec256(
75521
    wuffs_sha256__hasher* self,
75522
    wuffs_base__slice_u8 a_x) {
75523
  if (!self) {
75524
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
75525
  }
75526
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
75527
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
75528
  }
75529
75530
  wuffs_sha256__hasher__update(self, a_x);
75531
  return wuffs_sha256__hasher__checksum_bitvec256(self);
75532
}
75533
75534
// -------- func sha256.hasher.up
75535
75536
WUFFS_BASE__GENERATED_C_CODE
75537
static wuffs_base__empty_struct
75538
wuffs_sha256__hasher__up(
75539
    wuffs_sha256__hasher* self,
75540
    wuffs_base__slice_u8 a_x) {
75541
  wuffs_base__slice_u8 v_p = {0};
75542
  uint32_t v_w[64] = {0};
75543
  uint32_t v_w2 = 0;
75544
  uint32_t v_w15 = 0;
75545
  uint32_t v_s0 = 0;
75546
  uint32_t v_s1 = 0;
75547
  uint32_t v_t1 = 0;
75548
  uint32_t v_t2 = 0;
75549
  uint32_t v_a = 0;
75550
  uint32_t v_b = 0;
75551
  uint32_t v_c = 0;
75552
  uint32_t v_d = 0;
75553
  uint32_t v_e = 0;
75554
  uint32_t v_f = 0;
75555
  uint32_t v_g = 0;
75556
  uint32_t v_h = 0;
75557
  uint32_t v_i = 0;
75558
  uint32_t v_buf_len = 0;
75559
75560
  v_a = self->private_impl.f_h0;
75561
  v_b = self->private_impl.f_h1;
75562
  v_c = self->private_impl.f_h2;
75563
  v_d = self->private_impl.f_h3;
75564
  v_e = self->private_impl.f_h4;
75565
  v_f = self->private_impl.f_h5;
75566
  v_g = self->private_impl.f_h6;
75567
  v_h = self->private_impl.f_h7;
75568
  {
75569
    wuffs_base__slice_u8 i_slice_p = a_x;
75570
    v_p.ptr = i_slice_p.ptr;
75571
    v_p.len = 64;
75572
    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));
75573
    while (v_p.ptr < i_end0_p) {
75574
      v_w[0u] = ((((uint32_t)(v_p.ptr[0u])) << 24u) |
75575
          (((uint32_t)(v_p.ptr[1u])) << 16u) |
75576
          (((uint32_t)(v_p.ptr[2u])) << 8u) |
75577
          ((uint32_t)(v_p.ptr[3u])));
75578
      v_w[1u] = ((((uint32_t)(v_p.ptr[4u])) << 24u) |
75579
          (((uint32_t)(v_p.ptr[5u])) << 16u) |
75580
          (((uint32_t)(v_p.ptr[6u])) << 8u) |
75581
          ((uint32_t)(v_p.ptr[7u])));
75582
      v_w[2u] = ((((uint32_t)(v_p.ptr[8u])) << 24u) |
75583
          (((uint32_t)(v_p.ptr[9u])) << 16u) |
75584
          (((uint32_t)(v_p.ptr[10u])) << 8u) |
75585
          ((uint32_t)(v_p.ptr[11u])));
75586
      v_w[3u] = ((((uint32_t)(v_p.ptr[12u])) << 24u) |
75587
          (((uint32_t)(v_p.ptr[13u])) << 16u) |
75588
          (((uint32_t)(v_p.ptr[14u])) << 8u) |
75589
          ((uint32_t)(v_p.ptr[15u])));
75590
      v_w[4u] = ((((uint32_t)(v_p.ptr[16u])) << 24u) |
75591
          (((uint32_t)(v_p.ptr[17u])) << 16u) |
75592
          (((uint32_t)(v_p.ptr[18u])) << 8u) |
75593
          ((uint32_t)(v_p.ptr[19u])));
75594
      v_w[5u] = ((((uint32_t)(v_p.ptr[20u])) << 24u) |
75595
          (((uint32_t)(v_p.ptr[21u])) << 16u) |
75596
          (((uint32_t)(v_p.ptr[22u])) << 8u) |
75597
          ((uint32_t)(v_p.ptr[23u])));
75598
      v_w[6u] = ((((uint32_t)(v_p.ptr[24u])) << 24u) |
75599
          (((uint32_t)(v_p.ptr[25u])) << 16u) |
75600
          (((uint32_t)(v_p.ptr[26u])) << 8u) |
75601
          ((uint32_t)(v_p.ptr[27u])));
75602
      v_w[7u] = ((((uint32_t)(v_p.ptr[28u])) << 24u) |
75603
          (((uint32_t)(v_p.ptr[29u])) << 16u) |
75604
          (((uint32_t)(v_p.ptr[30u])) << 8u) |
75605
          ((uint32_t)(v_p.ptr[31u])));
75606
      v_w[8u] = ((((uint32_t)(v_p.ptr[32u])) << 24u) |
75607
          (((uint32_t)(v_p.ptr[33u])) << 16u) |
75608
          (((uint32_t)(v_p.ptr[34u])) << 8u) |
75609
          ((uint32_t)(v_p.ptr[35u])));
75610
      v_w[9u] = ((((uint32_t)(v_p.ptr[36u])) << 24u) |
75611
          (((uint32_t)(v_p.ptr[37u])) << 16u) |
75612
          (((uint32_t)(v_p.ptr[38u])) << 8u) |
75613
          ((uint32_t)(v_p.ptr[39u])));
75614
      v_w[10u] = ((((uint32_t)(v_p.ptr[40u])) << 24u) |
75615
          (((uint32_t)(v_p.ptr[41u])) << 16u) |
75616
          (((uint32_t)(v_p.ptr[42u])) << 8u) |
75617
          ((uint32_t)(v_p.ptr[43u])));
75618
      v_w[11u] = ((((uint32_t)(v_p.ptr[44u])) << 24u) |
75619
          (((uint32_t)(v_p.ptr[45u])) << 16u) |
75620
          (((uint32_t)(v_p.ptr[46u])) << 8u) |
75621
          ((uint32_t)(v_p.ptr[47u])));
75622
      v_w[12u] = ((((uint32_t)(v_p.ptr[48u])) << 24u) |
75623
          (((uint32_t)(v_p.ptr[49u])) << 16u) |
75624
          (((uint32_t)(v_p.ptr[50u])) << 8u) |
75625
          ((uint32_t)(v_p.ptr[51u])));
75626
      v_w[13u] = ((((uint32_t)(v_p.ptr[52u])) << 24u) |
75627
          (((uint32_t)(v_p.ptr[53u])) << 16u) |
75628
          (((uint32_t)(v_p.ptr[54u])) << 8u) |
75629
          ((uint32_t)(v_p.ptr[55u])));
75630
      v_w[14u] = ((((uint32_t)(v_p.ptr[56u])) << 24u) |
75631
          (((uint32_t)(v_p.ptr[57u])) << 16u) |
75632
          (((uint32_t)(v_p.ptr[58u])) << 8u) |
75633
          ((uint32_t)(v_p.ptr[59u])));
75634
      v_w[15u] = ((((uint32_t)(v_p.ptr[60u])) << 24u) |
75635
          (((uint32_t)(v_p.ptr[61u])) << 16u) |
75636
          (((uint32_t)(v_p.ptr[62u])) << 8u) |
75637
          ((uint32_t)(v_p.ptr[63u])));
75638
      v_i = 16u;
75639
      while (v_i < 64u) {
75640
        v_w2 = v_w[(v_i - 2u)];
75641
        v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
75642
        v_w15 = v_w[(v_i - 15u)];
75643
        v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
75644
        v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
75645
        v_i += 1u;
75646
      }
75647
      v_i = 0u;
75648
      while (v_i < 64u) {
75649
        v_t1 = v_h;
75650
        v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u)));
75651
        v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
75652
        v_t1 += WUFFS_SHA256__K[v_i];
75653
        v_t1 += v_w[v_i];
75654
        v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u)));
75655
        v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
75656
        v_h = v_g;
75657
        v_g = v_f;
75658
        v_f = v_e;
75659
        v_e = ((uint32_t)(v_d + v_t1));
75660
        v_d = v_c;
75661
        v_c = v_b;
75662
        v_b = v_a;
75663
        v_a = ((uint32_t)(v_t1 + v_t2));
75664
        v_i += 1u;
75665
      }
75666
      v_a += self->private_impl.f_h0;
75667
      self->private_impl.f_h0 = v_a;
75668
      v_b += self->private_impl.f_h1;
75669
      self->private_impl.f_h1 = v_b;
75670
      v_c += self->private_impl.f_h2;
75671
      self->private_impl.f_h2 = v_c;
75672
      v_d += self->private_impl.f_h3;
75673
      self->private_impl.f_h3 = v_d;
75674
      v_e += self->private_impl.f_h4;
75675
      self->private_impl.f_h4 = v_e;
75676
      v_f += self->private_impl.f_h5;
75677
      self->private_impl.f_h5 = v_f;
75678
      v_g += self->private_impl.f_h6;
75679
      self->private_impl.f_h6 = v_g;
75680
      v_h += self->private_impl.f_h7;
75681
      self->private_impl.f_h7 = v_h;
75682
      v_p.ptr += 64;
75683
    }
75684
    v_p.len = 1;
75685
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
75686
    while (v_p.ptr < i_end1_p) {
75687
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
75688
      v_buf_len = ((v_buf_len + 1u) & 63u);
75689
      v_p.ptr += 1;
75690
    }
75691
    v_p.len = 0;
75692
  }
75693
  self->private_impl.f_buf_len = ((uint32_t)((((uint64_t)(a_x.len)) & 63u)));
75694
  return wuffs_base__make_empty_struct();
75695
}
75696
75697
// -------- func sha256.hasher.checksum_bitvec256
75698
75699
WUFFS_BASE__GENERATED_C_CODE
75700
WUFFS_BASE__MAYBE_STATIC wuffs_base__bitvec256
75701
wuffs_sha256__hasher__checksum_bitvec256(
75702
    const wuffs_sha256__hasher* self) {
75703
  if (!self) {
75704
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
75705
  }
75706
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
75707
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
75708
    return wuffs_base__utility__make_bitvec256(0u, 0u, 0u, 0u);
75709
  }
75710
75711
  uint32_t v_buf_len = 0;
75712
  uint8_t v_buf_data[64] = {0};
75713
  uint64_t v_length_in_bits = 0;
75714
  uint32_t v_w[64] = {0};
75715
  uint32_t v_w2 = 0;
75716
  uint32_t v_w15 = 0;
75717
  uint32_t v_s0 = 0;
75718
  uint32_t v_s1 = 0;
75719
  uint32_t v_t1 = 0;
75720
  uint32_t v_t2 = 0;
75721
  uint32_t v_h0 = 0;
75722
  uint32_t v_h1 = 0;
75723
  uint32_t v_h2 = 0;
75724
  uint32_t v_h3 = 0;
75725
  uint32_t v_h4 = 0;
75726
  uint32_t v_h5 = 0;
75727
  uint32_t v_h6 = 0;
75728
  uint32_t v_h7 = 0;
75729
  uint32_t v_a = 0;
75730
  uint32_t v_b = 0;
75731
  uint32_t v_c = 0;
75732
  uint32_t v_d = 0;
75733
  uint32_t v_e = 0;
75734
  uint32_t v_f = 0;
75735
  uint32_t v_g = 0;
75736
  uint32_t v_h = 0;
75737
  uint32_t v_i = 0;
75738
  bool v_final_block = false;
75739
75740
  v_i = 0u;
75741
  while (v_i < 64u) {
75742
    v_buf_data[v_i] = self->private_impl.f_buf_data[v_i];
75743
    v_i += 1u;
75744
  }
75745
  v_buf_len = (self->private_impl.f_buf_len & 63u);
75746
  if (v_buf_len < 56u) {
75747
    v_buf_data[v_buf_len] = 128u;
75748
    v_buf_len += 1u;
75749
    while (v_buf_len < 56u) {
75750
      v_buf_data[v_buf_len] = 0u;
75751
      v_buf_len += 1u;
75752
    }
75753
    v_final_block = true;
75754
  } else {
75755
    v_buf_data[v_buf_len] = 128u;
75756
    v_buf_len += 1u;
75757
    while (v_buf_len < 64u) {
75758
      v_buf_data[v_buf_len] = 0u;
75759
      v_buf_len += 1u;
75760
    }
75761
  }
75762
  v_h0 = self->private_impl.f_h0;
75763
  v_a = v_h0;
75764
  v_h1 = self->private_impl.f_h1;
75765
  v_b = v_h1;
75766
  v_h2 = self->private_impl.f_h2;
75767
  v_c = v_h2;
75768
  v_h3 = self->private_impl.f_h3;
75769
  v_d = v_h3;
75770
  v_h4 = self->private_impl.f_h4;
75771
  v_e = v_h4;
75772
  v_h5 = self->private_impl.f_h5;
75773
  v_f = v_h5;
75774
  v_h6 = self->private_impl.f_h6;
75775
  v_g = v_h6;
75776
  v_h7 = self->private_impl.f_h7;
75777
  v_h = v_h7;
75778
  while (true) {
75779
    if (v_final_block) {
75780
      v_length_in_bits = ((uint64_t)(self->private_impl.f_length_modulo_u64 * 8u));
75781
      v_buf_data[56u] = ((uint8_t)((v_length_in_bits >> 56u)));
75782
      v_buf_data[57u] = ((uint8_t)((v_length_in_bits >> 48u)));
75783
      v_buf_data[58u] = ((uint8_t)((v_length_in_bits >> 40u)));
75784
      v_buf_data[59u] = ((uint8_t)((v_length_in_bits >> 32u)));
75785
      v_buf_data[60u] = ((uint8_t)((v_length_in_bits >> 24u)));
75786
      v_buf_data[61u] = ((uint8_t)((v_length_in_bits >> 16u)));
75787
      v_buf_data[62u] = ((uint8_t)((v_length_in_bits >> 8u)));
75788
      v_buf_data[63u] = ((uint8_t)(v_length_in_bits));
75789
    }
75790
    v_w[0u] = ((((uint32_t)(v_buf_data[0u])) << 24u) |
75791
        (((uint32_t)(v_buf_data[1u])) << 16u) |
75792
        (((uint32_t)(v_buf_data[2u])) << 8u) |
75793
        ((uint32_t)(v_buf_data[3u])));
75794
    v_w[1u] = ((((uint32_t)(v_buf_data[4u])) << 24u) |
75795
        (((uint32_t)(v_buf_data[5u])) << 16u) |
75796
        (((uint32_t)(v_buf_data[6u])) << 8u) |
75797
        ((uint32_t)(v_buf_data[7u])));
75798
    v_w[2u] = ((((uint32_t)(v_buf_data[8u])) << 24u) |
75799
        (((uint32_t)(v_buf_data[9u])) << 16u) |
75800
        (((uint32_t)(v_buf_data[10u])) << 8u) |
75801
        ((uint32_t)(v_buf_data[11u])));
75802
    v_w[3u] = ((((uint32_t)(v_buf_data[12u])) << 24u) |
75803
        (((uint32_t)(v_buf_data[13u])) << 16u) |
75804
        (((uint32_t)(v_buf_data[14u])) << 8u) |
75805
        ((uint32_t)(v_buf_data[15u])));
75806
    v_w[4u] = ((((uint32_t)(v_buf_data[16u])) << 24u) |
75807
        (((uint32_t)(v_buf_data[17u])) << 16u) |
75808
        (((uint32_t)(v_buf_data[18u])) << 8u) |
75809
        ((uint32_t)(v_buf_data[19u])));
75810
    v_w[5u] = ((((uint32_t)(v_buf_data[20u])) << 24u) |
75811
        (((uint32_t)(v_buf_data[21u])) << 16u) |
75812
        (((uint32_t)(v_buf_data[22u])) << 8u) |
75813
        ((uint32_t)(v_buf_data[23u])));
75814
    v_w[6u] = ((((uint32_t)(v_buf_data[24u])) << 24u) |
75815
        (((uint32_t)(v_buf_data[25u])) << 16u) |
75816
        (((uint32_t)(v_buf_data[26u])) << 8u) |
75817
        ((uint32_t)(v_buf_data[27u])));
75818
    v_w[7u] = ((((uint32_t)(v_buf_data[28u])) << 24u) |
75819
        (((uint32_t)(v_buf_data[29u])) << 16u) |
75820
        (((uint32_t)(v_buf_data[30u])) << 8u) |
75821
        ((uint32_t)(v_buf_data[31u])));
75822
    v_w[8u] = ((((uint32_t)(v_buf_data[32u])) << 24u) |
75823
        (((uint32_t)(v_buf_data[33u])) << 16u) |
75824
        (((uint32_t)(v_buf_data[34u])) << 8u) |
75825
        ((uint32_t)(v_buf_data[35u])));
75826
    v_w[9u] = ((((uint32_t)(v_buf_data[36u])) << 24u) |
75827
        (((uint32_t)(v_buf_data[37u])) << 16u) |
75828
        (((uint32_t)(v_buf_data[38u])) << 8u) |
75829
        ((uint32_t)(v_buf_data[39u])));
75830
    v_w[10u] = ((((uint32_t)(v_buf_data[40u])) << 24u) |
75831
        (((uint32_t)(v_buf_data[41u])) << 16u) |
75832
        (((uint32_t)(v_buf_data[42u])) << 8u) |
75833
        ((uint32_t)(v_buf_data[43u])));
75834
    v_w[11u] = ((((uint32_t)(v_buf_data[44u])) << 24u) |
75835
        (((uint32_t)(v_buf_data[45u])) << 16u) |
75836
        (((uint32_t)(v_buf_data[46u])) << 8u) |
75837
        ((uint32_t)(v_buf_data[47u])));
75838
    v_w[12u] = ((((uint32_t)(v_buf_data[48u])) << 24u) |
75839
        (((uint32_t)(v_buf_data[49u])) << 16u) |
75840
        (((uint32_t)(v_buf_data[50u])) << 8u) |
75841
        ((uint32_t)(v_buf_data[51u])));
75842
    v_w[13u] = ((((uint32_t)(v_buf_data[52u])) << 24u) |
75843
        (((uint32_t)(v_buf_data[53u])) << 16u) |
75844
        (((uint32_t)(v_buf_data[54u])) << 8u) |
75845
        ((uint32_t)(v_buf_data[55u])));
75846
    v_w[14u] = ((((uint32_t)(v_buf_data[56u])) << 24u) |
75847
        (((uint32_t)(v_buf_data[57u])) << 16u) |
75848
        (((uint32_t)(v_buf_data[58u])) << 8u) |
75849
        ((uint32_t)(v_buf_data[59u])));
75850
    v_w[15u] = ((((uint32_t)(v_buf_data[60u])) << 24u) |
75851
        (((uint32_t)(v_buf_data[61u])) << 16u) |
75852
        (((uint32_t)(v_buf_data[62u])) << 8u) |
75853
        ((uint32_t)(v_buf_data[63u])));
75854
    v_i = 16u;
75855
    while (v_i < 64u) {
75856
      v_w2 = v_w[(v_i - 2u)];
75857
      v_s1 = ((v_w2 >> 10u) ^ (((uint32_t)(v_w2 << 15u)) | (v_w2 >> 17u)) ^ (((uint32_t)(v_w2 << 13u)) | (v_w2 >> 19u)));
75858
      v_w15 = v_w[(v_i - 15u)];
75859
      v_s0 = ((v_w15 >> 3u) ^ (((uint32_t)(v_w15 << 25u)) | (v_w15 >> 7u)) ^ (((uint32_t)(v_w15 << 14u)) | (v_w15 >> 18u)));
75860
      v_w[v_i] = ((uint32_t)(((uint32_t)(((uint32_t)(v_s1 + v_w[(v_i - 7u)])) + v_s0)) + v_w[(v_i - 16u)]));
75861
      v_i += 1u;
75862
    }
75863
    v_i = 0u;
75864
    while (v_i < 64u) {
75865
      v_t1 = v_h;
75866
      v_t1 += ((((uint32_t)(v_e << 26u)) | (v_e >> 6u)) ^ (((uint32_t)(v_e << 21u)) | (v_e >> 11u)) ^ (((uint32_t)(v_e << 7u)) | (v_e >> 25u)));
75867
      v_t1 += ((v_e & v_f) ^ ((4294967295u ^ v_e) & v_g));
75868
      v_t1 += WUFFS_SHA256__K[v_i];
75869
      v_t1 += v_w[v_i];
75870
      v_t2 = ((((uint32_t)(v_a << 30u)) | (v_a >> 2u)) ^ (((uint32_t)(v_a << 19u)) | (v_a >> 13u)) ^ (((uint32_t)(v_a << 10u)) | (v_a >> 22u)));
75871
      v_t2 += ((v_a & v_b) ^ (v_a & v_c) ^ (v_b & v_c));
75872
      v_h = v_g;
75873
      v_g = v_f;
75874
      v_f = v_e;
75875
      v_e = ((uint32_t)(v_d + v_t1));
75876
      v_d = v_c;
75877
      v_c = v_b;
75878
      v_b = v_a;
75879
      v_a = ((uint32_t)(v_t1 + v_t2));
75880
      v_i += 1u;
75881
    }
75882
    v_a += v_h0;
75883
    v_b += v_h1;
75884
    v_c += v_h2;
75885
    v_d += v_h3;
75886
    v_e += v_h4;
75887
    v_f += v_h5;
75888
    v_g += v_h6;
75889
    v_h += v_h7;
75890
    if (v_final_block) {
75891
      break;
75892
    }
75893
    v_final_block = true;
75894
    v_h0 = v_a;
75895
    v_h1 = v_b;
75896
    v_h2 = v_c;
75897
    v_h3 = v_d;
75898
    v_h4 = v_e;
75899
    v_h5 = v_f;
75900
    v_h6 = v_g;
75901
    v_h7 = v_h;
75902
    v_buf_len = 0u;
75903
    while (v_buf_len < 56u) {
75904
      v_buf_data[v_buf_len] = 0u;
75905
      v_buf_len += 1u;
75906
    }
75907
  }
75908
  return wuffs_base__utility__make_bitvec256(
75909
      (((uint64_t)(v_h)) | (((uint64_t)(v_g)) << 32u)),
75910
      (((uint64_t)(v_f)) | (((uint64_t)(v_e)) << 32u)),
75911
      (((uint64_t)(v_d)) | (((uint64_t)(v_c)) << 32u)),
75912
      (((uint64_t)(v_b)) | (((uint64_t)(v_a)) << 32u)));
75913
}
75914
75915
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__SHA256)
75916
75917
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
75918
75919
// ---------------- Status Codes Implementations
75920
75921
const char wuffs_targa__error__bad_header[] = "#targa: bad header";
75922
const char wuffs_targa__error__bad_run_length_encoding[] = "#targa: bad run length encoding";
75923
const char wuffs_targa__error__truncated_input[] = "#targa: truncated input";
75924
const char wuffs_targa__error__unsupported_targa_file[] = "#targa: unsupported TARGA file";
75925
75926
// ---------------- Private Consts
75927
75928
// ---------------- Private Initializer Prototypes
75929
75930
// ---------------- Private Function Prototypes
75931
75932
WUFFS_BASE__GENERATED_C_CODE
75933
static wuffs_base__status
75934
wuffs_targa__decoder__do_decode_image_config(
75935
    wuffs_targa__decoder* self,
75936
    wuffs_base__image_config* a_dst,
75937
    wuffs_base__io_buffer* a_src);
75938
75939
WUFFS_BASE__GENERATED_C_CODE
75940
static wuffs_base__status
75941
wuffs_targa__decoder__do_decode_frame_config(
75942
    wuffs_targa__decoder* self,
75943
    wuffs_base__frame_config* a_dst,
75944
    wuffs_base__io_buffer* a_src);
75945
75946
WUFFS_BASE__GENERATED_C_CODE
75947
static wuffs_base__status
75948
wuffs_targa__decoder__do_decode_frame(
75949
    wuffs_targa__decoder* self,
75950
    wuffs_base__pixel_buffer* a_dst,
75951
    wuffs_base__io_buffer* a_src,
75952
    wuffs_base__pixel_blend a_blend,
75953
    wuffs_base__slice_u8 a_workbuf,
75954
    wuffs_base__decode_frame_options* a_opts);
75955
75956
// ---------------- VTables
75957
75958
const wuffs_base__image_decoder__func_ptrs
75959
wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder = {
75960
  (wuffs_base__status(*)(void*,
75961
      wuffs_base__pixel_buffer*,
75962
      wuffs_base__io_buffer*,
75963
      wuffs_base__pixel_blend,
75964
      wuffs_base__slice_u8,
75965
      wuffs_base__decode_frame_options*))(&wuffs_targa__decoder__decode_frame),
75966
  (wuffs_base__status(*)(void*,
75967
      wuffs_base__frame_config*,
75968
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_frame_config),
75969
  (wuffs_base__status(*)(void*,
75970
      wuffs_base__image_config*,
75971
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__decode_image_config),
75972
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_targa__decoder__frame_dirty_rect),
75973
  (uint64_t(*)(const void*,
75974
      uint32_t))(&wuffs_targa__decoder__get_quirk),
75975
  (uint32_t(*)(const void*))(&wuffs_targa__decoder__num_animation_loops),
75976
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frame_configs),
75977
  (uint64_t(*)(const void*))(&wuffs_targa__decoder__num_decoded_frames),
75978
  (wuffs_base__status(*)(void*,
75979
      uint64_t,
75980
      uint64_t))(&wuffs_targa__decoder__restart_frame),
75981
  (wuffs_base__status(*)(void*,
75982
      uint32_t,
75983
      uint64_t))(&wuffs_targa__decoder__set_quirk),
75984
  (wuffs_base__empty_struct(*)(void*,
75985
      uint32_t,
75986
      bool))(&wuffs_targa__decoder__set_report_metadata),
75987
  (wuffs_base__status(*)(void*,
75988
      wuffs_base__io_buffer*,
75989
      wuffs_base__more_information*,
75990
      wuffs_base__io_buffer*))(&wuffs_targa__decoder__tell_me_more),
75991
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_targa__decoder__workbuf_len),
75992
};
75993
75994
// ---------------- Initializer Implementations
75995
75996
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
75997
wuffs_targa__decoder__initialize(
75998
    wuffs_targa__decoder* self,
75999
    size_t sizeof_star_self,
76000
    uint64_t wuffs_version,
76001
    uint32_t options){
76002
  if (!self) {
76003
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76004
  }
76005
  if (sizeof(*self) != sizeof_star_self) {
76006
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
76007
  }
76008
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
76009
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
76010
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
76011
  }
76012
76013
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
76014
    // The whole point of this if-check is to detect an uninitialized *self.
76015
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
76016
#if !defined(__clang__) && defined(__GNUC__)
76017
#pragma GCC diagnostic push
76018
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
76019
#endif
76020
    if (self->private_impl.magic != 0) {
76021
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
76022
    }
76023
#if !defined(__clang__) && defined(__GNUC__)
76024
#pragma GCC diagnostic pop
76025
#endif
76026
  } else {
76027
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
76028
      memset(self, 0, sizeof(*self));
76029
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
76030
    } else {
76031
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
76032
    }
76033
  }
76034
76035
  self->private_impl.magic = WUFFS_BASE__MAGIC;
76036
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
76037
      wuffs_base__image_decoder__vtable_name;
76038
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
76039
      (const void*)(&wuffs_targa__decoder__func_ptrs_for__wuffs_base__image_decoder);
76040
  return wuffs_base__make_status(NULL);
76041
}
76042
76043
wuffs_targa__decoder*
76044
wuffs_targa__decoder__alloc(void) {
76045
  wuffs_targa__decoder* x =
76046
      (wuffs_targa__decoder*)(calloc(1, sizeof(wuffs_targa__decoder)));
76047
  if (!x) {
76048
    return NULL;
76049
  }
76050
  if (wuffs_targa__decoder__initialize(
76051
      x, sizeof(wuffs_targa__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
76052
    free(x);
76053
    return NULL;
76054
  }
76055
  return x;
76056
}
76057
76058
size_t
76059
sizeof__wuffs_targa__decoder(void) {
76060
  return sizeof(wuffs_targa__decoder);
76061
}
76062
76063
// ---------------- Function Implementations
76064
76065
// -------- func targa.decoder.get_quirk
76066
76067
WUFFS_BASE__GENERATED_C_CODE
76068
WUFFS_BASE__MAYBE_STATIC uint64_t
76069
wuffs_targa__decoder__get_quirk(
76070
    const wuffs_targa__decoder* self,
76071
    uint32_t a_key) {
76072
  if (!self) {
76073
    return 0;
76074
  }
76075
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
76076
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
76077
    return 0;
76078
  }
76079
76080
  return 0u;
76081
}
76082
76083
// -------- func targa.decoder.set_quirk
76084
76085
WUFFS_BASE__GENERATED_C_CODE
76086
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76087
wuffs_targa__decoder__set_quirk(
76088
    wuffs_targa__decoder* self,
76089
    uint32_t a_key,
76090
    uint64_t a_value) {
76091
  if (!self) {
76092
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76093
  }
76094
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76095
    return wuffs_base__make_status(
76096
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76097
        ? wuffs_base__error__disabled_by_previous_error
76098
        : wuffs_base__error__initialize_not_called);
76099
  }
76100
76101
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
76102
}
76103
76104
// -------- func targa.decoder.decode_image_config
76105
76106
WUFFS_BASE__GENERATED_C_CODE
76107
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76108
wuffs_targa__decoder__decode_image_config(
76109
    wuffs_targa__decoder* self,
76110
    wuffs_base__image_config* a_dst,
76111
    wuffs_base__io_buffer* a_src) {
76112
  if (!self) {
76113
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76114
  }
76115
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76116
    return wuffs_base__make_status(
76117
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76118
        ? wuffs_base__error__disabled_by_previous_error
76119
        : wuffs_base__error__initialize_not_called);
76120
  }
76121
  if (!a_src) {
76122
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76123
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76124
  }
76125
  if ((self->private_impl.active_coroutine != 0) &&
76126
      (self->private_impl.active_coroutine != 1)) {
76127
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76128
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76129
  }
76130
  self->private_impl.active_coroutine = 0;
76131
  wuffs_base__status status = wuffs_base__make_status(NULL);
76132
76133
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76134
76135
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
76136
  switch (coro_susp_point) {
76137
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76138
76139
    while (true) {
76140
      {
76141
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_image_config(self, a_dst, a_src);
76142
        v_status = t_0;
76143
      }
76144
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76145
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
76146
        goto exit;
76147
      }
76148
      status = v_status;
76149
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76150
    }
76151
76152
    ok:
76153
    self->private_impl.p_decode_image_config = 0;
76154
    goto exit;
76155
  }
76156
76157
  goto suspend;
76158
  suspend:
76159
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76160
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
76161
76162
  goto exit;
76163
  exit:
76164
  if (wuffs_base__status__is_error(&status)) {
76165
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76166
  }
76167
  return status;
76168
}
76169
76170
// -------- func targa.decoder.do_decode_image_config
76171
76172
WUFFS_BASE__GENERATED_C_CODE
76173
static wuffs_base__status
76174
wuffs_targa__decoder__do_decode_image_config(
76175
    wuffs_targa__decoder* self,
76176
    wuffs_base__image_config* a_dst,
76177
    wuffs_base__io_buffer* a_src) {
76178
  wuffs_base__status status = wuffs_base__make_status(NULL);
76179
76180
  uint32_t v_c32 = 0;
76181
  uint32_t v_c5 = 0;
76182
  uint32_t v_i = 0;
76183
76184
  const uint8_t* iop_a_src = NULL;
76185
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76186
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76187
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76188
  if (a_src && a_src->data.ptr) {
76189
    io0_a_src = a_src->data.ptr;
76190
    io1_a_src = io0_a_src + a_src->meta.ri;
76191
    iop_a_src = io1_a_src;
76192
    io2_a_src = io0_a_src + a_src->meta.wi;
76193
  }
76194
76195
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
76196
  if (coro_susp_point) {
76197
    v_i = self->private_data.s_do_decode_image_config.v_i;
76198
  }
76199
  switch (coro_susp_point) {
76200
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76201
76202
    if (self->private_impl.f_call_sequence != 0u) {
76203
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
76204
      goto exit;
76205
    }
76206
    {
76207
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76208
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76209
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76210
        goto suspend;
76211
      }
76212
      uint8_t t_0 = *iop_a_src++;
76213
      self->private_impl.f_header_id_length = t_0;
76214
    }
76215
    {
76216
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
76217
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76218
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76219
        goto suspend;
76220
      }
76221
      uint8_t t_1 = *iop_a_src++;
76222
      self->private_impl.f_header_color_map_type = t_1;
76223
    }
76224
    if (self->private_impl.f_header_color_map_type > 1u) {
76225
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
76226
      goto exit;
76227
    }
76228
    {
76229
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
76230
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76231
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76232
        goto suspend;
76233
      }
76234
      uint8_t t_2 = *iop_a_src++;
76235
      self->private_impl.f_header_image_type = t_2;
76236
    }
76237
    if ((self->private_impl.f_header_image_type == 1u) ||
76238
        (self->private_impl.f_header_image_type == 2u) ||
76239
        (self->private_impl.f_header_image_type == 3u) ||
76240
        (self->private_impl.f_header_image_type == 9u) ||
76241
        (self->private_impl.f_header_image_type == 10u) ||
76242
        (self->private_impl.f_header_image_type == 11u)) {
76243
    } else {
76244
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
76245
      goto exit;
76246
    }
76247
    {
76248
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
76249
      uint16_t t_3;
76250
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
76251
        t_3 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
76252
        iop_a_src += 2;
76253
      } else {
76254
        self->private_data.s_do_decode_image_config.scratch = 0;
76255
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
76256
        while (true) {
76257
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76258
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76259
            goto suspend;
76260
          }
76261
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76262
          uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
76263
          *scratch <<= 8;
76264
          *scratch >>= 8;
76265
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
76266
          if (num_bits_3 == 8) {
76267
            t_3 = ((uint16_t)(*scratch));
76268
            break;
76269
          }
76270
          num_bits_3 += 8u;
76271
          *scratch |= ((uint64_t)(num_bits_3)) << 56;
76272
        }
76273
      }
76274
      self->private_impl.f_header_color_map_first_entry_index = t_3;
76275
    }
76276
    {
76277
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
76278
      uint16_t t_4;
76279
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
76280
        t_4 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
76281
        iop_a_src += 2;
76282
      } else {
76283
        self->private_data.s_do_decode_image_config.scratch = 0;
76284
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
76285
        while (true) {
76286
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76287
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76288
            goto suspend;
76289
          }
76290
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76291
          uint32_t num_bits_4 = ((uint32_t)(*scratch >> 56));
76292
          *scratch <<= 8;
76293
          *scratch >>= 8;
76294
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_4;
76295
          if (num_bits_4 == 8) {
76296
            t_4 = ((uint16_t)(*scratch));
76297
            break;
76298
          }
76299
          num_bits_4 += 8u;
76300
          *scratch |= ((uint64_t)(num_bits_4)) << 56;
76301
        }
76302
      }
76303
      self->private_impl.f_header_color_map_length = t_4;
76304
    }
76305
    {
76306
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
76307
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76308
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76309
        goto suspend;
76310
      }
76311
      uint8_t t_5 = *iop_a_src++;
76312
      self->private_impl.f_header_color_map_entry_size = t_5;
76313
    }
76314
    if (self->private_impl.f_header_color_map_type != 0u) {
76315
      if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length > 256u)) {
76316
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
76317
        goto exit;
76318
      } else if ((self->private_impl.f_header_color_map_entry_size != 15u) &&
76319
          (self->private_impl.f_header_color_map_entry_size != 16u) &&
76320
          (self->private_impl.f_header_color_map_entry_size != 24u) &&
76321
          (self->private_impl.f_header_color_map_entry_size != 32u)) {
76322
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
76323
        goto exit;
76324
      }
76325
    } else {
76326
      if ((self->private_impl.f_header_color_map_first_entry_index != 0u) || (self->private_impl.f_header_color_map_length != 0u) || (self->private_impl.f_header_color_map_entry_size != 0u)) {
76327
        status = wuffs_base__make_status(wuffs_targa__error__bad_header);
76328
        goto exit;
76329
      }
76330
    }
76331
    self->private_data.s_do_decode_image_config.scratch = 4u;
76332
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
76333
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
76334
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
76335
      iop_a_src = io2_a_src;
76336
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76337
      goto suspend;
76338
    }
76339
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
76340
    {
76341
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
76342
      uint32_t t_6;
76343
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
76344
        t_6 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
76345
        iop_a_src += 2;
76346
      } else {
76347
        self->private_data.s_do_decode_image_config.scratch = 0;
76348
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
76349
        while (true) {
76350
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76351
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76352
            goto suspend;
76353
          }
76354
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76355
          uint32_t num_bits_6 = ((uint32_t)(*scratch >> 56));
76356
          *scratch <<= 8;
76357
          *scratch >>= 8;
76358
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_6;
76359
          if (num_bits_6 == 8) {
76360
            t_6 = ((uint32_t)(*scratch));
76361
            break;
76362
          }
76363
          num_bits_6 += 8u;
76364
          *scratch |= ((uint64_t)(num_bits_6)) << 56;
76365
        }
76366
      }
76367
      self->private_impl.f_width = t_6;
76368
    }
76369
    {
76370
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
76371
      uint32_t t_7;
76372
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
76373
        t_7 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
76374
        iop_a_src += 2;
76375
      } else {
76376
        self->private_data.s_do_decode_image_config.scratch = 0;
76377
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
76378
        while (true) {
76379
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76380
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76381
            goto suspend;
76382
          }
76383
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76384
          uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
76385
          *scratch <<= 8;
76386
          *scratch >>= 8;
76387
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
76388
          if (num_bits_7 == 8) {
76389
            t_7 = ((uint32_t)(*scratch));
76390
            break;
76391
          }
76392
          num_bits_7 += 8u;
76393
          *scratch |= ((uint64_t)(num_bits_7)) << 56;
76394
        }
76395
      }
76396
      self->private_impl.f_height = t_7;
76397
    }
76398
    {
76399
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
76400
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76401
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76402
        goto suspend;
76403
      }
76404
      uint8_t t_8 = *iop_a_src++;
76405
      self->private_impl.f_header_pixel_depth = t_8;
76406
    }
76407
    if ((self->private_impl.f_header_pixel_depth != 1u) &&
76408
        (self->private_impl.f_header_pixel_depth != 8u) &&
76409
        (self->private_impl.f_header_pixel_depth != 15u) &&
76410
        (self->private_impl.f_header_pixel_depth != 16u) &&
76411
        (self->private_impl.f_header_pixel_depth != 24u) &&
76412
        (self->private_impl.f_header_pixel_depth != 32u)) {
76413
      status = wuffs_base__make_status(wuffs_targa__error__bad_header);
76414
      goto exit;
76415
    }
76416
    if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 9u) {
76417
      self->private_impl.f_scratch_bytes_per_pixel = 1u;
76418
      self->private_impl.f_src_bytes_per_pixel = 1u;
76419
      self->private_impl.f_src_pixfmt = 2164523016u;
76420
      self->private_impl.f_opaque = ((self->private_impl.f_header_color_map_entry_size == 15u) || (self->private_impl.f_header_color_map_entry_size == 24u));
76421
    } else if (((uint8_t)(self->private_impl.f_header_image_type | 8u)) == 10u) {
76422
      if ((self->private_impl.f_header_pixel_depth == 15u) || (self->private_impl.f_header_pixel_depth == 16u)) {
76423
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
76424
        self->private_impl.f_src_bytes_per_pixel = 0u;
76425
        self->private_impl.f_src_pixfmt = 2164295816u;
76426
      } else if (self->private_impl.f_header_pixel_depth == 24u) {
76427
        self->private_impl.f_scratch_bytes_per_pixel = 3u;
76428
        self->private_impl.f_src_bytes_per_pixel = 3u;
76429
        self->private_impl.f_src_pixfmt = 2147485832u;
76430
        self->private_impl.f_opaque = true;
76431
      } else if (self->private_impl.f_header_pixel_depth == 32u) {
76432
        self->private_impl.f_scratch_bytes_per_pixel = 4u;
76433
        self->private_impl.f_src_bytes_per_pixel = 4u;
76434
        self->private_impl.f_src_pixfmt = 2164295816u;
76435
      } else {
76436
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
76437
        goto exit;
76438
      }
76439
    } else {
76440
      if (self->private_impl.f_header_pixel_depth == 8u) {
76441
        self->private_impl.f_scratch_bytes_per_pixel = 1u;
76442
        self->private_impl.f_src_bytes_per_pixel = 1u;
76443
        self->private_impl.f_src_pixfmt = 536870920u;
76444
        self->private_impl.f_opaque = true;
76445
      } else {
76446
        status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
76447
        goto exit;
76448
      }
76449
    }
76450
    {
76451
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
76452
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76453
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76454
        goto suspend;
76455
      }
76456
      uint8_t t_9 = *iop_a_src++;
76457
      self->private_impl.f_header_image_descriptor = t_9;
76458
    }
76459
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 16u)) != 0u) {
76460
      status = wuffs_base__make_status(wuffs_targa__error__unsupported_targa_file);
76461
      goto exit;
76462
    }
76463
    self->private_data.s_do_decode_image_config.scratch = ((uint32_t)(self->private_impl.f_header_id_length));
76464
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
76465
    if (self->private_data.s_do_decode_image_config.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
76466
      self->private_data.s_do_decode_image_config.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
76467
      iop_a_src = io2_a_src;
76468
      status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76469
      goto suspend;
76470
    }
76471
    iop_a_src += self->private_data.s_do_decode_image_config.scratch;
76472
    if (self->private_impl.f_header_color_map_type != 0u) {
76473
      while (v_i < ((uint32_t)(self->private_impl.f_header_color_map_length))) {
76474
        if (self->private_impl.f_header_color_map_entry_size == 24u) {
76475
          {
76476
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
76477
            uint32_t t_10;
76478
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
76479
              t_10 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
76480
              iop_a_src += 3;
76481
            } else {
76482
              self->private_data.s_do_decode_image_config.scratch = 0;
76483
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
76484
              while (true) {
76485
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76486
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76487
                  goto suspend;
76488
                }
76489
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76490
                uint32_t num_bits_10 = ((uint32_t)(*scratch >> 56));
76491
                *scratch <<= 8;
76492
                *scratch >>= 8;
76493
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_10;
76494
                if (num_bits_10 == 16) {
76495
                  t_10 = ((uint32_t)(*scratch));
76496
                  break;
76497
                }
76498
                num_bits_10 += 8u;
76499
                *scratch |= ((uint64_t)(num_bits_10)) << 56;
76500
              }
76501
            }
76502
            v_c32 = t_10;
76503
          }
76504
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
76505
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
76506
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
76507
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
76508
        } else if (self->private_impl.f_header_color_map_entry_size == 32u) {
76509
          {
76510
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
76511
            uint32_t t_11;
76512
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
76513
              t_11 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
76514
              iop_a_src += 4;
76515
            } else {
76516
              self->private_data.s_do_decode_image_config.scratch = 0;
76517
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
76518
              while (true) {
76519
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76520
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76521
                  goto suspend;
76522
                }
76523
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76524
                uint32_t num_bits_11 = ((uint32_t)(*scratch >> 56));
76525
                *scratch <<= 8;
76526
                *scratch >>= 8;
76527
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_11;
76528
                if (num_bits_11 == 24) {
76529
                  t_11 = ((uint32_t)(*scratch));
76530
                  break;
76531
                }
76532
                num_bits_11 += 8u;
76533
                *scratch |= ((uint64_t)(num_bits_11)) << 56;
76534
              }
76535
            }
76536
            v_c32 = t_11;
76537
          }
76538
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)((v_c32 >> 0u)));
76539
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)((v_c32 >> 8u)));
76540
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)((v_c32 >> 16u)));
76541
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = ((uint8_t)((v_c32 >> 24u)));
76542
        } else {
76543
          {
76544
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
76545
            uint32_t t_12;
76546
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
76547
              t_12 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
76548
              iop_a_src += 2;
76549
            } else {
76550
              self->private_data.s_do_decode_image_config.scratch = 0;
76551
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
76552
              while (true) {
76553
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
76554
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76555
                  goto suspend;
76556
                }
76557
                uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
76558
                uint32_t num_bits_12 = ((uint32_t)(*scratch >> 56));
76559
                *scratch <<= 8;
76560
                *scratch >>= 8;
76561
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_12;
76562
                if (num_bits_12 == 8) {
76563
                  t_12 = ((uint32_t)(*scratch));
76564
                  break;
76565
                }
76566
                num_bits_12 += 8u;
76567
                *scratch |= ((uint64_t)(num_bits_12)) << 56;
76568
              }
76569
            }
76570
            v_c32 = t_12;
76571
          }
76572
          v_c5 = (31u & (v_c32 >> 0u));
76573
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 0u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
76574
          v_c5 = (31u & (v_c32 >> 5u));
76575
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 1u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
76576
          v_c5 = (31u & (v_c32 >> 10u));
76577
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 2u)] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
76578
          self->private_data.f_src_palette[(((v_i & 255u) * 4u) + 3u)] = 255u;
76579
        }
76580
        v_i += 1u;
76581
      }
76582
      while (v_i < 256u) {
76583
        self->private_data.f_src_palette[((v_i * 4u) + 0u)] = 0u;
76584
        self->private_data.f_src_palette[((v_i * 4u) + 1u)] = 0u;
76585
        self->private_data.f_src_palette[((v_i * 4u) + 2u)] = 0u;
76586
        self->private_data.f_src_palette[((v_i * 4u) + 3u)] = 255u;
76587
        v_i += 1u;
76588
      }
76589
    }
76590
    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)));
76591
    if (a_dst != NULL) {
76592
      wuffs_base__image_config__set(
76593
          a_dst,
76594
          self->private_impl.f_src_pixfmt,
76595
          0u,
76596
          self->private_impl.f_width,
76597
          self->private_impl.f_height,
76598
          self->private_impl.f_frame_config_io_position,
76599
          self->private_impl.f_opaque);
76600
    }
76601
    self->private_impl.f_call_sequence = 32u;
76602
76603
    goto ok;
76604
    ok:
76605
    self->private_impl.p_do_decode_image_config = 0;
76606
    goto exit;
76607
  }
76608
76609
  goto suspend;
76610
  suspend:
76611
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76612
  self->private_data.s_do_decode_image_config.v_i = v_i;
76613
76614
  goto exit;
76615
  exit:
76616
  if (a_src && a_src->data.ptr) {
76617
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76618
  }
76619
76620
  return status;
76621
}
76622
76623
// -------- func targa.decoder.decode_frame_config
76624
76625
WUFFS_BASE__GENERATED_C_CODE
76626
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76627
wuffs_targa__decoder__decode_frame_config(
76628
    wuffs_targa__decoder* self,
76629
    wuffs_base__frame_config* a_dst,
76630
    wuffs_base__io_buffer* a_src) {
76631
  if (!self) {
76632
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76633
  }
76634
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76635
    return wuffs_base__make_status(
76636
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76637
        ? wuffs_base__error__disabled_by_previous_error
76638
        : wuffs_base__error__initialize_not_called);
76639
  }
76640
  if (!a_src) {
76641
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76642
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76643
  }
76644
  if ((self->private_impl.active_coroutine != 0) &&
76645
      (self->private_impl.active_coroutine != 2)) {
76646
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76647
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76648
  }
76649
  self->private_impl.active_coroutine = 0;
76650
  wuffs_base__status status = wuffs_base__make_status(NULL);
76651
76652
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76653
76654
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
76655
  switch (coro_susp_point) {
76656
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76657
76658
    while (true) {
76659
      {
76660
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame_config(self, a_dst, a_src);
76661
        v_status = t_0;
76662
      }
76663
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76664
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
76665
        goto exit;
76666
      }
76667
      status = v_status;
76668
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76669
    }
76670
76671
    ok:
76672
    self->private_impl.p_decode_frame_config = 0;
76673
    goto exit;
76674
  }
76675
76676
  goto suspend;
76677
  suspend:
76678
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76679
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
76680
76681
  goto exit;
76682
  exit:
76683
  if (wuffs_base__status__is_error(&status)) {
76684
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76685
  }
76686
  return status;
76687
}
76688
76689
// -------- func targa.decoder.do_decode_frame_config
76690
76691
WUFFS_BASE__GENERATED_C_CODE
76692
static wuffs_base__status
76693
wuffs_targa__decoder__do_decode_frame_config(
76694
    wuffs_targa__decoder* self,
76695
    wuffs_base__frame_config* a_dst,
76696
    wuffs_base__io_buffer* a_src) {
76697
  wuffs_base__status status = wuffs_base__make_status(NULL);
76698
76699
  wuffs_base__pixel_format v_pixfmt = {0};
76700
76701
  const uint8_t* iop_a_src = NULL;
76702
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76703
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76704
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76705
  if (a_src && a_src->data.ptr) {
76706
    io0_a_src = a_src->data.ptr;
76707
    io1_a_src = io0_a_src + a_src->meta.ri;
76708
    iop_a_src = io1_a_src;
76709
    io2_a_src = io0_a_src + a_src->meta.wi;
76710
  }
76711
76712
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
76713
  switch (coro_susp_point) {
76714
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76715
76716
    if (self->private_impl.f_call_sequence == 32u) {
76717
    } else if (self->private_impl.f_call_sequence < 32u) {
76718
      if (a_src) {
76719
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76720
      }
76721
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76722
      status = wuffs_targa__decoder__do_decode_image_config(self, NULL, a_src);
76723
      if (a_src) {
76724
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
76725
      }
76726
      if (status.repr) {
76727
        goto suspend;
76728
      }
76729
    } else if (self->private_impl.f_call_sequence == 40u) {
76730
      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)))) {
76731
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
76732
        goto exit;
76733
      }
76734
    } else if (self->private_impl.f_call_sequence == 64u) {
76735
      self->private_impl.f_call_sequence = 96u;
76736
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76737
      goto ok;
76738
    } else {
76739
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76740
      goto ok;
76741
    }
76742
    if (a_dst != NULL) {
76743
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt);
76744
      wuffs_base__frame_config__set(
76745
          a_dst,
76746
          wuffs_base__utility__make_rect_ie_u32(
76747
          0u,
76748
          0u,
76749
          self->private_impl.f_width,
76750
          self->private_impl.f_height),
76751
          ((wuffs_base__flicks)(0u)),
76752
          0u,
76753
          self->private_impl.f_frame_config_io_position,
76754
          0u,
76755
          self->private_impl.f_opaque,
76756
          false,
76757
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
76758
    }
76759
    self->private_impl.f_call_sequence = 64u;
76760
76761
    ok:
76762
    self->private_impl.p_do_decode_frame_config = 0;
76763
    goto exit;
76764
  }
76765
76766
  goto suspend;
76767
  suspend:
76768
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76769
76770
  goto exit;
76771
  exit:
76772
  if (a_src && a_src->data.ptr) {
76773
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76774
  }
76775
76776
  return status;
76777
}
76778
76779
// -------- func targa.decoder.decode_frame
76780
76781
WUFFS_BASE__GENERATED_C_CODE
76782
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
76783
wuffs_targa__decoder__decode_frame(
76784
    wuffs_targa__decoder* self,
76785
    wuffs_base__pixel_buffer* a_dst,
76786
    wuffs_base__io_buffer* a_src,
76787
    wuffs_base__pixel_blend a_blend,
76788
    wuffs_base__slice_u8 a_workbuf,
76789
    wuffs_base__decode_frame_options* a_opts) {
76790
  if (!self) {
76791
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
76792
  }
76793
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
76794
    return wuffs_base__make_status(
76795
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
76796
        ? wuffs_base__error__disabled_by_previous_error
76797
        : wuffs_base__error__initialize_not_called);
76798
  }
76799
  if (!a_dst || !a_src) {
76800
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76801
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
76802
  }
76803
  if ((self->private_impl.active_coroutine != 0) &&
76804
      (self->private_impl.active_coroutine != 3)) {
76805
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76806
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
76807
  }
76808
  self->private_impl.active_coroutine = 0;
76809
  wuffs_base__status status = wuffs_base__make_status(NULL);
76810
76811
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76812
76813
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
76814
  switch (coro_susp_point) {
76815
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76816
76817
    while (true) {
76818
      {
76819
        wuffs_base__status t_0 = wuffs_targa__decoder__do_decode_frame(self,
76820
            a_dst,
76821
            a_src,
76822
            a_blend,
76823
            a_workbuf,
76824
            a_opts);
76825
        v_status = t_0;
76826
      }
76827
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
76828
        status = wuffs_base__make_status(wuffs_targa__error__truncated_input);
76829
        goto exit;
76830
      }
76831
      status = v_status;
76832
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
76833
    }
76834
76835
    ok:
76836
    self->private_impl.p_decode_frame = 0;
76837
    goto exit;
76838
  }
76839
76840
  goto suspend;
76841
  suspend:
76842
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
76843
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
76844
76845
  goto exit;
76846
  exit:
76847
  if (wuffs_base__status__is_error(&status)) {
76848
    self->private_impl.magic = WUFFS_BASE__DISABLED;
76849
  }
76850
  return status;
76851
}
76852
76853
// -------- func targa.decoder.do_decode_frame
76854
76855
WUFFS_BASE__GENERATED_C_CODE
76856
static wuffs_base__status
76857
wuffs_targa__decoder__do_decode_frame(
76858
    wuffs_targa__decoder* self,
76859
    wuffs_base__pixel_buffer* a_dst,
76860
    wuffs_base__io_buffer* a_src,
76861
    wuffs_base__pixel_blend a_blend,
76862
    wuffs_base__slice_u8 a_workbuf,
76863
    wuffs_base__decode_frame_options* a_opts) {
76864
  wuffs_base__status status = wuffs_base__make_status(NULL);
76865
76866
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
76867
  wuffs_base__pixel_format v_dst_pixfmt = {0};
76868
  uint32_t v_dst_bits_per_pixel = 0;
76869
  uint64_t v_dst_bytes_per_pixel = 0;
76870
  uint32_t v_dst_x = 0;
76871
  uint32_t v_dst_y = 0;
76872
  wuffs_base__table_u8 v_tab = {0};
76873
  wuffs_base__slice_u8 v_dst_palette = {0};
76874
  wuffs_base__slice_u8 v_dst = {0};
76875
  uint64_t v_dst_start = 0;
76876
  wuffs_base__slice_u8 v_src_palette = {0};
76877
  uint64_t v_mark = 0;
76878
  uint64_t v_num_pixels64 = 0;
76879
  uint32_t v_num_pixels32 = 0;
76880
  uint32_t v_lit_length = 0;
76881
  uint32_t v_run_length = 0;
76882
  uint64_t v_num_dst_bytes = 0;
76883
  uint32_t v_num_src_bytes = 0;
76884
  uint32_t v_c32 = 0;
76885
  uint32_t v_c5 = 0;
76886
76887
  const uint8_t* iop_a_src = NULL;
76888
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76889
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76890
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
76891
  if (a_src && a_src->data.ptr) {
76892
    io0_a_src = a_src->data.ptr;
76893
    io1_a_src = io0_a_src + a_src->meta.ri;
76894
    iop_a_src = io1_a_src;
76895
    io2_a_src = io0_a_src + a_src->meta.wi;
76896
  }
76897
76898
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
76899
  if (coro_susp_point) {
76900
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
76901
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
76902
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
76903
    v_mark = self->private_data.s_do_decode_frame.v_mark;
76904
    v_num_pixels32 = self->private_data.s_do_decode_frame.v_num_pixels32;
76905
    v_lit_length = self->private_data.s_do_decode_frame.v_lit_length;
76906
    v_run_length = self->private_data.s_do_decode_frame.v_run_length;
76907
    v_num_dst_bytes = self->private_data.s_do_decode_frame.v_num_dst_bytes;
76908
  }
76909
  switch (coro_susp_point) {
76910
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
76911
76912
    if (self->private_impl.f_call_sequence == 64u) {
76913
    } else if (self->private_impl.f_call_sequence < 64u) {
76914
      if (a_src) {
76915
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
76916
      }
76917
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
76918
      status = wuffs_targa__decoder__do_decode_frame_config(self, NULL, a_src);
76919
      if (a_src) {
76920
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
76921
      }
76922
      if (status.repr) {
76923
        goto suspend;
76924
      }
76925
    } else {
76926
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
76927
      goto ok;
76928
    }
76929
    if (self->private_impl.f_header_color_map_type != 0u) {
76930
      v_src_palette = wuffs_base__make_slice_u8(self->private_data.f_src_palette, 1024);
76931
    }
76932
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
76933
        wuffs_base__pixel_buffer__pixel_format(a_dst),
76934
        wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024)),
76935
        wuffs_base__utility__make_pixel_format(self->private_impl.f_src_pixfmt),
76936
        v_src_palette,
76937
        a_blend);
76938
    if ( ! wuffs_base__status__is_ok(&v_status)) {
76939
      status = v_status;
76940
      if (wuffs_base__status__is_error(&status)) {
76941
        goto exit;
76942
      } else if (wuffs_base__status__is_suspension(&status)) {
76943
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
76944
        goto exit;
76945
      }
76946
      goto ok;
76947
    }
76948
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
76949
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
76950
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
76951
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
76952
      goto exit;
76953
    }
76954
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
76955
    if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
76956
      v_dst_y = ((uint32_t)(self->private_impl.f_height - 1u));
76957
    }
76958
    if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
76959
      v_lit_length = self->private_impl.f_width;
76960
    }
76961
    label__resume__continue:;
76962
    while (true) {
76963
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
76964
      v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_dst_palette, 1024));
76965
      while (v_dst_y < self->private_impl.f_height) {
76966
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
76967
        v_dst_start = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
76968
        if (v_dst_start <= ((uint64_t)(v_dst.len))) {
76969
          v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_start);
76970
        } else {
76971
          v_dst = wuffs_base__utility__empty_slice_u8();
76972
        }
76973
        while (v_dst_x < self->private_impl.f_width) {
76974
          if (self->private_impl.f_src_bytes_per_pixel > 0u) {
76975
            if (v_lit_length > 0u) {
76976
              v_mark = ((uint64_t)(iop_a_src - io0_a_src));
76977
              v_num_pixels64 = (((uint64_t)(io2_a_src - iop_a_src)) / ((uint64_t)(self->private_impl.f_src_bytes_per_pixel)));
76978
              v_num_pixels32 = ((uint32_t)(wuffs_base__u64__min(v_num_pixels64, ((uint64_t)(v_lit_length)))));
76979
              v_num_dst_bytes = (((uint64_t)(v_num_pixels32)) * v_dst_bytes_per_pixel);
76980
              v_num_src_bytes = (v_num_pixels32 * self->private_impl.f_src_bytes_per_pixel);
76981
              self->private_data.s_do_decode_frame.scratch = v_num_src_bytes;
76982
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
76983
              if (self->private_data.s_do_decode_frame.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
76984
                self->private_data.s_do_decode_frame.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
76985
                iop_a_src = io2_a_src;
76986
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
76987
                goto suspend;
76988
              }
76989
              iop_a_src += self->private_data.s_do_decode_frame.scratch;
76990
              wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, v_dst_palette, wuffs_private_impl__io__since(v_mark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
76991
              if (v_num_dst_bytes <= ((uint64_t)(v_dst.len))) {
76992
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_num_dst_bytes);
76993
              } else {
76994
                v_dst = wuffs_base__utility__empty_slice_u8();
76995
              }
76996
              v_dst_x += v_num_pixels32;
76997
              v_lit_length = (((uint32_t)(v_lit_length - v_num_pixels32)) & 65535u);
76998
              if (v_lit_length > 0u) {
76999
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77000
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(3);
77001
                goto label__resume__continue;
77002
              }
77003
            } else if (v_run_length > 0u) {
77004
              v_run_length -= 1u;
77005
              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_scratch_bytes_per_pixel));
77006
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
77007
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
77008
              }
77009
              v_dst_x += 1u;
77010
            } else {
77011
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
77012
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77013
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(4);
77014
                goto label__resume__continue;
77015
              }
77016
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
77017
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
77018
                iop_a_src += 1u;
77019
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
77020
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
77021
                  goto exit;
77022
                }
77023
              } else {
77024
                if (self->private_impl.f_src_bytes_per_pixel == 1u) {
77025
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
77026
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77027
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
77028
                    goto label__resume__continue;
77029
                  }
77030
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
77031
                  iop_a_src += 1u;
77032
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77033
                  iop_a_src += 1u;
77034
                } else if (self->private_impl.f_src_bytes_per_pixel == 3u) {
77035
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
77036
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77037
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
77038
                    goto label__resume__continue;
77039
                  }
77040
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
77041
                  iop_a_src += 1u;
77042
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77043
                  iop_a_src += 1u;
77044
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77045
                  iop_a_src += 1u;
77046
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77047
                  iop_a_src += 1u;
77048
                } else {
77049
                  if (((uint64_t)(io2_a_src - iop_a_src)) < 5u) {
77050
                    status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77051
                    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
77052
                    goto label__resume__continue;
77053
                  }
77054
                  v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
77055
                  iop_a_src += 1u;
77056
                  self->private_data.f_scratch[0u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77057
                  iop_a_src += 1u;
77058
                  self->private_data.f_scratch[1u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77059
                  iop_a_src += 1u;
77060
                  self->private_data.f_scratch[2u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77061
                  iop_a_src += 1u;
77062
                  self->private_data.f_scratch[3u] = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
77063
                  iop_a_src += 1u;
77064
                }
77065
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
77066
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
77067
                  goto exit;
77068
                }
77069
              }
77070
            }
77071
          } else {
77072
            if (v_lit_length > 0u) {
77073
              if (((uint64_t)(io2_a_src - iop_a_src)) < 2u) {
77074
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77075
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(8);
77076
                goto label__resume__continue;
77077
              }
77078
              v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
77079
              iop_a_src += 2u;
77080
              v_c5 = (31u & (v_c32 >> 0u));
77081
              self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77082
              v_c5 = (31u & (v_c32 >> 5u));
77083
              self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77084
              v_c5 = (31u & (v_c32 >> 10u));
77085
              self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77086
              self->private_data.f_scratch[3u] = 255u;
77087
              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, 4));
77088
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
77089
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
77090
              }
77091
              v_dst_x += 1u;
77092
              v_lit_length -= 1u;
77093
            } else if (v_run_length > 0u) {
77094
              v_run_length -= 1u;
77095
              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_scratch_bytes_per_pixel));
77096
              if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
77097
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
77098
              }
77099
              v_dst_x += 1u;
77100
            } else {
77101
              if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
77102
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77103
                WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
77104
                goto label__resume__continue;
77105
              }
77106
              if (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) < 128u) {
77107
                v_lit_length = (((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) + 1u);
77108
                iop_a_src += 1u;
77109
                if ((v_lit_length + v_dst_x) > self->private_impl.f_width) {
77110
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
77111
                  goto exit;
77112
                }
77113
              } else {
77114
                if (((uint64_t)(io2_a_src - iop_a_src)) < 3u) {
77115
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
77116
                  WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
77117
                  goto label__resume__continue;
77118
                }
77119
                v_run_length = ((((uint32_t)(wuffs_base__peek_u8be__no_bounds_check(iop_a_src))) & 127u) + 1u);
77120
                iop_a_src += 1u;
77121
                v_c32 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
77122
                iop_a_src += 2u;
77123
                v_c5 = (31u & (v_c32 >> 0u));
77124
                self->private_data.f_scratch[0u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77125
                v_c5 = (31u & (v_c32 >> 5u));
77126
                self->private_data.f_scratch[1u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77127
                v_c5 = (31u & (v_c32 >> 10u));
77128
                self->private_data.f_scratch[2u] = ((uint8_t)(((v_c5 << 3u) | (v_c5 >> 2u))));
77129
                self->private_data.f_scratch[3u] = 255u;
77130
                if ((v_run_length + v_dst_x) > self->private_impl.f_width) {
77131
                  status = wuffs_base__make_status(wuffs_targa__error__bad_run_length_encoding);
77132
                  goto exit;
77133
                }
77134
              }
77135
            }
77136
          }
77137
        }
77138
        v_dst_x = 0u;
77139
        if (((uint8_t)(self->private_impl.f_header_image_descriptor & 32u)) == 0u) {
77140
          v_dst_y -= 1u;
77141
        } else {
77142
          v_dst_y += 1u;
77143
        }
77144
        if (((uint8_t)(self->private_impl.f_header_image_type & 8u)) == 0u) {
77145
          v_lit_length = self->private_impl.f_width;
77146
        }
77147
      }
77148
      break;
77149
    }
77150
    self->private_impl.f_call_sequence = 96u;
77151
77152
    ok:
77153
    self->private_impl.p_do_decode_frame = 0;
77154
    goto exit;
77155
  }
77156
77157
  goto suspend;
77158
  suspend:
77159
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77160
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
77161
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
77162
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
77163
  self->private_data.s_do_decode_frame.v_mark = v_mark;
77164
  self->private_data.s_do_decode_frame.v_num_pixels32 = v_num_pixels32;
77165
  self->private_data.s_do_decode_frame.v_lit_length = v_lit_length;
77166
  self->private_data.s_do_decode_frame.v_run_length = v_run_length;
77167
  self->private_data.s_do_decode_frame.v_num_dst_bytes = v_num_dst_bytes;
77168
77169
  goto exit;
77170
  exit:
77171
  if (a_src && a_src->data.ptr) {
77172
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
77173
  }
77174
77175
  return status;
77176
}
77177
77178
// -------- func targa.decoder.frame_dirty_rect
77179
77180
WUFFS_BASE__GENERATED_C_CODE
77181
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
77182
wuffs_targa__decoder__frame_dirty_rect(
77183
    const wuffs_targa__decoder* self) {
77184
  if (!self) {
77185
    return wuffs_base__utility__empty_rect_ie_u32();
77186
  }
77187
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77188
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77189
    return wuffs_base__utility__empty_rect_ie_u32();
77190
  }
77191
77192
  return wuffs_base__utility__make_rect_ie_u32(
77193
      0u,
77194
      0u,
77195
      self->private_impl.f_width,
77196
      self->private_impl.f_height);
77197
}
77198
77199
// -------- func targa.decoder.num_animation_loops
77200
77201
WUFFS_BASE__GENERATED_C_CODE
77202
WUFFS_BASE__MAYBE_STATIC uint32_t
77203
wuffs_targa__decoder__num_animation_loops(
77204
    const wuffs_targa__decoder* self) {
77205
  if (!self) {
77206
    return 0;
77207
  }
77208
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77209
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77210
    return 0;
77211
  }
77212
77213
  return 0u;
77214
}
77215
77216
// -------- func targa.decoder.num_decoded_frame_configs
77217
77218
WUFFS_BASE__GENERATED_C_CODE
77219
WUFFS_BASE__MAYBE_STATIC uint64_t
77220
wuffs_targa__decoder__num_decoded_frame_configs(
77221
    const wuffs_targa__decoder* self) {
77222
  if (!self) {
77223
    return 0;
77224
  }
77225
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77226
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77227
    return 0;
77228
  }
77229
77230
  if (self->private_impl.f_call_sequence > 32u) {
77231
    return 1u;
77232
  }
77233
  return 0u;
77234
}
77235
77236
// -------- func targa.decoder.num_decoded_frames
77237
77238
WUFFS_BASE__GENERATED_C_CODE
77239
WUFFS_BASE__MAYBE_STATIC uint64_t
77240
wuffs_targa__decoder__num_decoded_frames(
77241
    const wuffs_targa__decoder* self) {
77242
  if (!self) {
77243
    return 0;
77244
  }
77245
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77246
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77247
    return 0;
77248
  }
77249
77250
  if (self->private_impl.f_call_sequence > 64u) {
77251
    return 1u;
77252
  }
77253
  return 0u;
77254
}
77255
77256
// -------- func targa.decoder.restart_frame
77257
77258
WUFFS_BASE__GENERATED_C_CODE
77259
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77260
wuffs_targa__decoder__restart_frame(
77261
    wuffs_targa__decoder* self,
77262
    uint64_t a_index,
77263
    uint64_t a_io_position) {
77264
  if (!self) {
77265
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77266
  }
77267
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77268
    return wuffs_base__make_status(
77269
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77270
        ? wuffs_base__error__disabled_by_previous_error
77271
        : wuffs_base__error__initialize_not_called);
77272
  }
77273
77274
  if (self->private_impl.f_call_sequence < 32u) {
77275
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
77276
  }
77277
  if (a_index != 0u) {
77278
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77279
  }
77280
  self->private_impl.f_call_sequence = 40u;
77281
  self->private_impl.f_frame_config_io_position = a_io_position;
77282
  return wuffs_base__make_status(NULL);
77283
}
77284
77285
// -------- func targa.decoder.set_report_metadata
77286
77287
WUFFS_BASE__GENERATED_C_CODE
77288
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
77289
wuffs_targa__decoder__set_report_metadata(
77290
    wuffs_targa__decoder* self,
77291
    uint32_t a_fourcc,
77292
    bool a_report) {
77293
  return wuffs_base__make_empty_struct();
77294
}
77295
77296
// -------- func targa.decoder.tell_me_more
77297
77298
WUFFS_BASE__GENERATED_C_CODE
77299
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77300
wuffs_targa__decoder__tell_me_more(
77301
    wuffs_targa__decoder* self,
77302
    wuffs_base__io_buffer* a_dst,
77303
    wuffs_base__more_information* a_minfo,
77304
    wuffs_base__io_buffer* a_src) {
77305
  if (!self) {
77306
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77307
  }
77308
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77309
    return wuffs_base__make_status(
77310
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77311
        ? wuffs_base__error__disabled_by_previous_error
77312
        : wuffs_base__error__initialize_not_called);
77313
  }
77314
  if (!a_dst || !a_src) {
77315
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77316
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77317
  }
77318
  if ((self->private_impl.active_coroutine != 0) &&
77319
      (self->private_impl.active_coroutine != 4)) {
77320
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77321
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77322
  }
77323
  self->private_impl.active_coroutine = 0;
77324
  wuffs_base__status status = wuffs_base__make_status(NULL);
77325
77326
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
77327
  goto exit;
77328
77329
  goto ok;
77330
  ok:
77331
  goto exit;
77332
  exit:
77333
  if (wuffs_base__status__is_error(&status)) {
77334
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77335
  }
77336
  return status;
77337
}
77338
77339
// -------- func targa.decoder.workbuf_len
77340
77341
WUFFS_BASE__GENERATED_C_CODE
77342
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
77343
wuffs_targa__decoder__workbuf_len(
77344
    const wuffs_targa__decoder* self) {
77345
  if (!self) {
77346
    return wuffs_base__utility__empty_range_ii_u64();
77347
  }
77348
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77349
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77350
    return wuffs_base__utility__empty_range_ii_u64();
77351
  }
77352
77353
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
77354
}
77355
77356
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
77357
77358
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
77359
77360
// ---------------- Status Codes Implementations
77361
77362
const char wuffs_thumbhash__error__bad_header[] = "#thumbhash: bad header";
77363
const char wuffs_thumbhash__error__truncated_input[] = "#thumbhash: truncated input";
77364
77365
// ---------------- Private Consts
77366
77367
#define WUFFS_THUMBHASH__QUIRKS_BASE 1712283648u
77368
77369
static const uint8_t
77370
WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
77371
  0u, 14u, 18u, 19u, 23u, 26u, 27u, 32u,
77372
};
77373
77374
static const uint8_t
77375
WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
77376
  0u, 0u, 14u, 32u, 51u, 74u, 100u, 127u,
77377
};
77378
77379
static const uint8_t
77380
WUFFS_THUMBHASH__DIMENSION_CODES_FROM_HAS_ALPHA_AND_L_COUNT[2][8] WUFFS_BASE__POTENTIALLY_UNUSED = {
77381
  {
77382
    23u, 23u, 23u, 23u, 39u, 71u, 103u, 119u,
77383
  }, {
77384
    55u, 55u, 55u, 55u, 87u, 119u, 118u, 116u,
77385
  },
77386
};
77387
77388
static const uint16_t
77389
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_00[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
77390
  49152u, 51337u, 53521u, 55706u, 57890u, 60075u, 62259u, 64444u,
77391
  1092u, 3277u, 5461u, 7646u, 9830u, 12015u, 14199u, 16384u,
77392
};
77393
77394
static const uint16_t
77395
WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_25[16] WUFFS_BASE__POTENTIALLY_UNUSED = {
77396
  45056u, 47787u, 50517u, 53248u, 55979u, 58709u, 61440u, 64171u,
77397
  1365u, 4096u, 6827u, 9557u, 12288u, 15019u, 17749u, 20480u,
77398
};
77399
77400
static const uint16_t
77401
WUFFS_THUMBHASH__COSINES[159][6] WUFFS_BASE__POTENTIALLY_UNUSED = {
77402
  {
77403
    16281u, 15973u, 15465u, 14761u, 13873u, 12810u,
77404
  }, {
77405
    15465u, 12810u, 8717u, 3646u, 63702u, 58427u,
77406
  }, {
77407
    13873u, 7109u, 63702u, 55321u, 50071u, 49563u,
77408
  }, {
77409
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
77410
  }, {
77411
    8717u, 58427u, 49255u, 55321u, 5411u, 15973u,
77412
  }, {
77413
    5411u, 52726u, 51663u, 3646u, 16281u, 7109u,
77414
  }, {
77415
    1834u, 49563u, 60125u, 14761u, 8717u, 52726u,
77416
  }, {
77417
    63702u, 49563u, 5411u, 14761u, 56819u, 52726u,
77418
  },
77419
  {
77420
    60125u, 52726u, 13873u, 3646u, 49255u, 7109u,
77421
  }, {
77422
    56819u, 58427u, 16281u, 55321u, 60125u, 15973u,
77423
  }, {
77424
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
77425
  }, {
77426
    51663u, 7109u, 1834u, 55321u, 15465u, 49563u,
77427
  }, {
77428
    50071u, 12810u, 56819u, 3646u, 1834u, 58427u,
77429
  }, {
77430
    49255u, 15973u, 50071u, 14761u, 51663u, 12810u,
77431
  }, {
77432
    16322u, 16135u, 15826u, 15396u, 14849u, 14189u,
77433
  }, {
77434
    15826u, 14189u, 11585u, 8192u, 4240u, 0u,
77435
  },
77436
  {
77437
    14849u, 10531u, 4240u, 62691u, 56139u, 51347u,
77438
  }, {
77439
    13421u, 5604u, 61296u, 52985u, 49214u, 51347u,
77440
  }, {
77441
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
77442
  }, {
77443
    9397u, 59932u, 49710u, 52985u, 1428u, 14189u,
77444
  }, {
77445
    6924u, 55005u, 49710u, 62691u, 13421u, 14189u,
77446
  }, {
77447
    4240u, 51347u, 53951u, 8192u, 15826u, 0u,
77448
  }, {
77449
    1428u, 49401u, 61296u, 15396u, 6924u, 51347u,
77450
  }, {
77451
    64108u, 49401u, 4240u, 15396u, 58612u, 51347u,
77452
  },
77453
  {
77454
    61296u, 51347u, 11585u, 8192u, 49710u, 0u,
77455
  }, {
77456
    58612u, 55005u, 15826u, 62691u, 52115u, 14189u,
77457
  }, {
77458
    56139u, 59932u, 15826u, 52985u, 64108u, 14189u,
77459
  }, {
77460
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
77461
  }, {
77462
    52115u, 5604u, 4240u, 52985u, 16322u, 51347u,
77463
  }, {
77464
    50687u, 10531u, 61296u, 62691u, 9397u, 51347u,
77465
  }, {
77466
    49710u, 14189u, 53951u, 8192u, 61296u, 0u,
77467
  }, {
77468
    49214u, 16135u, 49710u, 15396u, 50687u, 14189u,
77469
  },
77470
  {
77471
    16328u, 16161u, 15883u, 15496u, 15004u, 14409u,
77472
  }, {
77473
    15883u, 14409u, 12054u, 8961u, 5320u, 1353u,
77474
  }, {
77475
    15004u, 11097u, 5320u, 64183u, 57738u, 52607u,
77476
  }, {
77477
    13716u, 6581u, 62839u, 54439u, 49653u, 50040u,
77478
  }, {
77479
    12054u, 1353u, 55473u, 49375u, 51820u, 61514u,
77480
  }, {
77481
    10063u, 61514u, 50532u, 51127u, 62839u, 11097u,
77482
  }, {
77483
    7798u, 56575u, 49208u, 58955u, 10063u, 16161u,
77484
  }, {
77485
    5320u, 52607u, 51820u, 4022u, 16328u, 6581u,
77486
  },
77487
  {
77488
    2697u, 50040u, 57738u, 12929u, 12054u, 56575u,
77489
  }, {
77490
    0u, 49152u, 0u, 16384u, 0u, 49152u,
77491
  }, {
77492
    62839u, 50040u, 7798u, 12929u, 53482u, 56575u,
77493
  }, {
77494
    60216u, 52607u, 13716u, 4022u, 49208u, 6581u,
77495
  }, {
77496
    57738u, 56575u, 16328u, 58955u, 55473u, 16161u,
77497
  }, {
77498
    55473u, 61514u, 15004u, 51127u, 2697u, 11097u,
77499
  }, {
77500
    53482u, 1353u, 10063u, 49375u, 13716u, 61514u,
77501
  }, {
77502
    51820u, 6581u, 2697u, 54439u, 15883u, 50040u,
77503
  },
77504
  {
77505
    50532u, 11097u, 60216u, 64183u, 7798u, 52607u,
77506
  }, {
77507
    49653u, 14409u, 53482u, 8961u, 60216u, 1353u,
77508
  }, {
77509
    49208u, 16161u, 49653u, 15496u, 50532u, 14409u,
77510
  }, {
77511
    16346u, 16231u, 16041u, 15776u, 15438u, 15028u,
77512
  }, {
77513
    16041u, 15028u, 13385u, 11183u, 8513u, 5487u,
77514
  }, {
77515
    15438u, 12709u, 8513u, 3333u, 63305u, 57998u,
77516
  }, {
77517
    14547u, 9448u, 2231u, 60049u, 53562u, 49760u,
77518
  }, {
77519
    13385u, 5487u, 61116u, 52827u, 49190u, 51537u,
77520
  },
77521
  {
77522
    11974u, 1118u, 55196u, 49305u, 52151u, 62203u,
77523
  }, {
77524
    10340u, 62203u, 50989u, 50508u, 61116u, 9448u,
77525
  }, {
77526
    8513u, 57998u, 49190u, 56088u, 6527u, 16231u,
77527
  }, {
77528
    6527u, 54353u, 50098u, 64418u, 14547u, 12709u,
77529
  }, {
77530
    4420u, 51537u, 53562u, 7538u, 16041u, 1118u,
77531
  }, {
77532
    2231u, 49760u, 59009u, 13999u, 10340u, 54353u,
77533
  }, {
77534
    0u, 49152u, 0u, 16384u, 0u, 49152u,
77535
  }, {
77536
    63305u, 49760u, 6527u, 13999u, 55196u, 54353u,
77537
  },
77538
  {
77539
    61116u, 51537u, 11974u, 7538u, 49495u, 1118u,
77540
  }, {
77541
    59009u, 54353u, 15438u, 64418u, 50989u, 12709u,
77542
  }, {
77543
    57023u, 57998u, 16346u, 56088u, 59009u, 16231u,
77544
  }, {
77545
    55196u, 62203u, 14547u, 50508u, 4420u, 9448u,
77546
  }, {
77547
    53562u, 1118u, 10340u, 49305u, 13385u, 62203u,
77548
  }, {
77549
    52151u, 5487u, 4420u, 52827u, 16346u, 51537u,
77550
  }, {
77551
    50989u, 9448u, 63305u, 60049u, 11974u, 49760u,
77552
  }, {
77553
    50098u, 12709u, 57023u, 3333u, 2231u, 57998u,
77554
  },
77555
  {
77556
    49495u, 15028u, 52151u, 11183u, 57023u, 5487u,
77557
  }, {
77558
    49190u, 16231u, 49495u, 15776u, 50098u, 15028u,
77559
  }, {
77560
    16354u, 16265u, 16116u, 15908u, 15642u, 15319u,
77561
  }, {
77562
    16116u, 15319u, 14021u, 12264u, 10104u, 7614u,
77563
  }, {
77564
    15642u, 13484u, 10104u, 5810u, 989u, 61615u,
77565
  }, {
77566
    14941u, 10865u, 4874u, 63561u, 57060u, 52052u,
77567
  }, {
77568
    14021u, 7614u, 64547u, 56229u, 50595u, 49271u,
77569
  }, {
77570
    12897u, 3921u, 58812u, 51029u, 49420u, 54671u,
77571
  },
77572
  {
77573
    11585u, 0u, 53951u, 49152u, 53951u, 0u,
77574
  }, {
77575
    10104u, 61615u, 50595u, 51029u, 62583u, 10865u,
77576
  }, {
77577
    8476u, 57922u, 49182u, 56229u, 6724u, 16265u,
77578
  }, {
77579
    6724u, 54671u, 49894u, 63561u, 14021u, 13484u,
77580
  }, {
77581
    4874u, 52052u, 52639u, 5810u, 16354u, 3921u,
77582
  }, {
77583
    2953u, 50217u, 57060u, 12264u, 12897u, 57922u,
77584
  }, {
77585
    989u, 49271u, 62583u, 15908u, 4874u, 50217u,
77586
  }, {
77587
    64547u, 49271u, 2953u, 15908u, 60662u, 50217u,
77588
  },
77589
  {
77590
    62583u, 50217u, 8476u, 12264u, 52639u, 57922u,
77591
  }, {
77592
    60662u, 52052u, 12897u, 5810u, 49182u, 3921u,
77593
  }, {
77594
    58812u, 54671u, 15642u, 63561u, 51515u, 13484u,
77595
  }, {
77596
    57060u, 57922u, 16354u, 56229u, 58812u, 16265u,
77597
  }, {
77598
    55432u, 61615u, 14941u, 51029u, 2953u, 10865u,
77599
  }, {
77600
    53951u, 0u, 11585u, 49152u, 11585u, 0u,
77601
  }, {
77602
    52639u, 3921u, 6724u, 51029u, 16116u, 54671u,
77603
  }, {
77604
    51515u, 7614u, 989u, 56229u, 14941u, 49271u,
77605
  },
77606
  {
77607
    50595u, 10865u, 60662u, 63561u, 8476u, 52052u,
77608
  }, {
77609
    49894u, 13484u, 55432u, 5810u, 64547u, 61615u,
77610
  }, {
77611
    49420u, 15319u, 51515u, 12264u, 55432u, 7614u,
77612
  }, {
77613
    49182u, 16265u, 49420u, 15908u, 49894u, 15319u,
77614
  }, {
77615
    16356u, 16273u, 16135u, 15942u, 15696u, 15396u,
77616
  }, {
77617
    16135u, 15396u, 14189u, 12551u, 10531u, 8192u,
77618
  }, {
77619
    15696u, 13689u, 10531u, 6489u, 1902u, 62691u,
77620
  }, {
77621
    15044u, 11243u, 5604u, 64583u, 58183u, 52985u,
77622
  },
77623
  {
77624
    14189u, 8192u, 0u, 57344u, 51347u, 49152u,
77625
  }, {
77626
    13142u, 4699u, 59932u, 51847u, 49180u, 52985u,
77627
  }, {
77628
    11917u, 953u, 55005u, 49263u, 52394u, 62691u,
77629
  }, {
77630
    10531u, 62691u, 51347u, 50140u, 59932u, 8192u,
77631
  }, {
77632
    9003u, 59047u, 49401u, 54293u, 3778u, 15396u,
77633
  }, {
77634
    7353u, 55752u, 49401u, 60837u, 11917u, 15396u,
77635
  }, {
77636
    5604u, 52985u, 51347u, 2845u, 16135u, 8192u,
77637
  }, {
77638
    3778u, 50895u, 55005u, 9784u, 15044u, 62691u,
77639
  },
77640
  {
77641
    1902u, 49594u, 59932u, 14641u, 9003u, 52985u,
77642
  }, {
77643
    0u, 49152u, 0u, 16384u, 0u, 49152u,
77644
  }, {
77645
    63634u, 49594u, 5604u, 14641u, 56533u, 52985u,
77646
  }, {
77647
    61758u, 50895u, 10531u, 9784u, 50492u, 62691u,
77648
  }, {
77649
    59932u, 52985u, 14189u, 2845u, 49401u, 8192u,
77650
  }, {
77651
    58183u, 55752u, 16135u, 60837u, 53619u, 15396u,
77652
  }, {
77653
    56533u, 59047u, 16135u, 54293u, 61758u, 15396u,
77654
  }, {
77655
    55005u, 62691u, 14189u, 50140u, 5604u, 8192u,
77656
  },
77657
  {
77658
    53619u, 953u, 10531u, 49263u, 13142u, 62691u,
77659
  }, {
77660
    52394u, 4699u, 5604u, 51847u, 16356u, 52985u,
77661
  }, {
77662
    51347u, 8192u, 0u, 57344u, 14189u, 49152u,
77663
  }, {
77664
    50492u, 11243u, 59932u, 64583u, 7353u, 52985u,
77665
  }, {
77666
    49840u, 13689u, 55005u, 6489u, 63634u, 62691u,
77667
  }, {
77668
    49401u, 15396u, 51347u, 12551u, 55005u, 8192u,
77669
  }, {
77670
    49180u, 16273u, 49401u, 15942u, 49840u, 15396u,
77671
  }, {
77672
    16364u, 16305u, 16207u, 16069u, 15893u, 15679u,
77673
  },
77674
  {
77675
    16207u, 15679u, 14811u, 13623u, 12140u, 10394u,
77676
  }, {
77677
    15893u, 14449u, 12140u, 9102u, 5520u, 1606u,
77678
  }, {
77679
    15426u, 12665u, 8423u, 3196u, 63132u, 57813u,
77680
  }, {
77681
    14811u, 10394u, 3981u, 62340u, 55776u, 51087u,
77682
  }, {
77683
    14053u, 7723u, 64732u, 56434u, 50725u, 49231u,
77684
  }, {
77685
    13160u, 4756u, 60016u, 51913u, 49172u, 52871u,
77686
  }, {
77687
    12140u, 1606u, 55776u, 49467u, 51483u, 60780u,
77688
  }, {
77689
    11003u, 63930u, 52376u, 49467u, 57113u, 4756u,
77690
  },
77691
  {
77692
    9760u, 60780u, 50110u, 51913u, 64732u, 12665u,
77693
  }, {
77694
    8423u, 57813u, 49172u, 56434u, 7005u, 16305u,
77695
  }, {
77696
    7005u, 55142u, 49643u, 62340u, 13160u, 14449u,
77697
  }, {
77698
    5520u, 52871u, 51483u, 3196u, 16207u, 7723u,
77699
  }, {
77700
    3981u, 51087u, 54533u, 9102u, 15426u, 63930u,
77701
  }, {
77702
    2404u, 49857u, 58531u, 13623u, 11003u, 55142u,
77703
  }, {
77704
    804u, 49231u, 63132u, 16069u, 3981u, 49857u,
77705
  }, {
77706
    64732u, 49231u, 2404u, 16069u, 61555u, 49857u,
77707
  },
77708
  {
77709
    63132u, 49857u, 7005u, 13623u, 54533u, 55142u,
77710
  }, {
77711
    61555u, 51087u, 11003u, 9102u, 50110u, 63930u,
77712
  }, {
77713
    60016u, 52871u, 14053u, 3196u, 49329u, 7723u,
77714
  }, {
77715
    58531u, 55142u, 15893u, 62340u, 52376u, 14449u,
77716
  }, {
77717
    57113u, 57813u, 16364u, 56434u, 58531u, 16305u,
77718
  }, {
77719
    55776u, 60780u, 15426u, 51913u, 804u, 12665u,
77720
  }, {
77721
    54533u, 63930u, 13160u, 49467u, 8423u, 4756u,
77722
  }, {
77723
    53396u, 1606u, 9760u, 49467u, 14053u, 60780u,
77724
  },
77725
  {
77726
    52376u, 4756u, 5520u, 51913u, 16364u, 52871u,
77727
  }, {
77728
    51483u, 7723u, 804u, 56434u, 14811u, 49231u,
77729
  }, {
77730
    50725u, 10394u, 61555u, 62340u, 9760u, 51087u,
77731
  }, {
77732
    50110u, 12665u, 57113u, 3196u, 2404u, 57813u,
77733
  }, {
77734
    49643u, 14449u, 53396u, 9102u, 60016u, 1606u,
77735
  }, {
77736
    49329u, 15679u, 50725u, 13623u, 53396u, 10394u,
77737
  }, {
77738
    49172u, 16305u, 49329u, 16069u, 49643u, 15679u,
77739
  },
77740
};
77741
77742
// ---------------- Private Initializer Prototypes
77743
77744
// ---------------- Private Function Prototypes
77745
77746
WUFFS_BASE__GENERATED_C_CODE
77747
static wuffs_base__status
77748
wuffs_thumbhash__decoder__do_decode_image_config(
77749
    wuffs_thumbhash__decoder* self,
77750
    wuffs_base__image_config* a_dst,
77751
    wuffs_base__io_buffer* a_src);
77752
77753
WUFFS_BASE__GENERATED_C_CODE
77754
static wuffs_base__status
77755
wuffs_thumbhash__decoder__do_decode_frame_config(
77756
    wuffs_thumbhash__decoder* self,
77757
    wuffs_base__frame_config* a_dst,
77758
    wuffs_base__io_buffer* a_src);
77759
77760
WUFFS_BASE__GENERATED_C_CODE
77761
static wuffs_base__status
77762
wuffs_thumbhash__decoder__do_decode_frame(
77763
    wuffs_thumbhash__decoder* self,
77764
    wuffs_base__pixel_buffer* a_dst,
77765
    wuffs_base__io_buffer* a_src,
77766
    wuffs_base__pixel_blend a_blend,
77767
    wuffs_base__slice_u8 a_workbuf,
77768
    wuffs_base__decode_frame_options* a_opts);
77769
77770
WUFFS_BASE__GENERATED_C_CODE
77771
static wuffs_base__status
77772
wuffs_thumbhash__decoder__from_src_to_coeffs(
77773
    wuffs_thumbhash__decoder* self,
77774
    wuffs_base__io_buffer* a_src);
77775
77776
WUFFS_BASE__GENERATED_C_CODE
77777
static wuffs_base__empty_struct
77778
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
77779
    wuffs_thumbhash__decoder* self);
77780
77781
WUFFS_BASE__GENERATED_C_CODE
77782
static wuffs_base__status
77783
wuffs_thumbhash__decoder__from_pixels_to_dst(
77784
    wuffs_thumbhash__decoder* self,
77785
    wuffs_base__pixel_buffer* a_dst);
77786
77787
// ---------------- VTables
77788
77789
const wuffs_base__image_decoder__func_ptrs
77790
wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder = {
77791
  (wuffs_base__status(*)(void*,
77792
      wuffs_base__pixel_buffer*,
77793
      wuffs_base__io_buffer*,
77794
      wuffs_base__pixel_blend,
77795
      wuffs_base__slice_u8,
77796
      wuffs_base__decode_frame_options*))(&wuffs_thumbhash__decoder__decode_frame),
77797
  (wuffs_base__status(*)(void*,
77798
      wuffs_base__frame_config*,
77799
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_frame_config),
77800
  (wuffs_base__status(*)(void*,
77801
      wuffs_base__image_config*,
77802
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__decode_image_config),
77803
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_thumbhash__decoder__frame_dirty_rect),
77804
  (uint64_t(*)(const void*,
77805
      uint32_t))(&wuffs_thumbhash__decoder__get_quirk),
77806
  (uint32_t(*)(const void*))(&wuffs_thumbhash__decoder__num_animation_loops),
77807
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frame_configs),
77808
  (uint64_t(*)(const void*))(&wuffs_thumbhash__decoder__num_decoded_frames),
77809
  (wuffs_base__status(*)(void*,
77810
      uint64_t,
77811
      uint64_t))(&wuffs_thumbhash__decoder__restart_frame),
77812
  (wuffs_base__status(*)(void*,
77813
      uint32_t,
77814
      uint64_t))(&wuffs_thumbhash__decoder__set_quirk),
77815
  (wuffs_base__empty_struct(*)(void*,
77816
      uint32_t,
77817
      bool))(&wuffs_thumbhash__decoder__set_report_metadata),
77818
  (wuffs_base__status(*)(void*,
77819
      wuffs_base__io_buffer*,
77820
      wuffs_base__more_information*,
77821
      wuffs_base__io_buffer*))(&wuffs_thumbhash__decoder__tell_me_more),
77822
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_thumbhash__decoder__workbuf_len),
77823
};
77824
77825
// ---------------- Initializer Implementations
77826
77827
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
77828
wuffs_thumbhash__decoder__initialize(
77829
    wuffs_thumbhash__decoder* self,
77830
    size_t sizeof_star_self,
77831
    uint64_t wuffs_version,
77832
    uint32_t options){
77833
  if (!self) {
77834
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77835
  }
77836
  if (sizeof(*self) != sizeof_star_self) {
77837
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
77838
  }
77839
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
77840
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
77841
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
77842
  }
77843
77844
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
77845
    // The whole point of this if-check is to detect an uninitialized *self.
77846
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
77847
#if !defined(__clang__) && defined(__GNUC__)
77848
#pragma GCC diagnostic push
77849
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
77850
#endif
77851
    if (self->private_impl.magic != 0) {
77852
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
77853
    }
77854
#if !defined(__clang__) && defined(__GNUC__)
77855
#pragma GCC diagnostic pop
77856
#endif
77857
  } else {
77858
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
77859
      memset(self, 0, sizeof(*self));
77860
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
77861
    } else {
77862
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
77863
    }
77864
  }
77865
77866
  self->private_impl.magic = WUFFS_BASE__MAGIC;
77867
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
77868
      wuffs_base__image_decoder__vtable_name;
77869
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
77870
      (const void*)(&wuffs_thumbhash__decoder__func_ptrs_for__wuffs_base__image_decoder);
77871
  return wuffs_base__make_status(NULL);
77872
}
77873
77874
wuffs_thumbhash__decoder*
77875
wuffs_thumbhash__decoder__alloc(void) {
77876
  wuffs_thumbhash__decoder* x =
77877
      (wuffs_thumbhash__decoder*)(calloc(1, sizeof(wuffs_thumbhash__decoder)));
77878
  if (!x) {
77879
    return NULL;
77880
  }
77881
  if (wuffs_thumbhash__decoder__initialize(
77882
      x, sizeof(wuffs_thumbhash__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
77883
    free(x);
77884
    return NULL;
77885
  }
77886
  return x;
77887
}
77888
77889
size_t
77890
sizeof__wuffs_thumbhash__decoder(void) {
77891
  return sizeof(wuffs_thumbhash__decoder);
77892
}
77893
77894
// ---------------- Function Implementations
77895
77896
// -------- func thumbhash.decoder.get_quirk
77897
77898
WUFFS_BASE__GENERATED_C_CODE
77899
WUFFS_BASE__MAYBE_STATIC uint64_t
77900
wuffs_thumbhash__decoder__get_quirk(
77901
    const wuffs_thumbhash__decoder* self,
77902
    uint32_t a_key) {
77903
  if (!self) {
77904
    return 0;
77905
  }
77906
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
77907
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
77908
    return 0;
77909
  }
77910
77911
  if ((a_key == 1712283648u) && self->private_impl.f_quirk_just_raw_thumbhash) {
77912
    return 1u;
77913
  }
77914
  return 0u;
77915
}
77916
77917
// -------- func thumbhash.decoder.set_quirk
77918
77919
WUFFS_BASE__GENERATED_C_CODE
77920
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77921
wuffs_thumbhash__decoder__set_quirk(
77922
    wuffs_thumbhash__decoder* self,
77923
    uint32_t a_key,
77924
    uint64_t a_value) {
77925
  if (!self) {
77926
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77927
  }
77928
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77929
    return wuffs_base__make_status(
77930
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77931
        ? wuffs_base__error__disabled_by_previous_error
77932
        : wuffs_base__error__initialize_not_called);
77933
  }
77934
77935
  if (a_key == 1712283648u) {
77936
    self->private_impl.f_quirk_just_raw_thumbhash = (a_value > 0u);
77937
    return wuffs_base__make_status(NULL);
77938
  }
77939
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
77940
}
77941
77942
// -------- func thumbhash.decoder.decode_image_config
77943
77944
WUFFS_BASE__GENERATED_C_CODE
77945
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
77946
wuffs_thumbhash__decoder__decode_image_config(
77947
    wuffs_thumbhash__decoder* self,
77948
    wuffs_base__image_config* a_dst,
77949
    wuffs_base__io_buffer* a_src) {
77950
  if (!self) {
77951
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
77952
  }
77953
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
77954
    return wuffs_base__make_status(
77955
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
77956
        ? wuffs_base__error__disabled_by_previous_error
77957
        : wuffs_base__error__initialize_not_called);
77958
  }
77959
  if (!a_src) {
77960
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77961
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
77962
  }
77963
  if ((self->private_impl.active_coroutine != 0) &&
77964
      (self->private_impl.active_coroutine != 1)) {
77965
    self->private_impl.magic = WUFFS_BASE__DISABLED;
77966
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
77967
  }
77968
  self->private_impl.active_coroutine = 0;
77969
  wuffs_base__status status = wuffs_base__make_status(NULL);
77970
77971
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
77972
77973
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
77974
  switch (coro_susp_point) {
77975
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
77976
77977
    while (true) {
77978
      {
77979
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_image_config(self, a_dst, a_src);
77980
        v_status = t_0;
77981
      }
77982
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
77983
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
77984
        goto exit;
77985
      }
77986
      status = v_status;
77987
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
77988
    }
77989
77990
    ok:
77991
    self->private_impl.p_decode_image_config = 0;
77992
    goto exit;
77993
  }
77994
77995
  goto suspend;
77996
  suspend:
77997
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
77998
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
77999
78000
  goto exit;
78001
  exit:
78002
  if (wuffs_base__status__is_error(&status)) {
78003
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78004
  }
78005
  return status;
78006
}
78007
78008
// -------- func thumbhash.decoder.do_decode_image_config
78009
78010
WUFFS_BASE__GENERATED_C_CODE
78011
static wuffs_base__status
78012
wuffs_thumbhash__decoder__do_decode_image_config(
78013
    wuffs_thumbhash__decoder* self,
78014
    wuffs_base__image_config* a_dst,
78015
    wuffs_base__io_buffer* a_src) {
78016
  wuffs_base__status status = wuffs_base__make_status(NULL);
78017
78018
  uint32_t v_c32 = 0;
78019
  uint8_t v_swap = 0;
78020
78021
  const uint8_t* iop_a_src = NULL;
78022
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78023
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78024
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78025
  if (a_src && a_src->data.ptr) {
78026
    io0_a_src = a_src->data.ptr;
78027
    io1_a_src = io0_a_src + a_src->meta.ri;
78028
    iop_a_src = io1_a_src;
78029
    io2_a_src = io0_a_src + a_src->meta.wi;
78030
  }
78031
78032
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
78033
  switch (coro_susp_point) {
78034
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78035
78036
    if (self->private_impl.f_call_sequence != 0u) {
78037
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
78038
      goto exit;
78039
    }
78040
    if ( ! self->private_impl.f_quirk_just_raw_thumbhash) {
78041
      {
78042
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78043
        uint32_t t_0;
78044
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
78045
          t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
78046
          iop_a_src += 3;
78047
        } else {
78048
          self->private_data.s_do_decode_image_config.scratch = 0;
78049
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78050
          while (true) {
78051
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78052
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78053
              goto suspend;
78054
            }
78055
            uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
78056
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
78057
            *scratch <<= 8;
78058
            *scratch >>= 8;
78059
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
78060
            if (num_bits_0 == 16) {
78061
              t_0 = ((uint32_t)(*scratch));
78062
              break;
78063
            }
78064
            num_bits_0 += 8u;
78065
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
78066
          }
78067
        }
78068
        v_c32 = t_0;
78069
      }
78070
      if (v_c32 != 16694979u) {
78071
        status = wuffs_base__make_status(wuffs_thumbhash__error__bad_header);
78072
        goto exit;
78073
      }
78074
    }
78075
    {
78076
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
78077
      uint32_t t_1;
78078
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
78079
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
78080
        iop_a_src += 3;
78081
      } else {
78082
        self->private_data.s_do_decode_image_config.scratch = 0;
78083
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
78084
        while (true) {
78085
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78086
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78087
            goto suspend;
78088
          }
78089
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
78090
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
78091
          *scratch <<= 8;
78092
          *scratch >>= 8;
78093
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
78094
          if (num_bits_1 == 16) {
78095
            t_1 = ((uint32_t)(*scratch));
78096
            break;
78097
          }
78098
          num_bits_1 += 8u;
78099
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
78100
        }
78101
      }
78102
      v_c32 = t_1;
78103
    }
78104
    self->private_impl.f_l_dc = (((uint64_t)(((v_c32 >> 0u) & 63u))) * 136339441844224u);
78105
    self->private_impl.f_p_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 6u) & 63u))) * 272678883688448u) - 8589384836186112u));
78106
    self->private_impl.f_q_dc = ((uint64_t)((((uint64_t)(((v_c32 >> 12u) & 63u))) * 272678883688448u) - 8589384836186112u));
78107
    self->private_impl.f_l_scale = ((uint8_t)(((v_c32 >> 18u) & 31u)));
78108
    self->private_impl.f_has_alpha = ((uint8_t)(((v_c32 >> 23u) & 1u)));
78109
    {
78110
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
78111
      uint32_t t_2;
78112
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
78113
        t_2 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
78114
        iop_a_src += 2;
78115
      } else {
78116
        self->private_data.s_do_decode_image_config.scratch = 0;
78117
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
78118
        while (true) {
78119
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78120
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78121
            goto suspend;
78122
          }
78123
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
78124
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
78125
          *scratch <<= 8;
78126
          *scratch >>= 8;
78127
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
78128
          if (num_bits_2 == 8) {
78129
            t_2 = ((uint32_t)(*scratch));
78130
            break;
78131
          }
78132
          num_bits_2 += 8u;
78133
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
78134
        }
78135
      }
78136
      v_c32 = t_2;
78137
    }
78138
    self->private_impl.f_l_count = ((uint8_t)(((v_c32 >> 0u) & 7u)));
78139
    self->private_impl.f_p_scale = ((uint8_t)(((v_c32 >> 3u) & 63u)));
78140
    self->private_impl.f_q_scale = ((uint8_t)(((v_c32 >> 9u) & 63u)));
78141
    self->private_impl.f_is_landscape = ((uint8_t)(((v_c32 >> 15u) & 1u)));
78142
    self->private_impl.f_w_dimension_code = ((uint8_t)(((uint8_t)(WUFFS_THUMBHASH__DIMENSION_CODES_FROM_HAS_ALPHA_AND_L_COUNT[self->private_impl.f_has_alpha][self->private_impl.f_l_count] >> 4u)) & 7u));
78143
    self->private_impl.f_h_dimension_code = ((uint8_t)(((uint8_t)(WUFFS_THUMBHASH__DIMENSION_CODES_FROM_HAS_ALPHA_AND_L_COUNT[self->private_impl.f_has_alpha][self->private_impl.f_l_count] >> 0u)) & 7u));
78144
    if (self->private_impl.f_is_landscape != 0u) {
78145
      v_swap = self->private_impl.f_w_dimension_code;
78146
      self->private_impl.f_w_dimension_code = self->private_impl.f_h_dimension_code;
78147
      self->private_impl.f_h_dimension_code = v_swap;
78148
    }
78149
    if (self->private_impl.f_is_landscape != 0u) {
78150
      self->private_impl.f_lx = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
78151
      self->private_impl.f_ly = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
78152
    } else {
78153
      self->private_impl.f_lx = ((uint32_t)(wuffs_base__u8__max(self->private_impl.f_l_count, 3u)));
78154
      self->private_impl.f_ly = ((uint32_t)(((uint8_t)(7u - ((uint8_t)(2u * self->private_impl.f_has_alpha))))));
78155
    }
78156
    self->private_impl.f_frame_config_io_position = 8u;
78157
    if (self->private_impl.f_has_alpha != 0u) {
78158
      {
78159
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
78160
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78161
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78162
          goto suspend;
78163
        }
78164
        uint32_t t_3 = *iop_a_src++;
78165
        v_c32 = t_3;
78166
      }
78167
      self->private_impl.f_a_dc = (((uint64_t)(((v_c32 >> 0u) & 15u))) << 42u);
78168
      self->private_impl.f_a_scale = ((uint8_t)(((v_c32 >> 4u) & 15u)));
78169
      self->private_impl.f_frame_config_io_position = 9u;
78170
    }
78171
    if (self->private_impl.f_quirk_just_raw_thumbhash) {
78172
#if defined(__GNUC__)
78173
#pragma GCC diagnostic push
78174
#pragma GCC diagnostic ignored "-Wconversion"
78175
#endif
78176
      self->private_impl.f_frame_config_io_position -= 3u;
78177
#if defined(__GNUC__)
78178
#pragma GCC diagnostic pop
78179
#endif
78180
    }
78181
    self->private_impl.f_pixfmt = 2415954056u;
78182
    if (self->private_impl.f_has_alpha != 0u) {
78183
      self->private_impl.f_pixfmt = 2164295816u;
78184
    }
78185
    if (a_dst != NULL) {
78186
      wuffs_base__image_config__set(
78187
          a_dst,
78188
          self->private_impl.f_pixfmt,
78189
          0u,
78190
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
78191
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])),
78192
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
78193
          (self->private_impl.f_has_alpha == 0u));
78194
    }
78195
    self->private_impl.f_call_sequence = 32u;
78196
78197
    goto ok;
78198
    ok:
78199
    self->private_impl.p_do_decode_image_config = 0;
78200
    goto exit;
78201
  }
78202
78203
  goto suspend;
78204
  suspend:
78205
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78206
78207
  goto exit;
78208
  exit:
78209
  if (a_src && a_src->data.ptr) {
78210
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78211
  }
78212
78213
  return status;
78214
}
78215
78216
// -------- func thumbhash.decoder.decode_frame_config
78217
78218
WUFFS_BASE__GENERATED_C_CODE
78219
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78220
wuffs_thumbhash__decoder__decode_frame_config(
78221
    wuffs_thumbhash__decoder* self,
78222
    wuffs_base__frame_config* a_dst,
78223
    wuffs_base__io_buffer* a_src) {
78224
  if (!self) {
78225
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78226
  }
78227
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78228
    return wuffs_base__make_status(
78229
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78230
        ? wuffs_base__error__disabled_by_previous_error
78231
        : wuffs_base__error__initialize_not_called);
78232
  }
78233
  if (!a_src) {
78234
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78235
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78236
  }
78237
  if ((self->private_impl.active_coroutine != 0) &&
78238
      (self->private_impl.active_coroutine != 2)) {
78239
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78240
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
78241
  }
78242
  self->private_impl.active_coroutine = 0;
78243
  wuffs_base__status status = wuffs_base__make_status(NULL);
78244
78245
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78246
78247
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
78248
  switch (coro_susp_point) {
78249
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78250
78251
    while (true) {
78252
      {
78253
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame_config(self, a_dst, a_src);
78254
        v_status = t_0;
78255
      }
78256
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
78257
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
78258
        goto exit;
78259
      }
78260
      status = v_status;
78261
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
78262
    }
78263
78264
    ok:
78265
    self->private_impl.p_decode_frame_config = 0;
78266
    goto exit;
78267
  }
78268
78269
  goto suspend;
78270
  suspend:
78271
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78272
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
78273
78274
  goto exit;
78275
  exit:
78276
  if (wuffs_base__status__is_error(&status)) {
78277
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78278
  }
78279
  return status;
78280
}
78281
78282
// -------- func thumbhash.decoder.do_decode_frame_config
78283
78284
WUFFS_BASE__GENERATED_C_CODE
78285
static wuffs_base__status
78286
wuffs_thumbhash__decoder__do_decode_frame_config(
78287
    wuffs_thumbhash__decoder* self,
78288
    wuffs_base__frame_config* a_dst,
78289
    wuffs_base__io_buffer* a_src) {
78290
  wuffs_base__status status = wuffs_base__make_status(NULL);
78291
78292
  wuffs_base__pixel_format v_pixfmt = {0};
78293
78294
  const uint8_t* iop_a_src = NULL;
78295
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78296
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78297
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78298
  if (a_src && a_src->data.ptr) {
78299
    io0_a_src = a_src->data.ptr;
78300
    io1_a_src = io0_a_src + a_src->meta.ri;
78301
    iop_a_src = io1_a_src;
78302
    io2_a_src = io0_a_src + a_src->meta.wi;
78303
  }
78304
78305
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
78306
  switch (coro_susp_point) {
78307
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78308
78309
    if (self->private_impl.f_call_sequence == 32u) {
78310
    } else if (self->private_impl.f_call_sequence < 32u) {
78311
      if (a_src) {
78312
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78313
      }
78314
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78315
      status = wuffs_thumbhash__decoder__do_decode_image_config(self, NULL, a_src);
78316
      if (a_src) {
78317
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
78318
      }
78319
      if (status.repr) {
78320
        goto suspend;
78321
      }
78322
    } else if (self->private_impl.f_call_sequence == 40u) {
78323
      if (((uint64_t)(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)))) {
78324
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
78325
        goto exit;
78326
      }
78327
    } else if (self->private_impl.f_call_sequence == 64u) {
78328
      self->private_impl.f_call_sequence = 96u;
78329
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
78330
      goto ok;
78331
    } else {
78332
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
78333
      goto ok;
78334
    }
78335
    if (a_dst != NULL) {
78336
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
78337
      wuffs_base__frame_config__set(
78338
          a_dst,
78339
          wuffs_base__utility__make_rect_ie_u32(
78340
          0u,
78341
          0u,
78342
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
78343
          ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]))),
78344
          ((wuffs_base__flicks)(0u)),
78345
          0u,
78346
          ((uint64_t)(self->private_impl.f_frame_config_io_position)),
78347
          0u,
78348
          (self->private_impl.f_has_alpha == 0u),
78349
          false,
78350
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
78351
    }
78352
    self->private_impl.f_call_sequence = 64u;
78353
78354
    ok:
78355
    self->private_impl.p_do_decode_frame_config = 0;
78356
    goto exit;
78357
  }
78358
78359
  goto suspend;
78360
  suspend:
78361
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78362
78363
  goto exit;
78364
  exit:
78365
  if (a_src && a_src->data.ptr) {
78366
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78367
  }
78368
78369
  return status;
78370
}
78371
78372
// -------- func thumbhash.decoder.decode_frame
78373
78374
WUFFS_BASE__GENERATED_C_CODE
78375
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78376
wuffs_thumbhash__decoder__decode_frame(
78377
    wuffs_thumbhash__decoder* self,
78378
    wuffs_base__pixel_buffer* a_dst,
78379
    wuffs_base__io_buffer* a_src,
78380
    wuffs_base__pixel_blend a_blend,
78381
    wuffs_base__slice_u8 a_workbuf,
78382
    wuffs_base__decode_frame_options* a_opts) {
78383
  if (!self) {
78384
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78385
  }
78386
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78387
    return wuffs_base__make_status(
78388
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78389
        ? wuffs_base__error__disabled_by_previous_error
78390
        : wuffs_base__error__initialize_not_called);
78391
  }
78392
  if (!a_dst || !a_src) {
78393
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78394
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78395
  }
78396
  if ((self->private_impl.active_coroutine != 0) &&
78397
      (self->private_impl.active_coroutine != 3)) {
78398
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78399
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
78400
  }
78401
  self->private_impl.active_coroutine = 0;
78402
  wuffs_base__status status = wuffs_base__make_status(NULL);
78403
78404
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78405
78406
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
78407
  switch (coro_susp_point) {
78408
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78409
78410
    while (true) {
78411
      {
78412
        wuffs_base__status t_0 = wuffs_thumbhash__decoder__do_decode_frame(self,
78413
            a_dst,
78414
            a_src,
78415
            a_blend,
78416
            a_workbuf,
78417
            a_opts);
78418
        v_status = t_0;
78419
      }
78420
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
78421
        status = wuffs_base__make_status(wuffs_thumbhash__error__truncated_input);
78422
        goto exit;
78423
      }
78424
      status = v_status;
78425
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
78426
    }
78427
78428
    ok:
78429
    self->private_impl.p_decode_frame = 0;
78430
    goto exit;
78431
  }
78432
78433
  goto suspend;
78434
  suspend:
78435
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78436
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
78437
78438
  goto exit;
78439
  exit:
78440
  if (wuffs_base__status__is_error(&status)) {
78441
    self->private_impl.magic = WUFFS_BASE__DISABLED;
78442
  }
78443
  return status;
78444
}
78445
78446
// -------- func thumbhash.decoder.do_decode_frame
78447
78448
WUFFS_BASE__GENERATED_C_CODE
78449
static wuffs_base__status
78450
wuffs_thumbhash__decoder__do_decode_frame(
78451
    wuffs_thumbhash__decoder* self,
78452
    wuffs_base__pixel_buffer* a_dst,
78453
    wuffs_base__io_buffer* a_src,
78454
    wuffs_base__pixel_blend a_blend,
78455
    wuffs_base__slice_u8 a_workbuf,
78456
    wuffs_base__decode_frame_options* a_opts) {
78457
  wuffs_base__status status = wuffs_base__make_status(NULL);
78458
78459
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
78460
78461
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
78462
  switch (coro_susp_point) {
78463
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78464
78465
    if (self->private_impl.f_call_sequence == 64u) {
78466
    } else if (self->private_impl.f_call_sequence < 64u) {
78467
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78468
      status = wuffs_thumbhash__decoder__do_decode_frame_config(self, NULL, a_src);
78469
      if (status.repr) {
78470
        goto suspend;
78471
      }
78472
    } else {
78473
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
78474
      goto ok;
78475
    }
78476
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
78477
        wuffs_base__pixel_buffer__pixel_format(a_dst),
78478
        wuffs_base__pixel_buffer__palette(a_dst),
78479
        wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
78480
        wuffs_base__utility__empty_slice_u8(),
78481
        a_blend);
78482
    if ( ! wuffs_base__status__is_ok(&v_status)) {
78483
      status = v_status;
78484
      if (wuffs_base__status__is_error(&status)) {
78485
        goto exit;
78486
      } else if (wuffs_base__status__is_suspension(&status)) {
78487
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
78488
        goto exit;
78489
      }
78490
      goto ok;
78491
    }
78492
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78493
    status = wuffs_thumbhash__decoder__from_src_to_coeffs(self, a_src);
78494
    if (status.repr) {
78495
      goto suspend;
78496
    }
78497
    wuffs_thumbhash__decoder__from_coeffs_to_pixels(self);
78498
    v_status = wuffs_thumbhash__decoder__from_pixels_to_dst(self, a_dst);
78499
    if ( ! wuffs_base__status__is_ok(&v_status)) {
78500
      status = v_status;
78501
      if (wuffs_base__status__is_error(&status)) {
78502
        goto exit;
78503
      } else if (wuffs_base__status__is_suspension(&status)) {
78504
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
78505
        goto exit;
78506
      }
78507
      goto ok;
78508
    }
78509
    self->private_impl.f_call_sequence = 96u;
78510
78511
    ok:
78512
    self->private_impl.p_do_decode_frame = 0;
78513
    goto exit;
78514
  }
78515
78516
  goto suspend;
78517
  suspend:
78518
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78519
78520
  goto exit;
78521
  exit:
78522
  return status;
78523
}
78524
78525
// -------- func thumbhash.decoder.from_src_to_coeffs
78526
78527
WUFFS_BASE__GENERATED_C_CODE
78528
static wuffs_base__status
78529
wuffs_thumbhash__decoder__from_src_to_coeffs(
78530
    wuffs_thumbhash__decoder* self,
78531
    wuffs_base__io_buffer* a_src) {
78532
  wuffs_base__status status = wuffs_base__make_status(NULL);
78533
78534
  uint8_t v_c8 = 0;
78535
  uint32_t v_cy = 0;
78536
  uint32_t v_cx = 0;
78537
  uint32_t v_i = 0;
78538
  bool v_has_bits = false;
78539
78540
  const uint8_t* iop_a_src = NULL;
78541
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78542
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78543
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
78544
  if (a_src && a_src->data.ptr) {
78545
    io0_a_src = a_src->data.ptr;
78546
    io1_a_src = io0_a_src + a_src->meta.ri;
78547
    iop_a_src = io1_a_src;
78548
    io2_a_src = io0_a_src + a_src->meta.wi;
78549
  }
78550
78551
  uint32_t coro_susp_point = self->private_impl.p_from_src_to_coeffs;
78552
  if (coro_susp_point) {
78553
    v_cy = self->private_data.s_from_src_to_coeffs.v_cy;
78554
    v_cx = self->private_data.s_from_src_to_coeffs.v_cx;
78555
    v_i = self->private_data.s_from_src_to_coeffs.v_i;
78556
    v_has_bits = self->private_data.s_from_src_to_coeffs.v_has_bits;
78557
  }
78558
  switch (coro_susp_point) {
78559
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
78560
78561
    v_i = 0u;
78562
    v_cy = 0u;
78563
    while (v_cy < self->private_impl.f_ly) {
78564
      v_cx = 0u;
78565
      if (v_cy == 0u) {
78566
        v_cx = 1u;
78567
      }
78568
      while (((uint32_t)(v_cx * self->private_impl.f_ly)) < ((uint32_t)(self->private_impl.f_lx * ((uint32_t)(self->private_impl.f_ly - v_cy))))) {
78569
        if (v_has_bits) {
78570
          v_has_bits = false;
78571
#if defined(__GNUC__)
78572
#pragma GCC diagnostic push
78573
#pragma GCC diagnostic ignored "-Wconversion"
78574
#endif
78575
          v_c8 >>= 4u;
78576
#if defined(__GNUC__)
78577
#pragma GCC diagnostic pop
78578
#endif
78579
        } else {
78580
          v_has_bits = true;
78581
          {
78582
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
78583
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78584
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78585
              goto suspend;
78586
            }
78587
            uint8_t t_0 = *iop_a_src++;
78588
            v_c8 = t_0;
78589
          }
78590
        }
78591
        self->private_data.f_lac[(v_i & 31u)] = ((uint32_t)(((uint32_t)(((uint32_t)(self->private_impl.f_l_scale)) * 126u)) * wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_00[((uint8_t)(v_c8 & 15u))])));
78592
        v_i += 1u;
78593
        v_cx += 1u;
78594
      }
78595
      v_cy += 1u;
78596
    }
78597
    v_i = 0u;
78598
    v_cx = 0u;
78599
    while (v_cx < 5u) {
78600
      if (v_has_bits) {
78601
        v_has_bits = false;
78602
#if defined(__GNUC__)
78603
#pragma GCC diagnostic push
78604
#pragma GCC diagnostic ignored "-Wconversion"
78605
#endif
78606
        v_c8 >>= 4u;
78607
#if defined(__GNUC__)
78608
#pragma GCC diagnostic pop
78609
#endif
78610
      } else {
78611
        v_has_bits = true;
78612
        {
78613
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
78614
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78615
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78616
            goto suspend;
78617
          }
78618
          uint8_t t_1 = *iop_a_src++;
78619
          v_c8 = t_1;
78620
        }
78621
      }
78622
      self->private_data.f_pac[(v_i & 7u)] = ((uint32_t)(((uint32_t)(((uint32_t)(self->private_impl.f_p_scale)) * 62u)) * wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_25[((uint8_t)(v_c8 & 15u))])));
78623
      v_i += 1u;
78624
      v_cx += 1u;
78625
    }
78626
    v_i = 0u;
78627
    v_cx = 0u;
78628
    while (v_cx < 5u) {
78629
      if (v_has_bits) {
78630
        v_has_bits = false;
78631
#if defined(__GNUC__)
78632
#pragma GCC diagnostic push
78633
#pragma GCC diagnostic ignored "-Wconversion"
78634
#endif
78635
        v_c8 >>= 4u;
78636
#if defined(__GNUC__)
78637
#pragma GCC diagnostic pop
78638
#endif
78639
      } else {
78640
        v_has_bits = true;
78641
        {
78642
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
78643
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78644
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78645
            goto suspend;
78646
          }
78647
          uint8_t t_2 = *iop_a_src++;
78648
          v_c8 = t_2;
78649
        }
78650
      }
78651
      self->private_data.f_qac[(v_i & 7u)] = ((uint32_t)(((uint32_t)(((uint32_t)(self->private_impl.f_q_scale)) * 62u)) * wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_25[((uint8_t)(v_c8 & 15u))])));
78652
      v_i += 1u;
78653
      v_cx += 1u;
78654
    }
78655
    if (self->private_impl.f_has_alpha == 0u) {
78656
      status = wuffs_base__make_status(NULL);
78657
      goto ok;
78658
    }
78659
    v_i = 0u;
78660
    v_cx = 0u;
78661
    while (v_cx < 14u) {
78662
      if (v_has_bits) {
78663
        v_has_bits = false;
78664
#if defined(__GNUC__)
78665
#pragma GCC diagnostic push
78666
#pragma GCC diagnostic ignored "-Wconversion"
78667
#endif
78668
        v_c8 >>= 4u;
78669
#if defined(__GNUC__)
78670
#pragma GCC diagnostic pop
78671
#endif
78672
      } else {
78673
        v_has_bits = true;
78674
        {
78675
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
78676
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
78677
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
78678
            goto suspend;
78679
          }
78680
          uint8_t t_3 = *iop_a_src++;
78681
          v_c8 = t_3;
78682
        }
78683
      }
78684
      self->private_data.f_aac[(v_i & 15u)] = ((uint32_t)(((uint32_t)(((uint32_t)(self->private_impl.f_a_scale)) * 2u)) * wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__FROM_4_BITS_TO_PLUS_MINUS_1_00[((uint8_t)(v_c8 & 15u))])));
78685
      v_i += 1u;
78686
      v_cx += 1u;
78687
    }
78688
78689
    ok:
78690
    self->private_impl.p_from_src_to_coeffs = 0;
78691
    goto exit;
78692
  }
78693
78694
  goto suspend;
78695
  suspend:
78696
  self->private_impl.p_from_src_to_coeffs = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
78697
  self->private_data.s_from_src_to_coeffs.v_cy = v_cy;
78698
  self->private_data.s_from_src_to_coeffs.v_cx = v_cx;
78699
  self->private_data.s_from_src_to_coeffs.v_i = v_i;
78700
  self->private_data.s_from_src_to_coeffs.v_has_bits = v_has_bits;
78701
78702
  goto exit;
78703
  exit:
78704
  if (a_src && a_src->data.ptr) {
78705
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
78706
  }
78707
78708
  return status;
78709
}
78710
78711
// -------- func thumbhash.decoder.from_coeffs_to_pixels
78712
78713
WUFFS_BASE__GENERATED_C_CODE
78714
static wuffs_base__empty_struct
78715
wuffs_thumbhash__decoder__from_coeffs_to_pixels(
78716
    wuffs_thumbhash__decoder* self) {
78717
  uint32_t v_h = 0;
78718
  uint32_t v_w = 0;
78719
  uint32_t v_fy[8] = {0};
78720
  uint32_t v_fx[8] = {0};
78721
  uint32_t v_cosines_base_y = 0;
78722
  uint32_t v_cosines_base_x = 0;
78723
  uint32_t v_y = 0;
78724
  uint32_t v_x = 0;
78725
  uint32_t v_f = 0;
78726
  uint64_t v_l = 0;
78727
  uint64_t v_p = 0;
78728
  uint64_t v_q = 0;
78729
  uint64_t v_b = 0;
78730
  uint64_t v_g = 0;
78731
  uint64_t v_r = 0;
78732
  uint64_t v_a = 0;
78733
  uint32_t v_i = 0;
78734
  uint32_t v_cy = 0;
78735
  uint32_t v_cx = 0;
78736
78737
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
78738
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
78739
  v_fy[0u] = 16384u;
78740
  v_fx[0u] = 16384u;
78741
  v_a = 255u;
78742
  v_y = 0u;
78743
  while (v_y < v_h) {
78744
    v_cosines_base_y = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_h_dimension_code]));
78745
    v_fy[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][0u]);
78746
    v_fy[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][1u]);
78747
    v_fy[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][2u]);
78748
    v_fy[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][3u]);
78749
    v_fy[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][4u]);
78750
    v_fy[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_y + v_y)][5u]);
78751
    v_x = 0u;
78752
    while (v_x < v_w) {
78753
      v_cosines_base_x = ((uint32_t)(WUFFS_THUMBHASH__CUMULATIVE_DIMENSIONS[self->private_impl.f_w_dimension_code]));
78754
      v_fx[1u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][0u]);
78755
      v_fx[2u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][1u]);
78756
      v_fx[3u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][2u]);
78757
      v_fx[4u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][3u]);
78758
      v_fx[5u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][4u]);
78759
      v_fx[6u] = wuffs_base__utility__sign_extend_convert_u16_u32(WUFFS_THUMBHASH__COSINES[(v_cosines_base_x + v_x)][5u]);
78760
      v_l = self->private_impl.f_l_dc;
78761
      v_i = 0u;
78762
      v_cy = 0u;
78763
      while (v_cy < self->private_impl.f_ly) {
78764
        v_cx = 0u;
78765
        if (v_cy == 0u) {
78766
          v_cx = 1u;
78767
        }
78768
        while (((uint32_t)(v_cx * self->private_impl.f_ly)) < ((uint32_t)(self->private_impl.f_lx * ((uint32_t)(self->private_impl.f_ly - v_cy))))) {
78769
          v_f = ((uint32_t)(v_fx[(v_cx & 7u)] * v_fy[(v_cy & 7u)]));
78770
          v_l += ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(v_f) * wuffs_base__utility__sign_extend_convert_u32_u64(self->private_data.f_lac[(v_i & 31u)])));
78771
          v_i += 1u;
78772
          v_cx += 1u;
78773
        }
78774
        v_cy += 1u;
78775
      }
78776
      v_p = self->private_impl.f_p_dc;
78777
      v_q = self->private_impl.f_q_dc;
78778
      v_i = 0u;
78779
      v_cy = 0u;
78780
      while (v_cy < 3u) {
78781
        v_cx = 0u;
78782
        if (v_cy == 0u) {
78783
          v_cx = 1u;
78784
        }
78785
        while (v_cx < (3u - v_cy)) {
78786
          v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
78787
          v_p += ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(v_f) * wuffs_base__utility__sign_extend_convert_u32_u64(self->private_data.f_pac[(v_i & 7u)])));
78788
          v_q += ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(v_f) * wuffs_base__utility__sign_extend_convert_u32_u64(self->private_data.f_qac[(v_i & 7u)])));
78789
          v_i += 1u;
78790
          v_cx += 1u;
78791
        }
78792
        v_cy += 1u;
78793
      }
78794
      v_b = ((uint64_t)(v_l - wuffs_base__utility__i64_divide(((uint64_t)(2u * v_p)), 3u)));
78795
      v_r = wuffs_base__utility__sign_extend_rshift_u64(((uint64_t)(((uint64_t)(((uint64_t)(3u * v_l)) + v_q)) - v_b)), 1u);
78796
      v_g = ((uint64_t)(v_r - v_q));
78797
      if ((v_b >> 63u) != 0u) {
78798
        v_b = 0u;
78799
      } else if (v_b >= 8589384836185950u) {
78800
        v_b = 255u;
78801
      } else {
78802
        v_b /= 33683862102690u;
78803
      }
78804
      if ((v_g >> 63u) != 0u) {
78805
        v_g = 0u;
78806
      } else if (v_g >= 8589384836185950u) {
78807
        v_g = 255u;
78808
      } else {
78809
        v_g /= 33683862102690u;
78810
      }
78811
      if ((v_r >> 63u) != 0u) {
78812
        v_r = 0u;
78813
      } else if (v_r >= 8589384836185950u) {
78814
        v_r = 255u;
78815
      } else {
78816
        v_r /= 33683862102690u;
78817
      }
78818
      if (self->private_impl.f_has_alpha != 0u) {
78819
        v_a = self->private_impl.f_a_dc;
78820
        v_i = 0u;
78821
        v_cy = 0u;
78822
        while (v_cy < 5u) {
78823
          v_cx = 0u;
78824
          if (v_cy == 0u) {
78825
            v_cx = 1u;
78826
          }
78827
          while (v_cx < (5u - v_cy)) {
78828
            v_f = ((uint32_t)(v_fx[v_cx] * v_fy[v_cy]));
78829
            v_a += ((uint64_t)(wuffs_base__utility__sign_extend_convert_u32_u64(v_f) * wuffs_base__utility__sign_extend_convert_u32_u64(self->private_data.f_aac[(v_i & 15u)])));
78830
            v_i += 1u;
78831
            v_cx += 1u;
78832
          }
78833
          v_cy += 1u;
78834
        }
78835
        if ((v_a >> 63u) != 0u) {
78836
          v_a = 0u;
78837
        } else if (v_a >= 65970697666500u) {
78838
          v_a = 255u;
78839
        } else {
78840
          v_a /= 258708618300u;
78841
        }
78842
      }
78843
      self->private_data.f_pixels[v_y][((4u * v_x) + 0u)] = ((uint8_t)(v_b));
78844
      self->private_data.f_pixels[v_y][((4u * v_x) + 1u)] = ((uint8_t)(v_g));
78845
      self->private_data.f_pixels[v_y][((4u * v_x) + 2u)] = ((uint8_t)(v_r));
78846
      self->private_data.f_pixels[v_y][((4u * v_x) + 3u)] = ((uint8_t)(v_a));
78847
      v_x += 1u;
78848
    }
78849
    v_y += 1u;
78850
  }
78851
  return wuffs_base__make_empty_struct();
78852
}
78853
78854
// -------- func thumbhash.decoder.from_pixels_to_dst
78855
78856
WUFFS_BASE__GENERATED_C_CODE
78857
static wuffs_base__status
78858
wuffs_thumbhash__decoder__from_pixels_to_dst(
78859
    wuffs_thumbhash__decoder* self,
78860
    wuffs_base__pixel_buffer* a_dst) {
78861
  uint32_t v_h = 0;
78862
  uint32_t v_w = 0;
78863
  wuffs_base__pixel_format v_dst_pixfmt = {0};
78864
  uint32_t v_dst_bits_per_pixel = 0;
78865
  uint32_t v_dst_bytes_per_pixel = 0;
78866
  uint64_t v_dst_bytes_per_row = 0;
78867
  wuffs_base__table_u8 v_tab = {0};
78868
  uint32_t v_y = 0;
78869
  wuffs_base__slice_u8 v_dst = {0};
78870
  wuffs_base__slice_u8 v_src = {0};
78871
78872
  v_h = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code]));
78873
  v_w = ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code]));
78874
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
78875
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
78876
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
78877
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
78878
  }
78879
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
78880
  v_dst_bytes_per_row = ((uint64_t)((v_w * v_dst_bytes_per_pixel)));
78881
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
78882
  while (v_y < v_h) {
78883
    v_src = wuffs_base__make_slice_u8(self->private_data.f_pixels[v_y], (v_w * 4u));
78884
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
78885
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
78886
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
78887
    }
78888
    wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__pixel_buffer__palette(a_dst), v_src);
78889
    v_y += 1u;
78890
  }
78891
  return wuffs_base__make_status(NULL);
78892
}
78893
78894
// -------- func thumbhash.decoder.frame_dirty_rect
78895
78896
WUFFS_BASE__GENERATED_C_CODE
78897
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
78898
wuffs_thumbhash__decoder__frame_dirty_rect(
78899
    const wuffs_thumbhash__decoder* self) {
78900
  if (!self) {
78901
    return wuffs_base__utility__empty_rect_ie_u32();
78902
  }
78903
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78904
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78905
    return wuffs_base__utility__empty_rect_ie_u32();
78906
  }
78907
78908
  return wuffs_base__utility__make_rect_ie_u32(
78909
      0u,
78910
      0u,
78911
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_w_dimension_code])),
78912
      ((uint32_t)(WUFFS_THUMBHASH__DIMENSIONS_FROM_DIMENSION_CODES[self->private_impl.f_h_dimension_code])));
78913
}
78914
78915
// -------- func thumbhash.decoder.num_animation_loops
78916
78917
WUFFS_BASE__GENERATED_C_CODE
78918
WUFFS_BASE__MAYBE_STATIC uint32_t
78919
wuffs_thumbhash__decoder__num_animation_loops(
78920
    const wuffs_thumbhash__decoder* self) {
78921
  if (!self) {
78922
    return 0;
78923
  }
78924
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78925
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78926
    return 0;
78927
  }
78928
78929
  return 0u;
78930
}
78931
78932
// -------- func thumbhash.decoder.num_decoded_frame_configs
78933
78934
WUFFS_BASE__GENERATED_C_CODE
78935
WUFFS_BASE__MAYBE_STATIC uint64_t
78936
wuffs_thumbhash__decoder__num_decoded_frame_configs(
78937
    const wuffs_thumbhash__decoder* self) {
78938
  if (!self) {
78939
    return 0;
78940
  }
78941
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78942
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78943
    return 0;
78944
  }
78945
78946
  if (self->private_impl.f_call_sequence > 32u) {
78947
    return 1u;
78948
  }
78949
  return 0u;
78950
}
78951
78952
// -------- func thumbhash.decoder.num_decoded_frames
78953
78954
WUFFS_BASE__GENERATED_C_CODE
78955
WUFFS_BASE__MAYBE_STATIC uint64_t
78956
wuffs_thumbhash__decoder__num_decoded_frames(
78957
    const wuffs_thumbhash__decoder* self) {
78958
  if (!self) {
78959
    return 0;
78960
  }
78961
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
78962
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
78963
    return 0;
78964
  }
78965
78966
  if (self->private_impl.f_call_sequence > 64u) {
78967
    return 1u;
78968
  }
78969
  return 0u;
78970
}
78971
78972
// -------- func thumbhash.decoder.restart_frame
78973
78974
WUFFS_BASE__GENERATED_C_CODE
78975
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
78976
wuffs_thumbhash__decoder__restart_frame(
78977
    wuffs_thumbhash__decoder* self,
78978
    uint64_t a_index,
78979
    uint64_t a_io_position) {
78980
  if (!self) {
78981
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
78982
  }
78983
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
78984
    return wuffs_base__make_status(
78985
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
78986
        ? wuffs_base__error__disabled_by_previous_error
78987
        : wuffs_base__error__initialize_not_called);
78988
  }
78989
78990
  if (self->private_impl.f_call_sequence < 32u) {
78991
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
78992
  }
78993
  if ((a_index != 0u) || (a_io_position != ((uint64_t)(self->private_impl.f_frame_config_io_position)))) {
78994
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
78995
  }
78996
  self->private_impl.f_call_sequence = 40u;
78997
  return wuffs_base__make_status(NULL);
78998
}
78999
79000
// -------- func thumbhash.decoder.set_report_metadata
79001
79002
WUFFS_BASE__GENERATED_C_CODE
79003
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
79004
wuffs_thumbhash__decoder__set_report_metadata(
79005
    wuffs_thumbhash__decoder* self,
79006
    uint32_t a_fourcc,
79007
    bool a_report) {
79008
  return wuffs_base__make_empty_struct();
79009
}
79010
79011
// -------- func thumbhash.decoder.tell_me_more
79012
79013
WUFFS_BASE__GENERATED_C_CODE
79014
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79015
wuffs_thumbhash__decoder__tell_me_more(
79016
    wuffs_thumbhash__decoder* self,
79017
    wuffs_base__io_buffer* a_dst,
79018
    wuffs_base__more_information* a_minfo,
79019
    wuffs_base__io_buffer* a_src) {
79020
  if (!self) {
79021
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79022
  }
79023
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79024
    return wuffs_base__make_status(
79025
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79026
        ? wuffs_base__error__disabled_by_previous_error
79027
        : wuffs_base__error__initialize_not_called);
79028
  }
79029
  if (!a_dst || !a_src) {
79030
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79031
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79032
  }
79033
  if ((self->private_impl.active_coroutine != 0) &&
79034
      (self->private_impl.active_coroutine != 4)) {
79035
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79036
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79037
  }
79038
  self->private_impl.active_coroutine = 0;
79039
  wuffs_base__status status = wuffs_base__make_status(NULL);
79040
79041
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
79042
  goto exit;
79043
79044
  goto ok;
79045
  ok:
79046
  goto exit;
79047
  exit:
79048
  if (wuffs_base__status__is_error(&status)) {
79049
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79050
  }
79051
  return status;
79052
}
79053
79054
// -------- func thumbhash.decoder.workbuf_len
79055
79056
WUFFS_BASE__GENERATED_C_CODE
79057
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
79058
wuffs_thumbhash__decoder__workbuf_len(
79059
    const wuffs_thumbhash__decoder* self) {
79060
  if (!self) {
79061
    return wuffs_base__utility__empty_range_ii_u64();
79062
  }
79063
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79064
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79065
    return wuffs_base__utility__empty_range_ii_u64();
79066
  }
79067
79068
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
79069
}
79070
79071
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
79072
79073
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
79074
79075
// ---------------- Status Codes Implementations
79076
79077
const char wuffs_vp8__error__bad_header[] = "#vp8: bad header";
79078
const char wuffs_vp8__error__truncated_input[] = "#vp8: truncated input";
79079
const char wuffs_vp8__error__unsupported_vp8_file[] = "#vp8: unsupported VP8 file";
79080
79081
// ---------------- Private Consts
79082
79083
// ---------------- Private Initializer Prototypes
79084
79085
// ---------------- Private Function Prototypes
79086
79087
WUFFS_BASE__GENERATED_C_CODE
79088
static wuffs_base__status
79089
wuffs_vp8__decoder__do_decode_image_config(
79090
    wuffs_vp8__decoder* self,
79091
    wuffs_base__image_config* a_dst,
79092
    wuffs_base__io_buffer* a_src);
79093
79094
WUFFS_BASE__GENERATED_C_CODE
79095
static wuffs_base__status
79096
wuffs_vp8__decoder__do_decode_frame_config(
79097
    wuffs_vp8__decoder* self,
79098
    wuffs_base__frame_config* a_dst,
79099
    wuffs_base__io_buffer* a_src);
79100
79101
WUFFS_BASE__GENERATED_C_CODE
79102
static wuffs_base__status
79103
wuffs_vp8__decoder__do_decode_frame(
79104
    wuffs_vp8__decoder* self,
79105
    wuffs_base__pixel_buffer* a_dst,
79106
    wuffs_base__io_buffer* a_src,
79107
    wuffs_base__pixel_blend a_blend,
79108
    wuffs_base__slice_u8 a_workbuf,
79109
    wuffs_base__decode_frame_options* a_opts);
79110
79111
WUFFS_BASE__GENERATED_C_CODE
79112
static wuffs_base__status
79113
wuffs_vp8__decoder__make_a_placeholder_gradient(
79114
    wuffs_vp8__decoder* self,
79115
    wuffs_base__pixel_buffer* a_dst);
79116
79117
// ---------------- VTables
79118
79119
const wuffs_base__image_decoder__func_ptrs
79120
wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder = {
79121
  (wuffs_base__status(*)(void*,
79122
      wuffs_base__pixel_buffer*,
79123
      wuffs_base__io_buffer*,
79124
      wuffs_base__pixel_blend,
79125
      wuffs_base__slice_u8,
79126
      wuffs_base__decode_frame_options*))(&wuffs_vp8__decoder__decode_frame),
79127
  (wuffs_base__status(*)(void*,
79128
      wuffs_base__frame_config*,
79129
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_frame_config),
79130
  (wuffs_base__status(*)(void*,
79131
      wuffs_base__image_config*,
79132
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__decode_image_config),
79133
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_vp8__decoder__frame_dirty_rect),
79134
  (uint64_t(*)(const void*,
79135
      uint32_t))(&wuffs_vp8__decoder__get_quirk),
79136
  (uint32_t(*)(const void*))(&wuffs_vp8__decoder__num_animation_loops),
79137
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frame_configs),
79138
  (uint64_t(*)(const void*))(&wuffs_vp8__decoder__num_decoded_frames),
79139
  (wuffs_base__status(*)(void*,
79140
      uint64_t,
79141
      uint64_t))(&wuffs_vp8__decoder__restart_frame),
79142
  (wuffs_base__status(*)(void*,
79143
      uint32_t,
79144
      uint64_t))(&wuffs_vp8__decoder__set_quirk),
79145
  (wuffs_base__empty_struct(*)(void*,
79146
      uint32_t,
79147
      bool))(&wuffs_vp8__decoder__set_report_metadata),
79148
  (wuffs_base__status(*)(void*,
79149
      wuffs_base__io_buffer*,
79150
      wuffs_base__more_information*,
79151
      wuffs_base__io_buffer*))(&wuffs_vp8__decoder__tell_me_more),
79152
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_vp8__decoder__workbuf_len),
79153
};
79154
79155
// ---------------- Initializer Implementations
79156
79157
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
79158
wuffs_vp8__decoder__initialize(
79159
    wuffs_vp8__decoder* self,
79160
    size_t sizeof_star_self,
79161
    uint64_t wuffs_version,
79162
    uint32_t options){
79163
  if (!self) {
79164
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79165
  }
79166
  if (sizeof(*self) != sizeof_star_self) {
79167
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
79168
  }
79169
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
79170
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
79171
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
79172
  }
79173
79174
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
79175
    // The whole point of this if-check is to detect an uninitialized *self.
79176
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
79177
#if !defined(__clang__) && defined(__GNUC__)
79178
#pragma GCC diagnostic push
79179
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
79180
#endif
79181
    if (self->private_impl.magic != 0) {
79182
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
79183
    }
79184
#if !defined(__clang__) && defined(__GNUC__)
79185
#pragma GCC diagnostic pop
79186
#endif
79187
  } else {
79188
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
79189
      memset(self, 0, sizeof(*self));
79190
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
79191
    } else {
79192
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
79193
    }
79194
  }
79195
79196
  self->private_impl.magic = WUFFS_BASE__MAGIC;
79197
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
79198
      wuffs_base__image_decoder__vtable_name;
79199
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
79200
      (const void*)(&wuffs_vp8__decoder__func_ptrs_for__wuffs_base__image_decoder);
79201
  return wuffs_base__make_status(NULL);
79202
}
79203
79204
wuffs_vp8__decoder*
79205
wuffs_vp8__decoder__alloc(void) {
79206
  wuffs_vp8__decoder* x =
79207
      (wuffs_vp8__decoder*)(calloc(1, sizeof(wuffs_vp8__decoder)));
79208
  if (!x) {
79209
    return NULL;
79210
  }
79211
  if (wuffs_vp8__decoder__initialize(
79212
      x, sizeof(wuffs_vp8__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
79213
    free(x);
79214
    return NULL;
79215
  }
79216
  return x;
79217
}
79218
79219
size_t
79220
sizeof__wuffs_vp8__decoder(void) {
79221
  return sizeof(wuffs_vp8__decoder);
79222
}
79223
79224
// ---------------- Function Implementations
79225
79226
// -------- func vp8.decoder.get_quirk
79227
79228
WUFFS_BASE__GENERATED_C_CODE
79229
WUFFS_BASE__MAYBE_STATIC uint64_t
79230
wuffs_vp8__decoder__get_quirk(
79231
    const wuffs_vp8__decoder* self,
79232
    uint32_t a_key) {
79233
  if (!self) {
79234
    return 0;
79235
  }
79236
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79237
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79238
    return 0;
79239
  }
79240
79241
  return 0u;
79242
}
79243
79244
// -------- func vp8.decoder.set_quirk
79245
79246
WUFFS_BASE__GENERATED_C_CODE
79247
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79248
wuffs_vp8__decoder__set_quirk(
79249
    wuffs_vp8__decoder* self,
79250
    uint32_t a_key,
79251
    uint64_t a_value) {
79252
  if (!self) {
79253
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79254
  }
79255
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79256
    return wuffs_base__make_status(
79257
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79258
        ? wuffs_base__error__disabled_by_previous_error
79259
        : wuffs_base__error__initialize_not_called);
79260
  }
79261
79262
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
79263
}
79264
79265
// -------- func vp8.decoder.decode_image_config
79266
79267
WUFFS_BASE__GENERATED_C_CODE
79268
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79269
wuffs_vp8__decoder__decode_image_config(
79270
    wuffs_vp8__decoder* self,
79271
    wuffs_base__image_config* a_dst,
79272
    wuffs_base__io_buffer* a_src) {
79273
  if (!self) {
79274
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79275
  }
79276
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79277
    return wuffs_base__make_status(
79278
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79279
        ? wuffs_base__error__disabled_by_previous_error
79280
        : wuffs_base__error__initialize_not_called);
79281
  }
79282
  if (!a_src) {
79283
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79284
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79285
  }
79286
  if ((self->private_impl.active_coroutine != 0) &&
79287
      (self->private_impl.active_coroutine != 1)) {
79288
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79289
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79290
  }
79291
  self->private_impl.active_coroutine = 0;
79292
  wuffs_base__status status = wuffs_base__make_status(NULL);
79293
79294
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79295
79296
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
79297
  switch (coro_susp_point) {
79298
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79299
79300
    while (true) {
79301
      {
79302
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_image_config(self, a_dst, a_src);
79303
        v_status = t_0;
79304
      }
79305
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79306
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
79307
        goto exit;
79308
      }
79309
      status = v_status;
79310
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79311
    }
79312
79313
    ok:
79314
    self->private_impl.p_decode_image_config = 0;
79315
    goto exit;
79316
  }
79317
79318
  goto suspend;
79319
  suspend:
79320
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79321
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
79322
79323
  goto exit;
79324
  exit:
79325
  if (wuffs_base__status__is_error(&status)) {
79326
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79327
  }
79328
  return status;
79329
}
79330
79331
// -------- func vp8.decoder.do_decode_image_config
79332
79333
WUFFS_BASE__GENERATED_C_CODE
79334
static wuffs_base__status
79335
wuffs_vp8__decoder__do_decode_image_config(
79336
    wuffs_vp8__decoder* self,
79337
    wuffs_base__image_config* a_dst,
79338
    wuffs_base__io_buffer* a_src) {
79339
  wuffs_base__status status = wuffs_base__make_status(NULL);
79340
79341
  uint32_t v_c32 = 0;
79342
79343
  const uint8_t* iop_a_src = NULL;
79344
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79345
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79346
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79347
  if (a_src && a_src->data.ptr) {
79348
    io0_a_src = a_src->data.ptr;
79349
    io1_a_src = io0_a_src + a_src->meta.ri;
79350
    iop_a_src = io1_a_src;
79351
    io2_a_src = io0_a_src + a_src->meta.wi;
79352
  }
79353
79354
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
79355
  switch (coro_susp_point) {
79356
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79357
79358
    if (self->private_impl.f_call_sequence != 0u) {
79359
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
79360
      goto exit;
79361
    }
79362
    {
79363
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79364
      uint32_t t_0;
79365
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
79366
        t_0 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
79367
        iop_a_src += 3;
79368
      } else {
79369
        self->private_data.s_do_decode_image_config.scratch = 0;
79370
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
79371
        while (true) {
79372
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79373
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79374
            goto suspend;
79375
          }
79376
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79377
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
79378
          *scratch <<= 8;
79379
          *scratch >>= 8;
79380
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
79381
          if (num_bits_0 == 16) {
79382
            t_0 = ((uint32_t)(*scratch));
79383
            break;
79384
          }
79385
          num_bits_0 += 8u;
79386
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
79387
        }
79388
      }
79389
      v_c32 = t_0;
79390
    }
79391
    if ((v_c32 & 1u) != 0u) {
79392
      status = wuffs_base__make_status(wuffs_vp8__error__unsupported_vp8_file);
79393
      goto exit;
79394
    }
79395
    {
79396
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
79397
      uint32_t t_1;
79398
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 3)) {
79399
        t_1 = ((uint32_t)(wuffs_base__peek_u24le__no_bounds_check(iop_a_src)));
79400
        iop_a_src += 3;
79401
      } else {
79402
        self->private_data.s_do_decode_image_config.scratch = 0;
79403
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
79404
        while (true) {
79405
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79406
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79407
            goto suspend;
79408
          }
79409
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79410
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
79411
          *scratch <<= 8;
79412
          *scratch >>= 8;
79413
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
79414
          if (num_bits_1 == 16) {
79415
            t_1 = ((uint32_t)(*scratch));
79416
            break;
79417
          }
79418
          num_bits_1 += 8u;
79419
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
79420
        }
79421
      }
79422
      v_c32 = t_1;
79423
    }
79424
    if (v_c32 != 2752925u) {
79425
      status = wuffs_base__make_status(wuffs_vp8__error__bad_header);
79426
      goto exit;
79427
    }
79428
    {
79429
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
79430
      uint32_t t_2;
79431
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
79432
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
79433
        iop_a_src += 4;
79434
      } else {
79435
        self->private_data.s_do_decode_image_config.scratch = 0;
79436
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
79437
        while (true) {
79438
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
79439
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
79440
            goto suspend;
79441
          }
79442
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
79443
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
79444
          *scratch <<= 8;
79445
          *scratch >>= 8;
79446
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
79447
          if (num_bits_2 == 24) {
79448
            t_2 = ((uint32_t)(*scratch));
79449
            break;
79450
          }
79451
          num_bits_2 += 8u;
79452
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
79453
        }
79454
      }
79455
      v_c32 = t_2;
79456
    }
79457
    self->private_impl.f_width = (16383u & (v_c32 >> 0u));
79458
    self->private_impl.f_height = (16383u & (v_c32 >> 16u));
79459
    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)));
79460
    if (a_dst != NULL) {
79461
      wuffs_base__image_config__set(
79462
          a_dst,
79463
          2415954056u,
79464
          0u,
79465
          self->private_impl.f_width,
79466
          self->private_impl.f_height,
79467
          self->private_impl.f_frame_config_io_position,
79468
          false);
79469
    }
79470
    self->private_impl.f_call_sequence = 32u;
79471
79472
    goto ok;
79473
    ok:
79474
    self->private_impl.p_do_decode_image_config = 0;
79475
    goto exit;
79476
  }
79477
79478
  goto suspend;
79479
  suspend:
79480
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79481
79482
  goto exit;
79483
  exit:
79484
  if (a_src && a_src->data.ptr) {
79485
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79486
  }
79487
79488
  return status;
79489
}
79490
79491
// -------- func vp8.decoder.decode_frame_config
79492
79493
WUFFS_BASE__GENERATED_C_CODE
79494
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79495
wuffs_vp8__decoder__decode_frame_config(
79496
    wuffs_vp8__decoder* self,
79497
    wuffs_base__frame_config* a_dst,
79498
    wuffs_base__io_buffer* a_src) {
79499
  if (!self) {
79500
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79501
  }
79502
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79503
    return wuffs_base__make_status(
79504
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79505
        ? wuffs_base__error__disabled_by_previous_error
79506
        : wuffs_base__error__initialize_not_called);
79507
  }
79508
  if (!a_src) {
79509
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79510
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79511
  }
79512
  if ((self->private_impl.active_coroutine != 0) &&
79513
      (self->private_impl.active_coroutine != 2)) {
79514
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79515
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79516
  }
79517
  self->private_impl.active_coroutine = 0;
79518
  wuffs_base__status status = wuffs_base__make_status(NULL);
79519
79520
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79521
79522
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
79523
  switch (coro_susp_point) {
79524
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79525
79526
    while (true) {
79527
      {
79528
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame_config(self, a_dst, a_src);
79529
        v_status = t_0;
79530
      }
79531
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79532
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
79533
        goto exit;
79534
      }
79535
      status = v_status;
79536
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79537
    }
79538
79539
    ok:
79540
    self->private_impl.p_decode_frame_config = 0;
79541
    goto exit;
79542
  }
79543
79544
  goto suspend;
79545
  suspend:
79546
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79547
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
79548
79549
  goto exit;
79550
  exit:
79551
  if (wuffs_base__status__is_error(&status)) {
79552
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79553
  }
79554
  return status;
79555
}
79556
79557
// -------- func vp8.decoder.do_decode_frame_config
79558
79559
WUFFS_BASE__GENERATED_C_CODE
79560
static wuffs_base__status
79561
wuffs_vp8__decoder__do_decode_frame_config(
79562
    wuffs_vp8__decoder* self,
79563
    wuffs_base__frame_config* a_dst,
79564
    wuffs_base__io_buffer* a_src) {
79565
  wuffs_base__status status = wuffs_base__make_status(NULL);
79566
79567
  const uint8_t* iop_a_src = NULL;
79568
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79569
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79570
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
79571
  if (a_src && a_src->data.ptr) {
79572
    io0_a_src = a_src->data.ptr;
79573
    io1_a_src = io0_a_src + a_src->meta.ri;
79574
    iop_a_src = io1_a_src;
79575
    io2_a_src = io0_a_src + a_src->meta.wi;
79576
  }
79577
79578
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
79579
  switch (coro_susp_point) {
79580
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79581
79582
    if (self->private_impl.f_call_sequence == 32u) {
79583
    } else if (self->private_impl.f_call_sequence < 32u) {
79584
      if (a_src) {
79585
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79586
      }
79587
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79588
      status = wuffs_vp8__decoder__do_decode_image_config(self, NULL, a_src);
79589
      if (a_src) {
79590
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
79591
      }
79592
      if (status.repr) {
79593
        goto suspend;
79594
      }
79595
    } else if (self->private_impl.f_call_sequence == 40u) {
79596
      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)))) {
79597
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
79598
        goto exit;
79599
      }
79600
    } else if (self->private_impl.f_call_sequence == 64u) {
79601
      self->private_impl.f_call_sequence = 96u;
79602
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79603
      goto ok;
79604
    } else {
79605
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79606
      goto ok;
79607
    }
79608
    if (a_dst != NULL) {
79609
      wuffs_base__frame_config__set(
79610
          a_dst,
79611
          wuffs_base__utility__make_rect_ie_u32(
79612
          0u,
79613
          0u,
79614
          self->private_impl.f_width,
79615
          self->private_impl.f_height),
79616
          ((wuffs_base__flicks)(0u)),
79617
          0u,
79618
          self->private_impl.f_frame_config_io_position,
79619
          0u,
79620
          false,
79621
          false,
79622
          4278190080u);
79623
    }
79624
    self->private_impl.f_call_sequence = 64u;
79625
79626
    ok:
79627
    self->private_impl.p_do_decode_frame_config = 0;
79628
    goto exit;
79629
  }
79630
79631
  goto suspend;
79632
  suspend:
79633
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79634
79635
  goto exit;
79636
  exit:
79637
  if (a_src && a_src->data.ptr) {
79638
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
79639
  }
79640
79641
  return status;
79642
}
79643
79644
// -------- func vp8.decoder.decode_frame
79645
79646
WUFFS_BASE__GENERATED_C_CODE
79647
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79648
wuffs_vp8__decoder__decode_frame(
79649
    wuffs_vp8__decoder* self,
79650
    wuffs_base__pixel_buffer* a_dst,
79651
    wuffs_base__io_buffer* a_src,
79652
    wuffs_base__pixel_blend a_blend,
79653
    wuffs_base__slice_u8 a_workbuf,
79654
    wuffs_base__decode_frame_options* a_opts) {
79655
  if (!self) {
79656
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79657
  }
79658
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79659
    return wuffs_base__make_status(
79660
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79661
        ? wuffs_base__error__disabled_by_previous_error
79662
        : wuffs_base__error__initialize_not_called);
79663
  }
79664
  if (!a_dst || !a_src) {
79665
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79666
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79667
  }
79668
  if ((self->private_impl.active_coroutine != 0) &&
79669
      (self->private_impl.active_coroutine != 3)) {
79670
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79671
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79672
  }
79673
  self->private_impl.active_coroutine = 0;
79674
  wuffs_base__status status = wuffs_base__make_status(NULL);
79675
79676
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79677
79678
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
79679
  switch (coro_susp_point) {
79680
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79681
79682
    while (true) {
79683
      {
79684
        wuffs_base__status t_0 = wuffs_vp8__decoder__do_decode_frame(self,
79685
            a_dst,
79686
            a_src,
79687
            a_blend,
79688
            a_workbuf,
79689
            a_opts);
79690
        v_status = t_0;
79691
      }
79692
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
79693
        status = wuffs_base__make_status(wuffs_vp8__error__truncated_input);
79694
        goto exit;
79695
      }
79696
      status = v_status;
79697
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
79698
    }
79699
79700
    ok:
79701
    self->private_impl.p_decode_frame = 0;
79702
    goto exit;
79703
  }
79704
79705
  goto suspend;
79706
  suspend:
79707
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79708
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
79709
79710
  goto exit;
79711
  exit:
79712
  if (wuffs_base__status__is_error(&status)) {
79713
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79714
  }
79715
  return status;
79716
}
79717
79718
// -------- func vp8.decoder.do_decode_frame
79719
79720
WUFFS_BASE__GENERATED_C_CODE
79721
static wuffs_base__status
79722
wuffs_vp8__decoder__do_decode_frame(
79723
    wuffs_vp8__decoder* self,
79724
    wuffs_base__pixel_buffer* a_dst,
79725
    wuffs_base__io_buffer* a_src,
79726
    wuffs_base__pixel_blend a_blend,
79727
    wuffs_base__slice_u8 a_workbuf,
79728
    wuffs_base__decode_frame_options* a_opts) {
79729
  wuffs_base__status status = wuffs_base__make_status(NULL);
79730
79731
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
79732
79733
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
79734
  switch (coro_susp_point) {
79735
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
79736
79737
    if (self->private_impl.f_call_sequence == 64u) {
79738
    } else if (self->private_impl.f_call_sequence < 64u) {
79739
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
79740
      status = wuffs_vp8__decoder__do_decode_frame_config(self, NULL, a_src);
79741
      if (status.repr) {
79742
        goto suspend;
79743
      }
79744
    } else {
79745
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
79746
      goto ok;
79747
    }
79748
    self->private_impl.f_dst_x = 0u;
79749
    self->private_impl.f_dst_y = 0u;
79750
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
79751
        wuffs_base__pixel_buffer__pixel_format(a_dst),
79752
        wuffs_base__pixel_buffer__palette(a_dst),
79753
        wuffs_base__utility__make_pixel_format(2415954056u),
79754
        wuffs_base__utility__empty_slice_u8(),
79755
        a_blend);
79756
    if ( ! wuffs_base__status__is_ok(&v_status)) {
79757
      status = v_status;
79758
      if (wuffs_base__status__is_error(&status)) {
79759
        goto exit;
79760
      } else if (wuffs_base__status__is_suspension(&status)) {
79761
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
79762
        goto exit;
79763
      }
79764
      goto ok;
79765
    }
79766
    v_status = wuffs_vp8__decoder__make_a_placeholder_gradient(self, a_dst);
79767
    if ( ! wuffs_base__status__is_ok(&v_status)) {
79768
      status = v_status;
79769
      if (wuffs_base__status__is_error(&status)) {
79770
        goto exit;
79771
      } else if (wuffs_base__status__is_suspension(&status)) {
79772
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
79773
        goto exit;
79774
      }
79775
      goto ok;
79776
    }
79777
    self->private_impl.f_call_sequence = 96u;
79778
79779
    ok:
79780
    self->private_impl.p_do_decode_frame = 0;
79781
    goto exit;
79782
  }
79783
79784
  goto suspend;
79785
  suspend:
79786
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
79787
79788
  goto exit;
79789
  exit:
79790
  return status;
79791
}
79792
79793
// -------- func vp8.decoder.make_a_placeholder_gradient
79794
79795
WUFFS_BASE__GENERATED_C_CODE
79796
static wuffs_base__status
79797
wuffs_vp8__decoder__make_a_placeholder_gradient(
79798
    wuffs_vp8__decoder* self,
79799
    wuffs_base__pixel_buffer* a_dst) {
79800
  wuffs_base__pixel_format v_dst_pixfmt = {0};
79801
  uint32_t v_dst_bits_per_pixel = 0;
79802
  uint32_t v_dst_bytes_per_pixel = 0;
79803
  uint64_t v_dst_bytes_per_row = 0;
79804
  wuffs_base__table_u8 v_tab = {0};
79805
  wuffs_base__slice_u8 v_dst = {0};
79806
  uint64_t v_i = 0;
79807
  uint8_t v_bgrx[4] = {0};
79808
79809
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
79810
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
79811
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
79812
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
79813
  }
79814
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
79815
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
79816
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
79817
  v_bgrx[0u] = 128u;
79818
  while (self->private_impl.f_dst_y < self->private_impl.f_height) {
79819
    v_bgrx[1u] = ((uint8_t)(self->private_impl.f_dst_y));
79820
    self->private_impl.f_dst_x = 0u;
79821
    while (self->private_impl.f_dst_x < self->private_impl.f_width) {
79822
      v_bgrx[2u] = ((uint8_t)(self->private_impl.f_dst_x));
79823
      v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, self->private_impl.f_dst_y);
79824
      if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
79825
        v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
79826
      }
79827
      v_i = (((uint64_t)(self->private_impl.f_dst_x)) * ((uint64_t)(v_dst_bytes_per_pixel)));
79828
      if (v_i < ((uint64_t)(v_dst.len))) {
79829
        wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, wuffs_base__slice_u8__subslice_i(v_dst, v_i), wuffs_base__pixel_buffer__palette(a_dst), wuffs_base__make_slice_u8(v_bgrx, 4));
79830
      }
79831
      self->private_impl.f_dst_x += 1u;
79832
    }
79833
    self->private_impl.f_dst_y += 1u;
79834
  }
79835
  return wuffs_base__make_status(NULL);
79836
}
79837
79838
// -------- func vp8.decoder.frame_dirty_rect
79839
79840
WUFFS_BASE__GENERATED_C_CODE
79841
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
79842
wuffs_vp8__decoder__frame_dirty_rect(
79843
    const wuffs_vp8__decoder* self) {
79844
  if (!self) {
79845
    return wuffs_base__utility__empty_rect_ie_u32();
79846
  }
79847
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79848
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79849
    return wuffs_base__utility__empty_rect_ie_u32();
79850
  }
79851
79852
  return wuffs_base__utility__make_rect_ie_u32(
79853
      0u,
79854
      0u,
79855
      self->private_impl.f_width,
79856
      self->private_impl.f_height);
79857
}
79858
79859
// -------- func vp8.decoder.num_animation_loops
79860
79861
WUFFS_BASE__GENERATED_C_CODE
79862
WUFFS_BASE__MAYBE_STATIC uint32_t
79863
wuffs_vp8__decoder__num_animation_loops(
79864
    const wuffs_vp8__decoder* self) {
79865
  if (!self) {
79866
    return 0;
79867
  }
79868
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79869
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79870
    return 0;
79871
  }
79872
79873
  return 0u;
79874
}
79875
79876
// -------- func vp8.decoder.num_decoded_frame_configs
79877
79878
WUFFS_BASE__GENERATED_C_CODE
79879
WUFFS_BASE__MAYBE_STATIC uint64_t
79880
wuffs_vp8__decoder__num_decoded_frame_configs(
79881
    const wuffs_vp8__decoder* self) {
79882
  if (!self) {
79883
    return 0;
79884
  }
79885
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79886
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79887
    return 0;
79888
  }
79889
79890
  if (self->private_impl.f_call_sequence > 32u) {
79891
    return 1u;
79892
  }
79893
  return 0u;
79894
}
79895
79896
// -------- func vp8.decoder.num_decoded_frames
79897
79898
WUFFS_BASE__GENERATED_C_CODE
79899
WUFFS_BASE__MAYBE_STATIC uint64_t
79900
wuffs_vp8__decoder__num_decoded_frames(
79901
    const wuffs_vp8__decoder* self) {
79902
  if (!self) {
79903
    return 0;
79904
  }
79905
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
79906
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
79907
    return 0;
79908
  }
79909
79910
  if (self->private_impl.f_call_sequence > 64u) {
79911
    return 1u;
79912
  }
79913
  return 0u;
79914
}
79915
79916
// -------- func vp8.decoder.restart_frame
79917
79918
WUFFS_BASE__GENERATED_C_CODE
79919
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79920
wuffs_vp8__decoder__restart_frame(
79921
    wuffs_vp8__decoder* self,
79922
    uint64_t a_index,
79923
    uint64_t a_io_position) {
79924
  if (!self) {
79925
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79926
  }
79927
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79928
    return wuffs_base__make_status(
79929
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79930
        ? wuffs_base__error__disabled_by_previous_error
79931
        : wuffs_base__error__initialize_not_called);
79932
  }
79933
79934
  if (self->private_impl.f_call_sequence < 32u) {
79935
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
79936
  }
79937
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
79938
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79939
  }
79940
  self->private_impl.f_call_sequence = 40u;
79941
  return wuffs_base__make_status(NULL);
79942
}
79943
79944
// -------- func vp8.decoder.set_report_metadata
79945
79946
WUFFS_BASE__GENERATED_C_CODE
79947
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
79948
wuffs_vp8__decoder__set_report_metadata(
79949
    wuffs_vp8__decoder* self,
79950
    uint32_t a_fourcc,
79951
    bool a_report) {
79952
  return wuffs_base__make_empty_struct();
79953
}
79954
79955
// -------- func vp8.decoder.tell_me_more
79956
79957
WUFFS_BASE__GENERATED_C_CODE
79958
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
79959
wuffs_vp8__decoder__tell_me_more(
79960
    wuffs_vp8__decoder* self,
79961
    wuffs_base__io_buffer* a_dst,
79962
    wuffs_base__more_information* a_minfo,
79963
    wuffs_base__io_buffer* a_src) {
79964
  if (!self) {
79965
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
79966
  }
79967
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
79968
    return wuffs_base__make_status(
79969
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
79970
        ? wuffs_base__error__disabled_by_previous_error
79971
        : wuffs_base__error__initialize_not_called);
79972
  }
79973
  if (!a_dst || !a_src) {
79974
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79975
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
79976
  }
79977
  if ((self->private_impl.active_coroutine != 0) &&
79978
      (self->private_impl.active_coroutine != 4)) {
79979
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79980
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
79981
  }
79982
  self->private_impl.active_coroutine = 0;
79983
  wuffs_base__status status = wuffs_base__make_status(NULL);
79984
79985
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
79986
  goto exit;
79987
79988
  goto ok;
79989
  ok:
79990
  goto exit;
79991
  exit:
79992
  if (wuffs_base__status__is_error(&status)) {
79993
    self->private_impl.magic = WUFFS_BASE__DISABLED;
79994
  }
79995
  return status;
79996
}
79997
79998
// -------- func vp8.decoder.workbuf_len
79999
80000
WUFFS_BASE__GENERATED_C_CODE
80001
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
80002
wuffs_vp8__decoder__workbuf_len(
80003
    const wuffs_vp8__decoder* self) {
80004
  if (!self) {
80005
    return wuffs_base__utility__empty_range_ii_u64();
80006
  }
80007
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80008
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80009
    return wuffs_base__utility__empty_range_ii_u64();
80010
  }
80011
80012
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
80013
}
80014
80015
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__VP8)
80016
80017
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
80018
80019
// ---------------- Status Codes Implementations
80020
80021
const char wuffs_wbmp__error__bad_header[] = "#wbmp: bad header";
80022
const char wuffs_wbmp__error__truncated_input[] = "#wbmp: truncated input";
80023
80024
// ---------------- Private Consts
80025
80026
// ---------------- Private Initializer Prototypes
80027
80028
// ---------------- Private Function Prototypes
80029
80030
WUFFS_BASE__GENERATED_C_CODE
80031
static wuffs_base__status
80032
wuffs_wbmp__decoder__do_decode_image_config(
80033
    wuffs_wbmp__decoder* self,
80034
    wuffs_base__image_config* a_dst,
80035
    wuffs_base__io_buffer* a_src);
80036
80037
WUFFS_BASE__GENERATED_C_CODE
80038
static wuffs_base__status
80039
wuffs_wbmp__decoder__do_decode_frame_config(
80040
    wuffs_wbmp__decoder* self,
80041
    wuffs_base__frame_config* a_dst,
80042
    wuffs_base__io_buffer* a_src);
80043
80044
WUFFS_BASE__GENERATED_C_CODE
80045
static wuffs_base__status
80046
wuffs_wbmp__decoder__do_decode_frame(
80047
    wuffs_wbmp__decoder* self,
80048
    wuffs_base__pixel_buffer* a_dst,
80049
    wuffs_base__io_buffer* a_src,
80050
    wuffs_base__pixel_blend a_blend,
80051
    wuffs_base__slice_u8 a_workbuf,
80052
    wuffs_base__decode_frame_options* a_opts);
80053
80054
// ---------------- VTables
80055
80056
const wuffs_base__image_decoder__func_ptrs
80057
wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
80058
  (wuffs_base__status(*)(void*,
80059
      wuffs_base__pixel_buffer*,
80060
      wuffs_base__io_buffer*,
80061
      wuffs_base__pixel_blend,
80062
      wuffs_base__slice_u8,
80063
      wuffs_base__decode_frame_options*))(&wuffs_wbmp__decoder__decode_frame),
80064
  (wuffs_base__status(*)(void*,
80065
      wuffs_base__frame_config*,
80066
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_frame_config),
80067
  (wuffs_base__status(*)(void*,
80068
      wuffs_base__image_config*,
80069
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__decode_image_config),
80070
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_wbmp__decoder__frame_dirty_rect),
80071
  (uint64_t(*)(const void*,
80072
      uint32_t))(&wuffs_wbmp__decoder__get_quirk),
80073
  (uint32_t(*)(const void*))(&wuffs_wbmp__decoder__num_animation_loops),
80074
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frame_configs),
80075
  (uint64_t(*)(const void*))(&wuffs_wbmp__decoder__num_decoded_frames),
80076
  (wuffs_base__status(*)(void*,
80077
      uint64_t,
80078
      uint64_t))(&wuffs_wbmp__decoder__restart_frame),
80079
  (wuffs_base__status(*)(void*,
80080
      uint32_t,
80081
      uint64_t))(&wuffs_wbmp__decoder__set_quirk),
80082
  (wuffs_base__empty_struct(*)(void*,
80083
      uint32_t,
80084
      bool))(&wuffs_wbmp__decoder__set_report_metadata),
80085
  (wuffs_base__status(*)(void*,
80086
      wuffs_base__io_buffer*,
80087
      wuffs_base__more_information*,
80088
      wuffs_base__io_buffer*))(&wuffs_wbmp__decoder__tell_me_more),
80089
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_wbmp__decoder__workbuf_len),
80090
};
80091
80092
// ---------------- Initializer Implementations
80093
80094
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
80095
wuffs_wbmp__decoder__initialize(
80096
    wuffs_wbmp__decoder* self,
80097
    size_t sizeof_star_self,
80098
    uint64_t wuffs_version,
80099
    uint32_t options){
80100
  if (!self) {
80101
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80102
  }
80103
  if (sizeof(*self) != sizeof_star_self) {
80104
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
80105
  }
80106
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
80107
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
80108
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
80109
  }
80110
80111
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
80112
    // The whole point of this if-check is to detect an uninitialized *self.
80113
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
80114
#if !defined(__clang__) && defined(__GNUC__)
80115
#pragma GCC diagnostic push
80116
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
80117
#endif
80118
    if (self->private_impl.magic != 0) {
80119
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
80120
    }
80121
#if !defined(__clang__) && defined(__GNUC__)
80122
#pragma GCC diagnostic pop
80123
#endif
80124
  } else {
80125
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
80126
      memset(self, 0, sizeof(*self));
80127
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
80128
    } else {
80129
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
80130
    }
80131
  }
80132
80133
  self->private_impl.magic = WUFFS_BASE__MAGIC;
80134
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
80135
      wuffs_base__image_decoder__vtable_name;
80136
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
80137
      (const void*)(&wuffs_wbmp__decoder__func_ptrs_for__wuffs_base__image_decoder);
80138
  return wuffs_base__make_status(NULL);
80139
}
80140
80141
wuffs_wbmp__decoder*
80142
wuffs_wbmp__decoder__alloc(void) {
80143
  wuffs_wbmp__decoder* x =
80144
      (wuffs_wbmp__decoder*)(calloc(1, sizeof(wuffs_wbmp__decoder)));
80145
  if (!x) {
80146
    return NULL;
80147
  }
80148
  if (wuffs_wbmp__decoder__initialize(
80149
      x, sizeof(wuffs_wbmp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
80150
    free(x);
80151
    return NULL;
80152
  }
80153
  return x;
80154
}
80155
80156
size_t
80157
sizeof__wuffs_wbmp__decoder(void) {
80158
  return sizeof(wuffs_wbmp__decoder);
80159
}
80160
80161
// ---------------- Function Implementations
80162
80163
// -------- func wbmp.decoder.get_quirk
80164
80165
WUFFS_BASE__GENERATED_C_CODE
80166
WUFFS_BASE__MAYBE_STATIC uint64_t
80167
wuffs_wbmp__decoder__get_quirk(
80168
    const wuffs_wbmp__decoder* self,
80169
    uint32_t a_key) {
80170
  if (!self) {
80171
    return 0;
80172
  }
80173
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80174
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80175
    return 0;
80176
  }
80177
80178
  return 0u;
80179
}
80180
80181
// -------- func wbmp.decoder.set_quirk
80182
80183
WUFFS_BASE__GENERATED_C_CODE
80184
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80185
wuffs_wbmp__decoder__set_quirk(
80186
    wuffs_wbmp__decoder* self,
80187
    uint32_t a_key,
80188
    uint64_t a_value) {
80189
  if (!self) {
80190
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80191
  }
80192
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80193
    return wuffs_base__make_status(
80194
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80195
        ? wuffs_base__error__disabled_by_previous_error
80196
        : wuffs_base__error__initialize_not_called);
80197
  }
80198
80199
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
80200
}
80201
80202
// -------- func wbmp.decoder.decode_image_config
80203
80204
WUFFS_BASE__GENERATED_C_CODE
80205
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80206
wuffs_wbmp__decoder__decode_image_config(
80207
    wuffs_wbmp__decoder* self,
80208
    wuffs_base__image_config* a_dst,
80209
    wuffs_base__io_buffer* a_src) {
80210
  if (!self) {
80211
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80212
  }
80213
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80214
    return wuffs_base__make_status(
80215
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80216
        ? wuffs_base__error__disabled_by_previous_error
80217
        : wuffs_base__error__initialize_not_called);
80218
  }
80219
  if (!a_src) {
80220
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80221
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80222
  }
80223
  if ((self->private_impl.active_coroutine != 0) &&
80224
      (self->private_impl.active_coroutine != 1)) {
80225
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80226
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80227
  }
80228
  self->private_impl.active_coroutine = 0;
80229
  wuffs_base__status status = wuffs_base__make_status(NULL);
80230
80231
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80232
80233
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
80234
  switch (coro_susp_point) {
80235
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80236
80237
    while (true) {
80238
      {
80239
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_image_config(self, a_dst, a_src);
80240
        v_status = t_0;
80241
      }
80242
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80243
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
80244
        goto exit;
80245
      }
80246
      status = v_status;
80247
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80248
    }
80249
80250
    ok:
80251
    self->private_impl.p_decode_image_config = 0;
80252
    goto exit;
80253
  }
80254
80255
  goto suspend;
80256
  suspend:
80257
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80258
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
80259
80260
  goto exit;
80261
  exit:
80262
  if (wuffs_base__status__is_error(&status)) {
80263
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80264
  }
80265
  return status;
80266
}
80267
80268
// -------- func wbmp.decoder.do_decode_image_config
80269
80270
WUFFS_BASE__GENERATED_C_CODE
80271
static wuffs_base__status
80272
wuffs_wbmp__decoder__do_decode_image_config(
80273
    wuffs_wbmp__decoder* self,
80274
    wuffs_base__image_config* a_dst,
80275
    wuffs_base__io_buffer* a_src) {
80276
  wuffs_base__status status = wuffs_base__make_status(NULL);
80277
80278
  uint8_t v_c8 = 0;
80279
  uint32_t v_i = 0;
80280
  uint32_t v_p = 0;
80281
80282
  const uint8_t* iop_a_src = NULL;
80283
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80284
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80285
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80286
  if (a_src && a_src->data.ptr) {
80287
    io0_a_src = a_src->data.ptr;
80288
    io1_a_src = io0_a_src + a_src->meta.ri;
80289
    iop_a_src = io1_a_src;
80290
    io2_a_src = io0_a_src + a_src->meta.wi;
80291
  }
80292
80293
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
80294
  if (coro_susp_point) {
80295
    v_i = self->private_data.s_do_decode_image_config.v_i;
80296
    v_p = self->private_data.s_do_decode_image_config.v_p;
80297
  }
80298
  switch (coro_susp_point) {
80299
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80300
80301
    if (self->private_impl.f_call_sequence != 0u) {
80302
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
80303
      goto exit;
80304
    }
80305
    v_i = 0u;
80306
    while (v_i < 2u) {
80307
      {
80308
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80309
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80310
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80311
          goto suspend;
80312
        }
80313
        uint8_t t_0 = *iop_a_src++;
80314
        v_c8 = t_0;
80315
      }
80316
      if (v_c8 != 0u) {
80317
        status = wuffs_base__make_status(wuffs_wbmp__error__bad_header);
80318
        goto exit;
80319
      }
80320
      v_i += 1u;
80321
    }
80322
    v_i = 0u;
80323
    while (v_i < 2u) {
80324
      v_p = 0u;
80325
      while (true) {
80326
        {
80327
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
80328
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
80329
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80330
            goto suspend;
80331
          }
80332
          uint8_t t_1 = *iop_a_src++;
80333
          v_c8 = t_1;
80334
        }
80335
        v_p |= ((uint32_t)(((uint8_t)(v_c8 & 127u))));
80336
        if (((uint8_t)(v_c8 >> 7u)) == 0u) {
80337
          break;
80338
        } else if (v_p > 131071u) {
80339
          status = wuffs_base__make_status(wuffs_base__error__unsupported_image_dimension);
80340
          goto exit;
80341
        }
80342
        v_p <<= 7u;
80343
      }
80344
      if (v_i == 0u) {
80345
        self->private_impl.f_width = v_p;
80346
      } else {
80347
        self->private_impl.f_height = v_p;
80348
      }
80349
      v_i += 1u;
80350
    }
80351
    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)));
80352
    if (a_dst != NULL) {
80353
      wuffs_base__image_config__set(
80354
          a_dst,
80355
          2198077448u,
80356
          0u,
80357
          self->private_impl.f_width,
80358
          self->private_impl.f_height,
80359
          self->private_impl.f_frame_config_io_position,
80360
          true);
80361
    }
80362
    self->private_impl.f_call_sequence = 32u;
80363
80364
    goto ok;
80365
    ok:
80366
    self->private_impl.p_do_decode_image_config = 0;
80367
    goto exit;
80368
  }
80369
80370
  goto suspend;
80371
  suspend:
80372
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80373
  self->private_data.s_do_decode_image_config.v_i = v_i;
80374
  self->private_data.s_do_decode_image_config.v_p = v_p;
80375
80376
  goto exit;
80377
  exit:
80378
  if (a_src && a_src->data.ptr) {
80379
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80380
  }
80381
80382
  return status;
80383
}
80384
80385
// -------- func wbmp.decoder.decode_frame_config
80386
80387
WUFFS_BASE__GENERATED_C_CODE
80388
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80389
wuffs_wbmp__decoder__decode_frame_config(
80390
    wuffs_wbmp__decoder* self,
80391
    wuffs_base__frame_config* a_dst,
80392
    wuffs_base__io_buffer* a_src) {
80393
  if (!self) {
80394
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80395
  }
80396
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80397
    return wuffs_base__make_status(
80398
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80399
        ? wuffs_base__error__disabled_by_previous_error
80400
        : wuffs_base__error__initialize_not_called);
80401
  }
80402
  if (!a_src) {
80403
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80404
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80405
  }
80406
  if ((self->private_impl.active_coroutine != 0) &&
80407
      (self->private_impl.active_coroutine != 2)) {
80408
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80409
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80410
  }
80411
  self->private_impl.active_coroutine = 0;
80412
  wuffs_base__status status = wuffs_base__make_status(NULL);
80413
80414
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80415
80416
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
80417
  switch (coro_susp_point) {
80418
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80419
80420
    while (true) {
80421
      {
80422
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame_config(self, a_dst, a_src);
80423
        v_status = t_0;
80424
      }
80425
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80426
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
80427
        goto exit;
80428
      }
80429
      status = v_status;
80430
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80431
    }
80432
80433
    ok:
80434
    self->private_impl.p_decode_frame_config = 0;
80435
    goto exit;
80436
  }
80437
80438
  goto suspend;
80439
  suspend:
80440
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80441
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
80442
80443
  goto exit;
80444
  exit:
80445
  if (wuffs_base__status__is_error(&status)) {
80446
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80447
  }
80448
  return status;
80449
}
80450
80451
// -------- func wbmp.decoder.do_decode_frame_config
80452
80453
WUFFS_BASE__GENERATED_C_CODE
80454
static wuffs_base__status
80455
wuffs_wbmp__decoder__do_decode_frame_config(
80456
    wuffs_wbmp__decoder* self,
80457
    wuffs_base__frame_config* a_dst,
80458
    wuffs_base__io_buffer* a_src) {
80459
  wuffs_base__status status = wuffs_base__make_status(NULL);
80460
80461
  const uint8_t* iop_a_src = NULL;
80462
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80463
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80464
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80465
  if (a_src && a_src->data.ptr) {
80466
    io0_a_src = a_src->data.ptr;
80467
    io1_a_src = io0_a_src + a_src->meta.ri;
80468
    iop_a_src = io1_a_src;
80469
    io2_a_src = io0_a_src + a_src->meta.wi;
80470
  }
80471
80472
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
80473
  switch (coro_susp_point) {
80474
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80475
80476
    if (self->private_impl.f_call_sequence == 32u) {
80477
    } else if (self->private_impl.f_call_sequence < 32u) {
80478
      if (a_src) {
80479
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80480
      }
80481
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80482
      status = wuffs_wbmp__decoder__do_decode_image_config(self, NULL, a_src);
80483
      if (a_src) {
80484
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
80485
      }
80486
      if (status.repr) {
80487
        goto suspend;
80488
      }
80489
    } else if (self->private_impl.f_call_sequence == 40u) {
80490
      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)))) {
80491
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
80492
        goto exit;
80493
      }
80494
    } else if (self->private_impl.f_call_sequence == 64u) {
80495
      self->private_impl.f_call_sequence = 96u;
80496
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
80497
      goto ok;
80498
    } else {
80499
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
80500
      goto ok;
80501
    }
80502
    if (a_dst != NULL) {
80503
      wuffs_base__frame_config__set(
80504
          a_dst,
80505
          wuffs_base__utility__make_rect_ie_u32(
80506
          0u,
80507
          0u,
80508
          self->private_impl.f_width,
80509
          self->private_impl.f_height),
80510
          ((wuffs_base__flicks)(0u)),
80511
          0u,
80512
          self->private_impl.f_frame_config_io_position,
80513
          0u,
80514
          true,
80515
          false,
80516
          4278190080u);
80517
    }
80518
    self->private_impl.f_call_sequence = 64u;
80519
80520
    ok:
80521
    self->private_impl.p_do_decode_frame_config = 0;
80522
    goto exit;
80523
  }
80524
80525
  goto suspend;
80526
  suspend:
80527
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80528
80529
  goto exit;
80530
  exit:
80531
  if (a_src && a_src->data.ptr) {
80532
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80533
  }
80534
80535
  return status;
80536
}
80537
80538
// -------- func wbmp.decoder.decode_frame
80539
80540
WUFFS_BASE__GENERATED_C_CODE
80541
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80542
wuffs_wbmp__decoder__decode_frame(
80543
    wuffs_wbmp__decoder* self,
80544
    wuffs_base__pixel_buffer* a_dst,
80545
    wuffs_base__io_buffer* a_src,
80546
    wuffs_base__pixel_blend a_blend,
80547
    wuffs_base__slice_u8 a_workbuf,
80548
    wuffs_base__decode_frame_options* a_opts) {
80549
  if (!self) {
80550
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80551
  }
80552
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80553
    return wuffs_base__make_status(
80554
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80555
        ? wuffs_base__error__disabled_by_previous_error
80556
        : wuffs_base__error__initialize_not_called);
80557
  }
80558
  if (!a_dst || !a_src) {
80559
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80560
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80561
  }
80562
  if ((self->private_impl.active_coroutine != 0) &&
80563
      (self->private_impl.active_coroutine != 3)) {
80564
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80565
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80566
  }
80567
  self->private_impl.active_coroutine = 0;
80568
  wuffs_base__status status = wuffs_base__make_status(NULL);
80569
80570
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80571
80572
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
80573
  switch (coro_susp_point) {
80574
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80575
80576
    while (true) {
80577
      {
80578
        wuffs_base__status t_0 = wuffs_wbmp__decoder__do_decode_frame(self,
80579
            a_dst,
80580
            a_src,
80581
            a_blend,
80582
            a_workbuf,
80583
            a_opts);
80584
        v_status = t_0;
80585
      }
80586
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
80587
        status = wuffs_base__make_status(wuffs_wbmp__error__truncated_input);
80588
        goto exit;
80589
      }
80590
      status = v_status;
80591
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
80592
    }
80593
80594
    ok:
80595
    self->private_impl.p_decode_frame = 0;
80596
    goto exit;
80597
  }
80598
80599
  goto suspend;
80600
  suspend:
80601
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80602
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
80603
80604
  goto exit;
80605
  exit:
80606
  if (wuffs_base__status__is_error(&status)) {
80607
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80608
  }
80609
  return status;
80610
}
80611
80612
// -------- func wbmp.decoder.do_decode_frame
80613
80614
WUFFS_BASE__GENERATED_C_CODE
80615
static wuffs_base__status
80616
wuffs_wbmp__decoder__do_decode_frame(
80617
    wuffs_wbmp__decoder* self,
80618
    wuffs_base__pixel_buffer* a_dst,
80619
    wuffs_base__io_buffer* a_src,
80620
    wuffs_base__pixel_blend a_blend,
80621
    wuffs_base__slice_u8 a_workbuf,
80622
    wuffs_base__decode_frame_options* a_opts) {
80623
  wuffs_base__status status = wuffs_base__make_status(NULL);
80624
80625
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
80626
  wuffs_base__pixel_format v_dst_pixfmt = {0};
80627
  uint32_t v_dst_bits_per_pixel = 0;
80628
  uint64_t v_dst_bytes_per_pixel = 0;
80629
  uint64_t v_dst_x_in_bytes = 0;
80630
  uint32_t v_dst_x = 0;
80631
  uint32_t v_dst_y = 0;
80632
  wuffs_base__table_u8 v_tab = {0};
80633
  wuffs_base__slice_u8 v_dst = {0};
80634
  uint8_t v_src[1] = {0};
80635
  uint8_t v_c8 = 0;
80636
80637
  const uint8_t* iop_a_src = NULL;
80638
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80639
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80640
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
80641
  if (a_src && a_src->data.ptr) {
80642
    io0_a_src = a_src->data.ptr;
80643
    io1_a_src = io0_a_src + a_src->meta.ri;
80644
    iop_a_src = io1_a_src;
80645
    io2_a_src = io0_a_src + a_src->meta.wi;
80646
  }
80647
80648
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
80649
  if (coro_susp_point) {
80650
    v_dst_bytes_per_pixel = self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel;
80651
    v_dst_x = self->private_data.s_do_decode_frame.v_dst_x;
80652
    v_dst_y = self->private_data.s_do_decode_frame.v_dst_y;
80653
    memcpy(v_src, self->private_data.s_do_decode_frame.v_src, sizeof(v_src));
80654
    v_c8 = self->private_data.s_do_decode_frame.v_c8;
80655
  }
80656
  switch (coro_susp_point) {
80657
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
80658
80659
    if (self->private_impl.f_call_sequence == 64u) {
80660
    } else if (self->private_impl.f_call_sequence < 64u) {
80661
      if (a_src) {
80662
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80663
      }
80664
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
80665
      status = wuffs_wbmp__decoder__do_decode_frame_config(self, NULL, a_src);
80666
      if (a_src) {
80667
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
80668
      }
80669
      if (status.repr) {
80670
        goto suspend;
80671
      }
80672
    } else {
80673
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
80674
      goto ok;
80675
    }
80676
    v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
80677
        wuffs_base__pixel_buffer__pixel_format(a_dst),
80678
        wuffs_base__pixel_buffer__palette(a_dst),
80679
        wuffs_base__utility__make_pixel_format(536870920u),
80680
        wuffs_base__utility__empty_slice_u8(),
80681
        a_blend);
80682
    if ( ! wuffs_base__status__is_ok(&v_status)) {
80683
      status = v_status;
80684
      if (wuffs_base__status__is_error(&status)) {
80685
        goto exit;
80686
      } else if (wuffs_base__status__is_suspension(&status)) {
80687
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
80688
        goto exit;
80689
      }
80690
      goto ok;
80691
    }
80692
    v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
80693
    v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
80694
    if ((v_dst_bits_per_pixel & 7u) != 0u) {
80695
      status = wuffs_base__make_status(wuffs_base__error__unsupported_option);
80696
      goto exit;
80697
    }
80698
    v_dst_bytes_per_pixel = ((uint64_t)((v_dst_bits_per_pixel / 8u)));
80699
    if (self->private_impl.f_width > 0u) {
80700
      v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
80701
      while (v_dst_y < self->private_impl.f_height) {
80702
        v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
80703
        v_dst_x = 0u;
80704
        while (v_dst_x < self->private_impl.f_width) {
80705
          if ((v_dst_x & 7u) == 0u) {
80706
            while (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
80707
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
80708
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
80709
              v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
80710
              v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_dst_y);
80711
              v_dst_x_in_bytes = (((uint64_t)(v_dst_x)) * v_dst_bytes_per_pixel);
80712
              if (v_dst_x_in_bytes <= ((uint64_t)(v_dst.len))) {
80713
                v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_x_in_bytes);
80714
              }
80715
            }
80716
            v_c8 = wuffs_base__peek_u8be__no_bounds_check(iop_a_src);
80717
            iop_a_src += 1u;
80718
          }
80719
          if (((uint8_t)(v_c8 & 128u)) == 0u) {
80720
            v_src[0u] = 0u;
80721
          } else {
80722
            v_src[0u] = 255u;
80723
          }
80724
          v_c8 = ((uint8_t)((((uint32_t)(v_c8)) << 1u)));
80725
          wuffs_base__pixel_swizzler__swizzle_interleaved_from_slice(&self->private_impl.f_swizzler, v_dst, wuffs_base__utility__empty_slice_u8(), wuffs_base__make_slice_u8(v_src, 1));
80726
          if (v_dst_bytes_per_pixel <= ((uint64_t)(v_dst.len))) {
80727
            v_dst = wuffs_base__slice_u8__subslice_i(v_dst, v_dst_bytes_per_pixel);
80728
          }
80729
          v_dst_x += 1u;
80730
        }
80731
        v_dst_y += 1u;
80732
      }
80733
    }
80734
    self->private_impl.f_call_sequence = 96u;
80735
80736
    ok:
80737
    self->private_impl.p_do_decode_frame = 0;
80738
    goto exit;
80739
  }
80740
80741
  goto suspend;
80742
  suspend:
80743
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
80744
  self->private_data.s_do_decode_frame.v_dst_bytes_per_pixel = v_dst_bytes_per_pixel;
80745
  self->private_data.s_do_decode_frame.v_dst_x = v_dst_x;
80746
  self->private_data.s_do_decode_frame.v_dst_y = v_dst_y;
80747
  memcpy(self->private_data.s_do_decode_frame.v_src, v_src, sizeof(v_src));
80748
  self->private_data.s_do_decode_frame.v_c8 = v_c8;
80749
80750
  goto exit;
80751
  exit:
80752
  if (a_src && a_src->data.ptr) {
80753
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
80754
  }
80755
80756
  return status;
80757
}
80758
80759
// -------- func wbmp.decoder.frame_dirty_rect
80760
80761
WUFFS_BASE__GENERATED_C_CODE
80762
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
80763
wuffs_wbmp__decoder__frame_dirty_rect(
80764
    const wuffs_wbmp__decoder* self) {
80765
  if (!self) {
80766
    return wuffs_base__utility__empty_rect_ie_u32();
80767
  }
80768
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80769
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80770
    return wuffs_base__utility__empty_rect_ie_u32();
80771
  }
80772
80773
  return wuffs_base__utility__make_rect_ie_u32(
80774
      0u,
80775
      0u,
80776
      self->private_impl.f_width,
80777
      self->private_impl.f_height);
80778
}
80779
80780
// -------- func wbmp.decoder.num_animation_loops
80781
80782
WUFFS_BASE__GENERATED_C_CODE
80783
WUFFS_BASE__MAYBE_STATIC uint32_t
80784
wuffs_wbmp__decoder__num_animation_loops(
80785
    const wuffs_wbmp__decoder* self) {
80786
  if (!self) {
80787
    return 0;
80788
  }
80789
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80790
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80791
    return 0;
80792
  }
80793
80794
  return 0u;
80795
}
80796
80797
// -------- func wbmp.decoder.num_decoded_frame_configs
80798
80799
WUFFS_BASE__GENERATED_C_CODE
80800
WUFFS_BASE__MAYBE_STATIC uint64_t
80801
wuffs_wbmp__decoder__num_decoded_frame_configs(
80802
    const wuffs_wbmp__decoder* self) {
80803
  if (!self) {
80804
    return 0;
80805
  }
80806
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80807
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80808
    return 0;
80809
  }
80810
80811
  if (self->private_impl.f_call_sequence > 32u) {
80812
    return 1u;
80813
  }
80814
  return 0u;
80815
}
80816
80817
// -------- func wbmp.decoder.num_decoded_frames
80818
80819
WUFFS_BASE__GENERATED_C_CODE
80820
WUFFS_BASE__MAYBE_STATIC uint64_t
80821
wuffs_wbmp__decoder__num_decoded_frames(
80822
    const wuffs_wbmp__decoder* self) {
80823
  if (!self) {
80824
    return 0;
80825
  }
80826
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80827
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80828
    return 0;
80829
  }
80830
80831
  if (self->private_impl.f_call_sequence > 64u) {
80832
    return 1u;
80833
  }
80834
  return 0u;
80835
}
80836
80837
// -------- func wbmp.decoder.restart_frame
80838
80839
WUFFS_BASE__GENERATED_C_CODE
80840
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80841
wuffs_wbmp__decoder__restart_frame(
80842
    wuffs_wbmp__decoder* self,
80843
    uint64_t a_index,
80844
    uint64_t a_io_position) {
80845
  if (!self) {
80846
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80847
  }
80848
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80849
    return wuffs_base__make_status(
80850
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80851
        ? wuffs_base__error__disabled_by_previous_error
80852
        : wuffs_base__error__initialize_not_called);
80853
  }
80854
80855
  if (self->private_impl.f_call_sequence < 32u) {
80856
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
80857
  }
80858
  if (a_index != 0u) {
80859
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80860
  }
80861
  self->private_impl.f_call_sequence = 40u;
80862
  self->private_impl.f_frame_config_io_position = a_io_position;
80863
  return wuffs_base__make_status(NULL);
80864
}
80865
80866
// -------- func wbmp.decoder.set_report_metadata
80867
80868
WUFFS_BASE__GENERATED_C_CODE
80869
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
80870
wuffs_wbmp__decoder__set_report_metadata(
80871
    wuffs_wbmp__decoder* self,
80872
    uint32_t a_fourcc,
80873
    bool a_report) {
80874
  return wuffs_base__make_empty_struct();
80875
}
80876
80877
// -------- func wbmp.decoder.tell_me_more
80878
80879
WUFFS_BASE__GENERATED_C_CODE
80880
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
80881
wuffs_wbmp__decoder__tell_me_more(
80882
    wuffs_wbmp__decoder* self,
80883
    wuffs_base__io_buffer* a_dst,
80884
    wuffs_base__more_information* a_minfo,
80885
    wuffs_base__io_buffer* a_src) {
80886
  if (!self) {
80887
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
80888
  }
80889
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
80890
    return wuffs_base__make_status(
80891
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
80892
        ? wuffs_base__error__disabled_by_previous_error
80893
        : wuffs_base__error__initialize_not_called);
80894
  }
80895
  if (!a_dst || !a_src) {
80896
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80897
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
80898
  }
80899
  if ((self->private_impl.active_coroutine != 0) &&
80900
      (self->private_impl.active_coroutine != 4)) {
80901
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80902
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
80903
  }
80904
  self->private_impl.active_coroutine = 0;
80905
  wuffs_base__status status = wuffs_base__make_status(NULL);
80906
80907
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
80908
  goto exit;
80909
80910
  goto ok;
80911
  ok:
80912
  goto exit;
80913
  exit:
80914
  if (wuffs_base__status__is_error(&status)) {
80915
    self->private_impl.magic = WUFFS_BASE__DISABLED;
80916
  }
80917
  return status;
80918
}
80919
80920
// -------- func wbmp.decoder.workbuf_len
80921
80922
WUFFS_BASE__GENERATED_C_CODE
80923
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
80924
wuffs_wbmp__decoder__workbuf_len(
80925
    const wuffs_wbmp__decoder* self) {
80926
  if (!self) {
80927
    return wuffs_base__utility__empty_range_ii_u64();
80928
  }
80929
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
80930
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
80931
    return wuffs_base__utility__empty_range_ii_u64();
80932
  }
80933
80934
  return wuffs_base__utility__make_range_ii_u64(0u, 0u);
80935
}
80936
80937
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
80938
80939
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
80940
80941
// ---------------- Status Codes Implementations
80942
80943
const char wuffs_webp__error__bad_huffman_code_over_subscribed[] = "#webp: bad Huffman code (over-subscribed)";
80944
const char wuffs_webp__error__bad_huffman_code_under_subscribed[] = "#webp: bad Huffman code (under-subscribed)";
80945
const char wuffs_webp__error__bad_huffman_code[] = "#webp: bad Huffman code";
80946
const char wuffs_webp__error__bad_back_reference[] = "#webp: bad back-reference";
80947
const char wuffs_webp__error__bad_color_cache[] = "#webp: bad color cache";
80948
const char wuffs_webp__error__bad_header[] = "#webp: bad header";
80949
const char wuffs_webp__error__bad_transform[] = "#webp: bad transform";
80950
const char wuffs_webp__error__short_chunk[] = "#webp: short chunk";
80951
const char wuffs_webp__error__truncated_input[] = "#webp: truncated input";
80952
const char wuffs_webp__error__unsupported_number_of_huffman_groups[] = "#webp: unsupported number of Huffman groups";
80953
const char wuffs_webp__error__unsupported_transform_after_color_indexing_transform[] = "#webp: unsupported transform after color indexing transform";
80954
const char wuffs_webp__error__unsupported_webp_file[] = "#webp: unsupported WebP file";
80955
const char wuffs_webp__error__internal_error_inconsistent_huffman_code[] = "#webp: internal error: inconsistent Huffman code";
80956
const char wuffs_webp__error__internal_error_inconsistent_dst_buffer[] = "#webp: internal error: inconsistent dst buffer";
80957
const char wuffs_webp__error__internal_error_inconsistent_n_bits[] = "#webp: internal error: inconsistent n_bits";
80958
80959
// ---------------- Private Consts
80960
80961
static const uint8_t
80962
WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[19] WUFFS_BASE__POTENTIALLY_UNUSED = {
80963
  17u, 18u, 0u, 1u, 2u, 3u, 4u, 5u,
80964
  16u, 6u, 7u, 8u, 9u, 10u, 11u, 12u,
80965
  13u, 14u, 15u,
80966
};
80967
80968
static const uint8_t
80969
WUFFS_WEBP__REPEAT_N_BITS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
80970
  2u, 3u, 7u, 0u,
80971
};
80972
80973
static const uint8_t
80974
WUFFS_WEBP__REPEAT_COUNTS[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
80975
  3u, 3u, 11u, 0u,
80976
};
80977
80978
static const uint16_t
80979
WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[5] WUFFS_BASE__POTENTIALLY_UNUSED = {
80980
  1612u, 0u, 511u, 1022u, 1533u,
80981
};
80982
80983
static const uint8_t
80984
WUFFS_WEBP__DISTANCE_MAP[120] WUFFS_BASE__POTENTIALLY_UNUSED = {
80985
  24u, 7u, 23u, 25u, 40u, 6u, 39u, 41u,
80986
  22u, 26u, 38u, 42u, 56u, 5u, 55u, 57u,
80987
  21u, 27u, 54u, 58u, 37u, 43u, 72u, 4u,
80988
  71u, 73u, 20u, 28u, 53u, 59u, 70u, 74u,
80989
  36u, 44u, 88u, 69u, 75u, 52u, 60u, 3u,
80990
  87u, 89u, 19u, 29u, 86u, 90u, 35u, 45u,
80991
  68u, 76u, 85u, 91u, 51u, 61u, 104u, 2u,
80992
  103u, 105u, 18u, 30u, 102u, 106u, 34u, 46u,
80993
  84u, 92u, 67u, 77u, 101u, 107u, 50u, 62u,
80994
  120u, 1u, 119u, 121u, 83u, 93u, 17u, 31u,
80995
  100u, 108u, 66u, 78u, 118u, 122u, 33u, 47u,
80996
  117u, 123u, 49u, 63u, 99u, 109u, 82u, 94u,
80997
  0u, 116u, 124u, 65u, 79u, 16u, 32u, 98u,
80998
  110u, 48u, 115u, 125u, 81u, 95u, 64u, 114u,
80999
  126u, 97u, 111u, 80u, 113u, 127u, 96u, 112u,
81000
};
81001
81002
// ---------------- Private Initializer Prototypes
81003
81004
// ---------------- Private Function Prototypes
81005
81006
WUFFS_BASE__GENERATED_C_CODE
81007
static wuffs_base__status
81008
wuffs_webp__decoder__decode_huffman_groups(
81009
    wuffs_webp__decoder* self,
81010
    wuffs_base__io_buffer* a_src,
81011
    uint32_t a_n_huffman_groups);
81012
81013
WUFFS_BASE__GENERATED_C_CODE
81014
static wuffs_base__status
81015
wuffs_webp__decoder__decode_huffman_tree(
81016
    wuffs_webp__decoder* self,
81017
    wuffs_base__io_buffer* a_src,
81018
    uint32_t a_hg,
81019
    uint32_t a_ht);
81020
81021
WUFFS_BASE__GENERATED_C_CODE
81022
static wuffs_base__status
81023
wuffs_webp__decoder__decode_huffman_tree_simple(
81024
    wuffs_webp__decoder* self,
81025
    wuffs_base__io_buffer* a_src,
81026
    uint32_t a_hg,
81027
    uint32_t a_ht);
81028
81029
WUFFS_BASE__GENERATED_C_CODE
81030
static wuffs_base__status
81031
wuffs_webp__decoder__decode_code_length_code_lengths(
81032
    wuffs_webp__decoder* self,
81033
    wuffs_base__io_buffer* a_src);
81034
81035
WUFFS_BASE__GENERATED_C_CODE
81036
static wuffs_base__status
81037
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
81038
    wuffs_webp__decoder* self);
81039
81040
WUFFS_BASE__GENERATED_C_CODE
81041
static wuffs_base__status
81042
wuffs_webp__decoder__build_huffman_nodes(
81043
    wuffs_webp__decoder* self,
81044
    uint32_t a_hg,
81045
    uint32_t a_ht);
81046
81047
WUFFS_BASE__GENERATED_C_CODE
81048
static wuffs_base__status
81049
wuffs_webp__decoder__build_code_lengths(
81050
    wuffs_webp__decoder* self,
81051
    wuffs_base__io_buffer* a_src);
81052
81053
WUFFS_BASE__GENERATED_C_CODE
81054
static wuffs_base__status
81055
wuffs_webp__decoder__decode_pixels_slow(
81056
    wuffs_webp__decoder* self,
81057
    wuffs_base__slice_u8 a_dst,
81058
    wuffs_base__io_buffer* a_src,
81059
    uint32_t a_width,
81060
    uint32_t a_height,
81061
    wuffs_base__slice_u8 a_tile_data,
81062
    uint32_t a_tile_size_log2);
81063
81064
WUFFS_BASE__GENERATED_C_CODE
81065
static wuffs_base__empty_struct
81066
wuffs_webp__decoder__apply_transform_predictor(
81067
    wuffs_webp__decoder* self,
81068
    wuffs_base__slice_u8 a_pix,
81069
    wuffs_base__slice_u8 a_tile_data);
81070
81071
WUFFS_BASE__GENERATED_C_CODE
81072
static uint32_t
81073
wuffs_webp__decoder__absolute_difference(
81074
    const wuffs_webp__decoder* self,
81075
    uint32_t a_a,
81076
    uint32_t a_b);
81077
81078
WUFFS_BASE__GENERATED_C_CODE
81079
static uint8_t
81080
wuffs_webp__decoder__mode12(
81081
    const wuffs_webp__decoder* self,
81082
    uint8_t a_l,
81083
    uint8_t a_t,
81084
    uint8_t a_tl);
81085
81086
WUFFS_BASE__GENERATED_C_CODE
81087
static uint8_t
81088
wuffs_webp__decoder__mode13(
81089
    const wuffs_webp__decoder* self,
81090
    uint8_t a_l,
81091
    uint8_t a_t,
81092
    uint8_t a_tl);
81093
81094
WUFFS_BASE__GENERATED_C_CODE
81095
static wuffs_base__empty_struct
81096
wuffs_webp__decoder__apply_transform_cross_color(
81097
    wuffs_webp__decoder* self,
81098
    wuffs_base__slice_u8 a_pix,
81099
    wuffs_base__slice_u8 a_tile_data);
81100
81101
WUFFS_BASE__GENERATED_C_CODE
81102
static wuffs_base__empty_struct
81103
wuffs_webp__decoder__apply_transform_subtract_green(
81104
    wuffs_webp__decoder* self,
81105
    wuffs_base__slice_u8 a_pix);
81106
81107
WUFFS_BASE__GENERATED_C_CODE
81108
static wuffs_base__empty_struct
81109
wuffs_webp__decoder__apply_transform_color_indexing(
81110
    wuffs_webp__decoder* self,
81111
    wuffs_base__slice_u8 a_pix);
81112
81113
WUFFS_BASE__GENERATED_C_CODE
81114
static wuffs_base__status
81115
wuffs_webp__decoder__do_decode_image_config(
81116
    wuffs_webp__decoder* self,
81117
    wuffs_base__image_config* a_dst,
81118
    wuffs_base__io_buffer* a_src);
81119
81120
WUFFS_BASE__GENERATED_C_CODE
81121
static wuffs_base__status
81122
wuffs_webp__decoder__do_decode_image_config_limited(
81123
    wuffs_webp__decoder* self,
81124
    wuffs_base__image_config* a_dst,
81125
    wuffs_base__io_buffer* a_src);
81126
81127
WUFFS_BASE__GENERATED_C_CODE
81128
static wuffs_base__status
81129
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
81130
    wuffs_webp__decoder* self,
81131
    wuffs_base__io_buffer* a_src);
81132
81133
WUFFS_BASE__GENERATED_C_CODE
81134
static wuffs_base__status
81135
wuffs_webp__decoder__do_decode_frame_config(
81136
    wuffs_webp__decoder* self,
81137
    wuffs_base__frame_config* a_dst,
81138
    wuffs_base__io_buffer* a_src);
81139
81140
WUFFS_BASE__GENERATED_C_CODE
81141
static wuffs_base__status
81142
wuffs_webp__decoder__do_decode_frame(
81143
    wuffs_webp__decoder* self,
81144
    wuffs_base__pixel_buffer* a_dst,
81145
    wuffs_base__io_buffer* a_src,
81146
    wuffs_base__pixel_blend a_blend,
81147
    wuffs_base__slice_u8 a_workbuf,
81148
    wuffs_base__decode_frame_options* a_opts);
81149
81150
WUFFS_BASE__GENERATED_C_CODE
81151
static wuffs_base__status
81152
wuffs_webp__decoder__decode_transform(
81153
    wuffs_webp__decoder* self,
81154
    wuffs_base__io_buffer* a_src,
81155
    wuffs_base__slice_u8 a_workbuf);
81156
81157
WUFFS_BASE__GENERATED_C_CODE
81158
static wuffs_base__status
81159
wuffs_webp__decoder__decode_color_cache_parameters(
81160
    wuffs_webp__decoder* self,
81161
    wuffs_base__io_buffer* a_src);
81162
81163
WUFFS_BASE__GENERATED_C_CODE
81164
static wuffs_base__status
81165
wuffs_webp__decoder__decode_hg_table(
81166
    wuffs_webp__decoder* self,
81167
    wuffs_base__io_buffer* a_src,
81168
    uint32_t a_width,
81169
    wuffs_base__slice_u8 a_workbuf);
81170
81171
WUFFS_BASE__GENERATED_C_CODE
81172
static wuffs_base__status
81173
wuffs_webp__decoder__decode_pixels(
81174
    wuffs_webp__decoder* self,
81175
    wuffs_base__slice_u8 a_dst,
81176
    wuffs_base__io_buffer* a_src,
81177
    uint32_t a_width,
81178
    uint32_t a_height,
81179
    wuffs_base__slice_u8 a_tile_data,
81180
    uint32_t a_tile_size_log2);
81181
81182
WUFFS_BASE__GENERATED_C_CODE
81183
static wuffs_base__status
81184
wuffs_webp__decoder__swizzle(
81185
    wuffs_webp__decoder* self,
81186
    wuffs_base__pixel_buffer* a_dst,
81187
    wuffs_base__slice_u8 a_src,
81188
    wuffs_base__pixel_blend a_blend);
81189
81190
// ---------------- VTables
81191
81192
const wuffs_base__image_decoder__func_ptrs
81193
wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder = {
81194
  (wuffs_base__status(*)(void*,
81195
      wuffs_base__pixel_buffer*,
81196
      wuffs_base__io_buffer*,
81197
      wuffs_base__pixel_blend,
81198
      wuffs_base__slice_u8,
81199
      wuffs_base__decode_frame_options*))(&wuffs_webp__decoder__decode_frame),
81200
  (wuffs_base__status(*)(void*,
81201
      wuffs_base__frame_config*,
81202
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_frame_config),
81203
  (wuffs_base__status(*)(void*,
81204
      wuffs_base__image_config*,
81205
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__decode_image_config),
81206
  (wuffs_base__rect_ie_u32(*)(const void*))(&wuffs_webp__decoder__frame_dirty_rect),
81207
  (uint64_t(*)(const void*,
81208
      uint32_t))(&wuffs_webp__decoder__get_quirk),
81209
  (uint32_t(*)(const void*))(&wuffs_webp__decoder__num_animation_loops),
81210
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frame_configs),
81211
  (uint64_t(*)(const void*))(&wuffs_webp__decoder__num_decoded_frames),
81212
  (wuffs_base__status(*)(void*,
81213
      uint64_t,
81214
      uint64_t))(&wuffs_webp__decoder__restart_frame),
81215
  (wuffs_base__status(*)(void*,
81216
      uint32_t,
81217
      uint64_t))(&wuffs_webp__decoder__set_quirk),
81218
  (wuffs_base__empty_struct(*)(void*,
81219
      uint32_t,
81220
      bool))(&wuffs_webp__decoder__set_report_metadata),
81221
  (wuffs_base__status(*)(void*,
81222
      wuffs_base__io_buffer*,
81223
      wuffs_base__more_information*,
81224
      wuffs_base__io_buffer*))(&wuffs_webp__decoder__tell_me_more),
81225
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_webp__decoder__workbuf_len),
81226
};
81227
81228
// ---------------- Initializer Implementations
81229
81230
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
81231
wuffs_webp__decoder__initialize(
81232
    wuffs_webp__decoder* self,
81233
    size_t sizeof_star_self,
81234
    uint64_t wuffs_version,
81235
    uint32_t options){
81236
  if (!self) {
81237
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
81238
  }
81239
  if (sizeof(*self) != sizeof_star_self) {
81240
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
81241
  }
81242
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
81243
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
81244
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
81245
  }
81246
81247
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
81248
    // The whole point of this if-check is to detect an uninitialized *self.
81249
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
81250
#if !defined(__clang__) && defined(__GNUC__)
81251
#pragma GCC diagnostic push
81252
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
81253
#endif
81254
    if (self->private_impl.magic != 0) {
81255
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
81256
    }
81257
#if !defined(__clang__) && defined(__GNUC__)
81258
#pragma GCC diagnostic pop
81259
#endif
81260
  } else {
81261
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
81262
      memset(self, 0, sizeof(*self));
81263
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
81264
    } else {
81265
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
81266
    }
81267
  }
81268
81269
  {
81270
    wuffs_base__status z = wuffs_vp8__decoder__initialize(
81271
        &self->private_data.f_vp8, sizeof(self->private_data.f_vp8), WUFFS_VERSION, options);
81272
    if (z.repr) {
81273
      return z;
81274
    }
81275
  }
81276
  self->private_impl.magic = WUFFS_BASE__MAGIC;
81277
  self->private_impl.vtable_for__wuffs_base__image_decoder.vtable_name =
81278
      wuffs_base__image_decoder__vtable_name;
81279
  self->private_impl.vtable_for__wuffs_base__image_decoder.function_pointers =
81280
      (const void*)(&wuffs_webp__decoder__func_ptrs_for__wuffs_base__image_decoder);
81281
  return wuffs_base__make_status(NULL);
81282
}
81283
81284
wuffs_webp__decoder*
81285
wuffs_webp__decoder__alloc(void) {
81286
  wuffs_webp__decoder* x =
81287
      (wuffs_webp__decoder*)(calloc(1, sizeof(wuffs_webp__decoder)));
81288
  if (!x) {
81289
    return NULL;
81290
  }
81291
  if (wuffs_webp__decoder__initialize(
81292
      x, sizeof(wuffs_webp__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
81293
    free(x);
81294
    return NULL;
81295
  }
81296
  return x;
81297
}
81298
81299
size_t
81300
sizeof__wuffs_webp__decoder(void) {
81301
  return sizeof(wuffs_webp__decoder);
81302
}
81303
81304
// ---------------- Function Implementations
81305
81306
// -------- func webp.decoder.decode_huffman_groups
81307
81308
WUFFS_BASE__GENERATED_C_CODE
81309
static wuffs_base__status
81310
wuffs_webp__decoder__decode_huffman_groups(
81311
    wuffs_webp__decoder* self,
81312
    wuffs_base__io_buffer* a_src,
81313
    uint32_t a_n_huffman_groups) {
81314
  wuffs_base__status status = wuffs_base__make_status(NULL);
81315
81316
  uint32_t v_hg = 0;
81317
  uint32_t v_ht = 0;
81318
81319
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_groups;
81320
  if (coro_susp_point) {
81321
    v_hg = self->private_data.s_decode_huffman_groups.v_hg;
81322
    v_ht = self->private_data.s_decode_huffman_groups.v_ht;
81323
  }
81324
  switch (coro_susp_point) {
81325
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81326
81327
    v_hg = 0u;
81328
    while (v_hg < a_n_huffman_groups) {
81329
      v_ht = 0u;
81330
      while (v_ht < 5u) {
81331
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81332
        status = wuffs_webp__decoder__decode_huffman_tree(self, a_src, v_hg, v_ht);
81333
        if (status.repr) {
81334
          goto suspend;
81335
        }
81336
        v_ht += 1u;
81337
      }
81338
      v_hg += 1u;
81339
    }
81340
81341
    goto ok;
81342
    ok:
81343
    self->private_impl.p_decode_huffman_groups = 0;
81344
    goto exit;
81345
  }
81346
81347
  goto suspend;
81348
  suspend:
81349
  self->private_impl.p_decode_huffman_groups = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81350
  self->private_data.s_decode_huffman_groups.v_hg = v_hg;
81351
  self->private_data.s_decode_huffman_groups.v_ht = v_ht;
81352
81353
  goto exit;
81354
  exit:
81355
  return status;
81356
}
81357
81358
// -------- func webp.decoder.decode_huffman_tree
81359
81360
WUFFS_BASE__GENERATED_C_CODE
81361
static wuffs_base__status
81362
wuffs_webp__decoder__decode_huffman_tree(
81363
    wuffs_webp__decoder* self,
81364
    wuffs_base__io_buffer* a_src,
81365
    uint32_t a_hg,
81366
    uint32_t a_ht) {
81367
  wuffs_base__status status = wuffs_base__make_status(NULL);
81368
81369
  uint8_t v_c8 = 0;
81370
  uint32_t v_use_simple = 0;
81371
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
81372
81373
  const uint8_t* iop_a_src = NULL;
81374
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81375
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81376
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81377
  if (a_src && a_src->data.ptr) {
81378
    io0_a_src = a_src->data.ptr;
81379
    io1_a_src = io0_a_src + a_src->meta.ri;
81380
    iop_a_src = io1_a_src;
81381
    io2_a_src = io0_a_src + a_src->meta.wi;
81382
  }
81383
81384
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree;
81385
  switch (coro_susp_point) {
81386
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81387
81388
    if (a_ht >= 4u) {
81389
      self->private_impl.f_ht_n_symbols = 40u;
81390
    } else if (a_ht > 0u) {
81391
      self->private_impl.f_ht_n_symbols = 256u;
81392
    } else if (self->private_impl.f_color_cache_bits == 0u) {
81393
      self->private_impl.f_ht_n_symbols = 280u;
81394
    } else {
81395
      self->private_impl.f_ht_n_symbols = (280u + (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits));
81396
    }
81397
    if (self->private_impl.f_n_bits < 1u) {
81398
      {
81399
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81400
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81401
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81402
          goto suspend;
81403
        }
81404
        uint8_t t_0 = *iop_a_src++;
81405
        v_c8 = t_0;
81406
      }
81407
      self->private_impl.f_bits = ((uint32_t)(v_c8));
81408
      self->private_impl.f_n_bits = 8u;
81409
    }
81410
    v_use_simple = (self->private_impl.f_bits & 1u);
81411
    self->private_impl.f_bits >>= 1u;
81412
    self->private_impl.f_n_bits -= 1u;
81413
    if (v_use_simple != 0u) {
81414
      if (a_src) {
81415
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81416
      }
81417
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81418
      status = wuffs_webp__decoder__decode_huffman_tree_simple(self, a_src, a_hg, a_ht);
81419
      if (a_src) {
81420
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81421
      }
81422
      if (status.repr) {
81423
        goto suspend;
81424
      }
81425
    } else {
81426
      if (a_src) {
81427
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81428
      }
81429
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81430
      status = wuffs_webp__decoder__decode_code_length_code_lengths(self, a_src);
81431
      if (a_src) {
81432
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81433
      }
81434
      if (status.repr) {
81435
        goto suspend;
81436
      }
81437
      v_status = wuffs_webp__decoder__build_code_lengths_huffman_nodes(self);
81438
      if ( ! wuffs_base__status__is_ok(&v_status)) {
81439
        status = v_status;
81440
        if (wuffs_base__status__is_error(&status)) {
81441
          goto exit;
81442
        } else if (wuffs_base__status__is_suspension(&status)) {
81443
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81444
          goto exit;
81445
        }
81446
        goto ok;
81447
      }
81448
      if (a_src) {
81449
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81450
      }
81451
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
81452
      status = wuffs_webp__decoder__build_code_lengths(self, a_src);
81453
      if (a_src) {
81454
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
81455
      }
81456
      if (status.repr) {
81457
        goto suspend;
81458
      }
81459
      v_status = wuffs_webp__decoder__build_huffman_nodes(self, a_hg, a_ht);
81460
      if ( ! wuffs_base__status__is_ok(&v_status)) {
81461
        status = v_status;
81462
        if (wuffs_base__status__is_error(&status)) {
81463
          goto exit;
81464
        } else if (wuffs_base__status__is_suspension(&status)) {
81465
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
81466
          goto exit;
81467
        }
81468
        goto ok;
81469
      }
81470
    }
81471
81472
    ok:
81473
    self->private_impl.p_decode_huffman_tree = 0;
81474
    goto exit;
81475
  }
81476
81477
  goto suspend;
81478
  suspend:
81479
  self->private_impl.p_decode_huffman_tree = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81480
81481
  goto exit;
81482
  exit:
81483
  if (a_src && a_src->data.ptr) {
81484
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81485
  }
81486
81487
  return status;
81488
}
81489
81490
// -------- func webp.decoder.decode_huffman_tree_simple
81491
81492
WUFFS_BASE__GENERATED_C_CODE
81493
static wuffs_base__status
81494
wuffs_webp__decoder__decode_huffman_tree_simple(
81495
    wuffs_webp__decoder* self,
81496
    wuffs_base__io_buffer* a_src,
81497
    uint32_t a_hg,
81498
    uint32_t a_ht) {
81499
  wuffs_base__status status = wuffs_base__make_status(NULL);
81500
81501
  uint8_t v_c8 = 0;
81502
  uint32_t v_use_second_symbol = 0;
81503
  uint32_t v_first_symbol_n_bits = 0;
81504
  uint32_t v_symbol0 = 0;
81505
  uint32_t v_symbol1 = 0;
81506
  uint32_t v_base_offset = 0;
81507
81508
  const uint8_t* iop_a_src = NULL;
81509
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81510
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81511
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81512
  if (a_src && a_src->data.ptr) {
81513
    io0_a_src = a_src->data.ptr;
81514
    io1_a_src = io0_a_src + a_src->meta.ri;
81515
    iop_a_src = io1_a_src;
81516
    io2_a_src = io0_a_src + a_src->meta.wi;
81517
  }
81518
81519
  uint32_t coro_susp_point = self->private_impl.p_decode_huffman_tree_simple;
81520
  if (coro_susp_point) {
81521
    v_use_second_symbol = self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol;
81522
    v_first_symbol_n_bits = self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits;
81523
    v_symbol0 = self->private_data.s_decode_huffman_tree_simple.v_symbol0;
81524
    v_base_offset = self->private_data.s_decode_huffman_tree_simple.v_base_offset;
81525
  }
81526
  switch (coro_susp_point) {
81527
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81528
81529
    if (self->private_impl.f_n_bits < 2u) {
81530
      {
81531
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81532
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81533
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81534
          goto suspend;
81535
        }
81536
        uint8_t t_0 = *iop_a_src++;
81537
        v_c8 = t_0;
81538
      }
81539
      if (self->private_impl.f_n_bits >= 2u) {
81540
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81541
        goto exit;
81542
      }
81543
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81544
      self->private_impl.f_n_bits += 8u;
81545
    }
81546
    v_use_second_symbol = (self->private_impl.f_bits & 1u);
81547
    v_first_symbol_n_bits = ((((self->private_impl.f_bits & 2u) >> 1u) * 7u) + 1u);
81548
    self->private_impl.f_bits >>= 2u;
81549
    self->private_impl.f_n_bits -= 2u;
81550
    if (self->private_impl.f_n_bits < v_first_symbol_n_bits) {
81551
      {
81552
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81553
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81554
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81555
          goto suspend;
81556
        }
81557
        uint8_t t_1 = *iop_a_src++;
81558
        v_c8 = t_1;
81559
      }
81560
      if (self->private_impl.f_n_bits >= v_first_symbol_n_bits) {
81561
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81562
        goto exit;
81563
      }
81564
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81565
      self->private_impl.f_n_bits += 8u;
81566
    }
81567
    v_symbol0 = (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_first_symbol_n_bits) - 1u));
81568
    self->private_impl.f_bits >>= v_first_symbol_n_bits;
81569
    self->private_impl.f_n_bits -= v_first_symbol_n_bits;
81570
    v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
81571
    if (v_use_second_symbol != 0u) {
81572
      if (self->private_impl.f_n_bits < 8u) {
81573
        {
81574
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81575
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81576
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81577
            goto suspend;
81578
          }
81579
          uint8_t t_2 = *iop_a_src++;
81580
          v_c8 = t_2;
81581
        }
81582
        if (self->private_impl.f_n_bits >= 8u) {
81583
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81584
          goto exit;
81585
        }
81586
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81587
        self->private_impl.f_n_bits += 8u;
81588
      }
81589
      v_symbol1 = (self->private_impl.f_bits & 255u);
81590
      self->private_impl.f_bits >>= 8u;
81591
      self->private_impl.f_n_bits -= 8u;
81592
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 0u)] = ((uint16_t)((v_base_offset + 1u)));
81593
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 1u)] = ((uint16_t)((v_symbol0 | 32768u)));
81594
      self->private_data.f_huffman_nodes[a_hg][(v_base_offset + 2u)] = ((uint16_t)((v_symbol1 | 32768u)));
81595
    } else {
81596
      self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_symbol0 | 32768u)));
81597
    }
81598
81599
    goto ok;
81600
    ok:
81601
    self->private_impl.p_decode_huffman_tree_simple = 0;
81602
    goto exit;
81603
  }
81604
81605
  goto suspend;
81606
  suspend:
81607
  self->private_impl.p_decode_huffman_tree_simple = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81608
  self->private_data.s_decode_huffman_tree_simple.v_use_second_symbol = v_use_second_symbol;
81609
  self->private_data.s_decode_huffman_tree_simple.v_first_symbol_n_bits = v_first_symbol_n_bits;
81610
  self->private_data.s_decode_huffman_tree_simple.v_symbol0 = v_symbol0;
81611
  self->private_data.s_decode_huffman_tree_simple.v_base_offset = v_base_offset;
81612
81613
  goto exit;
81614
  exit:
81615
  if (a_src && a_src->data.ptr) {
81616
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81617
  }
81618
81619
  return status;
81620
}
81621
81622
// -------- func webp.decoder.decode_code_length_code_lengths
81623
81624
WUFFS_BASE__GENERATED_C_CODE
81625
static wuffs_base__status
81626
wuffs_webp__decoder__decode_code_length_code_lengths(
81627
    wuffs_webp__decoder* self,
81628
    wuffs_base__io_buffer* a_src) {
81629
  wuffs_base__status status = wuffs_base__make_status(NULL);
81630
81631
  uint8_t v_c8 = 0;
81632
  uint32_t v_n_codes = 0;
81633
  uint32_t v_i = 0;
81634
81635
  const uint8_t* iop_a_src = NULL;
81636
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81637
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81638
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81639
  if (a_src && a_src->data.ptr) {
81640
    io0_a_src = a_src->data.ptr;
81641
    io1_a_src = io0_a_src + a_src->meta.ri;
81642
    iop_a_src = io1_a_src;
81643
    io2_a_src = io0_a_src + a_src->meta.wi;
81644
  }
81645
81646
  uint32_t coro_susp_point = self->private_impl.p_decode_code_length_code_lengths;
81647
  if (coro_susp_point) {
81648
    v_n_codes = self->private_data.s_decode_code_length_code_lengths.v_n_codes;
81649
    v_i = self->private_data.s_decode_code_length_code_lengths.v_i;
81650
  }
81651
  switch (coro_susp_point) {
81652
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81653
81654
    if (self->private_impl.f_n_bits < 4u) {
81655
      {
81656
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81657
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81658
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81659
          goto suspend;
81660
        }
81661
        uint8_t t_0 = *iop_a_src++;
81662
        v_c8 = t_0;
81663
      }
81664
      if (self->private_impl.f_n_bits >= 4u) {
81665
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81666
        goto exit;
81667
      }
81668
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81669
      self->private_impl.f_n_bits += 8u;
81670
    }
81671
    v_n_codes = ((self->private_impl.f_bits & 15u) + 4u);
81672
    self->private_impl.f_bits >>= 4u;
81673
    self->private_impl.f_n_bits -= 4u;
81674
    v_i = 0u;
81675
    while (v_i < v_n_codes) {
81676
      if (self->private_impl.f_n_bits < 3u) {
81677
        {
81678
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81679
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81680
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81681
            goto suspend;
81682
          }
81683
          uint8_t t_1 = *iop_a_src++;
81684
          v_c8 = t_1;
81685
        }
81686
        if (self->private_impl.f_n_bits >= 3u) {
81687
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81688
          goto exit;
81689
        }
81690
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81691
        self->private_impl.f_n_bits += 8u;
81692
      }
81693
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = ((uint8_t)((self->private_impl.f_bits & 7u)));
81694
      self->private_impl.f_bits >>= 3u;
81695
      self->private_impl.f_n_bits -= 3u;
81696
      v_i += 1u;
81697
    }
81698
    while (v_i < 19u) {
81699
      self->private_impl.f_code_length_code_lengths[WUFFS_WEBP__CODE_LENGTH_CODE_ORDER[v_i]] = 0u;
81700
      v_i += 1u;
81701
    }
81702
81703
    goto ok;
81704
    ok:
81705
    self->private_impl.p_decode_code_length_code_lengths = 0;
81706
    goto exit;
81707
  }
81708
81709
  goto suspend;
81710
  suspend:
81711
  self->private_impl.p_decode_code_length_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
81712
  self->private_data.s_decode_code_length_code_lengths.v_n_codes = v_n_codes;
81713
  self->private_data.s_decode_code_length_code_lengths.v_i = v_i;
81714
81715
  goto exit;
81716
  exit:
81717
  if (a_src && a_src->data.ptr) {
81718
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
81719
  }
81720
81721
  return status;
81722
}
81723
81724
// -------- func webp.decoder.build_code_lengths_huffman_nodes
81725
81726
WUFFS_BASE__GENERATED_C_CODE
81727
static wuffs_base__status
81728
wuffs_webp__decoder__build_code_lengths_huffman_nodes(
81729
    wuffs_webp__decoder* self) {
81730
  uint32_t v_code_bits = 0;
81731
  uint32_t v_code_len = 0;
81732
  uint32_t v_symbol = 0;
81733
  uint32_t v_histogram[8] = {0};
81734
  uint32_t v_n_used_symbols = 0;
81735
  uint32_t v_last_used_symbol = 0;
81736
  uint32_t v_subscription_weight = 0;
81737
  uint32_t v_subscription_total = 0;
81738
  uint32_t v_curr_code = 0;
81739
  uint32_t v_next_codes[9] = {0};
81740
  uint32_t v_n_branches = 0;
81741
  uint32_t v_h = 0;
81742
  uint32_t v_children = 0;
81743
  uint16_t v_node = 0;
81744
81745
  v_symbol = 0u;
81746
  while (v_symbol < 19u) {
81747
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
81748
    if (v_code_len != 0u) {
81749
      v_histogram[v_code_len] += 1u;
81750
      v_n_used_symbols += 1u;
81751
      v_last_used_symbol = v_symbol;
81752
    }
81753
    v_symbol += 1u;
81754
  }
81755
  if (v_n_used_symbols < 1u) {
81756
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
81757
  } else if (v_n_used_symbols == 1u) {
81758
    self->private_data.f_code_lengths_huffman_nodes[0u] = ((uint16_t)((v_last_used_symbol | 32768u)));
81759
    return wuffs_base__make_status(NULL);
81760
  }
81761
  v_subscription_weight = 16384u;
81762
  v_code_len = 1u;
81763
  while (true) {
81764
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
81765
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
81766
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
81767
    v_subscription_weight >>= 1u;
81768
    if (v_code_len >= 7u) {
81769
      break;
81770
    }
81771
    v_code_len += 1u;
81772
  }
81773
  if (v_subscription_total > 32768u) {
81774
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
81775
  } else if (v_subscription_total < 32768u) {
81776
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
81777
  }
81778
  self->private_data.f_code_lengths_huffman_nodes[0u] = 0u;
81779
  v_symbol = 0u;
81780
  while (v_symbol < 19u) {
81781
    v_code_len = ((uint32_t)(self->private_impl.f_code_length_code_lengths[v_symbol]));
81782
    if (v_code_len > 0u) {
81783
      v_code_bits = v_next_codes[v_code_len];
81784
      v_next_codes[v_code_len] += 1u;
81785
      v_code_bits <<= (32u - v_code_len);
81786
      v_h = 0u;
81787
      while (v_code_len > 0u) {
81788
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
81789
        if (v_node == 0u) {
81790
          v_children = ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))));
81791
          v_children = wuffs_base__u32__min(v_children, 35u);
81792
          self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)(v_children));
81793
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 0u)] = 0u;
81794
          self->private_data.f_code_lengths_huffman_nodes[(v_children + 1u)] = 0u;
81795
          v_h = (v_children + (v_code_bits >> 31u));
81796
          v_n_branches += 1u;
81797
        } else {
81798
          v_children = ((uint32_t)(v_node));
81799
          v_h = (wuffs_base__u32__min(v_children, 35u) + (v_code_bits >> 31u));
81800
        }
81801
        v_code_bits <<= 1u;
81802
        v_code_len -= 1u;
81803
      }
81804
      self->private_data.f_code_lengths_huffman_nodes[v_h] = ((uint16_t)((v_symbol | 32768u)));
81805
    }
81806
    v_symbol += 1u;
81807
  }
81808
  return wuffs_base__make_status(NULL);
81809
}
81810
81811
// -------- func webp.decoder.build_huffman_nodes
81812
81813
WUFFS_BASE__GENERATED_C_CODE
81814
static wuffs_base__status
81815
wuffs_webp__decoder__build_huffman_nodes(
81816
    wuffs_webp__decoder* self,
81817
    uint32_t a_hg,
81818
    uint32_t a_ht) {
81819
  uint32_t v_base_offset = 0;
81820
  uint32_t v_code_bits = 0;
81821
  uint32_t v_code_len = 0;
81822
  uint32_t v_symbol = 0;
81823
  uint32_t v_histogram[16] = {0};
81824
  uint32_t v_n_used_symbols = 0;
81825
  uint32_t v_last_used_symbol = 0;
81826
  uint32_t v_subscription_weight = 0;
81827
  uint32_t v_subscription_total = 0;
81828
  uint32_t v_curr_code = 0;
81829
  uint32_t v_next_codes[17] = {0};
81830
  uint32_t v_n_branches = 0;
81831
  uint32_t v_h = 0;
81832
  uint32_t v_children = 0;
81833
  uint16_t v_node = 0;
81834
81835
  v_base_offset = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[a_ht]));
81836
  v_symbol = 0u;
81837
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
81838
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
81839
    if (v_code_len != 0u) {
81840
      v_histogram[v_code_len] += 1u;
81841
      v_n_used_symbols += 1u;
81842
      v_last_used_symbol = v_symbol;
81843
    }
81844
    v_symbol += 1u;
81845
  }
81846
  if (v_n_used_symbols < 1u) {
81847
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
81848
  } else if (v_n_used_symbols == 1u) {
81849
    self->private_data.f_huffman_nodes[a_hg][v_base_offset] = ((uint16_t)((v_last_used_symbol | 32768u)));
81850
    return wuffs_base__make_status(NULL);
81851
  }
81852
  v_subscription_weight = 16384u;
81853
  v_code_len = 1u;
81854
  while (true) {
81855
    v_curr_code = ((uint32_t)(((uint32_t)(v_curr_code + v_histogram[v_code_len])) << 1u));
81856
    v_next_codes[(v_code_len + 1u)] = v_curr_code;
81857
    v_subscription_total += ((uint32_t)(v_subscription_weight * v_histogram[v_code_len]));
81858
    v_subscription_weight >>= 1u;
81859
    if (v_code_len >= 15u) {
81860
      break;
81861
    }
81862
    v_code_len += 1u;
81863
  }
81864
  if (v_subscription_total > 32768u) {
81865
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_over_subscribed);
81866
  } else if (v_subscription_total < 32768u) {
81867
    return wuffs_base__make_status(wuffs_webp__error__bad_huffman_code_under_subscribed);
81868
  }
81869
  self->private_data.f_huffman_nodes[a_hg][v_base_offset] = 0u;
81870
  v_symbol = 0u;
81871
  while (v_symbol < self->private_impl.f_ht_n_symbols) {
81872
    v_code_len = ((uint32_t)(((uint16_t)(self->private_data.f_code_lengths[v_symbol] & 15u))));
81873
    if (v_code_len != 0u) {
81874
      v_code_bits = v_next_codes[v_code_len];
81875
      v_next_codes[v_code_len] += 1u;
81876
      v_code_bits <<= (32u - v_code_len);
81877
      v_h = v_base_offset;
81878
      while (v_code_len > 0u) {
81879
        v_node = self->private_data.f_huffman_nodes[a_hg][v_h];
81880
        if (v_node == 0u) {
81881
          v_children = ((uint32_t)(v_base_offset + ((uint32_t)(1u + ((uint32_t)(2u * v_n_branches))))));
81882
          v_children = wuffs_base__u32__min(v_children, 6265u);
81883
          self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)(v_children));
81884
          self->private_data.f_huffman_nodes[a_hg][(v_children + 0u)] = 0u;
81885
          self->private_data.f_huffman_nodes[a_hg][(v_children + 1u)] = 0u;
81886
          v_h = (v_children + (v_code_bits >> 31u));
81887
          v_n_branches += 1u;
81888
        } else {
81889
          v_children = ((uint32_t)(v_node));
81890
          v_h = (wuffs_base__u32__min(v_children, 6265u) + (v_code_bits >> 31u));
81891
        }
81892
        v_code_bits <<= 1u;
81893
        v_code_len -= 1u;
81894
      }
81895
      self->private_data.f_huffman_nodes[a_hg][v_h] = ((uint16_t)((v_symbol | 32768u)));
81896
    }
81897
    v_symbol += 1u;
81898
  }
81899
  return wuffs_base__make_status(NULL);
81900
}
81901
81902
// -------- func webp.decoder.build_code_lengths
81903
81904
WUFFS_BASE__GENERATED_C_CODE
81905
static wuffs_base__status
81906
wuffs_webp__decoder__build_code_lengths(
81907
    wuffs_webp__decoder* self,
81908
    wuffs_base__io_buffer* a_src) {
81909
  wuffs_base__status status = wuffs_base__make_status(NULL);
81910
81911
  uint8_t v_c8 = 0;
81912
  uint32_t v_use_length = 0;
81913
  uint32_t v_length_n_bits = 0;
81914
  uint32_t v_length = 0;
81915
  uint16_t v_prev_code_length = 0;
81916
  uint32_t v_h = 0;
81917
  uint32_t v_s = 0;
81918
  uint32_t v_s_max = 0;
81919
  uint16_t v_node = 0;
81920
  uint32_t v_symbol = 0;
81921
  uint16_t v_repeat_value = 0;
81922
  uint32_t v_repeat_n_bits = 0;
81923
81924
  const uint8_t* iop_a_src = NULL;
81925
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81926
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81927
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
81928
  if (a_src && a_src->data.ptr) {
81929
    io0_a_src = a_src->data.ptr;
81930
    io1_a_src = io0_a_src + a_src->meta.ri;
81931
    iop_a_src = io1_a_src;
81932
    io2_a_src = io0_a_src + a_src->meta.wi;
81933
  }
81934
81935
  uint32_t coro_susp_point = self->private_impl.p_build_code_lengths;
81936
  if (coro_susp_point) {
81937
    v_length_n_bits = self->private_data.s_build_code_lengths.v_length_n_bits;
81938
    v_prev_code_length = self->private_data.s_build_code_lengths.v_prev_code_length;
81939
    v_s = self->private_data.s_build_code_lengths.v_s;
81940
    v_s_max = self->private_data.s_build_code_lengths.v_s_max;
81941
    v_node = self->private_data.s_build_code_lengths.v_node;
81942
    v_repeat_value = self->private_data.s_build_code_lengths.v_repeat_value;
81943
    v_repeat_n_bits = self->private_data.s_build_code_lengths.v_repeat_n_bits;
81944
  }
81945
  switch (coro_susp_point) {
81946
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
81947
81948
    if (self->private_impl.f_n_bits < 1u) {
81949
      {
81950
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
81951
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81952
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81953
          goto suspend;
81954
        }
81955
        uint8_t t_0 = *iop_a_src++;
81956
        v_c8 = t_0;
81957
      }
81958
      self->private_impl.f_bits = ((uint32_t)(v_c8));
81959
      self->private_impl.f_n_bits = 8u;
81960
    }
81961
    v_use_length = (self->private_impl.f_bits & 1u);
81962
    self->private_impl.f_bits >>= 1u;
81963
    self->private_impl.f_n_bits -= 1u;
81964
    self->private_impl.f_ht_code_lengths_remaining = self->private_impl.f_ht_n_symbols;
81965
    if (v_use_length != 0u) {
81966
      if (self->private_impl.f_n_bits < 3u) {
81967
        {
81968
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
81969
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81970
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81971
            goto suspend;
81972
          }
81973
          uint8_t t_1 = *iop_a_src++;
81974
          v_c8 = t_1;
81975
        }
81976
        if (self->private_impl.f_n_bits >= 3u) {
81977
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81978
          goto exit;
81979
        }
81980
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
81981
        self->private_impl.f_n_bits += 8u;
81982
      }
81983
      v_length_n_bits = (((self->private_impl.f_bits & 7u) * 2u) + 2u);
81984
      self->private_impl.f_bits >>= 3u;
81985
      self->private_impl.f_n_bits -= 3u;
81986
      while (self->private_impl.f_n_bits < v_length_n_bits) {
81987
        {
81988
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
81989
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
81990
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
81991
            goto suspend;
81992
          }
81993
          uint8_t t_2 = *iop_a_src++;
81994
          v_c8 = t_2;
81995
        }
81996
        if (self->private_impl.f_n_bits >= v_length_n_bits) {
81997
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
81998
          goto exit;
81999
        }
82000
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82001
        self->private_impl.f_n_bits += 8u;
82002
      }
82003
      v_length = ((self->private_impl.f_bits & ((((uint32_t)(1u)) << v_length_n_bits) - 1u)) + 2u);
82004
      self->private_impl.f_bits >>= v_length_n_bits;
82005
      self->private_impl.f_n_bits -= v_length_n_bits;
82006
      if (v_length > self->private_impl.f_ht_n_symbols) {
82007
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
82008
        goto exit;
82009
      }
82010
      self->private_impl.f_ht_code_lengths_remaining = v_length;
82011
    }
82012
    v_prev_code_length = 8u;
82013
    while (v_s < self->private_impl.f_ht_n_symbols) {
82014
      if (self->private_impl.f_ht_code_lengths_remaining <= 0u) {
82015
        while (v_s < self->private_impl.f_ht_n_symbols) {
82016
          self->private_data.f_code_lengths[v_s] = 0u;
82017
          v_s += 1u;
82018
        }
82019
        break;
82020
      }
82021
      self->private_impl.f_ht_code_lengths_remaining -= 1u;
82022
      v_h = 0u;
82023
      while (true) {
82024
        v_node = self->private_data.f_code_lengths_huffman_nodes[v_h];
82025
        if (v_node >= 32768u) {
82026
          break;
82027
        } else if (v_node > 35u) {
82028
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
82029
          goto exit;
82030
        }
82031
        if (self->private_impl.f_n_bits < 1u) {
82032
          {
82033
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
82034
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82035
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82036
              goto suspend;
82037
            }
82038
            uint8_t t_3 = *iop_a_src++;
82039
            v_c8 = t_3;
82040
          }
82041
          self->private_impl.f_bits = ((uint32_t)(v_c8));
82042
          self->private_impl.f_n_bits = 8u;
82043
        }
82044
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
82045
        self->private_impl.f_bits >>= 1u;
82046
        self->private_impl.f_n_bits -= 1u;
82047
      }
82048
      v_symbol = ((uint32_t)(((uint16_t)(v_node & 32767u))));
82049
      if (v_symbol == 0u) {
82050
        self->private_data.f_code_lengths[v_s] = 0u;
82051
        v_s += 1u;
82052
        continue;
82053
      } else if (v_symbol < 16u) {
82054
        v_prev_code_length = ((uint16_t)(v_symbol));
82055
        self->private_data.f_code_lengths[v_s] = v_prev_code_length;
82056
        v_s += 1u;
82057
        continue;
82058
      } else if (v_symbol == 16u) {
82059
        v_repeat_value = v_prev_code_length;
82060
      } else {
82061
        v_repeat_value = 0u;
82062
      }
82063
      v_repeat_n_bits = ((uint32_t)(WUFFS_WEBP__REPEAT_N_BITS[(v_symbol & 3u)]));
82064
      v_s_max = ((uint32_t)(((uint32_t)(WUFFS_WEBP__REPEAT_COUNTS[(v_symbol & 3u)])) + v_s));
82065
      if (self->private_impl.f_n_bits < v_repeat_n_bits) {
82066
        {
82067
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
82068
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82069
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82070
            goto suspend;
82071
          }
82072
          uint8_t t_4 = *iop_a_src++;
82073
          v_c8 = t_4;
82074
        }
82075
        if (self->private_impl.f_n_bits >= v_repeat_n_bits) {
82076
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82077
          goto exit;
82078
        }
82079
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82080
        self->private_impl.f_n_bits += 8u;
82081
      }
82082
      v_s_max += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_repeat_n_bits) - 1u));
82083
      self->private_impl.f_bits >>= v_repeat_n_bits;
82084
      self->private_impl.f_n_bits -= v_repeat_n_bits;
82085
      if (v_s_max > self->private_impl.f_ht_n_symbols) {
82086
        status = wuffs_base__make_status(wuffs_webp__error__bad_huffman_code);
82087
        goto exit;
82088
      }
82089
      while (v_s < v_s_max) {
82090
        self->private_data.f_code_lengths[v_s] = v_repeat_value;
82091
        v_s += 1u;
82092
      }
82093
    }
82094
82095
    goto ok;
82096
    ok:
82097
    self->private_impl.p_build_code_lengths = 0;
82098
    goto exit;
82099
  }
82100
82101
  goto suspend;
82102
  suspend:
82103
  self->private_impl.p_build_code_lengths = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82104
  self->private_data.s_build_code_lengths.v_length_n_bits = v_length_n_bits;
82105
  self->private_data.s_build_code_lengths.v_prev_code_length = v_prev_code_length;
82106
  self->private_data.s_build_code_lengths.v_s = v_s;
82107
  self->private_data.s_build_code_lengths.v_s_max = v_s_max;
82108
  self->private_data.s_build_code_lengths.v_node = v_node;
82109
  self->private_data.s_build_code_lengths.v_repeat_value = v_repeat_value;
82110
  self->private_data.s_build_code_lengths.v_repeat_n_bits = v_repeat_n_bits;
82111
82112
  goto exit;
82113
  exit:
82114
  if (a_src && a_src->data.ptr) {
82115
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82116
  }
82117
82118
  return status;
82119
}
82120
82121
// -------- func webp.decoder.decode_pixels_slow
82122
82123
WUFFS_BASE__GENERATED_C_CODE
82124
static wuffs_base__status
82125
wuffs_webp__decoder__decode_pixels_slow(
82126
    wuffs_webp__decoder* self,
82127
    wuffs_base__slice_u8 a_dst,
82128
    wuffs_base__io_buffer* a_src,
82129
    uint32_t a_width,
82130
    uint32_t a_height,
82131
    wuffs_base__slice_u8 a_tile_data,
82132
    uint32_t a_tile_size_log2) {
82133
  wuffs_base__status status = wuffs_base__make_status(NULL);
82134
82135
  uint8_t v_c8 = 0;
82136
  uint64_t v_p = 0;
82137
  uint64_t v_p_max = 0;
82138
  uint32_t v_tile_size_log2 = 0;
82139
  uint32_t v_width_in_tiles = 0;
82140
  uint32_t v_x = 0;
82141
  uint32_t v_y = 0;
82142
  uint32_t v_i = 0;
82143
  uint32_t v_hg = 0;
82144
  uint32_t v_h = 0;
82145
  uint16_t v_node = 0;
82146
  uint32_t v_pixel_g = 0;
82147
  uint32_t v_color = 0;
82148
  wuffs_base__slice_u8 v_dst_pixel = {0};
82149
  uint32_t v_back_ref_len_n_bits = 0;
82150
  uint32_t v_back_ref_len_minus_1 = 0;
82151
  uint32_t v_back_ref_dist_n_bits = 0;
82152
  uint32_t v_back_ref_dist_sym = 0;
82153
  uint32_t v_back_ref_dist_premap_minus_1 = 0;
82154
  uint32_t v_back_ref_dist_minus_1 = 0;
82155
  uint32_t v_dm = 0;
82156
  uint32_t v_dx = 0;
82157
  uint32_t v_dy = 0;
82158
  uint64_t v_p_end = 0;
82159
  uint64_t v_dist4 = 0;
82160
  uint64_t v_q = 0;
82161
  wuffs_base__slice_u8 v_color_cache_pixels = {0};
82162
  uint64_t v_color_cache_p = 0;
82163
  uint32_t v_color_cache_shift = 0;
82164
82165
  const uint8_t* iop_a_src = NULL;
82166
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82167
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82168
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
82169
  if (a_src && a_src->data.ptr) {
82170
    io0_a_src = a_src->data.ptr;
82171
    io1_a_src = io0_a_src + a_src->meta.ri;
82172
    iop_a_src = io1_a_src;
82173
    io2_a_src = io0_a_src + a_src->meta.wi;
82174
  }
82175
82176
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels_slow;
82177
  if (coro_susp_point) {
82178
    v_p = self->private_data.s_decode_pixels_slow.v_p;
82179
    v_p_max = self->private_data.s_decode_pixels_slow.v_p_max;
82180
    v_tile_size_log2 = self->private_data.s_decode_pixels_slow.v_tile_size_log2;
82181
    v_width_in_tiles = self->private_data.s_decode_pixels_slow.v_width_in_tiles;
82182
    v_x = self->private_data.s_decode_pixels_slow.v_x;
82183
    v_y = self->private_data.s_decode_pixels_slow.v_y;
82184
    v_hg = self->private_data.s_decode_pixels_slow.v_hg;
82185
    v_node = self->private_data.s_decode_pixels_slow.v_node;
82186
    v_color = self->private_data.s_decode_pixels_slow.v_color;
82187
    v_back_ref_len_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits;
82188
    v_back_ref_len_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1;
82189
    v_back_ref_dist_n_bits = self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits;
82190
    v_back_ref_dist_premap_minus_1 = self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1;
82191
    v_color_cache_p = self->private_data.s_decode_pixels_slow.v_color_cache_p;
82192
  }
82193
  switch (coro_susp_point) {
82194
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
82195
82196
    v_p_max = ((uint64_t)((4u * a_width * a_height)));
82197
    if (((uint64_t)(a_dst.len)) < v_p_max) {
82198
      status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
82199
      goto exit;
82200
    }
82201
    if (a_tile_size_log2 != 0u) {
82202
      v_tile_size_log2 = a_tile_size_log2;
82203
      v_width_in_tiles = ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
82204
    } else {
82205
      v_tile_size_log2 = 31u;
82206
      v_width_in_tiles = 1u;
82207
    }
82208
    while (v_p < v_p_max) {
82209
      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));
82210
      if (((uint64_t)(v_i)) < ((uint64_t)(a_tile_data.len))) {
82211
        v_hg = ((uint32_t)(a_tile_data.ptr[((uint64_t)(v_i))]));
82212
      }
82213
      v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[0u]));
82214
      while (true) {
82215
        v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
82216
        if (v_node >= 32768u) {
82217
          break;
82218
        } else if (v_node > 6265u) {
82219
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_huffman_code);
82220
          goto exit;
82221
        }
82222
        if (self->private_impl.f_n_bits < 1u) {
82223
          {
82224
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
82225
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82226
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82227
              goto suspend;
82228
            }
82229
            uint8_t t_0 = *iop_a_src++;
82230
            v_c8 = t_0;
82231
          }
82232
          self->private_impl.f_bits = ((uint32_t)(v_c8));
82233
          self->private_impl.f_n_bits = 8u;
82234
        }
82235
        v_h = (((uint32_t)(v_node)) + (self->private_impl.f_bits & 1u));
82236
        self->private_impl.f_bits >>= 1u;
82237
        self->private_impl.f_n_bits -= 1u;
82238
      }
82239
      v_pixel_g = ((uint32_t)(((uint16_t)(v_node & 32767u))));
82240
      if (v_pixel_g < 256u) {
82241
        v_color = (v_pixel_g << 8u);
82242
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[1u]));
82243
        while (true) {
82244
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
82245
          if (v_node >= 32768u) {
82246
            break;
82247
          }
82248
          if (self->private_impl.f_n_bits < 1u) {
82249
            {
82250
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
82251
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82252
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82253
                goto suspend;
82254
              }
82255
              uint8_t t_1 = *iop_a_src++;
82256
              v_c8 = t_1;
82257
            }
82258
            self->private_impl.f_bits = ((uint32_t)(v_c8));
82259
            self->private_impl.f_n_bits = 8u;
82260
          }
82261
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
82262
          self->private_impl.f_bits >>= 1u;
82263
          self->private_impl.f_n_bits -= 1u;
82264
        }
82265
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 16u);
82266
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[2u]));
82267
        while (true) {
82268
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
82269
          if (v_node >= 32768u) {
82270
            break;
82271
          }
82272
          if (self->private_impl.f_n_bits < 1u) {
82273
            {
82274
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
82275
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82276
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82277
                goto suspend;
82278
              }
82279
              uint8_t t_2 = *iop_a_src++;
82280
              v_c8 = t_2;
82281
            }
82282
            self->private_impl.f_bits = ((uint32_t)(v_c8));
82283
            self->private_impl.f_n_bits = 8u;
82284
          }
82285
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
82286
          self->private_impl.f_bits >>= 1u;
82287
          self->private_impl.f_n_bits -= 1u;
82288
        }
82289
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 0u);
82290
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[3u]));
82291
        while (true) {
82292
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
82293
          if (v_node >= 32768u) {
82294
            break;
82295
          }
82296
          if (self->private_impl.f_n_bits < 1u) {
82297
            {
82298
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
82299
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82300
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82301
                goto suspend;
82302
              }
82303
              uint8_t t_3 = *iop_a_src++;
82304
              v_c8 = t_3;
82305
            }
82306
            self->private_impl.f_bits = ((uint32_t)(v_c8));
82307
            self->private_impl.f_n_bits = 8u;
82308
          }
82309
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
82310
          self->private_impl.f_bits >>= 1u;
82311
          self->private_impl.f_n_bits -= 1u;
82312
        }
82313
        v_color |= (((uint32_t)(((uint16_t)(v_node & 255u)))) << 24u);
82314
      } else if (v_pixel_g < 280u) {
82315
        if (v_pixel_g < 260u) {
82316
          v_back_ref_len_minus_1 = (v_pixel_g - 256u);
82317
        } else {
82318
          v_back_ref_len_n_bits = ((v_pixel_g - 258u) >> 1u);
82319
          v_back_ref_len_minus_1 = ((((uint32_t)(2u)) + (v_pixel_g & 1u)) << v_back_ref_len_n_bits);
82320
          while (self->private_impl.f_n_bits < v_back_ref_len_n_bits) {
82321
            {
82322
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
82323
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82324
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82325
                goto suspend;
82326
              }
82327
              uint8_t t_4 = *iop_a_src++;
82328
              v_c8 = t_4;
82329
            }
82330
            if (self->private_impl.f_n_bits >= v_back_ref_len_n_bits) {
82331
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82332
              goto exit;
82333
            }
82334
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82335
            self->private_impl.f_n_bits += 8u;
82336
          }
82337
          v_back_ref_len_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_len_n_bits) - 1u));
82338
          self->private_impl.f_bits >>= v_back_ref_len_n_bits;
82339
          self->private_impl.f_n_bits -= v_back_ref_len_n_bits;
82340
        }
82341
        v_h = ((uint32_t)(WUFFS_WEBP__HUFFMAN_TABLE_BASE_OFFSETS[4u]));
82342
        while (true) {
82343
          v_node = self->private_data.f_huffman_nodes[v_hg][v_h];
82344
          if (v_node >= 32768u) {
82345
            break;
82346
          }
82347
          if (self->private_impl.f_n_bits < 1u) {
82348
            {
82349
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
82350
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82351
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82352
                goto suspend;
82353
              }
82354
              uint8_t t_5 = *iop_a_src++;
82355
              v_c8 = t_5;
82356
            }
82357
            self->private_impl.f_bits = ((uint32_t)(v_c8));
82358
            self->private_impl.f_n_bits = 8u;
82359
          }
82360
          v_h = ((((uint32_t)(v_node)) & 4095u) + (self->private_impl.f_bits & 1u));
82361
          self->private_impl.f_bits >>= 1u;
82362
          self->private_impl.f_n_bits -= 1u;
82363
        }
82364
        v_back_ref_dist_sym = ((uint32_t)(((uint16_t)(v_node & 32767u))));
82365
        if (v_back_ref_dist_sym < 4u) {
82366
          v_back_ref_dist_premap_minus_1 = v_back_ref_dist_sym;
82367
        } else if (v_back_ref_dist_sym < 40u) {
82368
          v_back_ref_dist_n_bits = ((v_back_ref_dist_sym - 2u) >> 1u);
82369
          v_back_ref_dist_premap_minus_1 = ((((uint32_t)(2u)) + (v_back_ref_dist_sym & 1u)) << v_back_ref_dist_n_bits);
82370
          while (self->private_impl.f_n_bits < v_back_ref_dist_n_bits) {
82371
            {
82372
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
82373
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
82374
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
82375
                goto suspend;
82376
              }
82377
              uint8_t t_6 = *iop_a_src++;
82378
              v_c8 = t_6;
82379
            }
82380
            if (self->private_impl.f_n_bits >= v_back_ref_dist_n_bits) {
82381
              status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
82382
              goto exit;
82383
            }
82384
            self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
82385
            self->private_impl.f_n_bits += 8u;
82386
          }
82387
          v_back_ref_dist_premap_minus_1 += (self->private_impl.f_bits & ((((uint32_t)(1u)) << v_back_ref_dist_n_bits) - 1u));
82388
          self->private_impl.f_bits >>= v_back_ref_dist_n_bits;
82389
          self->private_impl.f_n_bits -= v_back_ref_dist_n_bits;
82390
        }
82391
        if (v_back_ref_dist_premap_minus_1 >= 120u) {
82392
          v_back_ref_dist_minus_1 = (v_back_ref_dist_premap_minus_1 - 120u);
82393
        } else {
82394
          v_dm = ((uint32_t)(WUFFS_WEBP__DISTANCE_MAP[v_back_ref_dist_premap_minus_1]));
82395
          v_dy = (v_dm >> 4u);
82396
          v_dx = ((uint32_t)(7u - (v_dm & 15u)));
82397
          v_back_ref_dist_minus_1 = ((uint32_t)((a_width * v_dy) + v_dx));
82398
        }
82399
        v_p_end = (v_p + ((uint64_t)(((v_back_ref_len_minus_1 + 1u) * 4u))));
82400
        v_dist4 = ((((uint64_t)(v_back_ref_dist_minus_1)) * 4u) + 4u);
82401
        if ((v_p_end > v_p_max) || (v_p_end > ((uint64_t)(a_dst.len))) || (v_p < v_dist4)) {
82402
          status = wuffs_base__make_status(wuffs_webp__error__bad_back_reference);
82403
          goto exit;
82404
        }
82405
        v_q = (v_p - v_dist4);
82406
        while ((v_q < v_p) && (v_p < v_p_end)) {
82407
          a_dst.ptr[v_p] = a_dst.ptr[v_q];
82408
          v_p += 1u;
82409
          v_q += 1u;
82410
        }
82411
        v_x += (v_back_ref_len_minus_1 + 1u);
82412
        while (v_x >= a_width) {
82413
          v_x -= a_width;
82414
          v_y += 1u;
82415
        }
82416
        continue;
82417
      } else {
82418
        if ((v_color_cache_p > v_p) || (v_p > ((uint64_t)(a_dst.len)))) {
82419
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
82420
          goto exit;
82421
        }
82422
        v_color_cache_pixels = wuffs_base__slice_u8__subslice_ij(a_dst, v_color_cache_p, v_p);
82423
        v_color_cache_p = v_p;
82424
        v_color_cache_shift = ((32u - self->private_impl.f_color_cache_bits) & 31u);
82425
        while (((uint64_t)(v_color_cache_pixels.len)) >= 4u) {
82426
          v_color = wuffs_base__peek_u32le__no_bounds_check(v_color_cache_pixels.ptr);
82427
          self->private_data.f_color_cache[((((uint32_t)(v_color * 506832829u)) >> v_color_cache_shift) & 2047u)] = v_color;
82428
          v_color_cache_pixels = wuffs_base__slice_u8__subslice_i(v_color_cache_pixels, 4u);
82429
        }
82430
        v_color = self->private_data.f_color_cache[((v_pixel_g - 280u) & 2047u)];
82431
      }
82432
      if (v_p > ((uint64_t)(a_dst.len))) {
82433
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
82434
        goto exit;
82435
      }
82436
      v_dst_pixel = wuffs_base__slice_u8__subslice_i(a_dst, v_p);
82437
      if (((uint64_t)(v_dst_pixel.len)) < 4u) {
82438
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_dst_buffer);
82439
        goto exit;
82440
      }
82441
      wuffs_base__poke_u32le__no_bounds_check(v_dst_pixel.ptr, v_color);
82442
      v_p += 4u;
82443
      v_x += 1u;
82444
      if (v_x == a_width) {
82445
        v_x = 0u;
82446
        v_y += 1u;
82447
      }
82448
    }
82449
82450
    goto ok;
82451
    ok:
82452
    self->private_impl.p_decode_pixels_slow = 0;
82453
    goto exit;
82454
  }
82455
82456
  goto suspend;
82457
  suspend:
82458
  self->private_impl.p_decode_pixels_slow = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
82459
  self->private_data.s_decode_pixels_slow.v_p = v_p;
82460
  self->private_data.s_decode_pixels_slow.v_p_max = v_p_max;
82461
  self->private_data.s_decode_pixels_slow.v_tile_size_log2 = v_tile_size_log2;
82462
  self->private_data.s_decode_pixels_slow.v_width_in_tiles = v_width_in_tiles;
82463
  self->private_data.s_decode_pixels_slow.v_x = v_x;
82464
  self->private_data.s_decode_pixels_slow.v_y = v_y;
82465
  self->private_data.s_decode_pixels_slow.v_hg = v_hg;
82466
  self->private_data.s_decode_pixels_slow.v_node = v_node;
82467
  self->private_data.s_decode_pixels_slow.v_color = v_color;
82468
  self->private_data.s_decode_pixels_slow.v_back_ref_len_n_bits = v_back_ref_len_n_bits;
82469
  self->private_data.s_decode_pixels_slow.v_back_ref_len_minus_1 = v_back_ref_len_minus_1;
82470
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_n_bits = v_back_ref_dist_n_bits;
82471
  self->private_data.s_decode_pixels_slow.v_back_ref_dist_premap_minus_1 = v_back_ref_dist_premap_minus_1;
82472
  self->private_data.s_decode_pixels_slow.v_color_cache_p = v_color_cache_p;
82473
82474
  goto exit;
82475
  exit:
82476
  if (a_src && a_src->data.ptr) {
82477
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
82478
  }
82479
82480
  return status;
82481
}
82482
82483
// -------- func webp.decoder.apply_transform_predictor
82484
82485
WUFFS_BASE__GENERATED_C_CODE
82486
static wuffs_base__empty_struct
82487
wuffs_webp__decoder__apply_transform_predictor(
82488
    wuffs_webp__decoder* self,
82489
    wuffs_base__slice_u8 a_pix,
82490
    wuffs_base__slice_u8 a_tile_data) {
82491
  uint64_t v_w4 = 0;
82492
  wuffs_base__slice_u8 v_prev_row = {0};
82493
  wuffs_base__slice_u8 v_curr_row = {0};
82494
  uint32_t v_tile_size_log2 = 0;
82495
  uint32_t v_tiles_per_row = 0;
82496
  uint32_t v_mask = 0;
82497
  uint32_t v_y = 0;
82498
  uint32_t v_x = 0;
82499
  uint64_t v_t = 0;
82500
  wuffs_base__slice_u8 v_tile_data = {0};
82501
  uint8_t v_mode = 0;
82502
  uint32_t v_l0 = 0;
82503
  uint32_t v_l1 = 0;
82504
  uint32_t v_l2 = 0;
82505
  uint32_t v_l3 = 0;
82506
  uint32_t v_c0 = 0;
82507
  uint32_t v_c1 = 0;
82508
  uint32_t v_c2 = 0;
82509
  uint32_t v_c3 = 0;
82510
  uint32_t v_t0 = 0;
82511
  uint32_t v_t1 = 0;
82512
  uint32_t v_t2 = 0;
82513
  uint32_t v_t3 = 0;
82514
  uint32_t v_sum_l = 0;
82515
  uint32_t v_sum_t = 0;
82516
82517
  if ((self->private_impl.f_width <= 0u) || (self->private_impl.f_height <= 0u)) {
82518
    return wuffs_base__make_empty_struct();
82519
  }
82520
  v_w4 = ((uint64_t)((self->private_impl.f_width * 4u)));
82521
  v_curr_row = wuffs_base__utility__empty_slice_u8();
82522
  if (v_w4 <= ((uint64_t)(a_pix.len))) {
82523
    v_curr_row = wuffs_base__slice_u8__subslice_j(a_pix, v_w4);
82524
  }
82525
  if (((uint64_t)(v_curr_row.len)) >= 4u) {
82526
#if defined(__GNUC__)
82527
#pragma GCC diagnostic push
82528
#pragma GCC diagnostic ignored "-Wconversion"
82529
#endif
82530
    v_curr_row.ptr[3u] += 255u;
82531
#if defined(__GNUC__)
82532
#pragma GCC diagnostic pop
82533
#endif
82534
  }
82535
  while (((uint64_t)(v_curr_row.len)) >= 8u) {
82536
#if defined(__GNUC__)
82537
#pragma GCC diagnostic push
82538
#pragma GCC diagnostic ignored "-Wconversion"
82539
#endif
82540
    v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
82541
    v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
82542
    v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
82543
    v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
82544
#if defined(__GNUC__)
82545
#pragma GCC diagnostic pop
82546
#endif
82547
    v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
82548
  }
82549
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[0u]));
82550
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
82551
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
82552
  v_y = 1u;
82553
  while (v_y < self->private_impl.f_height) {
82554
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
82555
    v_tile_data = wuffs_base__utility__empty_slice_u8();
82556
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
82557
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
82558
      if (((uint64_t)(v_tile_data.len)) >= 4u) {
82559
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
82560
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
82561
      }
82562
    }
82563
    if (v_w4 <= ((uint64_t)(a_pix.len))) {
82564
      v_prev_row = a_pix;
82565
      a_pix = wuffs_base__slice_u8__subslice_i(a_pix, v_w4);
82566
      v_curr_row = a_pix;
82567
    }
82568
    if ((((uint64_t)(v_prev_row.len)) >= 4u) && (((uint64_t)(v_curr_row.len)) >= 4u)) {
82569
#if defined(__GNUC__)
82570
#pragma GCC diagnostic push
82571
#pragma GCC diagnostic ignored "-Wconversion"
82572
#endif
82573
      v_curr_row.ptr[0u] += v_prev_row.ptr[0u];
82574
      v_curr_row.ptr[1u] += v_prev_row.ptr[1u];
82575
      v_curr_row.ptr[2u] += v_prev_row.ptr[2u];
82576
      v_curr_row.ptr[3u] += v_prev_row.ptr[3u];
82577
#if defined(__GNUC__)
82578
#pragma GCC diagnostic pop
82579
#endif
82580
    }
82581
    v_x = 1u;
82582
    while (v_x < self->private_impl.f_width) {
82583
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
82584
        v_mode = ((uint8_t)(v_tile_data.ptr[1u] & 15u));
82585
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
82586
      }
82587
      if ((((uint64_t)(v_prev_row.len)) < 12u) || (((uint64_t)(v_curr_row.len)) < 8u)) {
82588
        break;
82589
      }
82590
      if (v_mode == 0u) {
82591
#if defined(__GNUC__)
82592
#pragma GCC diagnostic push
82593
#pragma GCC diagnostic ignored "-Wconversion"
82594
#endif
82595
        v_curr_row.ptr[7u] += 255u;
82596
#if defined(__GNUC__)
82597
#pragma GCC diagnostic pop
82598
#endif
82599
      } else if (v_mode == 1u) {
82600
#if defined(__GNUC__)
82601
#pragma GCC diagnostic push
82602
#pragma GCC diagnostic ignored "-Wconversion"
82603
#endif
82604
        v_curr_row.ptr[4u] += v_curr_row.ptr[0u];
82605
        v_curr_row.ptr[5u] += v_curr_row.ptr[1u];
82606
        v_curr_row.ptr[6u] += v_curr_row.ptr[2u];
82607
        v_curr_row.ptr[7u] += v_curr_row.ptr[3u];
82608
#if defined(__GNUC__)
82609
#pragma GCC diagnostic pop
82610
#endif
82611
      } else if (v_mode == 2u) {
82612
#if defined(__GNUC__)
82613
#pragma GCC diagnostic push
82614
#pragma GCC diagnostic ignored "-Wconversion"
82615
#endif
82616
        v_curr_row.ptr[4u] += v_prev_row.ptr[4u];
82617
        v_curr_row.ptr[5u] += v_prev_row.ptr[5u];
82618
        v_curr_row.ptr[6u] += v_prev_row.ptr[6u];
82619
        v_curr_row.ptr[7u] += v_prev_row.ptr[7u];
82620
#if defined(__GNUC__)
82621
#pragma GCC diagnostic pop
82622
#endif
82623
      } else if (v_mode == 3u) {
82624
#if defined(__GNUC__)
82625
#pragma GCC diagnostic push
82626
#pragma GCC diagnostic ignored "-Wconversion"
82627
#endif
82628
        v_curr_row.ptr[4u] += v_prev_row.ptr[8u];
82629
        v_curr_row.ptr[5u] += v_prev_row.ptr[9u];
82630
        v_curr_row.ptr[6u] += v_prev_row.ptr[10u];
82631
        v_curr_row.ptr[7u] += v_prev_row.ptr[11u];
82632
#if defined(__GNUC__)
82633
#pragma GCC diagnostic pop
82634
#endif
82635
      } else if (v_mode == 4u) {
82636
#if defined(__GNUC__)
82637
#pragma GCC diagnostic push
82638
#pragma GCC diagnostic ignored "-Wconversion"
82639
#endif
82640
        v_curr_row.ptr[4u] += v_prev_row.ptr[0u];
82641
        v_curr_row.ptr[5u] += v_prev_row.ptr[1u];
82642
        v_curr_row.ptr[6u] += v_prev_row.ptr[2u];
82643
        v_curr_row.ptr[7u] += v_prev_row.ptr[3u];
82644
#if defined(__GNUC__)
82645
#pragma GCC diagnostic pop
82646
#endif
82647
      } else if (v_mode == 5u) {
82648
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
82649
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
82650
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
82651
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
82652
#if defined(__GNUC__)
82653
#pragma GCC diagnostic push
82654
#pragma GCC diagnostic ignored "-Wconversion"
82655
#endif
82656
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
82657
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
82658
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
82659
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
82660
#if defined(__GNUC__)
82661
#pragma GCC diagnostic pop
82662
#endif
82663
      } else if (v_mode == 6u) {
82664
#if defined(__GNUC__)
82665
#pragma GCC diagnostic push
82666
#pragma GCC diagnostic ignored "-Wconversion"
82667
#endif
82668
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u)));
82669
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u)));
82670
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u)));
82671
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u)));
82672
#if defined(__GNUC__)
82673
#pragma GCC diagnostic pop
82674
#endif
82675
      } else if (v_mode == 7u) {
82676
#if defined(__GNUC__)
82677
#pragma GCC diagnostic push
82678
#pragma GCC diagnostic ignored "-Wconversion"
82679
#endif
82680
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
82681
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
82682
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
82683
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
82684
#if defined(__GNUC__)
82685
#pragma GCC diagnostic pop
82686
#endif
82687
      } else if (v_mode == 8u) {
82688
#if defined(__GNUC__)
82689
#pragma GCC diagnostic push
82690
#pragma GCC diagnostic ignored "-Wconversion"
82691
#endif
82692
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[4u]))) / 2u)));
82693
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[5u]))) / 2u)));
82694
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[6u]))) / 2u)));
82695
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[7u]))) / 2u)));
82696
#if defined(__GNUC__)
82697
#pragma GCC diagnostic pop
82698
#endif
82699
      } else if (v_mode == 9u) {
82700
#if defined(__GNUC__)
82701
#pragma GCC diagnostic push
82702
#pragma GCC diagnostic ignored "-Wconversion"
82703
#endif
82704
        v_curr_row.ptr[4u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u)));
82705
        v_curr_row.ptr[5u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u)));
82706
        v_curr_row.ptr[6u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u)));
82707
        v_curr_row.ptr[7u] += ((uint8_t)(((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u)));
82708
#if defined(__GNUC__)
82709
#pragma GCC diagnostic pop
82710
#endif
82711
      } else if (v_mode == 10u) {
82712
        v_l0 = ((((uint32_t)(v_curr_row.ptr[0u])) + ((uint32_t)(v_prev_row.ptr[0u]))) / 2u);
82713
        v_l1 = ((((uint32_t)(v_curr_row.ptr[1u])) + ((uint32_t)(v_prev_row.ptr[1u]))) / 2u);
82714
        v_l2 = ((((uint32_t)(v_curr_row.ptr[2u])) + ((uint32_t)(v_prev_row.ptr[2u]))) / 2u);
82715
        v_l3 = ((((uint32_t)(v_curr_row.ptr[3u])) + ((uint32_t)(v_prev_row.ptr[3u]))) / 2u);
82716
        v_t0 = ((((uint32_t)(v_prev_row.ptr[4u])) + ((uint32_t)(v_prev_row.ptr[8u]))) / 2u);
82717
        v_t1 = ((((uint32_t)(v_prev_row.ptr[5u])) + ((uint32_t)(v_prev_row.ptr[9u]))) / 2u);
82718
        v_t2 = ((((uint32_t)(v_prev_row.ptr[6u])) + ((uint32_t)(v_prev_row.ptr[10u]))) / 2u);
82719
        v_t3 = ((((uint32_t)(v_prev_row.ptr[7u])) + ((uint32_t)(v_prev_row.ptr[11u]))) / 2u);
82720
#if defined(__GNUC__)
82721
#pragma GCC diagnostic push
82722
#pragma GCC diagnostic ignored "-Wconversion"
82723
#endif
82724
        v_curr_row.ptr[4u] += ((uint8_t)(((v_l0 + v_t0) / 2u)));
82725
        v_curr_row.ptr[5u] += ((uint8_t)(((v_l1 + v_t1) / 2u)));
82726
        v_curr_row.ptr[6u] += ((uint8_t)(((v_l2 + v_t2) / 2u)));
82727
        v_curr_row.ptr[7u] += ((uint8_t)(((v_l3 + v_t3) / 2u)));
82728
#if defined(__GNUC__)
82729
#pragma GCC diagnostic pop
82730
#endif
82731
      } else if (v_mode == 11u) {
82732
        v_l0 = ((uint32_t)(v_curr_row.ptr[0u]));
82733
        v_l1 = ((uint32_t)(v_curr_row.ptr[1u]));
82734
        v_l2 = ((uint32_t)(v_curr_row.ptr[2u]));
82735
        v_l3 = ((uint32_t)(v_curr_row.ptr[3u]));
82736
        v_c0 = ((uint32_t)(v_prev_row.ptr[0u]));
82737
        v_c1 = ((uint32_t)(v_prev_row.ptr[1u]));
82738
        v_c2 = ((uint32_t)(v_prev_row.ptr[2u]));
82739
        v_c3 = ((uint32_t)(v_prev_row.ptr[3u]));
82740
        v_t0 = ((uint32_t)(v_prev_row.ptr[4u]));
82741
        v_t1 = ((uint32_t)(v_prev_row.ptr[5u]));
82742
        v_t2 = ((uint32_t)(v_prev_row.ptr[6u]));
82743
        v_t3 = ((uint32_t)(v_prev_row.ptr[7u]));
82744
        v_sum_l = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_t0) +
82745
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_t1) +
82746
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_t2) +
82747
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_t3));
82748
        v_sum_t = (wuffs_webp__decoder__absolute_difference(self, v_c0, v_l0) +
82749
            wuffs_webp__decoder__absolute_difference(self, v_c1, v_l1) +
82750
            wuffs_webp__decoder__absolute_difference(self, v_c2, v_l2) +
82751
            wuffs_webp__decoder__absolute_difference(self, v_c3, v_l3));
82752
        if (v_sum_l < v_sum_t) {
82753
#if defined(__GNUC__)
82754
#pragma GCC diagnostic push
82755
#pragma GCC diagnostic ignored "-Wconversion"
82756
#endif
82757
          v_curr_row.ptr[4u] += ((uint8_t)(v_l0));
82758
          v_curr_row.ptr[5u] += ((uint8_t)(v_l1));
82759
          v_curr_row.ptr[6u] += ((uint8_t)(v_l2));
82760
          v_curr_row.ptr[7u] += ((uint8_t)(v_l3));
82761
#if defined(__GNUC__)
82762
#pragma GCC diagnostic pop
82763
#endif
82764
        } else {
82765
#if defined(__GNUC__)
82766
#pragma GCC diagnostic push
82767
#pragma GCC diagnostic ignored "-Wconversion"
82768
#endif
82769
          v_curr_row.ptr[4u] += ((uint8_t)(v_t0));
82770
          v_curr_row.ptr[5u] += ((uint8_t)(v_t1));
82771
          v_curr_row.ptr[6u] += ((uint8_t)(v_t2));
82772
          v_curr_row.ptr[7u] += ((uint8_t)(v_t3));
82773
#if defined(__GNUC__)
82774
#pragma GCC diagnostic pop
82775
#endif
82776
        }
82777
      } else if (v_mode == 12u) {
82778
#if defined(__GNUC__)
82779
#pragma GCC diagnostic push
82780
#pragma GCC diagnostic ignored "-Wconversion"
82781
#endif
82782
        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]);
82783
        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]);
82784
        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]);
82785
        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]);
82786
#if defined(__GNUC__)
82787
#pragma GCC diagnostic pop
82788
#endif
82789
      } else if (v_mode == 13u) {
82790
#if defined(__GNUC__)
82791
#pragma GCC diagnostic push
82792
#pragma GCC diagnostic ignored "-Wconversion"
82793
#endif
82794
        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]);
82795
        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]);
82796
        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]);
82797
        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]);
82798
#if defined(__GNUC__)
82799
#pragma GCC diagnostic pop
82800
#endif
82801
      }
82802
      v_curr_row = wuffs_base__slice_u8__subslice_i(v_curr_row, 4u);
82803
      v_prev_row = wuffs_base__slice_u8__subslice_i(v_prev_row, 4u);
82804
      v_x += 1u;
82805
    }
82806
    v_y += 1u;
82807
  }
82808
  return wuffs_base__make_empty_struct();
82809
}
82810
82811
// -------- func webp.decoder.absolute_difference
82812
82813
WUFFS_BASE__GENERATED_C_CODE
82814
static uint32_t
82815
wuffs_webp__decoder__absolute_difference(
82816
    const wuffs_webp__decoder* self,
82817
    uint32_t a_a,
82818
    uint32_t a_b) {
82819
  if (a_a < a_b) {
82820
    return (a_b - a_a);
82821
  }
82822
  return (a_a - a_b);
82823
}
82824
82825
// -------- func webp.decoder.mode12
82826
82827
WUFFS_BASE__GENERATED_C_CODE
82828
static uint8_t
82829
wuffs_webp__decoder__mode12(
82830
    const wuffs_webp__decoder* self,
82831
    uint8_t a_l,
82832
    uint8_t a_t,
82833
    uint8_t a_tl) {
82834
  uint32_t v_v = 0;
82835
82836
  v_v = ((uint32_t)((((uint32_t)(a_l)) + ((uint32_t)(a_t))) - ((uint32_t)(a_tl))));
82837
  if (v_v < 256u) {
82838
    return ((uint8_t)(v_v));
82839
  } else if (v_v < 512u) {
82840
    return 255u;
82841
  }
82842
  return 0u;
82843
}
82844
82845
// -------- func webp.decoder.mode13
82846
82847
WUFFS_BASE__GENERATED_C_CODE
82848
static uint8_t
82849
wuffs_webp__decoder__mode13(
82850
    const wuffs_webp__decoder* self,
82851
    uint8_t a_l,
82852
    uint8_t a_t,
82853
    uint8_t a_tl) {
82854
  uint32_t v_x = 0;
82855
  uint32_t v_y = 0;
82856
  uint32_t v_z = 0;
82857
  uint32_t v_v = 0;
82858
82859
  v_x = ((((uint32_t)(a_l)) + ((uint32_t)(a_t))) / 2u);
82860
  v_y = ((uint32_t)(a_tl));
82861
  v_z = ((uint32_t)(v_x - v_y));
82862
  v_v = ((uint32_t)(v_x + wuffs_base__utility__sign_extend_rshift_u32(((uint32_t)(v_z + (v_z >> 31u))), 1u)));
82863
  if (v_v < 256u) {
82864
    return ((uint8_t)(v_v));
82865
  } else if (v_v < 512u) {
82866
    return 255u;
82867
  }
82868
  return 0u;
82869
}
82870
82871
// -------- func webp.decoder.apply_transform_cross_color
82872
82873
WUFFS_BASE__GENERATED_C_CODE
82874
static wuffs_base__empty_struct
82875
wuffs_webp__decoder__apply_transform_cross_color(
82876
    wuffs_webp__decoder* self,
82877
    wuffs_base__slice_u8 a_pix,
82878
    wuffs_base__slice_u8 a_tile_data) {
82879
  uint32_t v_tile_size_log2 = 0;
82880
  uint32_t v_tiles_per_row = 0;
82881
  uint32_t v_mask = 0;
82882
  uint32_t v_y = 0;
82883
  uint32_t v_x = 0;
82884
  uint64_t v_t = 0;
82885
  wuffs_base__slice_u8 v_tile_data = {0};
82886
  uint32_t v_g2r = 0;
82887
  uint32_t v_g2b = 0;
82888
  uint32_t v_r2b = 0;
82889
  uint8_t v_b = 0;
82890
  uint8_t v_g = 0;
82891
  uint8_t v_r = 0;
82892
82893
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[1u]));
82894
  v_tiles_per_row = ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2);
82895
  v_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
82896
  v_y = 0u;
82897
  while (v_y < self->private_impl.f_height) {
82898
    v_t = ((uint64_t)((4u * (v_y >> v_tile_size_log2) * v_tiles_per_row)));
82899
    v_tile_data = wuffs_base__utility__empty_slice_u8();
82900
    if (v_t <= ((uint64_t)(a_tile_data.len))) {
82901
      v_tile_data = wuffs_base__slice_u8__subslice_i(a_tile_data, v_t);
82902
    }
82903
    v_x = 0u;
82904
    while (v_x < self->private_impl.f_width) {
82905
      if (((v_x & v_mask) == 0u) && (((uint64_t)(v_tile_data.len)) >= 4u)) {
82906
        v_g2r = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[0u]);
82907
        v_g2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[1u]);
82908
        v_r2b = wuffs_base__utility__sign_extend_convert_u8_u32(v_tile_data.ptr[2u]);
82909
        v_tile_data = wuffs_base__slice_u8__subslice_i(v_tile_data, 4u);
82910
      }
82911
      if (((uint64_t)(a_pix.len)) >= 4u) {
82912
        v_b = a_pix.ptr[0u];
82913
        v_g = a_pix.ptr[1u];
82914
        v_r = a_pix.ptr[2u];
82915
#if defined(__GNUC__)
82916
#pragma GCC diagnostic push
82917
#pragma GCC diagnostic ignored "-Wconversion"
82918
#endif
82919
        v_r += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2r)) >> 5u)));
82920
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_g) * v_g2b)) >> 5u)));
82921
        v_b += ((uint8_t)((((uint32_t)(wuffs_base__utility__sign_extend_convert_u8_u32(v_r) * v_r2b)) >> 5u)));
82922
#if defined(__GNUC__)
82923
#pragma GCC diagnostic pop
82924
#endif
82925
        a_pix.ptr[0u] = v_b;
82926
        a_pix.ptr[2u] = v_r;
82927
        a_pix = wuffs_base__slice_u8__subslice_i(a_pix, 4u);
82928
      }
82929
      v_x += 1u;
82930
    }
82931
    v_y += 1u;
82932
  }
82933
  return wuffs_base__make_empty_struct();
82934
}
82935
82936
// -------- func webp.decoder.apply_transform_subtract_green
82937
82938
WUFFS_BASE__GENERATED_C_CODE
82939
static wuffs_base__empty_struct
82940
wuffs_webp__decoder__apply_transform_subtract_green(
82941
    wuffs_webp__decoder* self,
82942
    wuffs_base__slice_u8 a_pix) {
82943
  wuffs_base__slice_u8 v_p = {0};
82944
  uint8_t v_g = 0;
82945
82946
  {
82947
    wuffs_base__slice_u8 i_slice_p = a_pix;
82948
    v_p.ptr = i_slice_p.ptr;
82949
    v_p.len = 4;
82950
    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));
82951
    while (v_p.ptr < i_end0_p) {
82952
      v_g = v_p.ptr[1u];
82953
#if defined(__GNUC__)
82954
#pragma GCC diagnostic push
82955
#pragma GCC diagnostic ignored "-Wconversion"
82956
#endif
82957
      v_p.ptr[0u] += v_g;
82958
      v_p.ptr[2u] += v_g;
82959
#if defined(__GNUC__)
82960
#pragma GCC diagnostic pop
82961
#endif
82962
      v_p.ptr += 4;
82963
    }
82964
    v_p.len = 0;
82965
  }
82966
  return wuffs_base__make_empty_struct();
82967
}
82968
82969
// -------- func webp.decoder.apply_transform_color_indexing
82970
82971
WUFFS_BASE__GENERATED_C_CODE
82972
static wuffs_base__empty_struct
82973
wuffs_webp__decoder__apply_transform_color_indexing(
82974
    wuffs_webp__decoder* self,
82975
    wuffs_base__slice_u8 a_pix) {
82976
  uint32_t v_tile_size_log2 = 0;
82977
  uint32_t v_bits_per_pixel = 0;
82978
  uint32_t v_x_mask = 0;
82979
  uint32_t v_s_mask = 0;
82980
  uint64_t v_src_index = 0;
82981
  uint32_t v_y = 0;
82982
  uint64_t v_di = 0;
82983
  uint64_t v_dj = 0;
82984
  wuffs_base__slice_u8 v_dst = {0};
82985
  uint32_t v_x = 0;
82986
  uint32_t v_s = 0;
82987
  uint32_t v_p = 0;
82988
  uint8_t v_p0 = 0;
82989
  uint8_t v_p1 = 0;
82990
  uint8_t v_p2 = 0;
82991
  uint8_t v_p3 = 0;
82992
82993
  v_tile_size_log2 = ((uint32_t)(self->private_impl.f_transform_tile_size_log2[3u]));
82994
  if (v_tile_size_log2 == 0u) {
82995
    {
82996
      wuffs_base__slice_u8 i_slice_dst = a_pix;
82997
      v_dst.ptr = i_slice_dst.ptr;
82998
      v_dst.len = 4;
82999
      const uint8_t* i_end0_dst = wuffs_private_impl__ptr_u8_plus_len(v_dst.ptr, (((i_slice_dst.len - (size_t)(v_dst.ptr - i_slice_dst.ptr)) / 4) * 4));
83000
      while (v_dst.ptr < i_end0_dst) {
83001
        v_p = (((uint32_t)(v_dst.ptr[1u])) * 4u);
83002
        v_p0 = self->private_data.f_palette[(v_p + 0u)];
83003
        v_p1 = self->private_data.f_palette[(v_p + 1u)];
83004
        v_p2 = self->private_data.f_palette[(v_p + 2u)];
83005
        v_p3 = self->private_data.f_palette[(v_p + 3u)];
83006
        v_dst.ptr[0u] = v_p0;
83007
        v_dst.ptr[1u] = v_p1;
83008
        v_dst.ptr[2u] = v_p2;
83009
        v_dst.ptr[3u] = v_p3;
83010
        v_dst.ptr += 4;
83011
      }
83012
      v_dst.len = 0;
83013
    }
83014
    return wuffs_base__make_empty_struct();
83015
  }
83016
  v_bits_per_pixel = (((uint32_t)(8u)) >> v_tile_size_log2);
83017
  v_x_mask = ((((uint32_t)(1u)) << v_tile_size_log2) - 1u);
83018
  v_s_mask = ((((uint32_t)(1u)) << v_bits_per_pixel) - 1u);
83019
  v_src_index = ((uint64_t)((self->private_impl.f_workbuf_offset_for_color_indexing + 1u)));
83020
  v_y = 0u;
83021
  while (v_y < self->private_impl.f_height) {
83022
    v_di = ((uint64_t)((4u * (v_y + 0u) * self->private_impl.f_width)));
83023
    v_dj = ((uint64_t)((4u * (v_y + 1u) * self->private_impl.f_width)));
83024
    if ((v_di > v_dj) || (v_dj > ((uint64_t)(a_pix.len)))) {
83025
      break;
83026
    }
83027
    v_dst = wuffs_base__slice_u8__subslice_ij(a_pix, v_di, v_dj);
83028
    v_x = 0u;
83029
    while (((uint64_t)(v_dst.len)) >= 4u) {
83030
      if (((v_x & v_x_mask) == 0u) && (v_src_index < ((uint64_t)(a_pix.len)))) {
83031
        v_s = ((uint32_t)(a_pix.ptr[v_src_index]));
83032
        v_src_index += 4u;
83033
      }
83034
      v_p = ((v_s & v_s_mask) * 4u);
83035
      v_s >>= v_bits_per_pixel;
83036
      v_p0 = self->private_data.f_palette[(v_p + 0u)];
83037
      v_p1 = self->private_data.f_palette[(v_p + 1u)];
83038
      v_p2 = self->private_data.f_palette[(v_p + 2u)];
83039
      v_p3 = self->private_data.f_palette[(v_p + 3u)];
83040
      v_dst.ptr[0u] = v_p0;
83041
      v_dst.ptr[1u] = v_p1;
83042
      v_dst.ptr[2u] = v_p2;
83043
      v_dst.ptr[3u] = v_p3;
83044
      v_dst = wuffs_base__slice_u8__subslice_i(v_dst, 4u);
83045
      v_x += 1u;
83046
    }
83047
    v_y += 1u;
83048
  }
83049
  return wuffs_base__make_empty_struct();
83050
}
83051
83052
// -------- func webp.decoder.get_quirk
83053
83054
WUFFS_BASE__GENERATED_C_CODE
83055
WUFFS_BASE__MAYBE_STATIC uint64_t
83056
wuffs_webp__decoder__get_quirk(
83057
    const wuffs_webp__decoder* self,
83058
    uint32_t a_key) {
83059
  if (!self) {
83060
    return 0;
83061
  }
83062
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
83063
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
83064
    return 0;
83065
  }
83066
83067
  return 0u;
83068
}
83069
83070
// -------- func webp.decoder.set_quirk
83071
83072
WUFFS_BASE__GENERATED_C_CODE
83073
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
83074
wuffs_webp__decoder__set_quirk(
83075
    wuffs_webp__decoder* self,
83076
    uint32_t a_key,
83077
    uint64_t a_value) {
83078
  if (!self) {
83079
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83080
  }
83081
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
83082
    return wuffs_base__make_status(
83083
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
83084
        ? wuffs_base__error__disabled_by_previous_error
83085
        : wuffs_base__error__initialize_not_called);
83086
  }
83087
83088
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
83089
}
83090
83091
// -------- func webp.decoder.decode_image_config
83092
83093
WUFFS_BASE__GENERATED_C_CODE
83094
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
83095
wuffs_webp__decoder__decode_image_config(
83096
    wuffs_webp__decoder* self,
83097
    wuffs_base__image_config* a_dst,
83098
    wuffs_base__io_buffer* a_src) {
83099
  if (!self) {
83100
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83101
  }
83102
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
83103
    return wuffs_base__make_status(
83104
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
83105
        ? wuffs_base__error__disabled_by_previous_error
83106
        : wuffs_base__error__initialize_not_called);
83107
  }
83108
  if (!a_src) {
83109
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83110
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
83111
  }
83112
  if ((self->private_impl.active_coroutine != 0) &&
83113
      (self->private_impl.active_coroutine != 1)) {
83114
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83115
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
83116
  }
83117
  self->private_impl.active_coroutine = 0;
83118
  wuffs_base__status status = wuffs_base__make_status(NULL);
83119
83120
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83121
83122
  uint32_t coro_susp_point = self->private_impl.p_decode_image_config;
83123
  switch (coro_susp_point) {
83124
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83125
83126
    while (true) {
83127
      {
83128
        wuffs_base__status t_0 = wuffs_webp__decoder__do_decode_image_config(self, a_dst, a_src);
83129
        v_status = t_0;
83130
      }
83131
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
83132
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
83133
        goto exit;
83134
      }
83135
      status = v_status;
83136
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
83137
    }
83138
83139
    ok:
83140
    self->private_impl.p_decode_image_config = 0;
83141
    goto exit;
83142
  }
83143
83144
  goto suspend;
83145
  suspend:
83146
  self->private_impl.p_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83147
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
83148
83149
  goto exit;
83150
  exit:
83151
  if (wuffs_base__status__is_error(&status)) {
83152
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83153
  }
83154
  return status;
83155
}
83156
83157
// -------- func webp.decoder.do_decode_image_config
83158
83159
WUFFS_BASE__GENERATED_C_CODE
83160
static wuffs_base__status
83161
wuffs_webp__decoder__do_decode_image_config(
83162
    wuffs_webp__decoder* self,
83163
    wuffs_base__image_config* a_dst,
83164
    wuffs_base__io_buffer* a_src) {
83165
  wuffs_base__status status = wuffs_base__make_status(NULL);
83166
83167
  uint32_t v_c32 = 0;
83168
  uint64_t v_r_mark = 0;
83169
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83170
83171
  const uint8_t* iop_a_src = NULL;
83172
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83173
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83174
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83175
  if (a_src && a_src->data.ptr) {
83176
    io0_a_src = a_src->data.ptr;
83177
    io1_a_src = io0_a_src + a_src->meta.ri;
83178
    iop_a_src = io1_a_src;
83179
    io2_a_src = io0_a_src + a_src->meta.wi;
83180
  }
83181
83182
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config;
83183
  switch (coro_susp_point) {
83184
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83185
83186
    if (self->private_impl.f_call_sequence != 0u) {
83187
      status = wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
83188
      goto exit;
83189
    }
83190
    {
83191
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83192
      uint32_t t_0;
83193
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83194
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83195
        iop_a_src += 4;
83196
      } else {
83197
        self->private_data.s_do_decode_image_config.scratch = 0;
83198
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83199
        while (true) {
83200
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83201
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83202
            goto suspend;
83203
          }
83204
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
83205
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
83206
          *scratch <<= 8;
83207
          *scratch >>= 8;
83208
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
83209
          if (num_bits_0 == 24) {
83210
            t_0 = ((uint32_t)(*scratch));
83211
            break;
83212
          }
83213
          num_bits_0 += 8u;
83214
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
83215
        }
83216
      }
83217
      v_c32 = t_0;
83218
    }
83219
    if (v_c32 != 1179011410u) {
83220
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83221
      goto exit;
83222
    }
83223
    {
83224
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83225
      uint32_t t_1;
83226
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83227
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83228
        iop_a_src += 4;
83229
      } else {
83230
        self->private_data.s_do_decode_image_config.scratch = 0;
83231
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
83232
        while (true) {
83233
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83234
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83235
            goto suspend;
83236
          }
83237
          uint64_t* scratch = &self->private_data.s_do_decode_image_config.scratch;
83238
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
83239
          *scratch <<= 8;
83240
          *scratch >>= 8;
83241
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
83242
          if (num_bits_1 == 24) {
83243
            t_1 = ((uint32_t)(*scratch));
83244
            break;
83245
          }
83246
          num_bits_1 += 8u;
83247
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
83248
        }
83249
      }
83250
      self->private_impl.f_riff_chunk_length = t_1;
83251
    }
83252
    if ((self->private_impl.f_riff_chunk_length & 1u) != 0u) {
83253
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83254
      goto exit;
83255
    }
83256
    while (true) {
83257
      {
83258
        const bool o_0_closed_a_src = a_src->meta.closed;
83259
        const uint8_t* o_0_io2_a_src = io2_a_src;
83260
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
83261
            ((uint64_t)(self->private_impl.f_riff_chunk_length)));
83262
        if (a_src) {
83263
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
83264
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
83265
          a_src->meta.wi = n;
83266
        }
83267
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
83268
        {
83269
          if (a_src) {
83270
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83271
          }
83272
          wuffs_base__status t_2 = wuffs_webp__decoder__do_decode_image_config_limited(self, a_dst, a_src);
83273
          v_status = t_2;
83274
          if (a_src) {
83275
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
83276
          }
83277
        }
83278
        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))))));
83279
        io2_a_src = o_0_io2_a_src;
83280
        if (a_src) {
83281
          a_src->meta.closed = o_0_closed_a_src;
83282
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
83283
        }
83284
      }
83285
      if (wuffs_base__status__is_ok(&v_status)) {
83286
        break;
83287
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
83288
        status = v_status;
83289
        if (wuffs_base__status__is_error(&status)) {
83290
          goto exit;
83291
        } else if (wuffs_base__status__is_suspension(&status)) {
83292
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
83293
          goto exit;
83294
        }
83295
        goto ok;
83296
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_riff_chunk_length == 0u)) {
83297
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
83298
        goto exit;
83299
      }
83300
      status = v_status;
83301
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
83302
    }
83303
    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)));
83304
    if ( ! self->private_impl.f_is_vp8_lossy && (a_dst != NULL)) {
83305
      wuffs_base__image_config__set(
83306
          a_dst,
83307
          self->private_impl.f_pixfmt,
83308
          0u,
83309
          self->private_impl.f_width,
83310
          self->private_impl.f_height,
83311
          self->private_impl.f_frame_config_io_position,
83312
          false);
83313
    }
83314
    self->private_impl.f_call_sequence = 32u;
83315
83316
    ok:
83317
    self->private_impl.p_do_decode_image_config = 0;
83318
    goto exit;
83319
  }
83320
83321
  goto suspend;
83322
  suspend:
83323
  self->private_impl.p_do_decode_image_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83324
83325
  goto exit;
83326
  exit:
83327
  if (a_src && a_src->data.ptr) {
83328
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83329
  }
83330
83331
  return status;
83332
}
83333
83334
// -------- func webp.decoder.do_decode_image_config_limited
83335
83336
WUFFS_BASE__GENERATED_C_CODE
83337
static wuffs_base__status
83338
wuffs_webp__decoder__do_decode_image_config_limited(
83339
    wuffs_webp__decoder* self,
83340
    wuffs_base__image_config* a_dst,
83341
    wuffs_base__io_buffer* a_src) {
83342
  wuffs_base__status status = wuffs_base__make_status(NULL);
83343
83344
  uint32_t v_c32 = 0;
83345
  uint64_t v_r_mark = 0;
83346
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83347
83348
  const uint8_t* iop_a_src = NULL;
83349
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83350
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83351
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83352
  if (a_src && a_src->data.ptr) {
83353
    io0_a_src = a_src->data.ptr;
83354
    io1_a_src = io0_a_src + a_src->meta.ri;
83355
    iop_a_src = io1_a_src;
83356
    io2_a_src = io0_a_src + a_src->meta.wi;
83357
  }
83358
83359
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited;
83360
  switch (coro_susp_point) {
83361
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83362
83363
    {
83364
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83365
      uint32_t t_0;
83366
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83367
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83368
        iop_a_src += 4;
83369
      } else {
83370
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
83371
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83372
        while (true) {
83373
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83374
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83375
            goto suspend;
83376
          }
83377
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
83378
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
83379
          *scratch <<= 8;
83380
          *scratch >>= 8;
83381
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
83382
          if (num_bits_0 == 24) {
83383
            t_0 = ((uint32_t)(*scratch));
83384
            break;
83385
          }
83386
          num_bits_0 += 8u;
83387
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
83388
        }
83389
      }
83390
      v_c32 = t_0;
83391
    }
83392
    if (v_c32 != 1346520407u) {
83393
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83394
      goto exit;
83395
    }
83396
    {
83397
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83398
      uint32_t t_1;
83399
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83400
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83401
        iop_a_src += 4;
83402
      } else {
83403
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
83404
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
83405
        while (true) {
83406
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83407
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83408
            goto suspend;
83409
          }
83410
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
83411
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
83412
          *scratch <<= 8;
83413
          *scratch >>= 8;
83414
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
83415
          if (num_bits_1 == 24) {
83416
            t_1 = ((uint32_t)(*scratch));
83417
            break;
83418
          }
83419
          num_bits_1 += 8u;
83420
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
83421
        }
83422
      }
83423
      v_c32 = t_1;
83424
    }
83425
    if (v_c32 == 540561494u) {
83426
      self->private_impl.f_is_vp8_lossy = true;
83427
    } else if (v_c32 == 1278758998u) {
83428
    } else if (v_c32 == 1480085590u) {
83429
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_webp_file);
83430
      goto exit;
83431
    } else {
83432
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83433
      goto exit;
83434
    }
83435
    {
83436
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
83437
      uint32_t t_2;
83438
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83439
        t_2 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83440
        iop_a_src += 4;
83441
      } else {
83442
        self->private_data.s_do_decode_image_config_limited.scratch = 0;
83443
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
83444
        while (true) {
83445
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83446
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83447
            goto suspend;
83448
          }
83449
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited.scratch;
83450
          uint32_t num_bits_2 = ((uint32_t)(*scratch >> 56));
83451
          *scratch <<= 8;
83452
          *scratch >>= 8;
83453
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_2;
83454
          if (num_bits_2 == 24) {
83455
            t_2 = ((uint32_t)(*scratch));
83456
            break;
83457
          }
83458
          num_bits_2 += 8u;
83459
          *scratch |= ((uint64_t)(num_bits_2)) << 56;
83460
        }
83461
      }
83462
      self->private_impl.f_sub_chunk_length = t_2;
83463
    }
83464
    if (self->private_impl.f_sub_chunk_length < 4u) {
83465
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83466
      goto exit;
83467
    }
83468
    self->private_impl.f_sub_chunk_has_padding = ((self->private_impl.f_sub_chunk_length & 1u) != 0u);
83469
    while (true) {
83470
      {
83471
        const bool o_0_closed_a_src = a_src->meta.closed;
83472
        const uint8_t* o_0_io2_a_src = io2_a_src;
83473
        wuffs_private_impl__io_reader__limit(&io2_a_src, iop_a_src,
83474
            ((uint64_t)(self->private_impl.f_sub_chunk_length)));
83475
        if (a_src) {
83476
          size_t n = ((size_t)(io2_a_src - a_src->data.ptr));
83477
          a_src->meta.closed = a_src->meta.closed && (a_src->meta.wi <= n);
83478
          a_src->meta.wi = n;
83479
        }
83480
        v_r_mark = ((uint64_t)(iop_a_src - io0_a_src));
83481
        if (self->private_impl.f_is_vp8_lossy) {
83482
          {
83483
            if (a_src) {
83484
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83485
            }
83486
            wuffs_base__status t_3 = wuffs_vp8__decoder__decode_image_config(&self->private_data.f_vp8, a_dst, a_src);
83487
            v_status = t_3;
83488
            if (a_src) {
83489
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
83490
            }
83491
          }
83492
        } else {
83493
          {
83494
            if (a_src) {
83495
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83496
            }
83497
            wuffs_base__status t_4 = wuffs_webp__decoder__do_decode_image_config_limited_vp8l(self, a_src);
83498
            v_status = t_4;
83499
            if (a_src) {
83500
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
83501
            }
83502
          }
83503
        }
83504
        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))))));
83505
        io2_a_src = o_0_io2_a_src;
83506
        if (a_src) {
83507
          a_src->meta.closed = o_0_closed_a_src;
83508
          a_src->meta.wi = ((size_t)(io2_a_src - a_src->data.ptr));
83509
        }
83510
      }
83511
      if (wuffs_base__status__is_ok(&v_status)) {
83512
        break;
83513
      } else if ( ! wuffs_base__status__is_suspension(&v_status)) {
83514
        status = v_status;
83515
        if (wuffs_base__status__is_error(&status)) {
83516
          goto exit;
83517
        } else if (wuffs_base__status__is_suspension(&status)) {
83518
          status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
83519
          goto exit;
83520
        }
83521
        goto ok;
83522
      } else if ((v_status.repr == wuffs_base__suspension__short_read) && (self->private_impl.f_sub_chunk_length == 0u)) {
83523
        status = wuffs_base__make_status(wuffs_webp__error__short_chunk);
83524
        goto exit;
83525
      }
83526
      status = v_status;
83527
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
83528
    }
83529
83530
    ok:
83531
    self->private_impl.p_do_decode_image_config_limited = 0;
83532
    goto exit;
83533
  }
83534
83535
  goto suspend;
83536
  suspend:
83537
  self->private_impl.p_do_decode_image_config_limited = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83538
83539
  goto exit;
83540
  exit:
83541
  if (a_src && a_src->data.ptr) {
83542
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83543
  }
83544
83545
  return status;
83546
}
83547
83548
// -------- func webp.decoder.do_decode_image_config_limited_vp8l
83549
83550
WUFFS_BASE__GENERATED_C_CODE
83551
static wuffs_base__status
83552
wuffs_webp__decoder__do_decode_image_config_limited_vp8l(
83553
    wuffs_webp__decoder* self,
83554
    wuffs_base__io_buffer* a_src) {
83555
  wuffs_base__status status = wuffs_base__make_status(NULL);
83556
83557
  uint32_t v_c32 = 0;
83558
  uint32_t v_transform_size = 0;
83559
83560
  const uint8_t* iop_a_src = NULL;
83561
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83562
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83563
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83564
  if (a_src && a_src->data.ptr) {
83565
    io0_a_src = a_src->data.ptr;
83566
    io1_a_src = io0_a_src + a_src->meta.ri;
83567
    iop_a_src = io1_a_src;
83568
    io2_a_src = io0_a_src + a_src->meta.wi;
83569
  }
83570
83571
  uint32_t coro_susp_point = self->private_impl.p_do_decode_image_config_limited_vp8l;
83572
  switch (coro_susp_point) {
83573
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83574
83575
    {
83576
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83577
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83578
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83579
        goto suspend;
83580
      }
83581
      uint32_t t_0 = *iop_a_src++;
83582
      v_c32 = t_0;
83583
    }
83584
    if (v_c32 != 47u) {
83585
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83586
      goto exit;
83587
    }
83588
    {
83589
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83590
      uint32_t t_1;
83591
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
83592
        t_1 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
83593
        iop_a_src += 4;
83594
      } else {
83595
        self->private_data.s_do_decode_image_config_limited_vp8l.scratch = 0;
83596
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83597
        while (true) {
83598
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83599
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83600
            goto suspend;
83601
          }
83602
          uint64_t* scratch = &self->private_data.s_do_decode_image_config_limited_vp8l.scratch;
83603
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
83604
          *scratch <<= 8;
83605
          *scratch >>= 8;
83606
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
83607
          if (num_bits_1 == 24) {
83608
            t_1 = ((uint32_t)(*scratch));
83609
            break;
83610
          }
83611
          num_bits_1 += 8u;
83612
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
83613
        }
83614
      }
83615
      v_c32 = t_1;
83616
    }
83617
    self->private_impl.f_width = ((v_c32 & 16383u) + 1u);
83618
    v_c32 >>= 14u;
83619
    self->private_impl.f_height = ((v_c32 & 16383u) + 1u);
83620
    v_c32 >>= 14u;
83621
    self->private_impl.f_pixfmt = 2415954056u;
83622
    if ((v_c32 & 1u) != 0u) {
83623
      self->private_impl.f_pixfmt = 2164295816u;
83624
    }
83625
    v_c32 >>= 1u;
83626
    if (v_c32 != 0u) {
83627
      status = wuffs_base__make_status(wuffs_webp__error__bad_header);
83628
      goto exit;
83629
    }
83630
    v_transform_size = (4u * ((self->private_impl.f_width + 3u) >> 2u) * ((self->private_impl.f_height + 3u) >> 2u));
83631
    self->private_impl.f_workbuf_offset_for_transform[0u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (0u * v_transform_size));
83632
    self->private_impl.f_workbuf_offset_for_transform[1u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (1u * v_transform_size));
83633
    self->private_impl.f_workbuf_offset_for_transform[2u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (2u * v_transform_size));
83634
    self->private_impl.f_workbuf_offset_for_transform[3u] = ((4u * self->private_impl.f_width * self->private_impl.f_height) + (3u * v_transform_size));
83635
83636
    goto ok;
83637
    ok:
83638
    self->private_impl.p_do_decode_image_config_limited_vp8l = 0;
83639
    goto exit;
83640
  }
83641
83642
  goto suspend;
83643
  suspend:
83644
  self->private_impl.p_do_decode_image_config_limited_vp8l = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83645
83646
  goto exit;
83647
  exit:
83648
  if (a_src && a_src->data.ptr) {
83649
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83650
  }
83651
83652
  return status;
83653
}
83654
83655
// -------- func webp.decoder.decode_frame_config
83656
83657
WUFFS_BASE__GENERATED_C_CODE
83658
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
83659
wuffs_webp__decoder__decode_frame_config(
83660
    wuffs_webp__decoder* self,
83661
    wuffs_base__frame_config* a_dst,
83662
    wuffs_base__io_buffer* a_src) {
83663
  if (!self) {
83664
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83665
  }
83666
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
83667
    return wuffs_base__make_status(
83668
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
83669
        ? wuffs_base__error__disabled_by_previous_error
83670
        : wuffs_base__error__initialize_not_called);
83671
  }
83672
  if (!a_src) {
83673
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83674
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
83675
  }
83676
  if ((self->private_impl.active_coroutine != 0) &&
83677
      (self->private_impl.active_coroutine != 2)) {
83678
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83679
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
83680
  }
83681
  self->private_impl.active_coroutine = 0;
83682
  wuffs_base__status status = wuffs_base__make_status(NULL);
83683
83684
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83685
83686
  uint32_t coro_susp_point = self->private_impl.p_decode_frame_config;
83687
  switch (coro_susp_point) {
83688
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83689
83690
    while (true) {
83691
      if (self->private_impl.f_is_vp8_lossy) {
83692
        {
83693
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame_config(&self->private_data.f_vp8, a_dst, a_src);
83694
          v_status = t_0;
83695
        }
83696
      } else {
83697
        {
83698
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame_config(self, a_dst, a_src);
83699
          v_status = t_1;
83700
        }
83701
      }
83702
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
83703
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
83704
        goto exit;
83705
      }
83706
      status = v_status;
83707
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
83708
    }
83709
83710
    ok:
83711
    self->private_impl.p_decode_frame_config = 0;
83712
    goto exit;
83713
  }
83714
83715
  goto suspend;
83716
  suspend:
83717
  self->private_impl.p_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83718
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 2 : 0;
83719
83720
  goto exit;
83721
  exit:
83722
  if (wuffs_base__status__is_error(&status)) {
83723
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83724
  }
83725
  return status;
83726
}
83727
83728
// -------- func webp.decoder.do_decode_frame_config
83729
83730
WUFFS_BASE__GENERATED_C_CODE
83731
static wuffs_base__status
83732
wuffs_webp__decoder__do_decode_frame_config(
83733
    wuffs_webp__decoder* self,
83734
    wuffs_base__frame_config* a_dst,
83735
    wuffs_base__io_buffer* a_src) {
83736
  wuffs_base__status status = wuffs_base__make_status(NULL);
83737
83738
  wuffs_base__pixel_format v_pixfmt = {0};
83739
83740
  const uint8_t* iop_a_src = NULL;
83741
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83742
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83743
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83744
  if (a_src && a_src->data.ptr) {
83745
    io0_a_src = a_src->data.ptr;
83746
    io1_a_src = io0_a_src + a_src->meta.ri;
83747
    iop_a_src = io1_a_src;
83748
    io2_a_src = io0_a_src + a_src->meta.wi;
83749
  }
83750
83751
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame_config;
83752
  switch (coro_susp_point) {
83753
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83754
83755
    if (self->private_impl.f_call_sequence == 32u) {
83756
    } else if (self->private_impl.f_call_sequence < 32u) {
83757
      if (a_src) {
83758
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83759
      }
83760
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83761
      status = wuffs_webp__decoder__do_decode_image_config(self, NULL, a_src);
83762
      if (a_src) {
83763
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
83764
      }
83765
      if (status.repr) {
83766
        goto suspend;
83767
      }
83768
    } else if (self->private_impl.f_call_sequence == 40u) {
83769
      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)))) {
83770
        status = wuffs_base__make_status(wuffs_base__error__bad_restart);
83771
        goto exit;
83772
      }
83773
    } else if (self->private_impl.f_call_sequence == 64u) {
83774
      self->private_impl.f_call_sequence = 96u;
83775
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
83776
      goto ok;
83777
    } else {
83778
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
83779
      goto ok;
83780
    }
83781
    if (a_dst != NULL) {
83782
      v_pixfmt = wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt);
83783
      wuffs_base__frame_config__set(
83784
          a_dst,
83785
          wuffs_base__utility__make_rect_ie_u32(
83786
          0u,
83787
          0u,
83788
          self->private_impl.f_width,
83789
          self->private_impl.f_height),
83790
          ((wuffs_base__flicks)(0u)),
83791
          0u,
83792
          self->private_impl.f_frame_config_io_position,
83793
          0u,
83794
          false,
83795
          false,
83796
          wuffs_base__pixel_format__default_background_color(&v_pixfmt));
83797
    }
83798
    self->private_impl.f_call_sequence = 64u;
83799
83800
    ok:
83801
    self->private_impl.p_do_decode_frame_config = 0;
83802
    goto exit;
83803
  }
83804
83805
  goto suspend;
83806
  suspend:
83807
  self->private_impl.p_do_decode_frame_config = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83808
83809
  goto exit;
83810
  exit:
83811
  if (a_src && a_src->data.ptr) {
83812
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83813
  }
83814
83815
  return status;
83816
}
83817
83818
// -------- func webp.decoder.decode_frame
83819
83820
WUFFS_BASE__GENERATED_C_CODE
83821
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
83822
wuffs_webp__decoder__decode_frame(
83823
    wuffs_webp__decoder* self,
83824
    wuffs_base__pixel_buffer* a_dst,
83825
    wuffs_base__io_buffer* a_src,
83826
    wuffs_base__pixel_blend a_blend,
83827
    wuffs_base__slice_u8 a_workbuf,
83828
    wuffs_base__decode_frame_options* a_opts) {
83829
  if (!self) {
83830
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
83831
  }
83832
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
83833
    return wuffs_base__make_status(
83834
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
83835
        ? wuffs_base__error__disabled_by_previous_error
83836
        : wuffs_base__error__initialize_not_called);
83837
  }
83838
  if (!a_dst || !a_src) {
83839
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83840
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
83841
  }
83842
  if ((self->private_impl.active_coroutine != 0) &&
83843
      (self->private_impl.active_coroutine != 3)) {
83844
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83845
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
83846
  }
83847
  self->private_impl.active_coroutine = 0;
83848
  wuffs_base__status status = wuffs_base__make_status(NULL);
83849
83850
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83851
83852
  uint32_t coro_susp_point = self->private_impl.p_decode_frame;
83853
  switch (coro_susp_point) {
83854
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83855
83856
    while (true) {
83857
      if (self->private_impl.f_is_vp8_lossy) {
83858
        {
83859
          wuffs_base__status t_0 = wuffs_vp8__decoder__decode_frame(&self->private_data.f_vp8,
83860
              a_dst,
83861
              a_src,
83862
              a_blend,
83863
              a_workbuf,
83864
              a_opts);
83865
          v_status = t_0;
83866
        }
83867
      } else {
83868
        {
83869
          wuffs_base__status t_1 = wuffs_webp__decoder__do_decode_frame(self,
83870
              a_dst,
83871
              a_src,
83872
              a_blend,
83873
              a_workbuf,
83874
              a_opts);
83875
          v_status = t_1;
83876
        }
83877
      }
83878
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
83879
        status = wuffs_base__make_status(wuffs_webp__error__truncated_input);
83880
        goto exit;
83881
      }
83882
      status = v_status;
83883
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
83884
    }
83885
83886
    ok:
83887
    self->private_impl.p_decode_frame = 0;
83888
    goto exit;
83889
  }
83890
83891
  goto suspend;
83892
  suspend:
83893
  self->private_impl.p_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
83894
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 3 : 0;
83895
83896
  goto exit;
83897
  exit:
83898
  if (wuffs_base__status__is_error(&status)) {
83899
    self->private_impl.magic = WUFFS_BASE__DISABLED;
83900
  }
83901
  return status;
83902
}
83903
83904
// -------- func webp.decoder.do_decode_frame
83905
83906
WUFFS_BASE__GENERATED_C_CODE
83907
static wuffs_base__status
83908
wuffs_webp__decoder__do_decode_frame(
83909
    wuffs_webp__decoder* self,
83910
    wuffs_base__pixel_buffer* a_dst,
83911
    wuffs_base__io_buffer* a_src,
83912
    wuffs_base__pixel_blend a_blend,
83913
    wuffs_base__slice_u8 a_workbuf,
83914
    wuffs_base__decode_frame_options* a_opts) {
83915
  wuffs_base__status status = wuffs_base__make_status(NULL);
83916
83917
  uint8_t v_c8 = 0;
83918
  uint32_t v_has_more = 0;
83919
  uint32_t v_width = 0;
83920
  wuffs_base__slice_u8 v_dst = {0};
83921
  wuffs_base__slice_u8 v_tile_data = {0};
83922
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
83923
  wuffs_base__slice_u8 v_pix = {0};
83924
  uint32_t v_which = 0;
83925
  uint32_t v_transform_type = 0;
83926
  uint64_t v_ti = 0;
83927
  uint64_t v_tj = 0;
83928
83929
  const uint8_t* iop_a_src = NULL;
83930
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83931
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83932
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
83933
  if (a_src && a_src->data.ptr) {
83934
    io0_a_src = a_src->data.ptr;
83935
    io1_a_src = io0_a_src + a_src->meta.ri;
83936
    iop_a_src = io1_a_src;
83937
    io2_a_src = io0_a_src + a_src->meta.wi;
83938
  }
83939
83940
  uint32_t coro_susp_point = self->private_impl.p_do_decode_frame;
83941
  if (coro_susp_point) {
83942
    v_width = self->private_data.s_do_decode_frame.v_width;
83943
  }
83944
  switch (coro_susp_point) {
83945
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
83946
83947
    if (self->private_impl.f_call_sequence == 64u) {
83948
    } else if (self->private_impl.f_call_sequence < 64u) {
83949
      if (a_src) {
83950
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83951
      }
83952
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
83953
      status = wuffs_webp__decoder__do_decode_frame_config(self, NULL, a_src);
83954
      if (a_src) {
83955
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
83956
      }
83957
      if (status.repr) {
83958
        goto suspend;
83959
      }
83960
    } else {
83961
      status = wuffs_base__make_status(wuffs_base__note__end_of_data);
83962
      goto ok;
83963
    }
83964
    self->private_impl.f_seen_transform[0u] = false;
83965
    self->private_impl.f_seen_transform[1u] = false;
83966
    self->private_impl.f_seen_transform[2u] = false;
83967
    self->private_impl.f_seen_transform[3u] = false;
83968
    self->private_impl.f_n_transforms = 0u;
83969
    while (true) {
83970
      if (self->private_impl.f_n_bits < 1u) {
83971
        {
83972
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
83973
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
83974
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
83975
            goto suspend;
83976
          }
83977
          uint8_t t_0 = *iop_a_src++;
83978
          v_c8 = t_0;
83979
        }
83980
        self->private_impl.f_bits = ((uint32_t)(v_c8));
83981
        self->private_impl.f_n_bits = 8u;
83982
      }
83983
      v_has_more = (self->private_impl.f_bits & 1u);
83984
      self->private_impl.f_bits >>= 1u;
83985
      self->private_impl.f_n_bits -= 1u;
83986
      if (v_has_more == 0u) {
83987
        break;
83988
      }
83989
      if (a_src) {
83990
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
83991
      }
83992
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
83993
      status = wuffs_webp__decoder__decode_transform(self, a_src, a_workbuf);
83994
      if (a_src) {
83995
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
83996
      }
83997
      if (status.repr) {
83998
        goto suspend;
83999
      }
84000
    }
84001
    v_width = self->private_impl.f_width;
84002
    if (self->private_impl.f_seen_transform[3u]) {
84003
      v_width = self->private_impl.f_color_indexing_width;
84004
    }
84005
    if (a_src) {
84006
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84007
    }
84008
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84009
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
84010
    if (a_src) {
84011
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
84012
    }
84013
    if (status.repr) {
84014
      goto suspend;
84015
    }
84016
    self->private_impl.f_overall_color_cache_bits = self->private_impl.f_color_cache_bits;
84017
    if (a_src) {
84018
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84019
    }
84020
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
84021
    status = wuffs_webp__decoder__decode_hg_table(self, a_src, v_width, a_workbuf);
84022
    if (a_src) {
84023
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
84024
    }
84025
    if (status.repr) {
84026
      goto suspend;
84027
    }
84028
    self->private_impl.f_color_cache_bits = self->private_impl.f_overall_color_cache_bits;
84029
    if (a_src) {
84030
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84031
    }
84032
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
84033
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, self->private_impl.f_overall_n_huffman_groups);
84034
    if (a_src) {
84035
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
84036
    }
84037
    if (status.repr) {
84038
      goto suspend;
84039
    }
84040
    while (true) {
84041
      if ((((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u]))) ||
84042
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))) ||
84043
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])) > ((uint64_t)(a_workbuf.len))) ||
84044
          (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len)))) {
84045
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84046
        goto exit;
84047
      }
84048
      v_dst = wuffs_base__slice_u8__subslice_ij(a_workbuf,
84049
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_color_indexing)),
84050
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
84051
      v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf,
84052
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
84053
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
84054
      {
84055
        if (a_src) {
84056
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84057
        }
84058
        wuffs_base__status t_1 = wuffs_webp__decoder__decode_pixels(self,
84059
            v_dst,
84060
            a_src,
84061
            v_width,
84062
            self->private_impl.f_height,
84063
            v_tile_data,
84064
            self->private_impl.f_overall_tile_size_log2);
84065
        v_status = t_1;
84066
        if (a_src) {
84067
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
84068
        }
84069
      }
84070
      if (wuffs_base__status__is_ok(&v_status)) {
84071
        break;
84072
      }
84073
      status = v_status;
84074
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(7);
84075
    }
84076
    if (((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])) > ((uint64_t)(a_workbuf.len))) {
84077
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84078
      goto exit;
84079
    }
84080
    v_pix = wuffs_base__slice_u8__subslice_j(a_workbuf, ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])));
84081
    v_which = self->private_impl.f_n_transforms;
84082
    while (v_which > 0u) {
84083
      v_which -= 1u;
84084
      v_transform_type = ((uint32_t)(self->private_impl.f_transform_type[v_which]));
84085
      v_tile_data = wuffs_base__utility__empty_slice_u8();
84086
      if (v_transform_type < 2u) {
84087
        v_ti = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)]));
84088
        v_tj = ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]));
84089
        if ((v_ti <= v_tj) && (v_tj <= ((uint64_t)(a_workbuf.len)))) {
84090
          v_tile_data = wuffs_base__slice_u8__subslice_ij(a_workbuf, v_ti, v_tj);
84091
        }
84092
      }
84093
      if (v_transform_type == 0u) {
84094
        wuffs_webp__decoder__apply_transform_predictor(self, v_pix, v_tile_data);
84095
      } else if (v_transform_type == 1u) {
84096
        wuffs_webp__decoder__apply_transform_cross_color(self, v_pix, v_tile_data);
84097
      } else if (v_transform_type == 2u) {
84098
        wuffs_webp__decoder__apply_transform_subtract_green(self, v_pix);
84099
      } else {
84100
        wuffs_webp__decoder__apply_transform_color_indexing(self, v_pix);
84101
        v_width = self->private_impl.f_width;
84102
      }
84103
    }
84104
    v_status = wuffs_webp__decoder__swizzle(self, a_dst, v_pix, a_blend);
84105
    if ( ! wuffs_base__status__is_ok(&v_status)) {
84106
      status = v_status;
84107
      if (wuffs_base__status__is_error(&status)) {
84108
        goto exit;
84109
      } else if (wuffs_base__status__is_suspension(&status)) {
84110
        status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension);
84111
        goto exit;
84112
      }
84113
      goto ok;
84114
    }
84115
    self->private_impl.f_call_sequence = 96u;
84116
84117
    ok:
84118
    self->private_impl.p_do_decode_frame = 0;
84119
    goto exit;
84120
  }
84121
84122
  goto suspend;
84123
  suspend:
84124
  self->private_impl.p_do_decode_frame = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84125
  self->private_data.s_do_decode_frame.v_width = v_width;
84126
84127
  goto exit;
84128
  exit:
84129
  if (a_src && a_src->data.ptr) {
84130
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84131
  }
84132
84133
  return status;
84134
}
84135
84136
// -------- func webp.decoder.decode_transform
84137
84138
WUFFS_BASE__GENERATED_C_CODE
84139
static wuffs_base__status
84140
wuffs_webp__decoder__decode_transform(
84141
    wuffs_webp__decoder* self,
84142
    wuffs_base__io_buffer* a_src,
84143
    wuffs_base__slice_u8 a_workbuf) {
84144
  wuffs_base__status status = wuffs_base__make_status(NULL);
84145
84146
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84147
  uint8_t v_c8 = 0;
84148
  uint32_t v_transform_type = 0;
84149
  uint32_t v_tile_size_log2 = 0;
84150
  wuffs_base__slice_u8 v_p = {0};
84151
84152
  const uint8_t* iop_a_src = NULL;
84153
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84154
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84155
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84156
  if (a_src && a_src->data.ptr) {
84157
    io0_a_src = a_src->data.ptr;
84158
    io1_a_src = io0_a_src + a_src->meta.ri;
84159
    iop_a_src = io1_a_src;
84160
    io2_a_src = io0_a_src + a_src->meta.wi;
84161
  }
84162
84163
  uint32_t coro_susp_point = self->private_impl.p_decode_transform;
84164
  if (coro_susp_point) {
84165
    v_transform_type = self->private_data.s_decode_transform.v_transform_type;
84166
    v_tile_size_log2 = self->private_data.s_decode_transform.v_tile_size_log2;
84167
  }
84168
  switch (coro_susp_point) {
84169
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84170
84171
    if (self->private_impl.f_n_bits < 2u) {
84172
      {
84173
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84174
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84175
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84176
          goto suspend;
84177
        }
84178
        uint8_t t_0 = *iop_a_src++;
84179
        v_c8 = t_0;
84180
      }
84181
      if (self->private_impl.f_n_bits >= 2u) {
84182
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
84183
        goto exit;
84184
      }
84185
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
84186
      self->private_impl.f_n_bits += 8u;
84187
    }
84188
    v_transform_type = (self->private_impl.f_bits & 3u);
84189
    self->private_impl.f_bits >>= 2u;
84190
    self->private_impl.f_n_bits -= 2u;
84191
    if (self->private_impl.f_seen_transform[v_transform_type] || (self->private_impl.f_n_transforms >= 4u)) {
84192
      status = wuffs_base__make_status(wuffs_webp__error__bad_transform);
84193
      goto exit;
84194
    } else if (self->private_impl.f_seen_transform[3u]) {
84195
      status = wuffs_base__make_status(wuffs_webp__error__unsupported_transform_after_color_indexing_transform);
84196
      goto exit;
84197
    }
84198
    self->private_impl.f_seen_transform[v_transform_type] = true;
84199
    self->private_impl.f_transform_type[self->private_impl.f_n_transforms] = ((uint8_t)(v_transform_type));
84200
    self->private_impl.f_n_transforms += 1u;
84201
    if (v_transform_type < 2u) {
84202
      if (self->private_impl.f_n_bits < 3u) {
84203
        {
84204
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84205
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84206
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84207
            goto suspend;
84208
          }
84209
          uint8_t t_1 = *iop_a_src++;
84210
          v_c8 = t_1;
84211
        }
84212
        if (self->private_impl.f_n_bits >= 3u) {
84213
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
84214
          goto exit;
84215
        }
84216
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
84217
        self->private_impl.f_n_bits += 8u;
84218
      }
84219
      v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
84220
      self->private_impl.f_transform_tile_size_log2[v_transform_type] = ((uint8_t)(v_tile_size_log2));
84221
      self->private_impl.f_bits >>= 3u;
84222
      self->private_impl.f_n_bits -= 3u;
84223
      if (a_src) {
84224
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84225
      }
84226
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84227
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
84228
      if (a_src) {
84229
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
84230
      }
84231
      if (status.repr) {
84232
        goto suspend;
84233
      }
84234
      if (a_src) {
84235
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84236
      }
84237
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84238
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
84239
      if (a_src) {
84240
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
84241
      }
84242
      if (status.repr) {
84243
        goto suspend;
84244
      }
84245
      while (true) {
84246
        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)))) {
84247
          status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84248
          goto exit;
84249
        }
84250
        {
84251
          if (a_src) {
84252
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84253
          }
84254
          wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
84255
              wuffs_base__slice_u8__subslice_ij(a_workbuf,
84256
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 1u)])),
84257
              ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[(v_transform_type + 2u)]))),
84258
              a_src,
84259
              ((self->private_impl.f_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
84260
              ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
84261
              wuffs_base__utility__empty_slice_u8(),
84262
              0u);
84263
          v_status = t_2;
84264
          if (a_src) {
84265
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
84266
          }
84267
        }
84268
        if (wuffs_base__status__is_ok(&v_status)) {
84269
          break;
84270
        }
84271
        status = v_status;
84272
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
84273
      }
84274
    } else if (v_transform_type == 2u) {
84275
    } else {
84276
      if (self->private_impl.f_n_bits < 8u) {
84277
        {
84278
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
84279
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84280
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84281
            goto suspend;
84282
          }
84283
          uint8_t t_3 = *iop_a_src++;
84284
          v_c8 = t_3;
84285
        }
84286
        if (self->private_impl.f_n_bits >= 8u) {
84287
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
84288
          goto exit;
84289
        }
84290
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
84291
        self->private_impl.f_n_bits += 8u;
84292
      }
84293
      self->private_impl.f_color_indexing_palette_size = ((self->private_impl.f_bits & 255u) + 1u);
84294
      self->private_impl.f_bits >>= 8u;
84295
      self->private_impl.f_n_bits -= 8u;
84296
      if (self->private_impl.f_color_indexing_palette_size <= 2u) {
84297
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 7u) / 8u);
84298
        self->private_impl.f_transform_tile_size_log2[3u] = 3u;
84299
      } else if (self->private_impl.f_color_indexing_palette_size <= 4u) {
84300
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 3u) / 4u);
84301
        self->private_impl.f_transform_tile_size_log2[3u] = 2u;
84302
      } else if (self->private_impl.f_color_indexing_palette_size <= 16u) {
84303
        self->private_impl.f_color_indexing_width = ((self->private_impl.f_width + 1u) / 2u);
84304
        self->private_impl.f_transform_tile_size_log2[3u] = 1u;
84305
      } else {
84306
        self->private_impl.f_color_indexing_width = self->private_impl.f_width;
84307
        self->private_impl.f_transform_tile_size_log2[3u] = 0u;
84308
      }
84309
      if (self->private_impl.f_width >= self->private_impl.f_color_indexing_width) {
84310
        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);
84311
      }
84312
      if (a_src) {
84313
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84314
      }
84315
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
84316
      status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
84317
      if (a_src) {
84318
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
84319
      }
84320
      if (status.repr) {
84321
        goto suspend;
84322
      }
84323
      if (a_src) {
84324
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84325
      }
84326
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
84327
      status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
84328
      if (a_src) {
84329
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
84330
      }
84331
      if (status.repr) {
84332
        goto suspend;
84333
      }
84334
      if (a_src) {
84335
        a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84336
      }
84337
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
84338
      status = wuffs_webp__decoder__decode_pixels(self,
84339
          wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size)),
84340
          a_src,
84341
          self->private_impl.f_color_indexing_palette_size,
84342
          1u,
84343
          wuffs_base__utility__empty_slice_u8(),
84344
          0u);
84345
      if (a_src) {
84346
        iop_a_src = a_src->data.ptr + a_src->meta.ri;
84347
      }
84348
      if (status.repr) {
84349
        goto suspend;
84350
      }
84351
      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);
84352
      v_p = wuffs_base__make_slice_u8(self->private_data.f_palette, (4u * self->private_impl.f_color_indexing_palette_size));
84353
      while (((uint64_t)(v_p.len)) >= 8u) {
84354
#if defined(__GNUC__)
84355
#pragma GCC diagnostic push
84356
#pragma GCC diagnostic ignored "-Wconversion"
84357
#endif
84358
        v_p.ptr[4u] += v_p.ptr[0u];
84359
        v_p.ptr[5u] += v_p.ptr[1u];
84360
        v_p.ptr[6u] += v_p.ptr[2u];
84361
        v_p.ptr[7u] += v_p.ptr[3u];
84362
#if defined(__GNUC__)
84363
#pragma GCC diagnostic pop
84364
#endif
84365
        v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
84366
      }
84367
    }
84368
84369
    ok:
84370
    self->private_impl.p_decode_transform = 0;
84371
    goto exit;
84372
  }
84373
84374
  goto suspend;
84375
  suspend:
84376
  self->private_impl.p_decode_transform = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84377
  self->private_data.s_decode_transform.v_transform_type = v_transform_type;
84378
  self->private_data.s_decode_transform.v_tile_size_log2 = v_tile_size_log2;
84379
84380
  goto exit;
84381
  exit:
84382
  if (a_src && a_src->data.ptr) {
84383
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84384
  }
84385
84386
  return status;
84387
}
84388
84389
// -------- func webp.decoder.decode_color_cache_parameters
84390
84391
WUFFS_BASE__GENERATED_C_CODE
84392
static wuffs_base__status
84393
wuffs_webp__decoder__decode_color_cache_parameters(
84394
    wuffs_webp__decoder* self,
84395
    wuffs_base__io_buffer* a_src) {
84396
  wuffs_base__status status = wuffs_base__make_status(NULL);
84397
84398
  uint8_t v_c8 = 0;
84399
  uint32_t v_use_color_cache = 0;
84400
  uint32_t v_color_cache_bits = 0;
84401
84402
  const uint8_t* iop_a_src = NULL;
84403
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84404
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84405
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84406
  if (a_src && a_src->data.ptr) {
84407
    io0_a_src = a_src->data.ptr;
84408
    io1_a_src = io0_a_src + a_src->meta.ri;
84409
    iop_a_src = io1_a_src;
84410
    io2_a_src = io0_a_src + a_src->meta.wi;
84411
  }
84412
84413
  uint32_t coro_susp_point = self->private_impl.p_decode_color_cache_parameters;
84414
  switch (coro_susp_point) {
84415
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84416
84417
    if (self->private_impl.f_n_bits < 1u) {
84418
      {
84419
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84420
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84421
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84422
          goto suspend;
84423
        }
84424
        uint8_t t_0 = *iop_a_src++;
84425
        v_c8 = t_0;
84426
      }
84427
      self->private_impl.f_bits = ((uint32_t)(v_c8));
84428
      self->private_impl.f_n_bits = 8u;
84429
    }
84430
    v_use_color_cache = (self->private_impl.f_bits & 1u);
84431
    self->private_impl.f_bits >>= 1u;
84432
    self->private_impl.f_n_bits -= 1u;
84433
    self->private_impl.f_color_cache_bits = 0u;
84434
    if (v_use_color_cache != 0u) {
84435
      if (self->private_impl.f_n_bits < 4u) {
84436
        {
84437
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84438
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84439
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84440
            goto suspend;
84441
          }
84442
          uint8_t t_1 = *iop_a_src++;
84443
          v_c8 = t_1;
84444
        }
84445
        if (self->private_impl.f_n_bits >= 4u) {
84446
          status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
84447
          goto exit;
84448
        }
84449
        self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
84450
        self->private_impl.f_n_bits += 8u;
84451
      }
84452
      v_color_cache_bits = (self->private_impl.f_bits & 15u);
84453
      self->private_impl.f_bits >>= 4u;
84454
      self->private_impl.f_n_bits -= 4u;
84455
      if ((v_color_cache_bits < 1u) || (11u < v_color_cache_bits)) {
84456
        status = wuffs_base__make_status(wuffs_webp__error__bad_color_cache);
84457
        goto exit;
84458
      }
84459
      self->private_impl.f_color_cache_bits = v_color_cache_bits;
84460
    }
84461
84462
    goto ok;
84463
    ok:
84464
    self->private_impl.p_decode_color_cache_parameters = 0;
84465
    goto exit;
84466
  }
84467
84468
  goto suspend;
84469
  suspend:
84470
  self->private_impl.p_decode_color_cache_parameters = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84471
84472
  goto exit;
84473
  exit:
84474
  if (a_src && a_src->data.ptr) {
84475
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84476
  }
84477
84478
  return status;
84479
}
84480
84481
// -------- func webp.decoder.decode_hg_table
84482
84483
WUFFS_BASE__GENERATED_C_CODE
84484
static wuffs_base__status
84485
wuffs_webp__decoder__decode_hg_table(
84486
    wuffs_webp__decoder* self,
84487
    wuffs_base__io_buffer* a_src,
84488
    uint32_t a_width,
84489
    wuffs_base__slice_u8 a_workbuf) {
84490
  wuffs_base__status status = wuffs_base__make_status(NULL);
84491
84492
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84493
  uint8_t v_c8 = 0;
84494
  uint32_t v_use_hg_table = 0;
84495
  uint32_t v_tile_size_log2 = 0;
84496
  wuffs_base__slice_u8 v_hg_pixels = {0};
84497
  uint64_t v_n = 0;
84498
  wuffs_base__slice_u8 v_p = {0};
84499
  uint32_t v_hg_plus_1 = 0;
84500
84501
  const uint8_t* iop_a_src = NULL;
84502
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84503
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84504
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
84505
  if (a_src && a_src->data.ptr) {
84506
    io0_a_src = a_src->data.ptr;
84507
    io1_a_src = io0_a_src + a_src->meta.ri;
84508
    iop_a_src = io1_a_src;
84509
    io2_a_src = io0_a_src + a_src->meta.wi;
84510
  }
84511
84512
  uint32_t coro_susp_point = self->private_impl.p_decode_hg_table;
84513
  if (coro_susp_point) {
84514
    v_tile_size_log2 = self->private_data.s_decode_hg_table.v_tile_size_log2;
84515
  }
84516
  switch (coro_susp_point) {
84517
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84518
84519
    if (self->private_impl.f_n_bits < 1u) {
84520
      {
84521
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84522
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84523
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84524
          goto suspend;
84525
        }
84526
        uint8_t t_0 = *iop_a_src++;
84527
        v_c8 = t_0;
84528
      }
84529
      self->private_impl.f_bits = ((uint32_t)(v_c8));
84530
      self->private_impl.f_n_bits = 8u;
84531
    }
84532
    v_use_hg_table = (self->private_impl.f_bits & 1u);
84533
    self->private_impl.f_bits >>= 1u;
84534
    self->private_impl.f_n_bits -= 1u;
84535
    if (v_use_hg_table == 0u) {
84536
      self->private_impl.f_overall_n_huffman_groups = 1u;
84537
      self->private_impl.f_overall_tile_size_log2 = 0u;
84538
      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)))) {
84539
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84540
        goto exit;
84541
      }
84542
      v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
84543
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
84544
          ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
84545
      if (((uint64_t)(v_hg_pixels.len)) >= 4u) {
84546
        v_hg_pixels.ptr[0u] = 0u;
84547
        v_hg_pixels.ptr[1u] = 0u;
84548
        v_hg_pixels.ptr[2u] = 0u;
84549
        v_hg_pixels.ptr[3u] = 0u;
84550
      }
84551
      status = wuffs_base__make_status(NULL);
84552
      goto ok;
84553
    }
84554
    if (self->private_impl.f_n_bits < 3u) {
84555
      {
84556
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
84557
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
84558
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
84559
          goto suspend;
84560
        }
84561
        uint8_t t_1 = *iop_a_src++;
84562
        v_c8 = t_1;
84563
      }
84564
      if (self->private_impl.f_n_bits >= 3u) {
84565
        status = wuffs_base__make_status(wuffs_webp__error__internal_error_inconsistent_n_bits);
84566
        goto exit;
84567
      }
84568
      self->private_impl.f_bits |= (((uint32_t)(v_c8)) << self->private_impl.f_n_bits);
84569
      self->private_impl.f_n_bits += 8u;
84570
    }
84571
    v_tile_size_log2 = ((self->private_impl.f_bits & 7u) + 2u);
84572
    self->private_impl.f_bits >>= 3u;
84573
    self->private_impl.f_n_bits -= 3u;
84574
    self->private_impl.f_overall_tile_size_log2 = v_tile_size_log2;
84575
    if (a_src) {
84576
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84577
    }
84578
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
84579
    status = wuffs_webp__decoder__decode_color_cache_parameters(self, a_src);
84580
    if (a_src) {
84581
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
84582
    }
84583
    if (status.repr) {
84584
      goto suspend;
84585
    }
84586
    if (a_src) {
84587
      a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84588
    }
84589
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
84590
    status = wuffs_webp__decoder__decode_huffman_groups(self, a_src, 1u);
84591
    if (a_src) {
84592
      iop_a_src = a_src->data.ptr + a_src->meta.ri;
84593
    }
84594
    if (status.repr) {
84595
      goto suspend;
84596
    }
84597
    while (true) {
84598
      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)))) {
84599
        status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84600
        goto exit;
84601
      }
84602
      {
84603
        if (a_src) {
84604
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84605
        }
84606
        wuffs_base__status t_2 = wuffs_webp__decoder__decode_pixels(self,
84607
            wuffs_base__slice_u8__subslice_ij(a_workbuf,
84608
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
84609
            ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u]))),
84610
            a_src,
84611
            ((a_width + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
84612
            ((self->private_impl.f_height + ((((uint32_t)(1u)) << v_tile_size_log2) - 1u)) >> v_tile_size_log2),
84613
            wuffs_base__utility__empty_slice_u8(),
84614
            0u);
84615
        v_status = t_2;
84616
        if (a_src) {
84617
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
84618
        }
84619
      }
84620
      if (wuffs_base__status__is_ok(&v_status)) {
84621
        break;
84622
      }
84623
      status = v_status;
84624
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
84625
    }
84626
    self->private_impl.f_overall_n_huffman_groups = 1u;
84627
    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)))) {
84628
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84629
      goto exit;
84630
    }
84631
    v_hg_pixels = wuffs_base__slice_u8__subslice_ij(a_workbuf,
84632
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[0u])),
84633
        ((uint64_t)(self->private_impl.f_workbuf_offset_for_transform[1u])));
84634
    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)));
84635
    if (v_n > ((uint64_t)(v_hg_pixels.len))) {
84636
      status = wuffs_base__make_status(wuffs_base__error__bad_workbuf_length);
84637
      goto exit;
84638
    }
84639
    v_p = wuffs_base__slice_u8__subslice_j(v_hg_pixels, v_n);
84640
    while (((uint64_t)(v_p.len)) >= 4u) {
84641
      if (v_p.ptr[2u] != 0u) {
84642
        status = wuffs_base__make_status(wuffs_webp__error__unsupported_number_of_huffman_groups);
84643
        goto exit;
84644
      }
84645
      v_hg_plus_1 = (((uint32_t)(v_p.ptr[1u])) + 1u);
84646
      if (self->private_impl.f_overall_n_huffman_groups < v_hg_plus_1) {
84647
        self->private_impl.f_overall_n_huffman_groups = v_hg_plus_1;
84648
      }
84649
      v_p = wuffs_base__slice_u8__subslice_i(v_p, 4u);
84650
    }
84651
84652
    ok:
84653
    self->private_impl.p_decode_hg_table = 0;
84654
    goto exit;
84655
  }
84656
84657
  goto suspend;
84658
  suspend:
84659
  self->private_impl.p_decode_hg_table = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84660
  self->private_data.s_decode_hg_table.v_tile_size_log2 = v_tile_size_log2;
84661
84662
  goto exit;
84663
  exit:
84664
  if (a_src && a_src->data.ptr) {
84665
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
84666
  }
84667
84668
  return status;
84669
}
84670
84671
// -------- func webp.decoder.decode_pixels
84672
84673
WUFFS_BASE__GENERATED_C_CODE
84674
static wuffs_base__status
84675
wuffs_webp__decoder__decode_pixels(
84676
    wuffs_webp__decoder* self,
84677
    wuffs_base__slice_u8 a_dst,
84678
    wuffs_base__io_buffer* a_src,
84679
    uint32_t a_width,
84680
    uint32_t a_height,
84681
    wuffs_base__slice_u8 a_tile_data,
84682
    uint32_t a_tile_size_log2) {
84683
  wuffs_base__status status = wuffs_base__make_status(NULL);
84684
84685
  uint32_t v_i = 0;
84686
  uint32_t v_n = 0;
84687
84688
  uint32_t coro_susp_point = self->private_impl.p_decode_pixels;
84689
  switch (coro_susp_point) {
84690
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
84691
84692
    v_i = 0u;
84693
    v_n = (((uint32_t)(1u)) << self->private_impl.f_color_cache_bits);
84694
    while (v_i < v_n) {
84695
      self->private_data.f_color_cache[v_i] = 0u;
84696
      v_i += 1u;
84697
    }
84698
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
84699
    status = wuffs_webp__decoder__decode_pixels_slow(self,
84700
        a_dst,
84701
        a_src,
84702
        a_width,
84703
        a_height,
84704
        a_tile_data,
84705
        a_tile_size_log2);
84706
    if (status.repr) {
84707
      goto suspend;
84708
    }
84709
84710
    goto ok;
84711
    ok:
84712
    self->private_impl.p_decode_pixels = 0;
84713
    goto exit;
84714
  }
84715
84716
  goto suspend;
84717
  suspend:
84718
  self->private_impl.p_decode_pixels = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
84719
84720
  goto exit;
84721
  exit:
84722
  return status;
84723
}
84724
84725
// -------- func webp.decoder.swizzle
84726
84727
WUFFS_BASE__GENERATED_C_CODE
84728
static wuffs_base__status
84729
wuffs_webp__decoder__swizzle(
84730
    wuffs_webp__decoder* self,
84731
    wuffs_base__pixel_buffer* a_dst,
84732
    wuffs_base__slice_u8 a_src,
84733
    wuffs_base__pixel_blend a_blend) {
84734
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84735
  wuffs_base__pixel_format v_dst_pixfmt = {0};
84736
  uint32_t v_dst_bits_per_pixel = 0;
84737
  uint32_t v_dst_bytes_per_pixel = 0;
84738
  uint64_t v_dst_bytes_per_row = 0;
84739
  wuffs_base__slice_u8 v_dst_palette = {0};
84740
  wuffs_base__table_u8 v_tab = {0};
84741
  uint64_t v_src_bytes_per_row = 0;
84742
  wuffs_base__slice_u8 v_dst = {0};
84743
  uint32_t v_y = 0;
84744
84745
  v_status = wuffs_base__pixel_swizzler__prepare(&self->private_impl.f_swizzler,
84746
      wuffs_base__pixel_buffer__pixel_format(a_dst),
84747
      wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024)),
84748
      wuffs_base__utility__make_pixel_format(self->private_impl.f_pixfmt),
84749
      wuffs_base__utility__empty_slice_u8(),
84750
      a_blend);
84751
  if ( ! wuffs_base__status__is_ok(&v_status)) {
84752
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
84753
  }
84754
  v_dst_pixfmt = wuffs_base__pixel_buffer__pixel_format(a_dst);
84755
  v_dst_bits_per_pixel = wuffs_base__pixel_format__bits_per_pixel(&v_dst_pixfmt);
84756
  if ((v_dst_bits_per_pixel & 7u) != 0u) {
84757
    return wuffs_base__make_status(wuffs_base__error__unsupported_option);
84758
  }
84759
  v_dst_bytes_per_pixel = (v_dst_bits_per_pixel / 8u);
84760
  v_dst_bytes_per_row = ((uint64_t)((self->private_impl.f_width * v_dst_bytes_per_pixel)));
84761
  v_dst_palette = wuffs_base__pixel_buffer__palette_or_else(a_dst, wuffs_base__make_slice_u8(self->private_data.f_palette, 1024));
84762
  v_tab = wuffs_base__pixel_buffer__plane(a_dst, 0u);
84763
  v_src_bytes_per_row = ((uint64_t)((self->private_impl.f_width * 4u)));
84764
  while (v_src_bytes_per_row <= ((uint64_t)(a_src.len))) {
84765
    v_dst = wuffs_private_impl__table_u8__row_u32(v_tab, v_y);
84766
    if (v_dst_bytes_per_row < ((uint64_t)(v_dst.len))) {
84767
      v_dst = wuffs_base__slice_u8__subslice_j(v_dst, v_dst_bytes_per_row);
84768
    }
84769
    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));
84770
    a_src = wuffs_base__slice_u8__subslice_i(a_src, v_src_bytes_per_row);
84771
    v_y += 1u;
84772
  }
84773
  return wuffs_base__make_status(NULL);
84774
}
84775
84776
// -------- func webp.decoder.frame_dirty_rect
84777
84778
WUFFS_BASE__GENERATED_C_CODE
84779
WUFFS_BASE__MAYBE_STATIC wuffs_base__rect_ie_u32
84780
wuffs_webp__decoder__frame_dirty_rect(
84781
    const wuffs_webp__decoder* self) {
84782
  if (!self) {
84783
    return wuffs_base__utility__empty_rect_ie_u32();
84784
  }
84785
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84786
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84787
    return wuffs_base__utility__empty_rect_ie_u32();
84788
  }
84789
84790
  if (self->private_impl.f_is_vp8_lossy) {
84791
    return wuffs_vp8__decoder__frame_dirty_rect(&self->private_data.f_vp8);
84792
  }
84793
  return wuffs_base__utility__make_rect_ie_u32(
84794
      0u,
84795
      0u,
84796
      self->private_impl.f_width,
84797
      self->private_impl.f_height);
84798
}
84799
84800
// -------- func webp.decoder.num_animation_loops
84801
84802
WUFFS_BASE__GENERATED_C_CODE
84803
WUFFS_BASE__MAYBE_STATIC uint32_t
84804
wuffs_webp__decoder__num_animation_loops(
84805
    const wuffs_webp__decoder* self) {
84806
  if (!self) {
84807
    return 0;
84808
  }
84809
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84810
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84811
    return 0;
84812
  }
84813
84814
  return 0u;
84815
}
84816
84817
// -------- func webp.decoder.num_decoded_frame_configs
84818
84819
WUFFS_BASE__GENERATED_C_CODE
84820
WUFFS_BASE__MAYBE_STATIC uint64_t
84821
wuffs_webp__decoder__num_decoded_frame_configs(
84822
    const wuffs_webp__decoder* self) {
84823
  if (!self) {
84824
    return 0;
84825
  }
84826
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84827
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84828
    return 0;
84829
  }
84830
84831
  if (self->private_impl.f_is_vp8_lossy) {
84832
    return wuffs_vp8__decoder__num_decoded_frame_configs(&self->private_data.f_vp8);
84833
  }
84834
  if (self->private_impl.f_call_sequence > 32u) {
84835
    return 1u;
84836
  }
84837
  return 0u;
84838
}
84839
84840
// -------- func webp.decoder.num_decoded_frames
84841
84842
WUFFS_BASE__GENERATED_C_CODE
84843
WUFFS_BASE__MAYBE_STATIC uint64_t
84844
wuffs_webp__decoder__num_decoded_frames(
84845
    const wuffs_webp__decoder* self) {
84846
  if (!self) {
84847
    return 0;
84848
  }
84849
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84850
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84851
    return 0;
84852
  }
84853
84854
  if (self->private_impl.f_is_vp8_lossy) {
84855
    return wuffs_vp8__decoder__num_decoded_frames(&self->private_data.f_vp8);
84856
  }
84857
  if (self->private_impl.f_call_sequence > 64u) {
84858
    return 1u;
84859
  }
84860
  return 0u;
84861
}
84862
84863
// -------- func webp.decoder.restart_frame
84864
84865
WUFFS_BASE__GENERATED_C_CODE
84866
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84867
wuffs_webp__decoder__restart_frame(
84868
    wuffs_webp__decoder* self,
84869
    uint64_t a_index,
84870
    uint64_t a_io_position) {
84871
  if (!self) {
84872
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84873
  }
84874
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84875
    return wuffs_base__make_status(
84876
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84877
        ? wuffs_base__error__disabled_by_previous_error
84878
        : wuffs_base__error__initialize_not_called);
84879
  }
84880
84881
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
84882
84883
  if (self->private_impl.f_is_vp8_lossy) {
84884
    v_status = wuffs_vp8__decoder__restart_frame(&self->private_data.f_vp8, a_index, a_io_position);
84885
    return wuffs_private_impl__status__ensure_not_a_suspension(v_status);
84886
  }
84887
  if (self->private_impl.f_call_sequence < 32u) {
84888
    return wuffs_base__make_status(wuffs_base__error__bad_call_sequence);
84889
  }
84890
  if ((a_index != 0u) || (a_io_position != self->private_impl.f_frame_config_io_position)) {
84891
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
84892
  }
84893
  self->private_impl.f_call_sequence = 40u;
84894
  return wuffs_base__make_status(NULL);
84895
}
84896
84897
// -------- func webp.decoder.set_report_metadata
84898
84899
WUFFS_BASE__GENERATED_C_CODE
84900
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
84901
wuffs_webp__decoder__set_report_metadata(
84902
    wuffs_webp__decoder* self,
84903
    uint32_t a_fourcc,
84904
    bool a_report) {
84905
  return wuffs_base__make_empty_struct();
84906
}
84907
84908
// -------- func webp.decoder.tell_me_more
84909
84910
WUFFS_BASE__GENERATED_C_CODE
84911
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
84912
wuffs_webp__decoder__tell_me_more(
84913
    wuffs_webp__decoder* self,
84914
    wuffs_base__io_buffer* a_dst,
84915
    wuffs_base__more_information* a_minfo,
84916
    wuffs_base__io_buffer* a_src) {
84917
  if (!self) {
84918
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
84919
  }
84920
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
84921
    return wuffs_base__make_status(
84922
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
84923
        ? wuffs_base__error__disabled_by_previous_error
84924
        : wuffs_base__error__initialize_not_called);
84925
  }
84926
  if (!a_dst || !a_src) {
84927
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84928
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
84929
  }
84930
  if ((self->private_impl.active_coroutine != 0) &&
84931
      (self->private_impl.active_coroutine != 4)) {
84932
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84933
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
84934
  }
84935
  self->private_impl.active_coroutine = 0;
84936
  wuffs_base__status status = wuffs_base__make_status(NULL);
84937
84938
  status = wuffs_base__make_status(wuffs_base__error__no_more_information);
84939
  goto exit;
84940
84941
  goto ok;
84942
  ok:
84943
  goto exit;
84944
  exit:
84945
  if (wuffs_base__status__is_error(&status)) {
84946
    self->private_impl.magic = WUFFS_BASE__DISABLED;
84947
  }
84948
  return status;
84949
}
84950
84951
// -------- func webp.decoder.workbuf_len
84952
84953
WUFFS_BASE__GENERATED_C_CODE
84954
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
84955
wuffs_webp__decoder__workbuf_len(
84956
    const wuffs_webp__decoder* self) {
84957
  if (!self) {
84958
    return wuffs_base__utility__empty_range_ii_u64();
84959
  }
84960
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
84961
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
84962
    return wuffs_base__utility__empty_range_ii_u64();
84963
  }
84964
84965
  if (self->private_impl.f_is_vp8_lossy) {
84966
    return wuffs_vp8__decoder__workbuf_len(&self->private_data.f_vp8);
84967
  }
84968
  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])));
84969
}
84970
84971
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
84972
84973
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
84974
84975
// ---------------- Status Codes Implementations
84976
84977
// ---------------- Private Consts
84978
84979
#define WUFFS_XXHASH32__XXH_PRIME32_1 2654435761u
84980
84981
#define WUFFS_XXHASH32__XXH_PRIME32_2 2246822519u
84982
84983
#define WUFFS_XXHASH32__XXH_PRIME32_3 3266489917u
84984
84985
#define WUFFS_XXHASH32__XXH_PRIME32_4 668265263u
84986
84987
#define WUFFS_XXHASH32__XXH_PRIME32_5 374761393u
84988
84989
#define WUFFS_XXHASH32__INITIAL_V0 606290984u
84990
84991
#define WUFFS_XXHASH32__INITIAL_V1 2246822519u
84992
84993
#define WUFFS_XXHASH32__INITIAL_V2 0u
84994
84995
#define WUFFS_XXHASH32__INITIAL_V3 1640531535u
84996
84997
// ---------------- Private Initializer Prototypes
84998
84999
// ---------------- Private Function Prototypes
85000
85001
WUFFS_BASE__GENERATED_C_CODE
85002
static wuffs_base__empty_struct
85003
wuffs_xxhash32__hasher__up(
85004
    wuffs_xxhash32__hasher* self,
85005
    wuffs_base__slice_u8 a_x);
85006
85007
// ---------------- VTables
85008
85009
const wuffs_base__hasher_u32__func_ptrs
85010
wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
85011
  (uint32_t(*)(const void*))(&wuffs_xxhash32__hasher__checksum_u32),
85012
  (uint64_t(*)(const void*,
85013
      uint32_t))(&wuffs_xxhash32__hasher__get_quirk),
85014
  (wuffs_base__status(*)(void*,
85015
      uint32_t,
85016
      uint64_t))(&wuffs_xxhash32__hasher__set_quirk),
85017
  (wuffs_base__empty_struct(*)(void*,
85018
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update),
85019
  (uint32_t(*)(void*,
85020
      wuffs_base__slice_u8))(&wuffs_xxhash32__hasher__update_u32),
85021
};
85022
85023
// ---------------- Initializer Implementations
85024
85025
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
85026
wuffs_xxhash32__hasher__initialize(
85027
    wuffs_xxhash32__hasher* self,
85028
    size_t sizeof_star_self,
85029
    uint64_t wuffs_version,
85030
    uint32_t options){
85031
  if (!self) {
85032
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
85033
  }
85034
  if (sizeof(*self) != sizeof_star_self) {
85035
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
85036
  }
85037
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
85038
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
85039
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
85040
  }
85041
85042
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
85043
    // The whole point of this if-check is to detect an uninitialized *self.
85044
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
85045
#if !defined(__clang__) && defined(__GNUC__)
85046
#pragma GCC diagnostic push
85047
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
85048
#endif
85049
    if (self->private_impl.magic != 0) {
85050
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
85051
    }
85052
#if !defined(__clang__) && defined(__GNUC__)
85053
#pragma GCC diagnostic pop
85054
#endif
85055
  } else {
85056
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
85057
      memset(self, 0, sizeof(*self));
85058
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
85059
    } else {
85060
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
85061
    }
85062
  }
85063
85064
  self->private_impl.magic = WUFFS_BASE__MAGIC;
85065
  self->private_impl.vtable_for__wuffs_base__hasher_u32.vtable_name =
85066
      wuffs_base__hasher_u32__vtable_name;
85067
  self->private_impl.vtable_for__wuffs_base__hasher_u32.function_pointers =
85068
      (const void*)(&wuffs_xxhash32__hasher__func_ptrs_for__wuffs_base__hasher_u32);
85069
  return wuffs_base__make_status(NULL);
85070
}
85071
85072
wuffs_xxhash32__hasher*
85073
wuffs_xxhash32__hasher__alloc(void) {
85074
  wuffs_xxhash32__hasher* x =
85075
      (wuffs_xxhash32__hasher*)(calloc(1, sizeof(wuffs_xxhash32__hasher)));
85076
  if (!x) {
85077
    return NULL;
85078
  }
85079
  if (wuffs_xxhash32__hasher__initialize(
85080
      x, sizeof(wuffs_xxhash32__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
85081
    free(x);
85082
    return NULL;
85083
  }
85084
  return x;
85085
}
85086
85087
size_t
85088
sizeof__wuffs_xxhash32__hasher(void) {
85089
  return sizeof(wuffs_xxhash32__hasher);
85090
}
85091
85092
// ---------------- Function Implementations
85093
85094
// -------- func xxhash32.hasher.get_quirk
85095
85096
WUFFS_BASE__GENERATED_C_CODE
85097
WUFFS_BASE__MAYBE_STATIC uint64_t
85098
wuffs_xxhash32__hasher__get_quirk(
85099
    const wuffs_xxhash32__hasher* self,
85100
    uint32_t a_key) {
85101
  if (!self) {
85102
    return 0;
85103
  }
85104
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
85105
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
85106
    return 0;
85107
  }
85108
85109
  return 0u;
85110
}
85111
85112
// -------- func xxhash32.hasher.set_quirk
85113
85114
WUFFS_BASE__GENERATED_C_CODE
85115
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
85116
wuffs_xxhash32__hasher__set_quirk(
85117
    wuffs_xxhash32__hasher* self,
85118
    uint32_t a_key,
85119
    uint64_t a_value) {
85120
  if (!self) {
85121
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
85122
  }
85123
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85124
    return wuffs_base__make_status(
85125
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
85126
        ? wuffs_base__error__disabled_by_previous_error
85127
        : wuffs_base__error__initialize_not_called);
85128
  }
85129
85130
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
85131
}
85132
85133
// -------- func xxhash32.hasher.update
85134
85135
WUFFS_BASE__GENERATED_C_CODE
85136
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
85137
wuffs_xxhash32__hasher__update(
85138
    wuffs_xxhash32__hasher* self,
85139
    wuffs_base__slice_u8 a_x) {
85140
  if (!self) {
85141
    return wuffs_base__make_empty_struct();
85142
  }
85143
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85144
    return wuffs_base__make_empty_struct();
85145
  }
85146
85147
  wuffs_base__slice_u8 v_remaining = {0};
85148
85149
  if ((self->private_impl.f_length_modulo_u32 == 0u) &&  ! self->private_impl.f_length_overflows_u32) {
85150
    self->private_impl.f_v0 = 606290984u;
85151
    self->private_impl.f_v1 = 2246822519u;
85152
    self->private_impl.f_v2 = 0u;
85153
    self->private_impl.f_v3 = 1640531535u;
85154
  }
85155
  while (((uint64_t)(a_x.len)) > 0u) {
85156
    v_remaining = wuffs_base__slice_u8__subslice_j(a_x, 0u);
85157
    if (((uint64_t)(a_x.len)) > 16777216u) {
85158
      v_remaining = wuffs_base__slice_u8__subslice_i(a_x, 16777216u);
85159
      a_x = wuffs_base__slice_u8__subslice_j(a_x, 16777216u);
85160
    }
85161
    wuffs_xxhash32__hasher__up(self, a_x);
85162
    a_x = v_remaining;
85163
  }
85164
  return wuffs_base__make_empty_struct();
85165
}
85166
85167
// -------- func xxhash32.hasher.update_u32
85168
85169
WUFFS_BASE__GENERATED_C_CODE
85170
WUFFS_BASE__MAYBE_STATIC uint32_t
85171
wuffs_xxhash32__hasher__update_u32(
85172
    wuffs_xxhash32__hasher* self,
85173
    wuffs_base__slice_u8 a_x) {
85174
  if (!self) {
85175
    return 0;
85176
  }
85177
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85178
    return 0;
85179
  }
85180
85181
  wuffs_xxhash32__hasher__update(self, a_x);
85182
  return wuffs_xxhash32__hasher__checksum_u32(self);
85183
}
85184
85185
// -------- func xxhash32.hasher.up
85186
85187
WUFFS_BASE__GENERATED_C_CODE
85188
static wuffs_base__empty_struct
85189
wuffs_xxhash32__hasher__up(
85190
    wuffs_xxhash32__hasher* self,
85191
    wuffs_base__slice_u8 a_x) {
85192
  uint32_t v_new_lmu = 0;
85193
  uint32_t v_buf_u32 = 0;
85194
  uint32_t v_buf_len = 0;
85195
  uint32_t v_v0 = 0;
85196
  uint32_t v_v1 = 0;
85197
  uint32_t v_v2 = 0;
85198
  uint32_t v_v3 = 0;
85199
  wuffs_base__slice_u8 v_p = {0};
85200
85201
  v_new_lmu = ((uint32_t)(self->private_impl.f_length_modulo_u32 + ((uint32_t)(((uint64_t)(a_x.len))))));
85202
  self->private_impl.f_length_overflows_u32 = ((v_new_lmu < self->private_impl.f_length_modulo_u32) || self->private_impl.f_length_overflows_u32);
85203
  self->private_impl.f_length_modulo_u32 = v_new_lmu;
85204
  while (true) {
85205
    if (self->private_impl.f_buf_len >= 16u) {
85206
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
85207
          (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
85208
          (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
85209
          (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
85210
      v_v0 = ((uint32_t)(self->private_impl.f_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85211
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
85212
      self->private_impl.f_v0 = ((uint32_t)(v_v0 * 2654435761u));
85213
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
85214
          (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
85215
          (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
85216
          (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
85217
      v_v1 = ((uint32_t)(self->private_impl.f_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85218
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
85219
      self->private_impl.f_v1 = ((uint32_t)(v_v1 * 2654435761u));
85220
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
85221
          (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
85222
          (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
85223
          (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
85224
      v_v2 = ((uint32_t)(self->private_impl.f_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85225
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
85226
      self->private_impl.f_v2 = ((uint32_t)(v_v2 * 2654435761u));
85227
      v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[12u])) |
85228
          (((uint32_t)(self->private_impl.f_buf_data[13u])) << 8u) |
85229
          (((uint32_t)(self->private_impl.f_buf_data[14u])) << 16u) |
85230
          (((uint32_t)(self->private_impl.f_buf_data[15u])) << 24u));
85231
      v_v3 = ((uint32_t)(self->private_impl.f_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85232
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
85233
      self->private_impl.f_v3 = ((uint32_t)(v_v3 * 2654435761u));
85234
      self->private_impl.f_buf_len = 0u;
85235
      break;
85236
    }
85237
    if (((uint64_t)(a_x.len)) <= 0u) {
85238
      return wuffs_base__make_empty_struct();
85239
    }
85240
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
85241
#if defined(__GNUC__)
85242
#pragma GCC diagnostic push
85243
#pragma GCC diagnostic ignored "-Wconversion"
85244
#endif
85245
    self->private_impl.f_buf_len += 1u;
85246
#if defined(__GNUC__)
85247
#pragma GCC diagnostic pop
85248
#endif
85249
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
85250
  }
85251
  v_buf_len = ((uint32_t)(((uint8_t)(self->private_impl.f_buf_len & 15u))));
85252
  v_v0 = self->private_impl.f_v0;
85253
  v_v1 = self->private_impl.f_v1;
85254
  v_v2 = self->private_impl.f_v2;
85255
  v_v3 = self->private_impl.f_v3;
85256
  {
85257
    wuffs_base__slice_u8 i_slice_p = a_x;
85258
    v_p.ptr = i_slice_p.ptr;
85259
    v_p.len = 16;
85260
    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)) / 16) * 16));
85261
    while (v_p.ptr < i_end0_p) {
85262
      v_buf_u32 = (((uint32_t)(v_p.ptr[0u])) |
85263
          (((uint32_t)(v_p.ptr[1u])) << 8u) |
85264
          (((uint32_t)(v_p.ptr[2u])) << 16u) |
85265
          (((uint32_t)(v_p.ptr[3u])) << 24u));
85266
      v_v0 = ((uint32_t)(v_v0 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85267
      v_v0 = (((uint32_t)(v_v0 << 13u)) | (v_v0 >> 19u));
85268
      v_v0 = ((uint32_t)(v_v0 * 2654435761u));
85269
      v_buf_u32 = (((uint32_t)(v_p.ptr[4u])) |
85270
          (((uint32_t)(v_p.ptr[5u])) << 8u) |
85271
          (((uint32_t)(v_p.ptr[6u])) << 16u) |
85272
          (((uint32_t)(v_p.ptr[7u])) << 24u));
85273
      v_v1 = ((uint32_t)(v_v1 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85274
      v_v1 = (((uint32_t)(v_v1 << 13u)) | (v_v1 >> 19u));
85275
      v_v1 = ((uint32_t)(v_v1 * 2654435761u));
85276
      v_buf_u32 = (((uint32_t)(v_p.ptr[8u])) |
85277
          (((uint32_t)(v_p.ptr[9u])) << 8u) |
85278
          (((uint32_t)(v_p.ptr[10u])) << 16u) |
85279
          (((uint32_t)(v_p.ptr[11u])) << 24u));
85280
      v_v2 = ((uint32_t)(v_v2 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85281
      v_v2 = (((uint32_t)(v_v2 << 13u)) | (v_v2 >> 19u));
85282
      v_v2 = ((uint32_t)(v_v2 * 2654435761u));
85283
      v_buf_u32 = (((uint32_t)(v_p.ptr[12u])) |
85284
          (((uint32_t)(v_p.ptr[13u])) << 8u) |
85285
          (((uint32_t)(v_p.ptr[14u])) << 16u) |
85286
          (((uint32_t)(v_p.ptr[15u])) << 24u));
85287
      v_v3 = ((uint32_t)(v_v3 + ((uint32_t)(v_buf_u32 * 2246822519u))));
85288
      v_v3 = (((uint32_t)(v_v3 << 13u)) | (v_v3 >> 19u));
85289
      v_v3 = ((uint32_t)(v_v3 * 2654435761u));
85290
      v_p.ptr += 16;
85291
    }
85292
    v_p.len = 1;
85293
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
85294
    while (v_p.ptr < i_end1_p) {
85295
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
85296
      v_buf_len = ((v_buf_len + 1u) & 15u);
85297
      v_p.ptr += 1;
85298
    }
85299
    v_p.len = 0;
85300
  }
85301
  self->private_impl.f_buf_len = ((uint8_t)(v_buf_len));
85302
  self->private_impl.f_v0 = v_v0;
85303
  self->private_impl.f_v1 = v_v1;
85304
  self->private_impl.f_v2 = v_v2;
85305
  self->private_impl.f_v3 = v_v3;
85306
  return wuffs_base__make_empty_struct();
85307
}
85308
85309
// -------- func xxhash32.hasher.checksum_u32
85310
85311
WUFFS_BASE__GENERATED_C_CODE
85312
WUFFS_BASE__MAYBE_STATIC uint32_t
85313
wuffs_xxhash32__hasher__checksum_u32(
85314
    const wuffs_xxhash32__hasher* self) {
85315
  if (!self) {
85316
    return 0;
85317
  }
85318
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
85319
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
85320
    return 0;
85321
  }
85322
85323
  uint32_t v_ret = 0;
85324
  uint32_t v_i = 0;
85325
  uint32_t v_n = 0;
85326
  uint32_t v_buf_u32 = 0;
85327
85328
  if ((self->private_impl.f_length_modulo_u32 >= 16u) || self->private_impl.f_length_overflows_u32) {
85329
    v_ret += (((uint32_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 31u));
85330
    v_ret += (((uint32_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 25u));
85331
    v_ret += (((uint32_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 20u));
85332
    v_ret += (((uint32_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 14u));
85333
    v_ret += self->private_impl.f_length_modulo_u32;
85334
  } else {
85335
    v_ret += 374761393u;
85336
    v_ret += self->private_impl.f_length_modulo_u32;
85337
  }
85338
  v_n = 16u;
85339
  v_n = wuffs_base__u32__min(v_n, ((uint32_t)(self->private_impl.f_buf_len)));
85340
  if (4u <= v_n) {
85341
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[0u])) |
85342
        (((uint32_t)(self->private_impl.f_buf_data[1u])) << 8u) |
85343
        (((uint32_t)(self->private_impl.f_buf_data[2u])) << 16u) |
85344
        (((uint32_t)(self->private_impl.f_buf_data[3u])) << 24u));
85345
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
85346
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
85347
    v_ret *= 668265263u;
85348
    v_i = 4u;
85349
  }
85350
  if (8u <= v_n) {
85351
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[4u])) |
85352
        (((uint32_t)(self->private_impl.f_buf_data[5u])) << 8u) |
85353
        (((uint32_t)(self->private_impl.f_buf_data[6u])) << 16u) |
85354
        (((uint32_t)(self->private_impl.f_buf_data[7u])) << 24u));
85355
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
85356
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
85357
    v_ret *= 668265263u;
85358
    v_i = 8u;
85359
  }
85360
  if (12u <= v_n) {
85361
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[8u])) |
85362
        (((uint32_t)(self->private_impl.f_buf_data[9u])) << 8u) |
85363
        (((uint32_t)(self->private_impl.f_buf_data[10u])) << 16u) |
85364
        (((uint32_t)(self->private_impl.f_buf_data[11u])) << 24u));
85365
    v_ret += ((uint32_t)(v_buf_u32 * 3266489917u));
85366
    v_ret = (((uint32_t)(v_ret << 17u)) | (v_ret >> 15u));
85367
    v_ret *= 668265263u;
85368
    v_i = 12u;
85369
  }
85370
  while (v_i < v_n) {
85371
    v_ret += ((uint32_t)(((uint32_t)(self->private_impl.f_buf_data[v_i])) * 374761393u));
85372
    v_ret = (((uint32_t)(v_ret << 11u)) | (v_ret >> 21u));
85373
    v_ret *= 2654435761u;
85374
    v_i += 1u;
85375
  }
85376
  v_ret ^= (v_ret >> 15u);
85377
  v_ret *= 2246822519u;
85378
  v_ret ^= (v_ret >> 13u);
85379
  v_ret *= 3266489917u;
85380
  v_ret ^= (v_ret >> 16u);
85381
  return v_ret;
85382
}
85383
85384
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH32)
85385
85386
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
85387
85388
// ---------------- Status Codes Implementations
85389
85390
// ---------------- Private Consts
85391
85392
#define WUFFS_XXHASH64__XXH_PRIME64_1 11400714785074694791u
85393
85394
#define WUFFS_XXHASH64__XXH_PRIME64_2 14029467366897019727u
85395
85396
#define WUFFS_XXHASH64__XXH_PRIME64_3 1609587929392839161u
85397
85398
#define WUFFS_XXHASH64__XXH_PRIME64_4 9650029242287828579u
85399
85400
#define WUFFS_XXHASH64__XXH_PRIME64_5 2870177450012600261u
85401
85402
#define WUFFS_XXHASH64__INITIAL_V0 6983438078262162902u
85403
85404
#define WUFFS_XXHASH64__INITIAL_V1 14029467366897019727u
85405
85406
#define WUFFS_XXHASH64__INITIAL_V2 0u
85407
85408
#define WUFFS_XXHASH64__INITIAL_V3 7046029288634856825u
85409
85410
// ---------------- Private Initializer Prototypes
85411
85412
// ---------------- Private Function Prototypes
85413
85414
WUFFS_BASE__GENERATED_C_CODE
85415
static wuffs_base__empty_struct
85416
wuffs_xxhash64__hasher__up(
85417
    wuffs_xxhash64__hasher* self,
85418
    wuffs_base__slice_u8 a_x);
85419
85420
// ---------------- VTables
85421
85422
const wuffs_base__hasher_u64__func_ptrs
85423
wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64 = {
85424
  (uint64_t(*)(const void*))(&wuffs_xxhash64__hasher__checksum_u64),
85425
  (uint64_t(*)(const void*,
85426
      uint32_t))(&wuffs_xxhash64__hasher__get_quirk),
85427
  (wuffs_base__status(*)(void*,
85428
      uint32_t,
85429
      uint64_t))(&wuffs_xxhash64__hasher__set_quirk),
85430
  (wuffs_base__empty_struct(*)(void*,
85431
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update),
85432
  (uint64_t(*)(void*,
85433
      wuffs_base__slice_u8))(&wuffs_xxhash64__hasher__update_u64),
85434
};
85435
85436
// ---------------- Initializer Implementations
85437
85438
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
85439
wuffs_xxhash64__hasher__initialize(
85440
    wuffs_xxhash64__hasher* self,
85441
    size_t sizeof_star_self,
85442
    uint64_t wuffs_version,
85443
    uint32_t options){
85444
  if (!self) {
85445
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
85446
  }
85447
  if (sizeof(*self) != sizeof_star_self) {
85448
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
85449
  }
85450
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
85451
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
85452
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
85453
  }
85454
85455
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
85456
    // The whole point of this if-check is to detect an uninitialized *self.
85457
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
85458
#if !defined(__clang__) && defined(__GNUC__)
85459
#pragma GCC diagnostic push
85460
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
85461
#endif
85462
    if (self->private_impl.magic != 0) {
85463
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
85464
    }
85465
#if !defined(__clang__) && defined(__GNUC__)
85466
#pragma GCC diagnostic pop
85467
#endif
85468
  } else {
85469
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
85470
      memset(self, 0, sizeof(*self));
85471
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
85472
    } else {
85473
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
85474
    }
85475
  }
85476
85477
  self->private_impl.magic = WUFFS_BASE__MAGIC;
85478
  self->private_impl.vtable_for__wuffs_base__hasher_u64.vtable_name =
85479
      wuffs_base__hasher_u64__vtable_name;
85480
  self->private_impl.vtable_for__wuffs_base__hasher_u64.function_pointers =
85481
      (const void*)(&wuffs_xxhash64__hasher__func_ptrs_for__wuffs_base__hasher_u64);
85482
  return wuffs_base__make_status(NULL);
85483
}
85484
85485
wuffs_xxhash64__hasher*
85486
wuffs_xxhash64__hasher__alloc(void) {
85487
  wuffs_xxhash64__hasher* x =
85488
      (wuffs_xxhash64__hasher*)(calloc(1, sizeof(wuffs_xxhash64__hasher)));
85489
  if (!x) {
85490
    return NULL;
85491
  }
85492
  if (wuffs_xxhash64__hasher__initialize(
85493
      x, sizeof(wuffs_xxhash64__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
85494
    free(x);
85495
    return NULL;
85496
  }
85497
  return x;
85498
}
85499
85500
size_t
85501
sizeof__wuffs_xxhash64__hasher(void) {
85502
  return sizeof(wuffs_xxhash64__hasher);
85503
}
85504
85505
// ---------------- Function Implementations
85506
85507
// -------- func xxhash64.hasher.get_quirk
85508
85509
WUFFS_BASE__GENERATED_C_CODE
85510
WUFFS_BASE__MAYBE_STATIC uint64_t
85511
wuffs_xxhash64__hasher__get_quirk(
85512
    const wuffs_xxhash64__hasher* self,
85513
    uint32_t a_key) {
85514
  if (!self) {
85515
    return 0;
85516
  }
85517
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
85518
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
85519
    return 0;
85520
  }
85521
85522
  return 0u;
85523
}
85524
85525
// -------- func xxhash64.hasher.set_quirk
85526
85527
WUFFS_BASE__GENERATED_C_CODE
85528
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
85529
wuffs_xxhash64__hasher__set_quirk(
85530
    wuffs_xxhash64__hasher* self,
85531
    uint32_t a_key,
85532
    uint64_t a_value) {
85533
  if (!self) {
85534
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
85535
  }
85536
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85537
    return wuffs_base__make_status(
85538
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
85539
        ? wuffs_base__error__disabled_by_previous_error
85540
        : wuffs_base__error__initialize_not_called);
85541
  }
85542
85543
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
85544
}
85545
85546
// -------- func xxhash64.hasher.update
85547
85548
WUFFS_BASE__GENERATED_C_CODE
85549
WUFFS_BASE__MAYBE_STATIC wuffs_base__empty_struct
85550
wuffs_xxhash64__hasher__update(
85551
    wuffs_xxhash64__hasher* self,
85552
    wuffs_base__slice_u8 a_x) {
85553
  if (!self) {
85554
    return wuffs_base__make_empty_struct();
85555
  }
85556
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85557
    return wuffs_base__make_empty_struct();
85558
  }
85559
85560
  if ((self->private_impl.f_length_modulo_u64 == 0u) &&  ! self->private_impl.f_length_overflows_u64) {
85561
    self->private_impl.f_v0 = 6983438078262162902u;
85562
    self->private_impl.f_v1 = 14029467366897019727u;
85563
    self->private_impl.f_v2 = 0u;
85564
    self->private_impl.f_v3 = 7046029288634856825u;
85565
  }
85566
  wuffs_xxhash64__hasher__up(self, a_x);
85567
  return wuffs_base__make_empty_struct();
85568
}
85569
85570
// -------- func xxhash64.hasher.update_u64
85571
85572
WUFFS_BASE__GENERATED_C_CODE
85573
WUFFS_BASE__MAYBE_STATIC uint64_t
85574
wuffs_xxhash64__hasher__update_u64(
85575
    wuffs_xxhash64__hasher* self,
85576
    wuffs_base__slice_u8 a_x) {
85577
  if (!self) {
85578
    return 0;
85579
  }
85580
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
85581
    return 0;
85582
  }
85583
85584
  wuffs_xxhash64__hasher__update(self, a_x);
85585
  return wuffs_xxhash64__hasher__checksum_u64(self);
85586
}
85587
85588
// -------- func xxhash64.hasher.up
85589
85590
WUFFS_BASE__GENERATED_C_CODE
85591
static wuffs_base__empty_struct
85592
wuffs_xxhash64__hasher__up(
85593
    wuffs_xxhash64__hasher* self,
85594
    wuffs_base__slice_u8 a_x) {
85595
  uint64_t v_new_lmu = 0;
85596
  uint64_t v_buf_u64 = 0;
85597
  uint32_t v_buf_len = 0;
85598
  uint64_t v_v0 = 0;
85599
  uint64_t v_v1 = 0;
85600
  uint64_t v_v2 = 0;
85601
  uint64_t v_v3 = 0;
85602
  wuffs_base__slice_u8 v_p = {0};
85603
85604
  v_new_lmu = ((uint64_t)(self->private_impl.f_length_modulo_u64 + ((uint64_t)(a_x.len))));
85605
  self->private_impl.f_length_overflows_u64 = ((v_new_lmu < self->private_impl.f_length_modulo_u64) || self->private_impl.f_length_overflows_u64);
85606
  self->private_impl.f_length_modulo_u64 = v_new_lmu;
85607
  while (true) {
85608
    if (self->private_impl.f_buf_len >= 32u) {
85609
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
85610
          (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
85611
          (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
85612
          (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
85613
          (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
85614
          (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
85615
          (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
85616
          (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
85617
      v_v0 = ((uint64_t)(self->private_impl.f_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85618
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
85619
      self->private_impl.f_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
85620
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
85621
          (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
85622
          (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
85623
          (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
85624
          (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
85625
          (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
85626
          (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
85627
          (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
85628
      v_v1 = ((uint64_t)(self->private_impl.f_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85629
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
85630
      self->private_impl.f_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
85631
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
85632
          (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
85633
          (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
85634
          (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
85635
          (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
85636
          (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
85637
          (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
85638
          (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
85639
      v_v2 = ((uint64_t)(self->private_impl.f_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85640
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
85641
      self->private_impl.f_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
85642
      v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[24u])) |
85643
          (((uint64_t)(self->private_impl.f_buf_data[25u])) << 8u) |
85644
          (((uint64_t)(self->private_impl.f_buf_data[26u])) << 16u) |
85645
          (((uint64_t)(self->private_impl.f_buf_data[27u])) << 24u) |
85646
          (((uint64_t)(self->private_impl.f_buf_data[28u])) << 32u) |
85647
          (((uint64_t)(self->private_impl.f_buf_data[29u])) << 40u) |
85648
          (((uint64_t)(self->private_impl.f_buf_data[30u])) << 48u) |
85649
          (((uint64_t)(self->private_impl.f_buf_data[31u])) << 56u));
85650
      v_v3 = ((uint64_t)(self->private_impl.f_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85651
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
85652
      self->private_impl.f_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
85653
      self->private_impl.f_buf_len = 0u;
85654
      break;
85655
    }
85656
    if (((uint64_t)(a_x.len)) <= 0u) {
85657
      return wuffs_base__make_empty_struct();
85658
    }
85659
    self->private_impl.f_buf_data[self->private_impl.f_buf_len] = a_x.ptr[0u];
85660
    self->private_impl.f_buf_len += 1u;
85661
    a_x = wuffs_base__slice_u8__subslice_i(a_x, 1u);
85662
  }
85663
  v_buf_len = (self->private_impl.f_buf_len & 31u);
85664
  v_v0 = self->private_impl.f_v0;
85665
  v_v1 = self->private_impl.f_v1;
85666
  v_v2 = self->private_impl.f_v2;
85667
  v_v3 = self->private_impl.f_v3;
85668
  {
85669
    wuffs_base__slice_u8 i_slice_p = a_x;
85670
    v_p.ptr = i_slice_p.ptr;
85671
    v_p.len = 32;
85672
    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)) / 32) * 32));
85673
    while (v_p.ptr < i_end0_p) {
85674
      v_buf_u64 = (((uint64_t)(v_p.ptr[0u])) |
85675
          (((uint64_t)(v_p.ptr[1u])) << 8u) |
85676
          (((uint64_t)(v_p.ptr[2u])) << 16u) |
85677
          (((uint64_t)(v_p.ptr[3u])) << 24u) |
85678
          (((uint64_t)(v_p.ptr[4u])) << 32u) |
85679
          (((uint64_t)(v_p.ptr[5u])) << 40u) |
85680
          (((uint64_t)(v_p.ptr[6u])) << 48u) |
85681
          (((uint64_t)(v_p.ptr[7u])) << 56u));
85682
      v_v0 = ((uint64_t)(v_v0 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85683
      v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
85684
      v_v0 = ((uint64_t)(v_v0 * 11400714785074694791u));
85685
      v_buf_u64 = (((uint64_t)(v_p.ptr[8u])) |
85686
          (((uint64_t)(v_p.ptr[9u])) << 8u) |
85687
          (((uint64_t)(v_p.ptr[10u])) << 16u) |
85688
          (((uint64_t)(v_p.ptr[11u])) << 24u) |
85689
          (((uint64_t)(v_p.ptr[12u])) << 32u) |
85690
          (((uint64_t)(v_p.ptr[13u])) << 40u) |
85691
          (((uint64_t)(v_p.ptr[14u])) << 48u) |
85692
          (((uint64_t)(v_p.ptr[15u])) << 56u));
85693
      v_v1 = ((uint64_t)(v_v1 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85694
      v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
85695
      v_v1 = ((uint64_t)(v_v1 * 11400714785074694791u));
85696
      v_buf_u64 = (((uint64_t)(v_p.ptr[16u])) |
85697
          (((uint64_t)(v_p.ptr[17u])) << 8u) |
85698
          (((uint64_t)(v_p.ptr[18u])) << 16u) |
85699
          (((uint64_t)(v_p.ptr[19u])) << 24u) |
85700
          (((uint64_t)(v_p.ptr[20u])) << 32u) |
85701
          (((uint64_t)(v_p.ptr[21u])) << 40u) |
85702
          (((uint64_t)(v_p.ptr[22u])) << 48u) |
85703
          (((uint64_t)(v_p.ptr[23u])) << 56u));
85704
      v_v2 = ((uint64_t)(v_v2 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85705
      v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
85706
      v_v2 = ((uint64_t)(v_v2 * 11400714785074694791u));
85707
      v_buf_u64 = (((uint64_t)(v_p.ptr[24u])) |
85708
          (((uint64_t)(v_p.ptr[25u])) << 8u) |
85709
          (((uint64_t)(v_p.ptr[26u])) << 16u) |
85710
          (((uint64_t)(v_p.ptr[27u])) << 24u) |
85711
          (((uint64_t)(v_p.ptr[28u])) << 32u) |
85712
          (((uint64_t)(v_p.ptr[29u])) << 40u) |
85713
          (((uint64_t)(v_p.ptr[30u])) << 48u) |
85714
          (((uint64_t)(v_p.ptr[31u])) << 56u));
85715
      v_v3 = ((uint64_t)(v_v3 + ((uint64_t)(v_buf_u64 * 14029467366897019727u))));
85716
      v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
85717
      v_v3 = ((uint64_t)(v_v3 * 11400714785074694791u));
85718
      v_p.ptr += 32;
85719
    }
85720
    v_p.len = 1;
85721
    const uint8_t* i_end1_p = wuffs_private_impl__ptr_u8_plus_len(i_slice_p.ptr, i_slice_p.len);
85722
    while (v_p.ptr < i_end1_p) {
85723
      self->private_impl.f_buf_data[v_buf_len] = v_p.ptr[0u];
85724
      v_buf_len = ((v_buf_len + 1u) & 31u);
85725
      v_p.ptr += 1;
85726
    }
85727
    v_p.len = 0;
85728
  }
85729
  self->private_impl.f_buf_len = v_buf_len;
85730
  self->private_impl.f_v0 = v_v0;
85731
  self->private_impl.f_v1 = v_v1;
85732
  self->private_impl.f_v2 = v_v2;
85733
  self->private_impl.f_v3 = v_v3;
85734
  return wuffs_base__make_empty_struct();
85735
}
85736
85737
// -------- func xxhash64.hasher.checksum_u64
85738
85739
WUFFS_BASE__GENERATED_C_CODE
85740
WUFFS_BASE__MAYBE_STATIC uint64_t
85741
wuffs_xxhash64__hasher__checksum_u64(
85742
    const wuffs_xxhash64__hasher* self) {
85743
  if (!self) {
85744
    return 0;
85745
  }
85746
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
85747
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
85748
    return 0;
85749
  }
85750
85751
  uint64_t v_ret = 0;
85752
  uint64_t v_v0 = 0;
85753
  uint64_t v_v1 = 0;
85754
  uint64_t v_v2 = 0;
85755
  uint64_t v_v3 = 0;
85756
  uint32_t v_i = 0;
85757
  uint32_t v_i8 = 0;
85758
  uint32_t v_n = 0;
85759
  uint32_t v_buf_u32 = 0;
85760
  uint64_t v_buf_u64 = 0;
85761
85762
  if ((self->private_impl.f_length_modulo_u64 >= 32u) || self->private_impl.f_length_overflows_u64) {
85763
    v_ret += (((uint64_t)(self->private_impl.f_v0 << 1u)) | (self->private_impl.f_v0 >> 63u));
85764
    v_ret += (((uint64_t)(self->private_impl.f_v1 << 7u)) | (self->private_impl.f_v1 >> 57u));
85765
    v_ret += (((uint64_t)(self->private_impl.f_v2 << 12u)) | (self->private_impl.f_v2 >> 52u));
85766
    v_ret += (((uint64_t)(self->private_impl.f_v3 << 18u)) | (self->private_impl.f_v3 >> 46u));
85767
    v_v0 = ((uint64_t)(self->private_impl.f_v0 * 14029467366897019727u));
85768
    v_v0 = (((uint64_t)(v_v0 << 31u)) | (v_v0 >> 33u));
85769
    v_v0 *= 11400714785074694791u;
85770
    v_v1 = ((uint64_t)(self->private_impl.f_v1 * 14029467366897019727u));
85771
    v_v1 = (((uint64_t)(v_v1 << 31u)) | (v_v1 >> 33u));
85772
    v_v1 *= 11400714785074694791u;
85773
    v_v2 = ((uint64_t)(self->private_impl.f_v2 * 14029467366897019727u));
85774
    v_v2 = (((uint64_t)(v_v2 << 31u)) | (v_v2 >> 33u));
85775
    v_v2 *= 11400714785074694791u;
85776
    v_v3 = ((uint64_t)(self->private_impl.f_v3 * 14029467366897019727u));
85777
    v_v3 = (((uint64_t)(v_v3 << 31u)) | (v_v3 >> 33u));
85778
    v_v3 *= 11400714785074694791u;
85779
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v0) * 11400714785074694791u)) + 9650029242287828579u));
85780
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v1) * 11400714785074694791u)) + 9650029242287828579u));
85781
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v2) * 11400714785074694791u)) + 9650029242287828579u));
85782
    v_ret = ((uint64_t)(((uint64_t)((v_ret ^ v_v3) * 11400714785074694791u)) + 9650029242287828579u));
85783
    v_ret += self->private_impl.f_length_modulo_u64;
85784
  } else {
85785
    v_ret += 2870177450012600261u;
85786
    v_ret += self->private_impl.f_length_modulo_u64;
85787
  }
85788
  v_n = 32u;
85789
  v_n = wuffs_base__u32__min(v_n, self->private_impl.f_buf_len);
85790
  if (8u <= v_n) {
85791
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[0u])) |
85792
        (((uint64_t)(self->private_impl.f_buf_data[1u])) << 8u) |
85793
        (((uint64_t)(self->private_impl.f_buf_data[2u])) << 16u) |
85794
        (((uint64_t)(self->private_impl.f_buf_data[3u])) << 24u) |
85795
        (((uint64_t)(self->private_impl.f_buf_data[4u])) << 32u) |
85796
        (((uint64_t)(self->private_impl.f_buf_data[5u])) << 40u) |
85797
        (((uint64_t)(self->private_impl.f_buf_data[6u])) << 48u) |
85798
        (((uint64_t)(self->private_impl.f_buf_data[7u])) << 56u));
85799
    v_buf_u64 *= 14029467366897019727u;
85800
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
85801
    v_buf_u64 *= 11400714785074694791u;
85802
    v_ret ^= v_buf_u64;
85803
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
85804
    v_ret *= 11400714785074694791u;
85805
    v_ret += 9650029242287828579u;
85806
    v_i = 8u;
85807
  }
85808
  if (16u <= v_n) {
85809
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[8u])) |
85810
        (((uint64_t)(self->private_impl.f_buf_data[9u])) << 8u) |
85811
        (((uint64_t)(self->private_impl.f_buf_data[10u])) << 16u) |
85812
        (((uint64_t)(self->private_impl.f_buf_data[11u])) << 24u) |
85813
        (((uint64_t)(self->private_impl.f_buf_data[12u])) << 32u) |
85814
        (((uint64_t)(self->private_impl.f_buf_data[13u])) << 40u) |
85815
        (((uint64_t)(self->private_impl.f_buf_data[14u])) << 48u) |
85816
        (((uint64_t)(self->private_impl.f_buf_data[15u])) << 56u));
85817
    v_buf_u64 *= 14029467366897019727u;
85818
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
85819
    v_buf_u64 *= 11400714785074694791u;
85820
    v_ret ^= v_buf_u64;
85821
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
85822
    v_ret *= 11400714785074694791u;
85823
    v_ret += 9650029242287828579u;
85824
    v_i = 16u;
85825
  }
85826
  if (24u <= v_n) {
85827
    v_buf_u64 = (((uint64_t)(self->private_impl.f_buf_data[16u])) |
85828
        (((uint64_t)(self->private_impl.f_buf_data[17u])) << 8u) |
85829
        (((uint64_t)(self->private_impl.f_buf_data[18u])) << 16u) |
85830
        (((uint64_t)(self->private_impl.f_buf_data[19u])) << 24u) |
85831
        (((uint64_t)(self->private_impl.f_buf_data[20u])) << 32u) |
85832
        (((uint64_t)(self->private_impl.f_buf_data[21u])) << 40u) |
85833
        (((uint64_t)(self->private_impl.f_buf_data[22u])) << 48u) |
85834
        (((uint64_t)(self->private_impl.f_buf_data[23u])) << 56u));
85835
    v_buf_u64 *= 14029467366897019727u;
85836
    v_buf_u64 = (((uint64_t)(v_buf_u64 << 31u)) | (v_buf_u64 >> 33u));
85837
    v_buf_u64 *= 11400714785074694791u;
85838
    v_ret ^= v_buf_u64;
85839
    v_ret = (((uint64_t)(v_ret << 27u)) | (v_ret >> 37u));
85840
    v_ret *= 11400714785074694791u;
85841
    v_ret += 9650029242287828579u;
85842
    v_i = 24u;
85843
  }
85844
  if ((v_n & 4u) != 0u) {
85845
    v_i8 = (v_i & 24u);
85846
    v_buf_u32 = (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 0u)])) |
85847
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 1u)])) << 8u) |
85848
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 2u)])) << 16u) |
85849
        (((uint32_t)(self->private_impl.f_buf_data[(v_i8 + 3u)])) << 24u));
85850
    v_ret ^= ((uint64_t)(((uint64_t)(v_buf_u32)) * 11400714785074694791u));
85851
    v_ret = (((uint64_t)(v_ret << 23u)) | (v_ret >> 41u));
85852
    v_ret *= 14029467366897019727u;
85853
    v_ret += 1609587929392839161u;
85854
    v_i = (v_i8 + 4u);
85855
  }
85856
  while (v_i < v_n) {
85857
    v_ret ^= ((uint64_t)(((uint64_t)(self->private_impl.f_buf_data[v_i])) * 2870177450012600261u));
85858
    v_ret = (((uint64_t)(v_ret << 11u)) | (v_ret >> 53u));
85859
    v_ret *= 11400714785074694791u;
85860
    v_i += 1u;
85861
  }
85862
  v_ret ^= (v_ret >> 33u);
85863
  v_ret *= 14029467366897019727u;
85864
  v_ret ^= (v_ret >> 29u);
85865
  v_ret *= 1609587929392839161u;
85866
  v_ret ^= (v_ret >> 32u);
85867
  return ((uint64_t)(v_ret));
85868
}
85869
85870
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XXHASH64)
85871
85872
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
85873
85874
// ---------------- Status Codes Implementations
85875
85876
const char wuffs_xz__error__bad_bcj_offset[] = "#xz: bad BCJ offset";
85877
const char wuffs_xz__error__bad_block_header[] = "#xz: bad block header";
85878
const char wuffs_xz__error__bad_checksum[] = "#xz: bad checksum";
85879
const char wuffs_xz__error__bad_filter[] = "#xz: bad filter";
85880
const char wuffs_xz__error__bad_footer[] = "#xz: bad footer";
85881
const char wuffs_xz__error__bad_header[] = "#xz: bad header";
85882
const char wuffs_xz__error__bad_header_concatenated_stream[] = "#xz: bad header (concatenated stream)";
85883
const char wuffs_xz__error__bad_index[] = "#xz: bad index";
85884
const char wuffs_xz__error__bad_padding[] = "#xz: bad padding";
85885
const char wuffs_xz__error__truncated_input[] = "#xz: truncated input";
85886
const char wuffs_xz__error__unsupported_checksum_algorithm[] = "#xz: unsupported checksum algorithm";
85887
const char wuffs_xz__error__unsupported_filter[] = "#xz: unsupported filter";
85888
const char wuffs_xz__error__unsupported_filter_combination[] = "#xz: unsupported filter combination";
85889
const char wuffs_xz__error__internal_error_inconsistent_bcj_filter_state[] = "#xz: internal error: inconsistent BCJ filter state";
85890
85891
// ---------------- Private Consts
85892
85893
static const bool
85894
WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
85895
  1u, 1u, 1u, 0u, 1u, 0u, 0u, 0u,
85896
};
85897
85898
static const uint8_t
85899
WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
85900
  0u, 1u, 2u, 2u, 3u, 3u, 3u, 3u,
85901
};
85902
85903
static const uint32_t
85904
WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[8] WUFFS_BASE__POTENTIALLY_UNUSED = {
85905
  4294967295u, 16777215u, 65535u, 65535u, 255u, 255u, 255u, 255u,
85906
};
85907
85908
static const uint8_t
85909
WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[32] WUFFS_BASE__POTENTIALLY_UNUSED = {
85910
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
85911
  0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u,
85912
  4u, 4u, 6u, 6u, 0u, 0u, 7u, 7u,
85913
  4u, 4u, 0u, 0u, 4u, 4u, 0u, 0u,
85914
};
85915
85916
#define WUFFS_XZ__QUIRKS_BASE 1963655168u
85917
85918
static const uint8_t
85919
WUFFS_XZ__CHECKSUM_LENGTH[4] WUFFS_BASE__POTENTIALLY_UNUSED = {
85920
  0u, 4u, 8u, 32u,
85921
};
85922
85923
static const uint8_t
85924
WUFFS_XZ__ZEROES[3] WUFFS_BASE__POTENTIALLY_UNUSED = {
85925
  0u, 0u, 0u,
85926
};
85927
85928
static const uint8_t
85929
WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[12] WUFFS_BASE__POTENTIALLY_UNUSED = {
85930
  0u, 0u, 0u, 0u, 1u, 4u, 16u, 4u,
85931
  2u, 4u, 4u, 2u,
85932
};
85933
85934
// ---------------- Private Initializer Prototypes
85935
85936
// ---------------- Private Function Prototypes
85937
85938
WUFFS_BASE__GENERATED_C_CODE
85939
static uint8_t
85940
wuffs_xz__decoder__apply_non_final_filters(
85941
    wuffs_xz__decoder* self,
85942
    wuffs_base__slice_u8 a_dst_slice);
85943
85944
WUFFS_BASE__GENERATED_C_CODE
85945
static uint8_t
85946
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
85947
    wuffs_xz__decoder* self,
85948
    wuffs_base__slice_u8 a_dst_slice);
85949
85950
WUFFS_BASE__GENERATED_C_CODE
85951
static uint8_t
85952
wuffs_xz__decoder__apply_filter_04_x86(
85953
    wuffs_xz__decoder* self,
85954
    wuffs_base__slice_u8 a_dst_slice);
85955
85956
WUFFS_BASE__GENERATED_C_CODE
85957
static uint8_t
85958
wuffs_xz__decoder__apply_filter_05_powerpc(
85959
    wuffs_xz__decoder* self,
85960
    wuffs_base__slice_u8 a_dst_slice);
85961
85962
WUFFS_BASE__GENERATED_C_CODE
85963
static uint8_t
85964
wuffs_xz__decoder__apply_filter_06_ia64(
85965
    wuffs_xz__decoder* self,
85966
    wuffs_base__slice_u8 a_dst_slice);
85967
85968
WUFFS_BASE__GENERATED_C_CODE
85969
static uint8_t
85970
wuffs_xz__decoder__apply_filter_07_arm(
85971
    wuffs_xz__decoder* self,
85972
    wuffs_base__slice_u8 a_dst_slice);
85973
85974
WUFFS_BASE__GENERATED_C_CODE
85975
static uint8_t
85976
wuffs_xz__decoder__apply_filter_08_armthumb(
85977
    wuffs_xz__decoder* self,
85978
    wuffs_base__slice_u8 a_dst_slice);
85979
85980
WUFFS_BASE__GENERATED_C_CODE
85981
static uint8_t
85982
wuffs_xz__decoder__apply_filter_09_sparc(
85983
    wuffs_xz__decoder* self,
85984
    wuffs_base__slice_u8 a_dst_slice);
85985
85986
WUFFS_BASE__GENERATED_C_CODE
85987
static uint8_t
85988
wuffs_xz__decoder__apply_filter_0a_arm64(
85989
    wuffs_xz__decoder* self,
85990
    wuffs_base__slice_u8 a_dst_slice);
85991
85992
WUFFS_BASE__GENERATED_C_CODE
85993
static uint8_t
85994
wuffs_xz__decoder__apply_filter_0b_riscv(
85995
    wuffs_xz__decoder* self,
85996
    wuffs_base__slice_u8 a_dst_slice);
85997
85998
WUFFS_BASE__GENERATED_C_CODE
85999
static wuffs_base__status
86000
wuffs_xz__decoder__do_transform_io(
86001
    wuffs_xz__decoder* self,
86002
    wuffs_base__io_buffer* a_dst,
86003
    wuffs_base__io_buffer* a_src,
86004
    wuffs_base__slice_u8 a_workbuf);
86005
86006
WUFFS_BASE__GENERATED_C_CODE
86007
static wuffs_base__status
86008
wuffs_xz__decoder__decode_block_header_with_padding(
86009
    wuffs_xz__decoder* self,
86010
    wuffs_base__io_buffer* a_src);
86011
86012
WUFFS_BASE__GENERATED_C_CODE
86013
static wuffs_base__status
86014
wuffs_xz__decoder__decode_block_header_sans_padding(
86015
    wuffs_xz__decoder* self,
86016
    wuffs_base__io_buffer* a_src);
86017
86018
WUFFS_BASE__GENERATED_C_CODE
86019
static wuffs_base__status
86020
wuffs_xz__decoder__verify_index(
86021
    wuffs_xz__decoder* self,
86022
    wuffs_base__io_buffer* a_src);
86023
86024
WUFFS_BASE__GENERATED_C_CODE
86025
static wuffs_base__status
86026
wuffs_xz__decoder__verify_footer(
86027
    wuffs_xz__decoder* self,
86028
    wuffs_base__io_buffer* a_src);
86029
86030
// ---------------- VTables
86031
86032
const wuffs_base__io_transformer__func_ptrs
86033
wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer = {
86034
  (wuffs_base__optional_u63(*)(const void*))(&wuffs_xz__decoder__dst_history_retain_length),
86035
  (uint64_t(*)(const void*,
86036
      uint32_t))(&wuffs_xz__decoder__get_quirk),
86037
  (wuffs_base__status(*)(void*,
86038
      uint32_t,
86039
      uint64_t))(&wuffs_xz__decoder__set_quirk),
86040
  (wuffs_base__status(*)(void*,
86041
      wuffs_base__io_buffer*,
86042
      wuffs_base__io_buffer*,
86043
      wuffs_base__slice_u8))(&wuffs_xz__decoder__transform_io),
86044
  (wuffs_base__range_ii_u64(*)(const void*))(&wuffs_xz__decoder__workbuf_len),
86045
};
86046
86047
// ---------------- Initializer Implementations
86048
86049
wuffs_base__status WUFFS_BASE__WARN_UNUSED_RESULT
86050
wuffs_xz__decoder__initialize(
86051
    wuffs_xz__decoder* self,
86052
    size_t sizeof_star_self,
86053
    uint64_t wuffs_version,
86054
    uint32_t options){
86055
  if (!self) {
86056
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86057
  }
86058
  if (sizeof(*self) != sizeof_star_self) {
86059
    return wuffs_base__make_status(wuffs_base__error__bad_sizeof_receiver);
86060
  }
86061
  if (((wuffs_version >> 32) != WUFFS_VERSION_MAJOR) ||
86062
      (((wuffs_version >> 16) & 0xFFFF) > WUFFS_VERSION_MINOR)) {
86063
    return wuffs_base__make_status(wuffs_base__error__bad_wuffs_version);
86064
  }
86065
86066
  if ((options & WUFFS_INITIALIZE__ALREADY_ZEROED) != 0) {
86067
    // The whole point of this if-check is to detect an uninitialized *self.
86068
    // We disable the warning on GCC. Clang-5.0 does not have this warning.
86069
#if !defined(__clang__) && defined(__GNUC__)
86070
#pragma GCC diagnostic push
86071
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
86072
#endif
86073
    if (self->private_impl.magic != 0) {
86074
      return wuffs_base__make_status(wuffs_base__error__initialize_falsely_claimed_already_zeroed);
86075
    }
86076
#if !defined(__clang__) && defined(__GNUC__)
86077
#pragma GCC diagnostic pop
86078
#endif
86079
  } else {
86080
    if ((options & WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED) == 0) {
86081
      memset(self, 0, sizeof(*self));
86082
      options |= WUFFS_INITIALIZE__ALREADY_ZEROED;
86083
    } else {
86084
      memset(&(self->private_impl), 0, sizeof(self->private_impl));
86085
    }
86086
  }
86087
86088
  self->private_impl.choosy_apply_non_final_filters = &wuffs_xz__decoder__apply_non_final_filters__choosy_default;
86089
86090
  {
86091
    wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
86092
        &self->private_data.f_crc32, sizeof(self->private_data.f_crc32), WUFFS_VERSION, options);
86093
    if (z.repr) {
86094
      return z;
86095
    }
86096
  }
86097
  {
86098
    wuffs_base__status z = wuffs_crc64__ecma_hasher__initialize(
86099
        &self->private_data.f_crc64, sizeof(self->private_data.f_crc64), WUFFS_VERSION, options);
86100
    if (z.repr) {
86101
      return z;
86102
    }
86103
  }
86104
  {
86105
    wuffs_base__status z = wuffs_sha256__hasher__initialize(
86106
        &self->private_data.f_sha256, sizeof(self->private_data.f_sha256), WUFFS_VERSION, options);
86107
    if (z.repr) {
86108
      return z;
86109
    }
86110
  }
86111
  {
86112
    wuffs_base__status z = wuffs_lzma__decoder__initialize(
86113
        &self->private_data.f_lzma, sizeof(self->private_data.f_lzma), WUFFS_VERSION, options);
86114
    if (z.repr) {
86115
      return z;
86116
    }
86117
  }
86118
  self->private_impl.magic = WUFFS_BASE__MAGIC;
86119
  self->private_impl.vtable_for__wuffs_base__io_transformer.vtable_name =
86120
      wuffs_base__io_transformer__vtable_name;
86121
  self->private_impl.vtable_for__wuffs_base__io_transformer.function_pointers =
86122
      (const void*)(&wuffs_xz__decoder__func_ptrs_for__wuffs_base__io_transformer);
86123
  return wuffs_base__make_status(NULL);
86124
}
86125
86126
wuffs_xz__decoder*
86127
wuffs_xz__decoder__alloc(void) {
86128
  wuffs_xz__decoder* x =
86129
      (wuffs_xz__decoder*)(calloc(1, sizeof(wuffs_xz__decoder)));
86130
  if (!x) {
86131
    return NULL;
86132
  }
86133
  if (wuffs_xz__decoder__initialize(
86134
      x, sizeof(wuffs_xz__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__ALREADY_ZEROED).repr) {
86135
    free(x);
86136
    return NULL;
86137
  }
86138
  return x;
86139
}
86140
86141
size_t
86142
sizeof__wuffs_xz__decoder(void) {
86143
  return sizeof(wuffs_xz__decoder);
86144
}
86145
86146
// ---------------- Function Implementations
86147
86148
// -------- func xz.decoder.apply_non_final_filters
86149
86150
WUFFS_BASE__GENERATED_C_CODE
86151
static uint8_t
86152
wuffs_xz__decoder__apply_non_final_filters(
86153
    wuffs_xz__decoder* self,
86154
    wuffs_base__slice_u8 a_dst_slice) {
86155
  return (*self->private_impl.choosy_apply_non_final_filters)(self, a_dst_slice);
86156
}
86157
86158
WUFFS_BASE__GENERATED_C_CODE
86159
static uint8_t
86160
wuffs_xz__decoder__apply_non_final_filters__choosy_default(
86161
    wuffs_xz__decoder* self,
86162
    wuffs_base__slice_u8 a_dst_slice) {
86163
  uint32_t v_f = 0;
86164
  uint64_t v_i = 0;
86165
  uint32_t v_filter_id = 0;
86166
  uint32_t v_delta_dist = 0;
86167
  uint32_t v_delta_pos = 0;
86168
  uint8_t v_c8 = 0;
86169
86170
  if (self->private_impl.f_num_non_final_filters <= 0u) {
86171
    return 0u;
86172
  }
86173
  v_f = (self->private_impl.f_num_non_final_filters - 1u);
86174
  while (true) {
86175
    v_filter_id = (self->private_impl.f_filters[v_f] & 127u);
86176
    if (v_filter_id == 3u) {
86177
      v_delta_dist = (((self->private_impl.f_filters[v_f] >> 8u) & 255u) + 1u);
86178
      v_delta_pos = (self->private_impl.f_filters[v_f] >> 24u);
86179
      v_i = 0u;
86180
      while (v_i < ((uint64_t)(a_dst_slice.len))) {
86181
        v_c8 = a_dst_slice.ptr[v_i];
86182
#if defined(__GNUC__)
86183
#pragma GCC diagnostic push
86184
#pragma GCC diagnostic ignored "-Wconversion"
86185
#endif
86186
        v_c8 += self->private_data.f_filter_data[v_f][(((uint32_t)(v_delta_dist + v_delta_pos)) & 255u)];
86187
#if defined(__GNUC__)
86188
#pragma GCC diagnostic pop
86189
#endif
86190
        self->private_data.f_filter_data[v_f][(v_delta_pos & 255u)] = v_c8;
86191
        v_delta_pos -= 1u;
86192
        a_dst_slice.ptr[v_i] = v_c8;
86193
        v_i += 1u;
86194
      }
86195
      self->private_impl.f_filters[v_f] &= 65535u;
86196
      self->private_impl.f_filters[v_f] |= ((uint32_t)(v_delta_pos << 24u));
86197
    }
86198
    if (v_f <= 0u) {
86199
      break;
86200
    }
86201
    v_f -= 1u;
86202
  }
86203
  return 0u;
86204
}
86205
86206
// -------- func xz.decoder.apply_filter_04_x86
86207
86208
WUFFS_BASE__GENERATED_C_CODE
86209
static uint8_t
86210
wuffs_xz__decoder__apply_filter_04_x86(
86211
    wuffs_xz__decoder* self,
86212
    wuffs_base__slice_u8 a_dst_slice) {
86213
  wuffs_base__slice_u8 v_s = {0};
86214
  uint32_t v_p = 0;
86215
  uint64_t v_i = 0;
86216
  uint64_t v_prev_pos = 0;
86217
  uint32_t v_prev_mask = 0;
86218
  uint8_t v_c8 = 0;
86219
  uint32_t v_src = 0;
86220
  uint32_t v_dst = 0;
86221
  uint32_t v_bit_num = 0;
86222
86223
  v_s = a_dst_slice;
86224
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 5u));
86225
  v_prev_pos = 18446744073709551615u;
86226
  v_prev_mask = self->private_impl.f_bcj_x86_prev_mask;
86227
  while (((uint64_t)(v_s.len)) >= 5u) {
86228
    if (((uint8_t)(v_s.ptr[0u] & 254u)) != 232u) {
86229
      v_i += 1u;
86230
      v_p += 1u;
86231
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
86232
      continue;
86233
    }
86234
    v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
86235
    if (v_prev_pos > 3u) {
86236
      v_prev_mask = 0u;
86237
    } else if (v_prev_pos > 0u) {
86238
      v_prev_mask = (((uint32_t)(v_prev_mask << (v_prev_pos - 1u))) & 7u);
86239
      if (v_prev_mask != 0u) {
86240
        v_c8 = v_s.ptr[((uint8_t)(4u - WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]))];
86241
        if ( ! WUFFS_XZ__FILTER_04_X86_MASK_TO_ALLOWED_STATUS[(v_prev_mask & 7u)] || (v_c8 == 0u) || (v_c8 == 255u)) {
86242
          v_prev_pos = v_i;
86243
          v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
86244
          v_i += 1u;
86245
          v_p += 1u;
86246
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
86247
          continue;
86248
        }
86249
      }
86250
    }
86251
    v_prev_pos = v_i;
86252
    v_c8 = v_s.ptr[4u];
86253
    if ((v_c8 != 0u) && (v_c8 != 255u)) {
86254
      v_prev_mask = (((uint32_t)(v_prev_mask << 1u)) | 1u);
86255
      v_i += 1u;
86256
      v_p += 1u;
86257
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 1u);
86258
      continue;
86259
    }
86260
    v_src = ((((uint32_t)(v_s.ptr[1u])) << 0u) |
86261
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
86262
        (((uint32_t)(v_s.ptr[3u])) << 16u) |
86263
        (((uint32_t)(v_s.ptr[4u])) << 24u));
86264
    while (true) {
86265
      v_dst = ((uint32_t)(v_src - v_p));
86266
      if (v_prev_mask == 0u) {
86267
        break;
86268
      }
86269
      v_bit_num = ((uint32_t)(WUFFS_XZ__FILTER_04_X86_MASK_TO_BIT_NUM[(v_prev_mask & 7u)]));
86270
      v_c8 = ((uint8_t)((v_dst >> (24u - (v_bit_num * 8u)))));
86271
      if ((v_c8 != 0u) && (v_c8 != 255u)) {
86272
        break;
86273
      }
86274
      v_src = (v_dst ^ WUFFS_XZ__FILTER_04_X86_MASK_TO_XOR_OPERAND[(v_prev_mask & 7u)]);
86275
    }
86276
    v_dst &= 33554431u;
86277
    v_dst |= ((uint32_t)(0u - (v_dst & 16777216u)));
86278
    v_s.ptr[1u] = ((uint8_t)((v_dst >> 0u)));
86279
    v_s.ptr[2u] = ((uint8_t)((v_dst >> 8u)));
86280
    v_s.ptr[3u] = ((uint8_t)((v_dst >> 16u)));
86281
    v_s.ptr[4u] = ((uint8_t)((v_dst >> 24u)));
86282
    v_i += 5u;
86283
    v_p += 5u;
86284
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 5u);
86285
  }
86286
  v_prev_pos = ((uint64_t)(v_i - v_prev_pos));
86287
  if (v_prev_pos > 3u) {
86288
    self->private_impl.f_bcj_x86_prev_mask = 0u;
86289
  } else if (v_prev_pos > 0u) {
86290
    self->private_impl.f_bcj_x86_prev_mask = ((uint32_t)(v_prev_mask << (v_prev_pos - 1u)));
86291
  }
86292
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 5u));
86293
  return ((uint8_t)(((uint64_t)(v_s.len))));
86294
}
86295
86296
// -------- func xz.decoder.apply_filter_05_powerpc
86297
86298
WUFFS_BASE__GENERATED_C_CODE
86299
static uint8_t
86300
wuffs_xz__decoder__apply_filter_05_powerpc(
86301
    wuffs_xz__decoder* self,
86302
    wuffs_base__slice_u8 a_dst_slice) {
86303
  wuffs_base__slice_u8 v_s = {0};
86304
  uint32_t v_p = 0;
86305
  uint32_t v_x = 0;
86306
86307
  v_s = a_dst_slice;
86308
  v_p = self->private_impl.f_bcj_pos;
86309
  while (((uint64_t)(v_s.len)) >= 4u) {
86310
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
86311
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
86312
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
86313
        (((uint32_t)(v_s.ptr[3u])) << 0u));
86314
    if ((v_x & 4227858435u) == 1207959553u) {
86315
      v_x = ((((uint32_t)((v_x & 67108860u) - v_p)) & 67108860u) | 1207959553u);
86316
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
86317
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
86318
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
86319
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
86320
    }
86321
    v_p += 4u;
86322
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86323
  }
86324
  self->private_impl.f_bcj_pos = v_p;
86325
  return ((uint8_t)(((uint64_t)(v_s.len))));
86326
}
86327
86328
// -------- func xz.decoder.apply_filter_06_ia64
86329
86330
WUFFS_BASE__GENERATED_C_CODE
86331
static uint8_t
86332
wuffs_xz__decoder__apply_filter_06_ia64(
86333
    wuffs_xz__decoder* self,
86334
    wuffs_base__slice_u8 a_dst_slice) {
86335
  wuffs_base__slice_u8 v_s = {0};
86336
  uint32_t v_p = 0;
86337
  uint32_t v_mask = 0;
86338
  uint32_t v_slot = 0;
86339
  uint32_t v_bit_pos = 0;
86340
  uint32_t v_byte_pos = 0;
86341
  uint32_t v_bit_res = 0;
86342
  uint64_t v_x = 0;
86343
  uint32_t v_j = 0;
86344
  uint64_t v_norm = 0;
86345
  uint32_t v_addr = 0;
86346
86347
  v_s = a_dst_slice;
86348
  v_p = self->private_impl.f_bcj_pos;
86349
  while (((uint64_t)(v_s.len)) >= 16u) {
86350
    v_mask = ((uint32_t)(WUFFS_XZ__FILTER_06_IA64_BRANCH_TABLE[((uint8_t)(v_s.ptr[0u] & 31u))]));
86351
    v_slot = 0u;
86352
    while (true) {
86353
      do {
86354
        if (((v_mask >> v_slot) & 1u) == 0u) {
86355
          break;
86356
        }
86357
        v_bit_pos = ((v_slot * 41u) + 5u);
86358
        v_byte_pos = (v_bit_pos >> 3u);
86359
        v_bit_res = (v_bit_pos & 7u);
86360
        v_x = 0u;
86361
        v_j = 0u;
86362
        while (v_j < 6u) {
86363
          v_x |= (((uint64_t)(v_s.ptr[(v_j + v_byte_pos)])) << (8u * v_j));
86364
          v_j += 1u;
86365
        }
86366
        v_norm = (v_x >> v_bit_res);
86367
        if ((((v_norm >> 37u) & 15u) != 5u) || (((v_norm >> 9u) & 7u) != 0u)) {
86368
          break;
86369
        }
86370
        v_addr = ((uint32_t)(((v_norm >> 13u) & 1048575u)));
86371
        v_addr |= (((uint32_t)(((v_norm >> 36u) & 1u))) << 20u);
86372
        v_addr <<= 4u;
86373
        v_addr -= v_p;
86374
        v_addr >>= 4u;
86375
        v_norm &= 18446743996400148479u;
86376
        v_norm |= (((uint64_t)((v_addr & 1048575u))) << 13u);
86377
        v_norm |= (((uint64_t)((v_addr & 1048576u))) << 16u);
86378
        v_x &= ((((uint64_t)(1u)) << v_bit_res) - 1u);
86379
        v_x |= ((uint64_t)(v_norm << v_bit_res));
86380
        v_j = 0u;
86381
        while (v_j < 6u) {
86382
          v_s.ptr[(v_j + v_byte_pos)] = ((uint8_t)((v_x >> (8u * v_j))));
86383
          v_j += 1u;
86384
        }
86385
      } while (0);
86386
      if (v_slot >= 2u) {
86387
        break;
86388
      }
86389
      v_slot += 1u;
86390
    }
86391
    v_p += 16u;
86392
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 16u);
86393
  }
86394
  self->private_impl.f_bcj_pos = v_p;
86395
  return ((uint8_t)(((uint64_t)(v_s.len))));
86396
}
86397
86398
// -------- func xz.decoder.apply_filter_07_arm
86399
86400
WUFFS_BASE__GENERATED_C_CODE
86401
static uint8_t
86402
wuffs_xz__decoder__apply_filter_07_arm(
86403
    wuffs_xz__decoder* self,
86404
    wuffs_base__slice_u8 a_dst_slice) {
86405
  wuffs_base__slice_u8 v_s = {0};
86406
  uint32_t v_p = 0;
86407
  uint32_t v_x = 0;
86408
86409
  v_s = a_dst_slice;
86410
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 8u));
86411
  while (((uint64_t)(v_s.len)) >= 4u) {
86412
    if (v_s.ptr[3u] == 235u) {
86413
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
86414
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
86415
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
86416
          (((uint32_t)(v_s.ptr[3u])) << 24u));
86417
      v_x = (((uint32_t)(((v_x & 16777215u) << 2u) - v_p)) >> 2u);
86418
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
86419
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
86420
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
86421
    }
86422
    v_p += 4u;
86423
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86424
  }
86425
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 8u));
86426
  return ((uint8_t)(((uint64_t)(v_s.len))));
86427
}
86428
86429
// -------- func xz.decoder.apply_filter_08_armthumb
86430
86431
WUFFS_BASE__GENERATED_C_CODE
86432
static uint8_t
86433
wuffs_xz__decoder__apply_filter_08_armthumb(
86434
    wuffs_xz__decoder* self,
86435
    wuffs_base__slice_u8 a_dst_slice) {
86436
  wuffs_base__slice_u8 v_s = {0};
86437
  uint32_t v_p = 0;
86438
  uint32_t v_x = 0;
86439
  uint32_t v_y = 0;
86440
86441
  v_s = a_dst_slice;
86442
  v_p = ((uint32_t)(self->private_impl.f_bcj_pos + 4u));
86443
  while (((uint64_t)(v_s.len)) >= 4u) {
86444
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
86445
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
86446
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
86447
        (((uint32_t)(v_s.ptr[3u])) << 24u));
86448
    if ((v_x & 4160813056u) != 4160811008u) {
86449
      v_p += 2u;
86450
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
86451
      continue;
86452
    }
86453
    v_y = ((((uint32_t)(((uint8_t)(v_s.ptr[0u] & 255u)))) << 11u) |
86454
        (((uint32_t)(((uint8_t)(v_s.ptr[1u] & 7u)))) << 19u) |
86455
        (((uint32_t)(((uint8_t)(v_s.ptr[2u] & 255u)))) << 0u) |
86456
        (((uint32_t)(((uint8_t)(v_s.ptr[3u] & 7u)))) << 8u));
86457
    v_y = (((uint32_t)(((uint32_t)(v_y << 1u)) - v_p)) >> 1u);
86458
    v_s.ptr[0u] = ((uint8_t)((v_y >> 11u)));
86459
    v_s.ptr[1u] = ((uint8_t)((((v_y >> 19u) & 7u) | 240u)));
86460
    v_s.ptr[2u] = ((uint8_t)((v_y >> 0u)));
86461
    v_s.ptr[3u] = ((uint8_t)((((v_y >> 8u) & 7u) | 248u)));
86462
    v_p += 4u;
86463
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86464
  }
86465
  self->private_impl.f_bcj_pos = ((uint32_t)(v_p - 4u));
86466
  return ((uint8_t)(((uint64_t)(v_s.len))));
86467
}
86468
86469
// -------- func xz.decoder.apply_filter_09_sparc
86470
86471
WUFFS_BASE__GENERATED_C_CODE
86472
static uint8_t
86473
wuffs_xz__decoder__apply_filter_09_sparc(
86474
    wuffs_xz__decoder* self,
86475
    wuffs_base__slice_u8 a_dst_slice) {
86476
  wuffs_base__slice_u8 v_s = {0};
86477
  uint32_t v_p = 0;
86478
  uint32_t v_x = 0;
86479
86480
  v_s = a_dst_slice;
86481
  v_p = self->private_impl.f_bcj_pos;
86482
  while (((uint64_t)(v_s.len)) >= 4u) {
86483
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 24u) |
86484
        (((uint32_t)(v_s.ptr[1u])) << 16u) |
86485
        (((uint32_t)(v_s.ptr[2u])) << 8u) |
86486
        (((uint32_t)(v_s.ptr[3u])) << 0u));
86487
    if (((v_x >> 22u) == 256u) || ((v_x >> 22u) == 511u)) {
86488
      v_x = (((uint32_t)(((uint32_t)(v_x << 2u)) - v_p)) >> 2u);
86489
      v_x = ((1073741824u - (v_x & 4194304u)) | 1073741824u | (v_x & 4194303u));
86490
      v_s.ptr[0u] = ((uint8_t)((v_x >> 24u)));
86491
      v_s.ptr[1u] = ((uint8_t)((v_x >> 16u)));
86492
      v_s.ptr[2u] = ((uint8_t)((v_x >> 8u)));
86493
      v_s.ptr[3u] = ((uint8_t)((v_x >> 0u)));
86494
    }
86495
    v_p += 4u;
86496
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86497
  }
86498
  self->private_impl.f_bcj_pos = v_p;
86499
  return ((uint8_t)(((uint64_t)(v_s.len))));
86500
}
86501
86502
// -------- func xz.decoder.apply_filter_0a_arm64
86503
86504
WUFFS_BASE__GENERATED_C_CODE
86505
static uint8_t
86506
wuffs_xz__decoder__apply_filter_0a_arm64(
86507
    wuffs_xz__decoder* self,
86508
    wuffs_base__slice_u8 a_dst_slice) {
86509
  wuffs_base__slice_u8 v_s = {0};
86510
  uint32_t v_p = 0;
86511
  uint32_t v_x = 0;
86512
  uint32_t v_y = 0;
86513
86514
  v_s = a_dst_slice;
86515
  v_p = self->private_impl.f_bcj_pos;
86516
  while (((uint64_t)(v_s.len)) >= 4u) {
86517
    v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
86518
        (((uint32_t)(v_s.ptr[1u])) << 8u) |
86519
        (((uint32_t)(v_s.ptr[2u])) << 16u) |
86520
        (((uint32_t)(v_s.ptr[3u])) << 24u));
86521
    if ((v_x >> 26u) == 37u) {
86522
      v_y = ((uint32_t)(v_x - (v_p >> 2u)));
86523
      v_x = (2483027968u | (v_y & 67108863u));
86524
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
86525
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
86526
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
86527
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
86528
    } else if ((v_x & 2667577344u) == 2415919104u) {
86529
      v_y = (((v_x >> 29u) & 3u) | ((v_x >> 3u) & 2097148u));
86530
      if ((((uint32_t)(v_y + 131072u)) & 1835008u) == 0u) {
86531
        v_y -= (v_p >> 12u);
86532
        v_x &= 2415919135u;
86533
        v_x |= ((v_y & 3u) << 29u);
86534
        v_x |= ((v_y & 262140u) << 3u);
86535
        v_x |= (((uint32_t)(0u - (v_y & 131072u))) & 14680064u);
86536
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
86537
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
86538
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
86539
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
86540
      }
86541
    }
86542
    v_p += 4u;
86543
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86544
  }
86545
  self->private_impl.f_bcj_pos = v_p;
86546
  return ((uint8_t)(((uint64_t)(v_s.len))));
86547
}
86548
86549
// -------- func xz.decoder.apply_filter_0b_riscv
86550
86551
WUFFS_BASE__GENERATED_C_CODE
86552
static uint8_t
86553
wuffs_xz__decoder__apply_filter_0b_riscv(
86554
    wuffs_xz__decoder* self,
86555
    wuffs_base__slice_u8 a_dst_slice) {
86556
  wuffs_base__slice_u8 v_s = {0};
86557
  uint32_t v_p = 0;
86558
  uint32_t v_x = 0;
86559
  uint32_t v_x27 = 0;
86560
  uint32_t v_y = 0;
86561
  uint32_t v_addr = 0;
86562
86563
  v_s = a_dst_slice;
86564
  v_p = self->private_impl.f_bcj_pos;
86565
  while (((uint64_t)(v_s.len)) >= 8u) {
86566
    if (v_s.ptr[0u] == 239u) {
86567
      if (((uint8_t)(v_s.ptr[1u] & 13u)) != 0u) {
86568
        v_p += 2u;
86569
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
86570
        continue;
86571
      }
86572
      v_addr = ((((uint32_t)(((uint8_t)(v_s.ptr[1u] & 240u)))) << 13u) | (((uint32_t)(v_s.ptr[2u])) << 9u) | (((uint32_t)(v_s.ptr[3u])) << 1u));
86573
      v_addr -= v_p;
86574
      v_s.ptr[1u] = ((uint8_t)(((uint8_t)(v_s.ptr[1u] & 15u)) | ((uint8_t)(((v_addr >> 8u) & 240u)))));
86575
      v_s.ptr[2u] = ((uint8_t)((((v_addr >> 16u) & 15u) | ((v_addr >> 7u) & 16u) | (((uint32_t)(v_addr << 4u)) & 224u))));
86576
      v_s.ptr[3u] = ((uint8_t)((((v_addr >> 4u) & 127u) | ((v_addr >> 13u) & 128u))));
86577
      v_p += 4u;
86578
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86579
      continue;
86580
    } else if (((uint8_t)(v_s.ptr[0u] & 127u)) == 23u) {
86581
      v_x = ((((uint32_t)(v_s.ptr[0u])) << 0u) |
86582
          (((uint32_t)(v_s.ptr[1u])) << 8u) |
86583
          (((uint32_t)(v_s.ptr[2u])) << 16u) |
86584
          (((uint32_t)(v_s.ptr[3u])) << 24u));
86585
      if ((v_x & 3712u) != 0u) {
86586
        v_y = ((((uint32_t)(v_s.ptr[4u])) << 0u) |
86587
            (((uint32_t)(v_s.ptr[5u])) << 8u) |
86588
            (((uint32_t)(v_s.ptr[6u])) << 16u) |
86589
            (((uint32_t)(v_s.ptr[7u])) << 24u));
86590
        if (((((uint32_t)(v_x << 8u)) ^ ((uint32_t)(v_y - 3u))) & 1015811u) != 0u) {
86591
          v_p += 6u;
86592
          v_s = wuffs_base__slice_u8__subslice_i(v_s, 6u);
86593
          continue;
86594
        }
86595
        v_addr = ((v_x & 4294963200u) | (v_y >> 20u));
86596
        v_x = (279u | ((uint32_t)(v_y << 12u)));
86597
        v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
86598
        v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
86599
        v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
86600
        v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
86601
        v_s.ptr[4u] = ((uint8_t)((v_addr >> 0u)));
86602
        v_s.ptr[5u] = ((uint8_t)((v_addr >> 8u)));
86603
        v_s.ptr[6u] = ((uint8_t)((v_addr >> 16u)));
86604
        v_s.ptr[7u] = ((uint8_t)((v_addr >> 24u)));
86605
        v_p += 8u;
86606
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
86607
        continue;
86608
      }
86609
      v_x27 = (v_x >> 27u);
86610
      if (((uint32_t)(((uint32_t)(v_x - 12567u)) << 18u)) >= (v_x27 & 29u)) {
86611
        v_p += 4u;
86612
        v_s = wuffs_base__slice_u8__subslice_i(v_s, 4u);
86613
        continue;
86614
      }
86615
      v_addr = ((((uint32_t)(v_s.ptr[4u])) << 24u) |
86616
          (((uint32_t)(v_s.ptr[5u])) << 16u) |
86617
          (((uint32_t)(v_s.ptr[6u])) << 8u) |
86618
          (((uint32_t)(v_s.ptr[7u])) << 0u));
86619
      v_addr -= v_p;
86620
      v_y = ((v_x >> 12u) | ((uint32_t)(v_addr << 20u)));
86621
      v_x = (23u | (v_x27 << 7u) | (((uint32_t)(v_addr + 2048u)) & 4294963200u));
86622
      v_s.ptr[0u] = ((uint8_t)((v_x >> 0u)));
86623
      v_s.ptr[1u] = ((uint8_t)((v_x >> 8u)));
86624
      v_s.ptr[2u] = ((uint8_t)((v_x >> 16u)));
86625
      v_s.ptr[3u] = ((uint8_t)((v_x >> 24u)));
86626
      v_s.ptr[4u] = ((uint8_t)((v_y >> 0u)));
86627
      v_s.ptr[5u] = ((uint8_t)((v_y >> 8u)));
86628
      v_s.ptr[6u] = ((uint8_t)((v_y >> 16u)));
86629
      v_s.ptr[7u] = ((uint8_t)((v_y >> 24u)));
86630
      v_p += 8u;
86631
      v_s = wuffs_base__slice_u8__subslice_i(v_s, 8u);
86632
      continue;
86633
    }
86634
    v_p += 2u;
86635
    v_s = wuffs_base__slice_u8__subslice_i(v_s, 2u);
86636
  }
86637
  self->private_impl.f_bcj_pos = v_p;
86638
  return ((uint8_t)(((uint64_t)(v_s.len))));
86639
}
86640
86641
// -------- func xz.decoder.get_quirk
86642
86643
WUFFS_BASE__GENERATED_C_CODE
86644
WUFFS_BASE__MAYBE_STATIC uint64_t
86645
wuffs_xz__decoder__get_quirk(
86646
    const wuffs_xz__decoder* self,
86647
    uint32_t a_key) {
86648
  if (!self) {
86649
    return 0;
86650
  }
86651
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86652
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86653
    return 0;
86654
  }
86655
86656
  if (a_key == 1u) {
86657
    if (self->private_impl.f_ignore_checksum) {
86658
      return 1u;
86659
    }
86660
  } else if (a_key == 1963655168u) {
86661
    if (self->private_impl.f_standalone_format) {
86662
      return 1u;
86663
    }
86664
  }
86665
  return 0u;
86666
}
86667
86668
// -------- func xz.decoder.set_quirk
86669
86670
WUFFS_BASE__GENERATED_C_CODE
86671
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86672
wuffs_xz__decoder__set_quirk(
86673
    wuffs_xz__decoder* self,
86674
    uint32_t a_key,
86675
    uint64_t a_value) {
86676
  if (!self) {
86677
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86678
  }
86679
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86680
    return wuffs_base__make_status(
86681
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86682
        ? wuffs_base__error__disabled_by_previous_error
86683
        : wuffs_base__error__initialize_not_called);
86684
  }
86685
86686
  if (a_key == 1u) {
86687
    self->private_impl.f_ignore_checksum = (a_value > 0u);
86688
    return wuffs_base__make_status(NULL);
86689
  } else if (a_key == 1963655168u) {
86690
    self->private_impl.f_standalone_format = (a_value > 0u);
86691
    return wuffs_base__make_status(NULL);
86692
  }
86693
  return wuffs_base__make_status(wuffs_base__error__unsupported_option);
86694
}
86695
86696
// -------- func xz.decoder.dst_history_retain_length
86697
86698
WUFFS_BASE__GENERATED_C_CODE
86699
WUFFS_BASE__MAYBE_STATIC wuffs_base__optional_u63
86700
wuffs_xz__decoder__dst_history_retain_length(
86701
    const wuffs_xz__decoder* self) {
86702
  if (!self) {
86703
    return wuffs_base__utility__make_optional_u63(false, 0u);
86704
  }
86705
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86706
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86707
    return wuffs_base__utility__make_optional_u63(false, 0u);
86708
  }
86709
86710
  return wuffs_lzma__decoder__dst_history_retain_length(&self->private_data.f_lzma);
86711
}
86712
86713
// -------- func xz.decoder.workbuf_len
86714
86715
WUFFS_BASE__GENERATED_C_CODE
86716
WUFFS_BASE__MAYBE_STATIC wuffs_base__range_ii_u64
86717
wuffs_xz__decoder__workbuf_len(
86718
    const wuffs_xz__decoder* self) {
86719
  if (!self) {
86720
    return wuffs_base__utility__empty_range_ii_u64();
86721
  }
86722
  if ((self->private_impl.magic != WUFFS_BASE__MAGIC) &&
86723
      (self->private_impl.magic != WUFFS_BASE__DISABLED)) {
86724
    return wuffs_base__utility__empty_range_ii_u64();
86725
  }
86726
86727
  return wuffs_lzma__decoder__workbuf_len(&self->private_data.f_lzma);
86728
}
86729
86730
// -------- func xz.decoder.transform_io
86731
86732
WUFFS_BASE__GENERATED_C_CODE
86733
WUFFS_BASE__MAYBE_STATIC wuffs_base__status
86734
wuffs_xz__decoder__transform_io(
86735
    wuffs_xz__decoder* self,
86736
    wuffs_base__io_buffer* a_dst,
86737
    wuffs_base__io_buffer* a_src,
86738
    wuffs_base__slice_u8 a_workbuf) {
86739
  if (!self) {
86740
    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
86741
  }
86742
  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
86743
    return wuffs_base__make_status(
86744
        (self->private_impl.magic == WUFFS_BASE__DISABLED)
86745
        ? wuffs_base__error__disabled_by_previous_error
86746
        : wuffs_base__error__initialize_not_called);
86747
  }
86748
  if (!a_dst || !a_src) {
86749
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86750
    return wuffs_base__make_status(wuffs_base__error__bad_argument);
86751
  }
86752
  if ((self->private_impl.active_coroutine != 0) &&
86753
      (self->private_impl.active_coroutine != 1)) {
86754
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86755
    return wuffs_base__make_status(wuffs_base__error__interleaved_coroutine_calls);
86756
  }
86757
  self->private_impl.active_coroutine = 0;
86758
  wuffs_base__status status = wuffs_base__make_status(NULL);
86759
86760
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
86761
86762
  uint32_t coro_susp_point = self->private_impl.p_transform_io;
86763
  switch (coro_susp_point) {
86764
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
86765
86766
    while (true) {
86767
      {
86768
        wuffs_base__status t_0 = wuffs_xz__decoder__do_transform_io(self, a_dst, a_src, a_workbuf);
86769
        v_status = t_0;
86770
      }
86771
      if ((v_status.repr == wuffs_base__suspension__short_read) && (a_src && a_src->meta.closed)) {
86772
        status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
86773
        goto exit;
86774
      }
86775
      status = v_status;
86776
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(1);
86777
    }
86778
86779
    ok:
86780
    self->private_impl.p_transform_io = 0;
86781
    goto exit;
86782
  }
86783
86784
  goto suspend;
86785
  suspend:
86786
  self->private_impl.p_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
86787
  self->private_impl.active_coroutine = wuffs_base__status__is_suspension(&status) ? 1 : 0;
86788
86789
  goto exit;
86790
  exit:
86791
  if (wuffs_base__status__is_error(&status)) {
86792
    self->private_impl.magic = WUFFS_BASE__DISABLED;
86793
  }
86794
  return status;
86795
}
86796
86797
// -------- func xz.decoder.do_transform_io
86798
86799
WUFFS_BASE__GENERATED_C_CODE
86800
static wuffs_base__status
86801
wuffs_xz__decoder__do_transform_io(
86802
    wuffs_xz__decoder* self,
86803
    wuffs_base__io_buffer* a_dst,
86804
    wuffs_base__io_buffer* a_src,
86805
    wuffs_base__slice_u8 a_workbuf) {
86806
  wuffs_base__status status = wuffs_base__make_status(NULL);
86807
86808
  uint64_t v_header_magic = 0;
86809
  uint64_t v_dmark = 0;
86810
  uint64_t v_smark = 0;
86811
  uint8_t v_i8 = 0;
86812
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
86813
  uint32_t v_checksum32_have = 0;
86814
  uint32_t v_checksum32_want = 0;
86815
  uint64_t v_checksum64_have = 0;
86816
  uint64_t v_checksum64_want = 0;
86817
  wuffs_base__bitvec256 v_checksum256_have = {0};
86818
  uint64_t v_compressed_size = 0;
86819
  uint64_t v_uncompressed_size = 0;
86820
  uint32_t v_hash = 0;
86821
  uint8_t v_c8 = 0;
86822
  uint32_t v_c32 = 0;
86823
  uint16_t v_footer_magic = 0;
86824
86825
  uint8_t* iop_a_dst = NULL;
86826
  uint8_t* io0_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86827
  uint8_t* io1_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86828
  uint8_t* io2_a_dst WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86829
  if (a_dst && a_dst->data.ptr) {
86830
    io0_a_dst = a_dst->data.ptr;
86831
    io1_a_dst = io0_a_dst + a_dst->meta.wi;
86832
    iop_a_dst = io1_a_dst;
86833
    io2_a_dst = io0_a_dst + a_dst->data.len;
86834
    if (a_dst->meta.closed) {
86835
      io2_a_dst = iop_a_dst;
86836
    }
86837
  }
86838
  const uint8_t* iop_a_src = NULL;
86839
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86840
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86841
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
86842
  if (a_src && a_src->data.ptr) {
86843
    io0_a_src = a_src->data.ptr;
86844
    io1_a_src = io0_a_src + a_src->meta.ri;
86845
    iop_a_src = io1_a_src;
86846
    io2_a_src = io0_a_src + a_src->meta.wi;
86847
  }
86848
86849
  uint32_t coro_susp_point = self->private_impl.p_do_transform_io;
86850
  if (coro_susp_point) {
86851
    v_checksum32_have = self->private_data.s_do_transform_io.v_checksum32_have;
86852
    v_checksum32_want = self->private_data.s_do_transform_io.v_checksum32_want;
86853
    v_checksum256_have = self->private_data.s_do_transform_io.v_checksum256_have;
86854
    v_compressed_size = self->private_data.s_do_transform_io.v_compressed_size;
86855
    v_uncompressed_size = self->private_data.s_do_transform_io.v_uncompressed_size;
86856
  }
86857
  switch (coro_susp_point) {
86858
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
86859
86860
    while (true) {
86861
      {
86862
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
86863
        uint64_t t_0;
86864
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
86865
          t_0 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
86866
          iop_a_src += 6;
86867
        } else {
86868
          self->private_data.s_do_transform_io.scratch = 0;
86869
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
86870
          while (true) {
86871
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
86872
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
86873
              goto suspend;
86874
            }
86875
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
86876
            uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
86877
            *scratch <<= 8;
86878
            *scratch >>= 8;
86879
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
86880
            if (num_bits_0 == 40) {
86881
              t_0 = ((uint64_t)(*scratch));
86882
              break;
86883
            }
86884
            num_bits_0 += 8u;
86885
            *scratch |= ((uint64_t)(num_bits_0)) << 56;
86886
          }
86887
        }
86888
        v_header_magic = t_0;
86889
      }
86890
      if (v_header_magic != 388031461373u) {
86891
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
86892
        goto exit;
86893
      }
86894
      {
86895
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
86896
        uint64_t t_1;
86897
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 6)) {
86898
          t_1 = ((uint64_t)(wuffs_base__peek_u48le__no_bounds_check(iop_a_src)));
86899
          iop_a_src += 6;
86900
        } else {
86901
          self->private_data.s_do_transform_io.scratch = 0;
86902
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
86903
          while (true) {
86904
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
86905
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
86906
              goto suspend;
86907
            }
86908
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
86909
            uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
86910
            *scratch <<= 8;
86911
            *scratch >>= 8;
86912
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
86913
            if (num_bits_1 == 40) {
86914
              t_1 = ((uint64_t)(*scratch));
86915
              break;
86916
            }
86917
            num_bits_1 += 8u;
86918
            *scratch |= ((uint64_t)(num_bits_1)) << 56;
86919
          }
86920
        }
86921
        v_header_magic = t_1;
86922
      }
86923
      if (v_header_magic == 72400582410240u) {
86924
        self->private_impl.f_checksummer = 0u;
86925
      } else if (v_header_magic == 60327687946496u) {
86926
        self->private_impl.f_checksummer = 1u;
86927
      } else if (v_header_magic == 77742513456128u) {
86928
        self->private_impl.f_checksummer = 2u;
86929
      } else if (v_header_magic == 177077137508864u) {
86930
        self->private_impl.f_checksummer = 3u;
86931
      } else if ((v_header_magic & 61695u) != 0u) {
86932
        status = wuffs_base__make_status(wuffs_xz__error__bad_header);
86933
        goto exit;
86934
      } else {
86935
        v_header_magic = (15u & (v_header_magic >> 8u));
86936
        if ((v_header_magic != 0u) &&
86937
            (v_header_magic != 1u) &&
86938
            (v_header_magic != 4u) &&
86939
            (v_header_magic != 10u)) {
86940
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_checksum_algorithm);
86941
          goto exit;
86942
        }
86943
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
86944
        goto exit;
86945
      }
86946
      self->private_impl.f_flags = ((uint16_t)(v_header_magic));
86947
      self->private_impl.f_num_actual_blocks = 0u;
86948
      while (true) {
86949
        if (((uint64_t)(io2_a_src - iop_a_src)) <= 0u) {
86950
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
86951
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(5);
86952
          continue;
86953
        } else if (wuffs_base__peek_u8be__no_bounds_check(iop_a_src) == 0u) {
86954
          break;
86955
        }
86956
        self->private_impl.f_num_actual_blocks += 1u;
86957
        if ( ! self->private_impl.f_ignore_checksum) {
86958
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
86959
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
86960
        }
86961
        self->private_impl.f_compressed_size_for_index = 4u;
86962
        while (true) {
86963
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
86964
          {
86965
            if (a_src) {
86966
              a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
86967
            }
86968
            wuffs_base__status t_2 = wuffs_xz__decoder__decode_block_header_with_padding(self, a_src);
86969
            v_status = t_2;
86970
            if (a_src) {
86971
              iop_a_src = a_src->data.ptr + a_src->meta.ri;
86972
            }
86973
          }
86974
          wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))));
86975
          if ( ! self->private_impl.f_ignore_checksum) {
86976
            v_checksum32_have = wuffs_crc32__ieee_hasher__update_u32(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
86977
          }
86978
          if (wuffs_base__status__is_ok(&v_status)) {
86979
            break;
86980
          }
86981
          status = v_status;
86982
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(6);
86983
        }
86984
        {
86985
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
86986
          uint32_t t_3;
86987
          if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
86988
            t_3 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
86989
            iop_a_src += 4;
86990
          } else {
86991
            self->private_data.s_do_transform_io.scratch = 0;
86992
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
86993
            while (true) {
86994
              if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
86995
                status = wuffs_base__make_status(wuffs_base__suspension__short_read);
86996
                goto suspend;
86997
              }
86998
              uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
86999
              uint32_t num_bits_3 = ((uint32_t)(*scratch >> 56));
87000
              *scratch <<= 8;
87001
              *scratch >>= 8;
87002
              *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_3;
87003
              if (num_bits_3 == 24) {
87004
                t_3 = ((uint32_t)(*scratch));
87005
                break;
87006
              }
87007
              num_bits_3 += 8u;
87008
              *scratch |= ((uint64_t)(num_bits_3)) << 56;
87009
            }
87010
          }
87011
          v_checksum32_want = t_3;
87012
        }
87013
        if (self->private_impl.f_ignore_checksum) {
87014
        } else if (v_checksum32_have != v_checksum32_want) {
87015
          status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87016
          goto exit;
87017
        } else {
87018
          wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
87019
              sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87020
          wuffs_private_impl__ignore_status(wuffs_crc64__ecma_hasher__initialize(&self->private_data.f_crc64,
87021
              sizeof (wuffs_crc64__ecma_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87022
          wuffs_private_impl__ignore_status(wuffs_sha256__hasher__initialize(&self->private_data.f_sha256,
87023
              sizeof (wuffs_sha256__hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87024
        }
87025
        v_compressed_size = 0u;
87026
        v_uncompressed_size = 0u;
87027
        while (true) {
87028
          if (((uint64_t)(self->private_impl.f_bcj_undo_index)) > ((uint64_t)(io2_a_dst - iop_a_dst))) {
87029
            status = wuffs_base__make_status(wuffs_base__suspension__short_write);
87030
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(9);
87031
            continue;
87032
          }
87033
          v_dmark = ((uint64_t)(iop_a_dst - io0_a_dst));
87034
          v_smark = ((uint64_t)(iop_a_src - io0_a_src));
87035
          if (self->private_impl.f_num_non_final_filters == 0u) {
87036
            {
87037
              if (a_dst) {
87038
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
87039
              }
87040
              if (a_src) {
87041
                a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87042
              }
87043
              wuffs_base__status t_4 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
87044
              v_status = t_4;
87045
              if (a_dst) {
87046
                iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
87047
              }
87048
              if (a_src) {
87049
                iop_a_src = a_src->data.ptr + a_src->meta.ri;
87050
              }
87051
            }
87052
          } else {
87053
            if (self->private_impl.f_bcj_undo_index > 0u) {
87054
              wuffs_private_impl__io_writer__copy_from_slice(&iop_a_dst, io2_a_dst,wuffs_base__make_slice_u8(self->private_data.f_filter_data[0u], self->private_impl.f_bcj_undo_index));
87055
              self->private_impl.f_bcj_undo_index = 0u;
87056
            }
87057
            {
87058
              uint8_t* o_0_io0_a_dst = io0_a_dst;
87059
              uint8_t* o_0_io1_a_dst = io1_a_dst;
87060
              io0_a_dst = iop_a_dst;
87061
              io1_a_dst = iop_a_dst;
87062
              wuffs_base__io_buffer o_0_a_dst;
87063
              if (a_dst) {
87064
                memcpy(&o_0_a_dst, a_dst, sizeof(*a_dst));
87065
                size_t wi0 = a_dst->meta.wi;
87066
                a_dst->data.ptr += wi0;
87067
                a_dst->data.len -= wi0;
87068
                a_dst->meta.ri = 0;
87069
                a_dst->meta.wi = 0;
87070
                a_dst->meta.pos = wuffs_base__u64__sat_add(a_dst->meta.pos, wi0);
87071
              }
87072
              {
87073
                if (a_dst) {
87074
                  a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
87075
                }
87076
                if (a_src) {
87077
                  a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87078
                }
87079
                wuffs_base__status t_5 = wuffs_lzma__decoder__transform_io(&self->private_data.f_lzma, a_dst, a_src, a_workbuf);
87080
                v_status = t_5;
87081
                if (a_dst) {
87082
                  iop_a_dst = a_dst->data.ptr + a_dst->meta.wi;
87083
                }
87084
                if (a_src) {
87085
                  iop_a_src = a_src->data.ptr + a_src->meta.ri;
87086
                }
87087
              }
87088
              if (a_dst) {
87089
                memcpy(a_dst, &o_0_a_dst, sizeof(*a_dst));
87090
                a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
87091
                io0_a_dst = o_0_io0_a_dst;
87092
                io1_a_dst = o_0_io1_a_dst;
87093
              }
87094
            }
87095
            self->private_impl.f_bcj_undo_index = wuffs_xz__decoder__apply_non_final_filters(self, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
87096
            if ((self->private_impl.f_bcj_undo_index > 0u) &&  ! wuffs_base__status__is_ok(&v_status)) {
87097
              v_i8 = ((uint8_t)(self->private_impl.f_bcj_undo_index - 1u));
87098
              while (true) {
87099
                if ( ! (iop_a_dst > io1_a_dst)) {
87100
                  status = wuffs_base__make_status(wuffs_xz__error__internal_error_inconsistent_bcj_filter_state);
87101
                  goto exit;
87102
                }
87103
                self->private_data.f_filter_data[0u][v_i8] = iop_a_dst[-1];
87104
                iop_a_dst--;
87105
                if (v_i8 <= 0u) {
87106
                  break;
87107
                }
87108
#if defined(__GNUC__)
87109
#pragma GCC diagnostic push
87110
#pragma GCC diagnostic ignored "-Wconversion"
87111
#endif
87112
                v_i8 -= 1u;
87113
#if defined(__GNUC__)
87114
#pragma GCC diagnostic pop
87115
#endif
87116
              }
87117
            }
87118
          }
87119
          v_compressed_size += wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)));
87120
          v_uncompressed_size += wuffs_private_impl__io__count_since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)));
87121
          if (self->private_impl.f_ignore_checksum) {
87122
          } else if (self->private_impl.f_checksummer == 1u) {
87123
            wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
87124
          } else if (self->private_impl.f_checksummer == 2u) {
87125
            wuffs_crc64__ecma_hasher__update(&self->private_data.f_crc64, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
87126
          } else if (self->private_impl.f_checksummer == 3u) {
87127
            wuffs_sha256__hasher__update(&self->private_data.f_sha256, wuffs_private_impl__io__since(v_dmark, ((uint64_t)(iop_a_dst - io0_a_dst)), io0_a_dst));
87128
          }
87129
          if (wuffs_base__status__is_ok(&v_status)) {
87130
            break;
87131
          }
87132
          status = v_status;
87133
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(10);
87134
        }
87135
        if ((self->private_impl.f_block_has_compressed_size && (self->private_impl.f_block_compressed_size != v_compressed_size)) || (self->private_impl.f_block_has_uncompressed_size && (self->private_impl.f_block_uncompressed_size != v_uncompressed_size))) {
87136
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87137
          goto exit;
87138
        }
87139
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, v_compressed_size);
87140
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_compressed_size_for_index, ((uint64_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer])));
87141
        self->private_impl.f_verification_have_total_sizes[0u] += self->private_impl.f_compressed_size_for_index;
87142
        v_hash = ((uint32_t)((self->private_impl.f_compressed_size_for_index ^ (self->private_impl.f_compressed_size_for_index >> 32u))));
87143
        v_hash *= 3432918353u;
87144
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
87145
        v_hash *= 461845907u;
87146
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[0u];
87147
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
87148
        self->private_impl.f_verification_have_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
87149
        self->private_impl.f_verification_have_total_sizes[1u] += v_uncompressed_size;
87150
        v_hash = ((uint32_t)((v_uncompressed_size ^ (v_uncompressed_size >> 32u))));
87151
        v_hash *= 3432918353u;
87152
        v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
87153
        v_hash *= 461845907u;
87154
        v_hash ^= self->private_impl.f_verification_have_hashed_sizes[1u];
87155
        v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
87156
        self->private_impl.f_verification_have_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
87157
        while ((v_compressed_size & 3u) != 0u) {
87158
          {
87159
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
87160
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87161
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87162
              goto suspend;
87163
            }
87164
            uint8_t t_6 = *iop_a_src++;
87165
            v_c8 = t_6;
87166
          }
87167
          if (v_c8 != 0u) {
87168
            status = wuffs_base__make_status(wuffs_xz__error__bad_padding);
87169
            goto exit;
87170
          }
87171
          v_compressed_size += 1u;
87172
        }
87173
        self->private_impl.f_lzma_needs_reset = true;
87174
        if (self->private_impl.f_ignore_checksum) {
87175
          self->private_data.s_do_transform_io.scratch = ((uint32_t)(WUFFS_XZ__CHECKSUM_LENGTH[self->private_impl.f_checksummer]));
87176
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
87177
          if (self->private_data.s_do_transform_io.scratch > ((uint64_t)(io2_a_src - iop_a_src))) {
87178
            self->private_data.s_do_transform_io.scratch -= ((uint64_t)(io2_a_src - iop_a_src));
87179
            iop_a_src = io2_a_src;
87180
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87181
            goto suspend;
87182
          }
87183
          iop_a_src += self->private_data.s_do_transform_io.scratch;
87184
        } else if (self->private_impl.f_checksummer == 1u) {
87185
          {
87186
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(13);
87187
            uint32_t t_7;
87188
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
87189
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
87190
              iop_a_src += 4;
87191
            } else {
87192
              self->private_data.s_do_transform_io.scratch = 0;
87193
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(14);
87194
              while (true) {
87195
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87196
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87197
                  goto suspend;
87198
                }
87199
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87200
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
87201
                *scratch <<= 8;
87202
                *scratch >>= 8;
87203
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
87204
                if (num_bits_7 == 24) {
87205
                  t_7 = ((uint32_t)(*scratch));
87206
                  break;
87207
                }
87208
                num_bits_7 += 8u;
87209
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
87210
              }
87211
            }
87212
            v_checksum32_want = t_7;
87213
          }
87214
          v_checksum32_have = wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32);
87215
          if (v_checksum32_have != v_checksum32_want) {
87216
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87217
            goto exit;
87218
          }
87219
        } else if (self->private_impl.f_checksummer == 2u) {
87220
          {
87221
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(15);
87222
            uint64_t t_8;
87223
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
87224
              t_8 = wuffs_base__peek_u64le__no_bounds_check(iop_a_src);
87225
              iop_a_src += 8;
87226
            } else {
87227
              self->private_data.s_do_transform_io.scratch = 0;
87228
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(16);
87229
              while (true) {
87230
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87231
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87232
                  goto suspend;
87233
                }
87234
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87235
                uint32_t num_bits_8 = ((uint32_t)(*scratch >> 56));
87236
                *scratch <<= 8;
87237
                *scratch >>= 8;
87238
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_8;
87239
                if (num_bits_8 == 56) {
87240
                  t_8 = ((uint64_t)(*scratch));
87241
                  break;
87242
                }
87243
                num_bits_8 += 8u;
87244
                *scratch |= ((uint64_t)(num_bits_8)) << 56;
87245
              }
87246
            }
87247
            v_checksum64_want = t_8;
87248
          }
87249
          v_checksum64_have = wuffs_crc64__ecma_hasher__checksum_u64(&self->private_data.f_crc64);
87250
          if (v_checksum64_have != v_checksum64_want) {
87251
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87252
            goto exit;
87253
          }
87254
        } else if (self->private_impl.f_checksummer == 3u) {
87255
          v_checksum256_have = wuffs_sha256__hasher__checksum_bitvec256(&self->private_data.f_sha256);
87256
          {
87257
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(17);
87258
            uint64_t t_9;
87259
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
87260
              t_9 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
87261
              iop_a_src += 8;
87262
            } else {
87263
              self->private_data.s_do_transform_io.scratch = 0;
87264
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(18);
87265
              while (true) {
87266
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87267
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87268
                  goto suspend;
87269
                }
87270
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87271
                uint32_t num_bits_9 = ((uint32_t)(*scratch & 0xFFu));
87272
                *scratch >>= 8;
87273
                *scratch <<= 8;
87274
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_9);
87275
                if (num_bits_9 == 56) {
87276
                  t_9 = ((uint64_t)(*scratch >> 0));
87277
                  break;
87278
                }
87279
                num_bits_9 += 8u;
87280
                *scratch |= ((uint64_t)(num_bits_9));
87281
              }
87282
            }
87283
            v_checksum64_want = t_9;
87284
          }
87285
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 3u) != v_checksum64_want) {
87286
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87287
            goto exit;
87288
          }
87289
          {
87290
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(19);
87291
            uint64_t t_10;
87292
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
87293
              t_10 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
87294
              iop_a_src += 8;
87295
            } else {
87296
              self->private_data.s_do_transform_io.scratch = 0;
87297
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(20);
87298
              while (true) {
87299
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87300
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87301
                  goto suspend;
87302
                }
87303
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87304
                uint32_t num_bits_10 = ((uint32_t)(*scratch & 0xFFu));
87305
                *scratch >>= 8;
87306
                *scratch <<= 8;
87307
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_10);
87308
                if (num_bits_10 == 56) {
87309
                  t_10 = ((uint64_t)(*scratch >> 0));
87310
                  break;
87311
                }
87312
                num_bits_10 += 8u;
87313
                *scratch |= ((uint64_t)(num_bits_10));
87314
              }
87315
            }
87316
            v_checksum64_want = t_10;
87317
          }
87318
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 2u) != v_checksum64_want) {
87319
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87320
            goto exit;
87321
          }
87322
          {
87323
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(21);
87324
            uint64_t t_11;
87325
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
87326
              t_11 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
87327
              iop_a_src += 8;
87328
            } else {
87329
              self->private_data.s_do_transform_io.scratch = 0;
87330
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(22);
87331
              while (true) {
87332
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87333
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87334
                  goto suspend;
87335
                }
87336
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87337
                uint32_t num_bits_11 = ((uint32_t)(*scratch & 0xFFu));
87338
                *scratch >>= 8;
87339
                *scratch <<= 8;
87340
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_11);
87341
                if (num_bits_11 == 56) {
87342
                  t_11 = ((uint64_t)(*scratch >> 0));
87343
                  break;
87344
                }
87345
                num_bits_11 += 8u;
87346
                *scratch |= ((uint64_t)(num_bits_11));
87347
              }
87348
            }
87349
            v_checksum64_want = t_11;
87350
          }
87351
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 1u) != v_checksum64_want) {
87352
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87353
            goto exit;
87354
          }
87355
          {
87356
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(23);
87357
            uint64_t t_12;
87358
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 8)) {
87359
              t_12 = wuffs_base__peek_u64be__no_bounds_check(iop_a_src);
87360
              iop_a_src += 8;
87361
            } else {
87362
              self->private_data.s_do_transform_io.scratch = 0;
87363
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(24);
87364
              while (true) {
87365
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87366
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87367
                  goto suspend;
87368
                }
87369
                uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87370
                uint32_t num_bits_12 = ((uint32_t)(*scratch & 0xFFu));
87371
                *scratch >>= 8;
87372
                *scratch <<= 8;
87373
                *scratch |= ((uint64_t)(*iop_a_src++)) << (56 - num_bits_12);
87374
                if (num_bits_12 == 56) {
87375
                  t_12 = ((uint64_t)(*scratch >> 0));
87376
                  break;
87377
                }
87378
                num_bits_12 += 8u;
87379
                *scratch |= ((uint64_t)(num_bits_12));
87380
              }
87381
            }
87382
            v_checksum64_want = t_12;
87383
          }
87384
          if (wuffs_base__bitvec256__get_u64(&v_checksum256_have, 0u) != v_checksum64_want) {
87385
            status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87386
            goto exit;
87387
          }
87388
        }
87389
      }
87390
      self->private_impl.f_backwards_size = 0u;
87391
      if ( ! self->private_impl.f_ignore_checksum) {
87392
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
87393
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87394
      }
87395
      while (true) {
87396
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
87397
        {
87398
          if (a_src) {
87399
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87400
          }
87401
          wuffs_base__status t_13 = wuffs_xz__decoder__verify_index(self, a_src);
87402
          v_status = t_13;
87403
          if (a_src) {
87404
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
87405
          }
87406
        }
87407
        wuffs_private_impl__u64__sat_add_indirect(&self->private_impl.f_backwards_size, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))));
87408
        if ( ! self->private_impl.f_ignore_checksum) {
87409
          wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
87410
        }
87411
        if (wuffs_base__status__is_ok(&v_status)) {
87412
          break;
87413
        }
87414
        status = v_status;
87415
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(25);
87416
      }
87417
      if ( ! self->private_impl.f_ignore_checksum) {
87418
        wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_base__make_slice_u8(wuffs_base__strip_const_from_u8_ptr(WUFFS_XZ__ZEROES), (3u & ((uint64_t)(0u - (3u & self->private_impl.f_backwards_size))))));
87419
      }
87420
      while ((self->private_impl.f_backwards_size & 3u) != 0u) {
87421
        {
87422
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(26);
87423
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87424
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87425
            goto suspend;
87426
          }
87427
          uint8_t t_14 = *iop_a_src++;
87428
          v_c8 = t_14;
87429
        }
87430
        if (v_c8 != 0u) {
87431
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
87432
          goto exit;
87433
        }
87434
        self->private_impl.f_backwards_size += 1u;
87435
      }
87436
      self->private_impl.f_backwards_size >>= 2u;
87437
      if ((self->private_impl.f_backwards_size == 0u) || (self->private_impl.f_backwards_size > 4294967295u)) {
87438
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
87439
        goto exit;
87440
      }
87441
      {
87442
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(27);
87443
        uint32_t t_15;
87444
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
87445
          t_15 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
87446
          iop_a_src += 4;
87447
        } else {
87448
          self->private_data.s_do_transform_io.scratch = 0;
87449
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(28);
87450
          while (true) {
87451
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87452
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87453
              goto suspend;
87454
            }
87455
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87456
            uint32_t num_bits_15 = ((uint32_t)(*scratch >> 56));
87457
            *scratch <<= 8;
87458
            *scratch >>= 8;
87459
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_15;
87460
            if (num_bits_15 == 24) {
87461
              t_15 = ((uint32_t)(*scratch));
87462
              break;
87463
            }
87464
            num_bits_15 += 8u;
87465
            *scratch |= ((uint64_t)(num_bits_15)) << 56;
87466
          }
87467
        }
87468
        v_checksum32_want = t_15;
87469
      }
87470
      if (self->private_impl.f_ignore_checksum) {
87471
      } else if (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32)) {
87472
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87473
        goto exit;
87474
      } else {
87475
        wuffs_private_impl__ignore_status(wuffs_crc32__ieee_hasher__initialize(&self->private_data.f_crc32,
87476
            sizeof (wuffs_crc32__ieee_hasher), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87477
      }
87478
      {
87479
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(29);
87480
        uint32_t t_16;
87481
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
87482
          t_16 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
87483
          iop_a_src += 4;
87484
        } else {
87485
          self->private_data.s_do_transform_io.scratch = 0;
87486
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(30);
87487
          while (true) {
87488
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87489
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87490
              goto suspend;
87491
            }
87492
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87493
            uint32_t num_bits_16 = ((uint32_t)(*scratch >> 56));
87494
            *scratch <<= 8;
87495
            *scratch >>= 8;
87496
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_16;
87497
            if (num_bits_16 == 24) {
87498
              t_16 = ((uint32_t)(*scratch));
87499
              break;
87500
            }
87501
            num_bits_16 += 8u;
87502
            *scratch |= ((uint64_t)(num_bits_16)) << 56;
87503
          }
87504
        }
87505
        v_checksum32_want = t_16;
87506
      }
87507
      while (true) {
87508
        v_smark = ((uint64_t)(iop_a_src - io0_a_src));
87509
        {
87510
          if (a_src) {
87511
            a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87512
          }
87513
          wuffs_base__status t_17 = wuffs_xz__decoder__verify_footer(self, a_src);
87514
          v_status = t_17;
87515
          if (a_src) {
87516
            iop_a_src = a_src->data.ptr + a_src->meta.ri;
87517
          }
87518
        }
87519
        if ( ! self->private_impl.f_ignore_checksum) {
87520
          wuffs_crc32__ieee_hasher__update(&self->private_data.f_crc32, wuffs_private_impl__io__since(v_smark, ((uint64_t)(iop_a_src - io0_a_src)), io0_a_src));
87521
        }
87522
        if (wuffs_base__status__is_ok(&v_status)) {
87523
          break;
87524
        }
87525
        status = v_status;
87526
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(31);
87527
      }
87528
      if ( ! self->private_impl.f_ignore_checksum && (v_checksum32_want != wuffs_crc32__ieee_hasher__checksum_u32(&self->private_data.f_crc32))) {
87529
        status = wuffs_base__make_status(wuffs_xz__error__bad_checksum);
87530
        goto exit;
87531
      }
87532
      {
87533
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(32);
87534
        uint16_t t_18;
87535
        if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
87536
          t_18 = wuffs_base__peek_u16le__no_bounds_check(iop_a_src);
87537
          iop_a_src += 2;
87538
        } else {
87539
          self->private_data.s_do_transform_io.scratch = 0;
87540
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(33);
87541
          while (true) {
87542
            if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87543
              status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87544
              goto suspend;
87545
            }
87546
            uint64_t* scratch = &self->private_data.s_do_transform_io.scratch;
87547
            uint32_t num_bits_18 = ((uint32_t)(*scratch >> 56));
87548
            *scratch <<= 8;
87549
            *scratch >>= 8;
87550
            *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_18;
87551
            if (num_bits_18 == 8) {
87552
              t_18 = ((uint16_t)(*scratch));
87553
              break;
87554
            }
87555
            num_bits_18 += 8u;
87556
            *scratch |= ((uint64_t)(num_bits_18)) << 56;
87557
          }
87558
        }
87559
        v_footer_magic = t_18;
87560
      }
87561
      if (v_footer_magic != 23129u) {
87562
        status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
87563
        goto exit;
87564
      }
87565
      if ( ! self->private_impl.f_standalone_format) {
87566
        break;
87567
      }
87568
      while (true) {
87569
        while (((uint64_t)(io2_a_src - iop_a_src)) < 4u) {
87570
          if (a_src && a_src->meta.closed) {
87571
            if (((uint64_t)(io2_a_src - iop_a_src)) == 0u) {
87572
              goto label__streams__break;
87573
            } else {
87574
              status = wuffs_base__make_status(wuffs_xz__error__truncated_input);
87575
              goto exit;
87576
            }
87577
          }
87578
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87579
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(34);
87580
        }
87581
        v_c32 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
87582
        if (v_c32 == 1484404733u) {
87583
          break;
87584
        } else if (v_c32 != 0u) {
87585
          status = wuffs_base__make_status(wuffs_xz__error__bad_header_concatenated_stream);
87586
          goto exit;
87587
        }
87588
        iop_a_src += 4u;
87589
      }
87590
      self->private_impl.f_started_verify_index = false;
87591
    }
87592
    label__streams__break:;
87593
87594
    ok:
87595
    self->private_impl.p_do_transform_io = 0;
87596
    goto exit;
87597
  }
87598
87599
  goto suspend;
87600
  suspend:
87601
  self->private_impl.p_do_transform_io = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
87602
  self->private_data.s_do_transform_io.v_checksum32_have = v_checksum32_have;
87603
  self->private_data.s_do_transform_io.v_checksum32_want = v_checksum32_want;
87604
  self->private_data.s_do_transform_io.v_checksum256_have = v_checksum256_have;
87605
  self->private_data.s_do_transform_io.v_compressed_size = v_compressed_size;
87606
  self->private_data.s_do_transform_io.v_uncompressed_size = v_uncompressed_size;
87607
87608
  goto exit;
87609
  exit:
87610
  if (a_dst && a_dst->data.ptr) {
87611
    a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
87612
  }
87613
  if (a_src && a_src->data.ptr) {
87614
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87615
  }
87616
87617
  return status;
87618
}
87619
87620
// -------- func xz.decoder.decode_block_header_with_padding
87621
87622
WUFFS_BASE__GENERATED_C_CODE
87623
static wuffs_base__status
87624
wuffs_xz__decoder__decode_block_header_with_padding(
87625
    wuffs_xz__decoder* self,
87626
    wuffs_base__io_buffer* a_src) {
87627
  wuffs_base__status status = wuffs_base__make_status(NULL);
87628
87629
  uint8_t v_c8 = 0;
87630
  uint64_t v_padded_size_have = 0;
87631
  uint64_t v_padded_size_want = 0;
87632
  uint64_t v_smark = 0;
87633
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
87634
87635
  const uint8_t* iop_a_src = NULL;
87636
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87637
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87638
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87639
  if (a_src && a_src->data.ptr) {
87640
    io0_a_src = a_src->data.ptr;
87641
    io1_a_src = io0_a_src + a_src->meta.ri;
87642
    iop_a_src = io1_a_src;
87643
    io2_a_src = io0_a_src + a_src->meta.wi;
87644
  }
87645
87646
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_with_padding;
87647
  if (coro_susp_point) {
87648
    v_padded_size_have = self->private_data.s_decode_block_header_with_padding.v_padded_size_have;
87649
    v_padded_size_want = self->private_data.s_decode_block_header_with_padding.v_padded_size_want;
87650
  }
87651
  switch (coro_susp_point) {
87652
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
87653
87654
    {
87655
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
87656
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87657
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87658
        goto suspend;
87659
      }
87660
      uint8_t t_0 = *iop_a_src++;
87661
      v_c8 = t_0;
87662
    }
87663
    v_padded_size_want = ((uint64_t)((((uint64_t)(v_c8)) * 4u) - 1u));
87664
    while (true) {
87665
      v_smark = ((uint64_t)(iop_a_src - io0_a_src));
87666
      {
87667
        if (a_src) {
87668
          a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87669
        }
87670
        wuffs_base__status t_1 = wuffs_xz__decoder__decode_block_header_sans_padding(self, a_src);
87671
        v_status = t_1;
87672
        if (a_src) {
87673
          iop_a_src = a_src->data.ptr + a_src->meta.ri;
87674
        }
87675
      }
87676
      wuffs_private_impl__u64__sat_add_indirect(&v_padded_size_have, wuffs_private_impl__io__count_since(v_smark, ((uint64_t)(iop_a_src - io0_a_src))));
87677
      if (wuffs_base__status__is_ok(&v_status)) {
87678
        break;
87679
      }
87680
      status = v_status;
87681
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(2);
87682
    }
87683
    if (v_padded_size_have > v_padded_size_want) {
87684
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87685
      goto exit;
87686
    }
87687
    while (v_padded_size_have < v_padded_size_want) {
87688
      {
87689
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
87690
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87691
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87692
          goto suspend;
87693
        }
87694
        uint8_t t_2 = *iop_a_src++;
87695
        v_c8 = t_2;
87696
      }
87697
      if (v_c8 != 0u) {
87698
        status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87699
        goto exit;
87700
      }
87701
      v_padded_size_have += 1u;
87702
    }
87703
87704
    ok:
87705
    self->private_impl.p_decode_block_header_with_padding = 0;
87706
    goto exit;
87707
  }
87708
87709
  goto suspend;
87710
  suspend:
87711
  self->private_impl.p_decode_block_header_with_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
87712
  self->private_data.s_decode_block_header_with_padding.v_padded_size_have = v_padded_size_have;
87713
  self->private_data.s_decode_block_header_with_padding.v_padded_size_want = v_padded_size_want;
87714
87715
  goto exit;
87716
  exit:
87717
  if (a_src && a_src->data.ptr) {
87718
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
87719
  }
87720
87721
  return status;
87722
}
87723
87724
// -------- func xz.decoder.decode_block_header_sans_padding
87725
87726
WUFFS_BASE__GENERATED_C_CODE
87727
static wuffs_base__status
87728
wuffs_xz__decoder__decode_block_header_sans_padding(
87729
    wuffs_xz__decoder* self,
87730
    wuffs_base__io_buffer* a_src) {
87731
  wuffs_base__status status = wuffs_base__make_status(NULL);
87732
87733
  uint8_t v_c8 = 0;
87734
  uint32_t v_c32 = 0;
87735
  uint32_t v_alignment = 0;
87736
  uint8_t v_flags = 0;
87737
  uint8_t v_filter_id = 0;
87738
  wuffs_base__status v_status = wuffs_base__make_status(NULL);
87739
  uint32_t v_shift = 0;
87740
  uint32_t v_f = 0;
87741
  uint32_t v_k = 0;
87742
87743
  const uint8_t* iop_a_src = NULL;
87744
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87745
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87746
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
87747
  if (a_src && a_src->data.ptr) {
87748
    io0_a_src = a_src->data.ptr;
87749
    io1_a_src = io0_a_src + a_src->meta.ri;
87750
    iop_a_src = io1_a_src;
87751
    io2_a_src = io0_a_src + a_src->meta.wi;
87752
  }
87753
87754
  uint32_t coro_susp_point = self->private_impl.p_decode_block_header_sans_padding;
87755
  if (coro_susp_point) {
87756
    v_flags = self->private_data.s_decode_block_header_sans_padding.v_flags;
87757
    v_filter_id = self->private_data.s_decode_block_header_sans_padding.v_filter_id;
87758
    v_shift = self->private_data.s_decode_block_header_sans_padding.v_shift;
87759
    v_f = self->private_data.s_decode_block_header_sans_padding.v_f;
87760
  }
87761
  switch (coro_susp_point) {
87762
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
87763
87764
    {
87765
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
87766
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87767
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87768
        goto suspend;
87769
      }
87770
      uint8_t t_0 = *iop_a_src++;
87771
      v_flags = t_0;
87772
    }
87773
    self->private_impl.f_num_non_final_filters = ((uint32_t)(((uint8_t)(v_flags & 3u))));
87774
    if (((uint8_t)(v_flags & 60u)) != 0u) {
87775
      status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87776
      goto exit;
87777
    }
87778
    self->private_impl.f_block_has_compressed_size = (((uint8_t)(v_flags & 64u)) != 0u);
87779
    if (self->private_impl.f_block_has_compressed_size) {
87780
      self->private_impl.f_block_compressed_size = 0u;
87781
      v_shift = 0u;
87782
      while (true) {
87783
        {
87784
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
87785
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87786
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87787
            goto suspend;
87788
          }
87789
          uint8_t t_1 = *iop_a_src++;
87790
          v_c8 = t_1;
87791
        }
87792
        if (v_shift <= 56u) {
87793
          self->private_impl.f_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
87794
          if (v_c8 >= 128u) {
87795
            v_shift += 7u;
87796
            continue;
87797
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
87798
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87799
            goto exit;
87800
          }
87801
          break;
87802
        } else if (v_c8 != 1u) {
87803
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87804
          goto exit;
87805
        }
87806
        self->private_impl.f_block_compressed_size |= (((uint64_t)(1u)) << 63u);
87807
        break;
87808
      }
87809
    }
87810
    self->private_impl.f_block_has_uncompressed_size = (((uint8_t)(v_flags & 128u)) != 0u);
87811
    if (self->private_impl.f_block_has_uncompressed_size) {
87812
      self->private_impl.f_block_uncompressed_size = 0u;
87813
      v_shift = 0u;
87814
      while (true) {
87815
        {
87816
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
87817
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87818
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87819
            goto suspend;
87820
          }
87821
          uint8_t t_2 = *iop_a_src++;
87822
          v_c8 = t_2;
87823
        }
87824
        if (v_shift <= 56u) {
87825
          self->private_impl.f_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
87826
          if (v_c8 >= 128u) {
87827
            v_shift += 7u;
87828
            continue;
87829
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
87830
            status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87831
            goto exit;
87832
          }
87833
          break;
87834
        } else if (v_c8 != 1u) {
87835
          status = wuffs_base__make_status(wuffs_xz__error__bad_block_header);
87836
          goto exit;
87837
        }
87838
        self->private_impl.f_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
87839
        break;
87840
      }
87841
    }
87842
    self->private_impl.f_bcj_x86_prev_mask = 0u;
87843
    self->private_impl.choosy_apply_non_final_filters = (
87844
        &wuffs_xz__decoder__apply_non_final_filters__choosy_default);
87845
    v_f = 0u;
87846
    while (v_f < self->private_impl.f_num_non_final_filters) {
87847
      {
87848
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
87849
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87850
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87851
          goto suspend;
87852
        }
87853
        uint8_t t_3 = *iop_a_src++;
87854
        v_filter_id = t_3;
87855
      }
87856
      if (v_filter_id == 33u) {
87857
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
87858
        goto exit;
87859
      } else if (v_filter_id == 3u) {
87860
        {
87861
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(5);
87862
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87863
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87864
            goto suspend;
87865
          }
87866
          uint8_t t_4 = *iop_a_src++;
87867
          v_c8 = t_4;
87868
        }
87869
        if (v_c8 != 1u) {
87870
          status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
87871
          goto exit;
87872
        }
87873
        {
87874
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(6);
87875
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87876
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87877
            goto suspend;
87878
          }
87879
          uint8_t t_5 = *iop_a_src++;
87880
          v_c8 = t_5;
87881
        }
87882
        self->private_impl.f_filters[v_f] = ((((uint32_t)(v_c8)) << 8u) | 3u);
87883
        v_k = 0u;
87884
        while (v_k < 256u) {
87885
          self->private_data.f_filter_data[v_f][v_k] = 0u;
87886
          v_k += 1u;
87887
        }
87888
      } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
87889
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
87890
        goto exit;
87891
      } else if (v_f != 0u) {
87892
        status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter_combination);
87893
        goto exit;
87894
      } else {
87895
        self->private_impl.f_filters[v_f] = ((uint32_t)(v_filter_id));
87896
        if (v_filter_id == 4u) {
87897
          self->private_impl.choosy_apply_non_final_filters = (
87898
              &wuffs_xz__decoder__apply_filter_04_x86);
87899
        } else if (v_filter_id == 5u) {
87900
          self->private_impl.choosy_apply_non_final_filters = (
87901
              &wuffs_xz__decoder__apply_filter_05_powerpc);
87902
        } else if (v_filter_id == 6u) {
87903
          self->private_impl.choosy_apply_non_final_filters = (
87904
              &wuffs_xz__decoder__apply_filter_06_ia64);
87905
        } else if (v_filter_id == 7u) {
87906
          self->private_impl.choosy_apply_non_final_filters = (
87907
              &wuffs_xz__decoder__apply_filter_07_arm);
87908
        } else if (v_filter_id == 8u) {
87909
          self->private_impl.choosy_apply_non_final_filters = (
87910
              &wuffs_xz__decoder__apply_filter_08_armthumb);
87911
        } else if (v_filter_id == 9u) {
87912
          self->private_impl.choosy_apply_non_final_filters = (
87913
              &wuffs_xz__decoder__apply_filter_09_sparc);
87914
        } else if (v_filter_id == 10u) {
87915
          self->private_impl.choosy_apply_non_final_filters = (
87916
              &wuffs_xz__decoder__apply_filter_0a_arm64);
87917
        } else {
87918
          self->private_impl.choosy_apply_non_final_filters = (
87919
              &wuffs_xz__decoder__apply_filter_0b_riscv);
87920
        }
87921
        {
87922
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(7);
87923
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87924
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87925
            goto suspend;
87926
          }
87927
          uint8_t t_6 = *iop_a_src++;
87928
          v_c8 = t_6;
87929
        }
87930
        if (v_c8 == 0u) {
87931
          self->private_impl.f_bcj_pos = 0u;
87932
        } else if (v_c8 == 4u) {
87933
          {
87934
            WUFFS_BASE__COROUTINE_SUSPENSION_POINT(8);
87935
            uint32_t t_7;
87936
            if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
87937
              t_7 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
87938
              iop_a_src += 4;
87939
            } else {
87940
              self->private_data.s_decode_block_header_sans_padding.scratch = 0;
87941
              WUFFS_BASE__COROUTINE_SUSPENSION_POINT(9);
87942
              while (true) {
87943
                if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87944
                  status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87945
                  goto suspend;
87946
                }
87947
                uint64_t* scratch = &self->private_data.s_decode_block_header_sans_padding.scratch;
87948
                uint32_t num_bits_7 = ((uint32_t)(*scratch >> 56));
87949
                *scratch <<= 8;
87950
                *scratch >>= 8;
87951
                *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_7;
87952
                if (num_bits_7 == 24) {
87953
                  t_7 = ((uint32_t)(*scratch));
87954
                  break;
87955
                }
87956
                num_bits_7 += 8u;
87957
                *scratch |= ((uint64_t)(num_bits_7)) << 56;
87958
              }
87959
            }
87960
            v_c32 = t_7;
87961
          }
87962
          v_alignment = ((uint32_t)(WUFFS_XZ__BCJ_OFFSET_ALIGNMENT[v_filter_id]));
87963
          if (v_alignment > 0u) {
87964
            if ((v_c32 % v_alignment) != 0u) {
87965
              status = wuffs_base__make_status(wuffs_xz__error__bad_bcj_offset);
87966
              goto exit;
87967
            }
87968
          }
87969
          self->private_impl.f_bcj_pos = v_c32;
87970
        } else {
87971
          status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
87972
          goto exit;
87973
        }
87974
      }
87975
      v_f += 1u;
87976
    }
87977
    {
87978
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(10);
87979
      if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87980
        status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87981
        goto suspend;
87982
      }
87983
      uint8_t t_8 = *iop_a_src++;
87984
      v_filter_id = t_8;
87985
    }
87986
    if (v_filter_id == 33u) {
87987
      if (self->private_impl.f_lzma_needs_reset) {
87988
        wuffs_private_impl__ignore_status(wuffs_lzma__decoder__initialize(&self->private_data.f_lzma,
87989
            sizeof (wuffs_lzma__decoder), WUFFS_VERSION, WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED));
87990
      }
87991
      {
87992
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(11);
87993
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
87994
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
87995
          goto suspend;
87996
        }
87997
        uint8_t t_9 = *iop_a_src++;
87998
        v_c8 = t_9;
87999
      }
88000
      if (v_c8 != 1u) {
88001
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
88002
        goto exit;
88003
      }
88004
      {
88005
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(12);
88006
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88007
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88008
          goto suspend;
88009
        }
88010
        uint8_t t_10 = *iop_a_src++;
88011
        v_c8 = t_10;
88012
      }
88013
      v_status = wuffs_lzma__decoder__set_quirk(&self->private_data.f_lzma, 1290294273u, (2u | (((uint64_t)(v_c8)) << 8u)));
88014
      if ( ! wuffs_base__status__is_ok(&v_status)) {
88015
        status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
88016
        goto exit;
88017
      }
88018
    } else if ((v_filter_id < 3u) || (11u < v_filter_id)) {
88019
      status = wuffs_base__make_status(wuffs_xz__error__unsupported_filter);
88020
      goto exit;
88021
    } else {
88022
      status = wuffs_base__make_status(wuffs_xz__error__bad_filter);
88023
      goto exit;
88024
    }
88025
88026
    goto ok;
88027
    ok:
88028
    self->private_impl.p_decode_block_header_sans_padding = 0;
88029
    goto exit;
88030
  }
88031
88032
  goto suspend;
88033
  suspend:
88034
  self->private_impl.p_decode_block_header_sans_padding = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88035
  self->private_data.s_decode_block_header_sans_padding.v_flags = v_flags;
88036
  self->private_data.s_decode_block_header_sans_padding.v_filter_id = v_filter_id;
88037
  self->private_data.s_decode_block_header_sans_padding.v_shift = v_shift;
88038
  self->private_data.s_decode_block_header_sans_padding.v_f = v_f;
88039
88040
  goto exit;
88041
  exit:
88042
  if (a_src && a_src->data.ptr) {
88043
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88044
  }
88045
88046
  return status;
88047
}
88048
88049
// -------- func xz.decoder.verify_index
88050
88051
WUFFS_BASE__GENERATED_C_CODE
88052
static wuffs_base__status
88053
wuffs_xz__decoder__verify_index(
88054
    wuffs_xz__decoder* self,
88055
    wuffs_base__io_buffer* a_src) {
88056
  wuffs_base__status status = wuffs_base__make_status(NULL);
88057
88058
  uint8_t v_c8 = 0;
88059
  uint32_t v_shift = 0;
88060
  uint32_t v_hash = 0;
88061
88062
  const uint8_t* iop_a_src = NULL;
88063
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88064
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88065
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88066
  if (a_src && a_src->data.ptr) {
88067
    io0_a_src = a_src->data.ptr;
88068
    io1_a_src = io0_a_src + a_src->meta.ri;
88069
    iop_a_src = io1_a_src;
88070
    io2_a_src = io0_a_src + a_src->meta.wi;
88071
  }
88072
88073
  uint32_t coro_susp_point = self->private_impl.p_verify_index;
88074
  if (coro_susp_point) {
88075
    v_shift = self->private_data.s_verify_index.v_shift;
88076
  }
88077
  switch (coro_susp_point) {
88078
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
88079
88080
    if ( ! self->private_impl.f_started_verify_index) {
88081
      self->private_impl.f_started_verify_index = true;
88082
      {
88083
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
88084
        if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88085
          status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88086
          goto suspend;
88087
        }
88088
        uint8_t t_0 = *iop_a_src++;
88089
        v_c8 = t_0;
88090
      }
88091
      if (v_c8 != 0u) {
88092
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88093
        goto exit;
88094
      }
88095
      self->private_impl.f_num_index_blocks = 0u;
88096
      v_shift = 0u;
88097
      while (true) {
88098
        {
88099
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
88100
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88101
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88102
            goto suspend;
88103
          }
88104
          uint8_t t_1 = *iop_a_src++;
88105
          v_c8 = t_1;
88106
        }
88107
        if (v_shift <= 56u) {
88108
          self->private_impl.f_num_index_blocks |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
88109
          if (v_c8 >= 128u) {
88110
            v_shift += 7u;
88111
            continue;
88112
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
88113
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88114
            goto exit;
88115
          }
88116
          break;
88117
        } else if (v_c8 != 1u) {
88118
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88119
          goto exit;
88120
        }
88121
        self->private_impl.f_num_index_blocks |= (((uint64_t)(1u)) << 63u);
88122
        break;
88123
      }
88124
      if (self->private_impl.f_num_index_blocks != self->private_impl.f_num_actual_blocks) {
88125
        status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88126
        goto exit;
88127
      }
88128
    }
88129
    while (self->private_impl.f_num_index_blocks > 0u) {
88130
      self->private_impl.f_num_index_blocks -= 1u;
88131
      self->private_impl.f_index_block_compressed_size = 0u;
88132
      v_shift = 0u;
88133
      while (true) {
88134
        {
88135
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
88136
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88137
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88138
            goto suspend;
88139
          }
88140
          uint8_t t_2 = *iop_a_src++;
88141
          v_c8 = t_2;
88142
        }
88143
        if (v_shift <= 56u) {
88144
          self->private_impl.f_index_block_compressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
88145
          if (v_c8 >= 128u) {
88146
            v_shift += 7u;
88147
            continue;
88148
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
88149
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88150
            goto exit;
88151
          }
88152
          break;
88153
        } else if (v_c8 != 1u) {
88154
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88155
          goto exit;
88156
        }
88157
        self->private_impl.f_index_block_compressed_size |= (((uint64_t)(1u)) << 63u);
88158
        break;
88159
      }
88160
      self->private_impl.f_index_block_uncompressed_size = 0u;
88161
      v_shift = 0u;
88162
      while (true) {
88163
        {
88164
          WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
88165
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88166
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88167
            goto suspend;
88168
          }
88169
          uint8_t t_3 = *iop_a_src++;
88170
          v_c8 = t_3;
88171
        }
88172
        if (v_shift <= 56u) {
88173
          self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(((uint8_t)(v_c8 & 127u)))) << v_shift);
88174
          if (v_c8 >= 128u) {
88175
            v_shift += 7u;
88176
            continue;
88177
          } else if ((v_c8 == 0u) && (v_shift > 0u)) {
88178
            status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88179
            goto exit;
88180
          }
88181
          break;
88182
        } else if (v_c8 != 1u) {
88183
          status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88184
          goto exit;
88185
        }
88186
        self->private_impl.f_index_block_uncompressed_size |= (((uint64_t)(1u)) << 63u);
88187
        break;
88188
      }
88189
      self->private_impl.f_verification_want_total_sizes[0u] += self->private_impl.f_index_block_compressed_size;
88190
      v_hash = ((uint32_t)((self->private_impl.f_index_block_compressed_size ^ (self->private_impl.f_index_block_compressed_size >> 32u))));
88191
      v_hash *= 3432918353u;
88192
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
88193
      v_hash *= 461845907u;
88194
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[0u];
88195
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
88196
      self->private_impl.f_verification_want_hashed_sizes[0u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
88197
      self->private_impl.f_verification_want_total_sizes[1u] += self->private_impl.f_index_block_uncompressed_size;
88198
      v_hash = ((uint32_t)((self->private_impl.f_index_block_uncompressed_size ^ (self->private_impl.f_index_block_uncompressed_size >> 32u))));
88199
      v_hash *= 3432918353u;
88200
      v_hash = (((uint32_t)(v_hash << 15u)) | (v_hash >> 17u));
88201
      v_hash *= 461845907u;
88202
      v_hash ^= self->private_impl.f_verification_want_hashed_sizes[1u];
88203
      v_hash = (((uint32_t)(v_hash << 13u)) | (v_hash >> 19u));
88204
      self->private_impl.f_verification_want_hashed_sizes[1u] = ((uint32_t)(((uint32_t)(v_hash * 5u)) + 3864292196u));
88205
    }
88206
    if ((self->private_impl.f_verification_have_hashed_sizes[0u] != self->private_impl.f_verification_want_hashed_sizes[0u]) ||
88207
        (self->private_impl.f_verification_have_hashed_sizes[1u] != self->private_impl.f_verification_want_hashed_sizes[1u]) ||
88208
        (self->private_impl.f_verification_have_total_sizes[0u] != self->private_impl.f_verification_want_total_sizes[0u]) ||
88209
        (self->private_impl.f_verification_have_total_sizes[1u] != self->private_impl.f_verification_want_total_sizes[1u])) {
88210
      status = wuffs_base__make_status(wuffs_xz__error__bad_index);
88211
      goto exit;
88212
    }
88213
88214
    goto ok;
88215
    ok:
88216
    self->private_impl.p_verify_index = 0;
88217
    goto exit;
88218
  }
88219
88220
  goto suspend;
88221
  suspend:
88222
  self->private_impl.p_verify_index = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88223
  self->private_data.s_verify_index.v_shift = v_shift;
88224
88225
  goto exit;
88226
  exit:
88227
  if (a_src && a_src->data.ptr) {
88228
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88229
  }
88230
88231
  return status;
88232
}
88233
88234
// -------- func xz.decoder.verify_footer
88235
88236
WUFFS_BASE__GENERATED_C_CODE
88237
static wuffs_base__status
88238
wuffs_xz__decoder__verify_footer(
88239
    wuffs_xz__decoder* self,
88240
    wuffs_base__io_buffer* a_src) {
88241
  wuffs_base__status status = wuffs_base__make_status(NULL);
88242
88243
  uint32_t v_c32 = 0;
88244
88245
  const uint8_t* iop_a_src = NULL;
88246
  const uint8_t* io0_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88247
  const uint8_t* io1_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88248
  const uint8_t* io2_a_src WUFFS_BASE__POTENTIALLY_UNUSED = NULL;
88249
  if (a_src && a_src->data.ptr) {
88250
    io0_a_src = a_src->data.ptr;
88251
    io1_a_src = io0_a_src + a_src->meta.ri;
88252
    iop_a_src = io1_a_src;
88253
    io2_a_src = io0_a_src + a_src->meta.wi;
88254
  }
88255
88256
  uint32_t coro_susp_point = self->private_impl.p_verify_footer;
88257
  switch (coro_susp_point) {
88258
    WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0;
88259
88260
    {
88261
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
88262
      uint32_t t_0;
88263
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 4)) {
88264
        t_0 = wuffs_base__peek_u32le__no_bounds_check(iop_a_src);
88265
        iop_a_src += 4;
88266
      } else {
88267
        self->private_data.s_verify_footer.scratch = 0;
88268
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
88269
        while (true) {
88270
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88271
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88272
            goto suspend;
88273
          }
88274
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
88275
          uint32_t num_bits_0 = ((uint32_t)(*scratch >> 56));
88276
          *scratch <<= 8;
88277
          *scratch >>= 8;
88278
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_0;
88279
          if (num_bits_0 == 24) {
88280
            t_0 = ((uint32_t)(*scratch));
88281
            break;
88282
          }
88283
          num_bits_0 += 8u;
88284
          *scratch |= ((uint64_t)(num_bits_0)) << 56;
88285
        }
88286
      }
88287
      v_c32 = t_0;
88288
    }
88289
    if (v_c32 != ((uint32_t)(self->private_impl.f_backwards_size))) {
88290
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
88291
      goto exit;
88292
    }
88293
    {
88294
      WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
88295
      uint32_t t_1;
88296
      if (WUFFS_BASE__LIKELY(io2_a_src - iop_a_src >= 2)) {
88297
        t_1 = ((uint32_t)(wuffs_base__peek_u16le__no_bounds_check(iop_a_src)));
88298
        iop_a_src += 2;
88299
      } else {
88300
        self->private_data.s_verify_footer.scratch = 0;
88301
        WUFFS_BASE__COROUTINE_SUSPENSION_POINT(4);
88302
        while (true) {
88303
          if (WUFFS_BASE__UNLIKELY(iop_a_src == io2_a_src)) {
88304
            status = wuffs_base__make_status(wuffs_base__suspension__short_read);
88305
            goto suspend;
88306
          }
88307
          uint64_t* scratch = &self->private_data.s_verify_footer.scratch;
88308
          uint32_t num_bits_1 = ((uint32_t)(*scratch >> 56));
88309
          *scratch <<= 8;
88310
          *scratch >>= 8;
88311
          *scratch |= ((uint64_t)(*iop_a_src++)) << num_bits_1;
88312
          if (num_bits_1 == 8) {
88313
            t_1 = ((uint32_t)(*scratch));
88314
            break;
88315
          }
88316
          num_bits_1 += 8u;
88317
          *scratch |= ((uint64_t)(num_bits_1)) << 56;
88318
        }
88319
      }
88320
      v_c32 = t_1;
88321
    }
88322
    if (v_c32 != ((uint32_t)(self->private_impl.f_flags))) {
88323
      status = wuffs_base__make_status(wuffs_xz__error__bad_footer);
88324
      goto exit;
88325
    }
88326
88327
    goto ok;
88328
    ok:
88329
    self->private_impl.p_verify_footer = 0;
88330
    goto exit;
88331
  }
88332
88333
  goto suspend;
88334
  suspend:
88335
  self->private_impl.p_verify_footer = wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
88336
88337
  goto exit;
88338
  exit:
88339
  if (a_src && a_src->data.ptr) {
88340
    a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
88341
  }
88342
88343
  return status;
88344
}
88345
88346
#endif  // !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__XZ)
88347
88348
#if defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
88349
88350
// ---------------- Auxiliary - Base
88351
88352
// Auxiliary code is discussed at
88353
// https://github.com/google/wuffs/blob/main/doc/note/auxiliary-code.md
88354
88355
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__BASE)
88356
88357
namespace wuffs_aux {
88358
88359
namespace sync_io {
88360
88361
// --------
88362
88363
DynIOBuffer::DynIOBuffer(uint64_t max_incl)
88364
    : m_buf(wuffs_base__empty_io_buffer()), m_max_incl(max_incl) {}
88365
88366
DynIOBuffer::~DynIOBuffer() {
88367
  free(m_buf.data.ptr);
88368
}
88369
88370
void  //
88371
DynIOBuffer::drop() {
88372
  free(m_buf.data.ptr);
88373
  m_buf = wuffs_base__empty_io_buffer();
88374
}
88375
88376
DynIOBuffer::GrowResult  //
88377
DynIOBuffer::grow(uint64_t min_incl) {
88378
  uint64_t n = round_up(min_incl, m_max_incl);
88379
  if (n == 0) {
88380
    return ((min_incl == 0) && (m_max_incl == 0))
88381
               ? DynIOBuffer::GrowResult::OK
88382
               : DynIOBuffer::GrowResult::FailedMaxInclExceeded;
88383
  } else if (n > SIZE_MAX) {
88384
    return DynIOBuffer::GrowResult::FailedOutOfMemory;
88385
  } else if (n > m_buf.data.len) {
88386
    uint8_t* ptr =
88387
        static_cast<uint8_t*>(realloc(m_buf.data.ptr, static_cast<size_t>(n)));
88388
    if (!ptr) {
88389
      return DynIOBuffer::GrowResult::FailedOutOfMemory;
88390
    }
88391
    m_buf.data.ptr = ptr;
88392
    m_buf.data.len = static_cast<size_t>(n);
88393
  }
88394
  return DynIOBuffer::GrowResult::OK;
88395
}
88396
88397
// round_up rounds min_incl up, returning the smallest value x satisfying
88398
// (min_incl <= x) and (x <= max_incl) and some other constraints. It returns 0
88399
// if there is no such x.
88400
//
88401
// When max_incl <= 4096, the other constraints are:
88402
//  - (x == max_incl)
88403
//
88404
// When max_incl >  4096, the other constraints are:
88405
//  - (x == max_incl) or (x is a power of 2)
88406
//  - (x >= 4096)
88407
uint64_t  //
88408
DynIOBuffer::round_up(uint64_t min_incl, uint64_t max_incl) {
88409
  if (min_incl > max_incl) {
88410
    return 0;
88411
  }
88412
  uint64_t n = 4096;
88413
  if (n >= max_incl) {
88414
    return max_incl;
88415
  }
88416
  while (n < min_incl) {
88417
    if (n >= (max_incl / 2)) {
88418
      return max_incl;
88419
    }
88420
    n *= 2;
88421
  }
88422
  return n;
88423
}
88424
88425
// --------
88426
88427
Input::~Input() {}
88428
88429
IOBuffer*  //
88430
Input::BringsItsOwnIOBuffer() {
88431
  return nullptr;
88432
}
88433
88434
// --------
88435
88436
FileInput::FileInput(FILE* f) : m_f(f) {}
88437
88438
std::string  //
88439
FileInput::CopyIn(IOBuffer* dst) {
88440
  if (!m_f) {
88441
    return "wuffs_aux::sync_io::FileInput: nullptr file";
88442
  } else if (!dst) {
88443
    return "wuffs_aux::sync_io::FileInput: nullptr IOBuffer";
88444
  } else if (dst->meta.closed) {
88445
    return "wuffs_aux::sync_io::FileInput: end of file";
88446
  } else {
88447
    dst->compact();
88448
    size_t n = fread(dst->writer_pointer(), 1, dst->writer_length(), m_f);
88449
    dst->meta.wi += n;
88450
    dst->meta.closed = feof(m_f);
88451
    if (ferror(m_f)) {
88452
      return "wuffs_aux::sync_io::FileInput: error reading file";
88453
    }
88454
  }
88455
  return "";
88456
}
88457
88458
// --------
88459
88460
MemoryInput::MemoryInput(const char* ptr, size_t len)
88461
    : m_io(wuffs_base__ptr_u8__reader(
88462
          static_cast<uint8_t*>(static_cast<void*>(const_cast<char*>(ptr))),
88463
          len,
88464
          true)) {}
88465
88466
MemoryInput::MemoryInput(const uint8_t* ptr, size_t len)
88467
    : m_io(wuffs_base__ptr_u8__reader(const_cast<uint8_t*>(ptr), len, true)) {}
88468
88469
IOBuffer*  //
88470
MemoryInput::BringsItsOwnIOBuffer() {
88471
  return &m_io;
88472
}
88473
88474
std::string  //
88475
MemoryInput::CopyIn(IOBuffer* dst) {
88476
  if (!dst) {
88477
    return "wuffs_aux::sync_io::MemoryInput: nullptr IOBuffer";
88478
  } else if (dst->meta.closed) {
88479
    return "wuffs_aux::sync_io::MemoryInput: end of file";
88480
  } else if (wuffs_base__slice_u8__overlaps(dst->data, m_io.data)) {
88481
    // Treat m_io's data as immutable, so don't compact dst or otherwise write
88482
    // to it.
88483
    return "wuffs_aux::sync_io::MemoryInput: overlapping buffers";
88484
  } else {
88485
    dst->compact();
88486
    size_t nd = dst->writer_length();
88487
    size_t ns = m_io.reader_length();
88488
    size_t n = (nd < ns) ? nd : ns;
88489
    memcpy(dst->writer_pointer(), m_io.reader_pointer(), n);
88490
    m_io.meta.ri += n;
88491
    dst->meta.wi += n;
88492
    dst->meta.closed = m_io.reader_length() == 0;
88493
  }
88494
  return "";
88495
}
88496
88497
// --------
88498
88499
}  // namespace sync_io
88500
88501
namespace private_impl {
88502
88503
struct ErrorMessages {
88504
  const char* max_incl_metadata_length_exceeded;
88505
  const char* out_of_memory;
88506
  const char* unexpected_end_of_file;
88507
  const char* unsupported_metadata;
88508
  const char* unsupported_negative_advance;
88509
88510
  // If adding new "const char*" typed fields to this struct, either add them
88511
  // after existing fields or, if re-ordering fields, make sure that you update
88512
  // all of the "const private_impl::ErrorMessages FooBarErrorMessages" values
88513
  // in all of the sibling *.cc files.
88514
88515
  static inline const char* resolve(const char* s) {
88516
    return s ? s : "wuffs_aux::private_impl: unknown error";
88517
  };
88518
};
88519
88520
std::string  //
88521
AdvanceIOBufferTo(const ErrorMessages& error_messages,
88522
                  sync_io::Input& input,
88523
                  IOBuffer& io_buf,
88524
                  uint64_t absolute_position) {
88525
  if (absolute_position < io_buf.reader_position()) {
88526
    return error_messages.resolve(error_messages.unsupported_negative_advance);
88527
  }
88528
  while (true) {
88529
    uint64_t relative_position = absolute_position - io_buf.reader_position();
88530
    if (relative_position <= io_buf.reader_length()) {
88531
      io_buf.meta.ri += (size_t)relative_position;
88532
      break;
88533
    } else if (io_buf.meta.closed) {
88534
      return error_messages.resolve(error_messages.unexpected_end_of_file);
88535
    }
88536
    io_buf.meta.ri = io_buf.meta.wi;
88537
    if (!input.BringsItsOwnIOBuffer()) {
88538
      io_buf.compact();
88539
    }
88540
    std::string error_message = input.CopyIn(&io_buf);
88541
    if (!error_message.empty()) {
88542
      return error_message;
88543
    }
88544
  }
88545
  return "";
88546
}
88547
88548
std::string  //
88549
HandleMetadata(
88550
    const ErrorMessages& error_messages,
88551
    sync_io::Input& input,
88552
    wuffs_base__io_buffer& io_buf,
88553
    sync_io::DynIOBuffer& raw,
88554
    wuffs_base__status (*tell_me_more_func)(void*,
88555
                                            wuffs_base__io_buffer*,
88556
                                            wuffs_base__more_information*,
88557
                                            wuffs_base__io_buffer*),
88558
    void* tell_me_more_receiver,
88559
    std::string (*handle_metadata_func)(void*,
88560
                                        const wuffs_base__more_information*,
88561
                                        wuffs_base__slice_u8),
88562
    void* handle_metadata_receiver) {
88563
  wuffs_base__more_information minfo = wuffs_base__empty_more_information();
88564
  // Reset raw but keep its backing array (the raw.m_buf.data slice).
88565
  raw.m_buf.meta = wuffs_base__empty_io_buffer_meta();
88566
88567
  while (true) {
88568
    minfo = wuffs_base__empty_more_information();
88569
    wuffs_base__status status = (*tell_me_more_func)(
88570
        tell_me_more_receiver, &raw.m_buf, &minfo, &io_buf);
88571
    switch (minfo.flavor) {
88572
      case 0:
88573
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_TRANSFORM:
88574
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_PARSED:
88575
        break;
88576
88577
      case WUFFS_BASE__MORE_INFORMATION__FLAVOR__METADATA_RAW_PASSTHROUGH: {
88578
        wuffs_base__range_ie_u64 r = minfo.metadata_raw_passthrough__range();
88579
        if (r.is_empty()) {
88580
          break;
88581
        }
88582
        uint64_t num_to_copy = r.length();
88583
        if (num_to_copy > (raw.m_max_incl - raw.m_buf.meta.wi)) {
88584
          return error_messages.resolve(
88585
              error_messages.max_incl_metadata_length_exceeded);
88586
        } else if (num_to_copy > (raw.m_buf.data.len - raw.m_buf.meta.wi)) {
88587
          switch (raw.grow(num_to_copy + raw.m_buf.meta.wi)) {
88588
            case sync_io::DynIOBuffer::GrowResult::OK:
88589
              break;
88590
            case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
88591
              return error_messages.resolve(
88592
                  error_messages.max_incl_metadata_length_exceeded);
88593
            case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
88594
              return error_messages.resolve(error_messages.out_of_memory);
88595
          }
88596
        }
88597
88598
        if (io_buf.reader_position() > r.min_incl) {
88599
          return error_messages.resolve(error_messages.unsupported_metadata);
88600
        } else {
88601
          std::string error_message =
88602
              AdvanceIOBufferTo(error_messages, input, io_buf, r.min_incl);
88603
          if (!error_message.empty()) {
88604
            return error_message;
88605
          }
88606
        }
88607
88608
        while (true) {
88609
          uint64_t n =
88610
              wuffs_base__u64__min(num_to_copy, io_buf.reader_length());
88611
          memcpy(raw.m_buf.writer_pointer(), io_buf.reader_pointer(), n);
88612
          raw.m_buf.meta.wi += n;
88613
          io_buf.meta.ri += n;
88614
          num_to_copy -= n;
88615
          if (num_to_copy == 0) {
88616
            break;
88617
          } else if (io_buf.meta.closed) {
88618
            return error_messages.resolve(
88619
                error_messages.unexpected_end_of_file);
88620
          } else if (!input.BringsItsOwnIOBuffer()) {
88621
            io_buf.compact();
88622
          }
88623
          std::string error_message = input.CopyIn(&io_buf);
88624
          if (!error_message.empty()) {
88625
            return error_message;
88626
          }
88627
        }
88628
        break;
88629
      }
88630
88631
      default:
88632
        return error_messages.resolve(error_messages.unsupported_metadata);
88633
    }
88634
88635
    if (status.repr == nullptr) {
88636
      break;
88637
    } else if (status.repr != wuffs_base__suspension__even_more_information) {
88638
      if (status.repr != wuffs_base__suspension__short_write) {
88639
        return status.message();
88640
      }
88641
      switch (raw.grow(wuffs_base__u64__sat_add(raw.m_buf.data.len, 1))) {
88642
        case sync_io::DynIOBuffer::GrowResult::OK:
88643
          break;
88644
        case sync_io::DynIOBuffer::GrowResult::FailedMaxInclExceeded:
88645
          return error_messages.resolve(
88646
              error_messages.max_incl_metadata_length_exceeded);
88647
        case sync_io::DynIOBuffer::GrowResult::FailedOutOfMemory:
88648
          return error_messages.resolve(error_messages.out_of_memory);
88649
      }
88650
    }
88651
  }
88652
88653
  return (*handle_metadata_func)(handle_metadata_receiver, &minfo,
88654
                                 raw.m_buf.reader_slice());
88655
}
88656
88657
}  // namespace private_impl
88658
88659
}  // namespace wuffs_aux
88660
88661
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
88662
        // defined(WUFFS_CONFIG__MODULE__AUX__BASE)
88663
88664
// ---------------- Auxiliary - CBOR
88665
88666
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
88667
88668
#include <utility>
88669
88670
namespace wuffs_aux {
88671
88672
DecodeCborResult::DecodeCborResult(std::string&& error_message0,
88673
                                   uint64_t cursor_position0)
88674
    : error_message(std::move(error_message0)),
88675
      cursor_position(cursor_position0) {}
88676
88677
DecodeCborCallbacks::~DecodeCborCallbacks() {}
88678
88679
void  //
88680
DecodeCborCallbacks::Done(DecodeCborResult& result,
88681
                          sync_io::Input& input,
88682
                          IOBuffer& buffer) {}
88683
88684
DecodeCborArgQuirks::DecodeCborArgQuirks(const QuirkKeyValuePair* ptr0,
88685
                                         const size_t len0)
88686
    : ptr(ptr0), len(len0) {}
88687
88688
DecodeCborArgQuirks  //
88689
DecodeCborArgQuirks::DefaultValue() {
88690
  return DecodeCborArgQuirks(nullptr, 0);
88691
}
88692
88693
DecodeCborResult  //
88694
DecodeCbor(DecodeCborCallbacks& callbacks,
88695
           sync_io::Input& input,
88696
           DecodeCborArgQuirks quirks) {
88697
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
88698
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
88699
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
88700
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
88701
  if (!io_buf) {
88702
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
88703
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
88704
    io_buf = &fallback_io_buf;
88705
  }
88706
  // cursor_index is discussed at
88707
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
88708
  size_t cursor_index = 0;
88709
  std::string ret_error_message;
88710
  std::string io_error_message;
88711
88712
  do {
88713
    // Prepare the low-level CBOR decoder.
88714
    wuffs_cbor__decoder::unique_ptr dec = wuffs_cbor__decoder::alloc();
88715
    if (!dec) {
88716
      ret_error_message = "wuffs_aux::DecodeCbor: out of memory";
88717
      goto done;
88718
    }
88719
    for (size_t i = 0; i < quirks.len; i++) {
88720
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
88721
    }
88722
88723
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
88724
    wuffs_base__token tok_array[256];
88725
    wuffs_base__token_buffer tok_buf =
88726
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
88727
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
88728
    wuffs_base__status tok_status = wuffs_base__make_status(nullptr);
88729
88730
    // Prepare other state.
88731
    int32_t depth = 0;
88732
    std::string str;
88733
    int64_t extension_category = 0;
88734
    uint64_t extension_detail = 0;
88735
88736
    // Valid token's VBCs range in 0 ..= 15. Values over that are for tokens
88737
    // from outside of the base package, such as the CBOR package.
88738
    constexpr int64_t EXT_CAT__CBOR_TAG = 16;
88739
88740
    // Loop, doing these two things:
88741
    //  1. Get the next token.
88742
    //  2. Process that token.
88743
    while (true) {
88744
      // 1. Get the next token.
88745
88746
      while (tok_buf.meta.ri >= tok_buf.meta.wi) {
88747
        if (tok_status.repr == nullptr) {
88748
          // No-op.
88749
        } else if (tok_status.repr == wuffs_base__suspension__short_write) {
88750
          tok_buf.compact();
88751
        } else if (tok_status.repr == wuffs_base__suspension__short_read) {
88752
          // Read from input to io_buf.
88753
          if (!io_error_message.empty()) {
88754
            ret_error_message = std::move(io_error_message);
88755
            goto done;
88756
          } else if (cursor_index != io_buf->meta.ri) {
88757
            ret_error_message =
88758
                "wuffs_aux::DecodeCbor: internal error: bad cursor_index";
88759
            goto done;
88760
          } else if (io_buf->meta.closed) {
88761
            ret_error_message =
88762
                "wuffs_aux::DecodeCbor: internal error: io_buf is closed";
88763
            goto done;
88764
          }
88765
          io_buf->compact();
88766
          if (io_buf->meta.wi >= io_buf->data.len) {
88767
            ret_error_message =
88768
                "wuffs_aux::DecodeCbor: internal error: io_buf is full";
88769
            goto done;
88770
          }
88771
          cursor_index = io_buf->meta.ri;
88772
          io_error_message = input.CopyIn(io_buf);
88773
        } else {
88774
          ret_error_message = tok_status.message();
88775
          goto done;
88776
        }
88777
88778
        if (WUFFS_CBOR__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
88779
          ret_error_message =
88780
              "wuffs_aux::DecodeCbor: internal error: bad WORKBUF_LEN";
88781
          goto done;
88782
        }
88783
        wuffs_base__slice_u8 work_buf = wuffs_base__empty_slice_u8();
88784
        tok_status = dec->decode_tokens(&tok_buf, io_buf, work_buf);
88785
        if ((tok_buf.meta.ri > tok_buf.meta.wi) ||
88786
            (tok_buf.meta.wi > tok_buf.data.len) ||
88787
            (io_buf->meta.ri > io_buf->meta.wi) ||
88788
            (io_buf->meta.wi > io_buf->data.len)) {
88789
          ret_error_message =
88790
              "wuffs_aux::DecodeCbor: internal error: bad buffer indexes";
88791
          goto done;
88792
        }
88793
      }
88794
88795
      wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];
88796
      uint64_t token_len = token.length();
88797
      if ((io_buf->meta.ri < cursor_index) ||
88798
          ((io_buf->meta.ri - cursor_index) < token_len)) {
88799
        ret_error_message =
88800
            "wuffs_aux::DecodeCbor: internal error: bad token indexes";
88801
        goto done;
88802
      }
88803
      uint8_t* token_ptr = io_buf->data.ptr + cursor_index;
88804
      cursor_index += static_cast<size_t>(token_len);
88805
88806
      // 2. Process that token.
88807
88808
      uint64_t vbd = token.value_base_detail();
88809
88810
      if (extension_category != 0) {
88811
        int64_t ext = token.value_extension();
88812
        if ((ext >= 0) && !token.continued()) {
88813
          extension_detail = (extension_detail
88814
                              << WUFFS_BASE__TOKEN__VALUE_EXTENSION__NUM_BITS) |
88815
                             static_cast<uint64_t>(ext);
88816
          switch (extension_category) {
88817
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED:
88818
              extension_category = 0;
88819
              ret_error_message =
88820
                  callbacks.AppendI64(static_cast<int64_t>(extension_detail));
88821
              goto parsed_a_value;
88822
            case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED:
88823
              extension_category = 0;
88824
              ret_error_message = callbacks.AppendU64(extension_detail);
88825
              goto parsed_a_value;
88826
            case EXT_CAT__CBOR_TAG:
88827
              extension_category = 0;
88828
              ret_error_message = callbacks.AppendCborTag(extension_detail);
88829
              if (!ret_error_message.empty()) {
88830
                goto done;
88831
              }
88832
              continue;
88833
          }
88834
        }
88835
        ret_error_message =
88836
            "wuffs_aux::DecodeCbor: internal error: bad extended token";
88837
        goto done;
88838
      }
88839
88840
      switch (token.value_base_category()) {
88841
        case WUFFS_BASE__TOKEN__VBC__FILLER:
88842
          continue;
88843
88844
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
88845
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
88846
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
88847
            if (!ret_error_message.empty()) {
88848
              goto done;
88849
            }
88850
            depth++;
88851
            if (depth > (int32_t)WUFFS_CBOR__DECODER_DEPTH_MAX_INCL) {
88852
              ret_error_message =
88853
                  "wuffs_aux::DecodeCbor: internal error: bad depth";
88854
              goto done;
88855
            }
88856
            continue;
88857
          }
88858
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
88859
          depth--;
88860
          if (depth < 0) {
88861
            ret_error_message =
88862
                "wuffs_aux::DecodeCbor: internal error: bad depth";
88863
            goto done;
88864
          }
88865
          goto parsed_a_value;
88866
        }
88867
88868
        case WUFFS_BASE__TOKEN__VBC__STRING: {
88869
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
88870
            // No-op.
88871
          } else if (vbd &
88872
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
88873
            const char* ptr =  // Convert from (uint8_t*).
88874
                static_cast<const char*>(static_cast<void*>(token_ptr));
88875
            str.append(ptr, static_cast<size_t>(token_len));
88876
          } else {
88877
            goto fail;
88878
          }
88879
          if (token.continued()) {
88880
            continue;
88881
          }
88882
          ret_error_message =
88883
              (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CHAIN_MUST_BE_UTF_8)
88884
                  ? callbacks.AppendTextString(std::move(str))
88885
                  : callbacks.AppendByteString(std::move(str));
88886
          str.clear();
88887
          goto parsed_a_value;
88888
        }
88889
88890
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
88891
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
88892
          size_t n = wuffs_base__utf_8__encode(
88893
              wuffs_base__make_slice_u8(
88894
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
88895
              static_cast<uint32_t>(vbd));
88896
          const char* ptr =  // Convert from (uint8_t*).
88897
              static_cast<const char*>(static_cast<void*>(&u[0]));
88898
          str.append(ptr, n);
88899
          if (token.continued()) {
88900
            continue;
88901
          }
88902
          goto fail;
88903
        }
88904
88905
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
88906
          if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL) {
88907
            ret_error_message = callbacks.AppendNull();
88908
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED) {
88909
            ret_error_message = callbacks.AppendUndefined();
88910
          } else {
88911
            ret_error_message = callbacks.AppendBool(
88912
                vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
88913
          }
88914
          goto parsed_a_value;
88915
        }
88916
88917
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
88918
          const uint64_t cfp_fbbe_fifb =
88919
              WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT |
88920
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_BINARY_BIG_ENDIAN |
88921
              WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_IGNORE_FIRST_BYTE;
88922
          if ((vbd & cfp_fbbe_fifb) == cfp_fbbe_fifb) {
88923
            double f;
88924
            switch (token_len) {
88925
              case 3:
88926
                f = wuffs_base__ieee_754_bit_representation__from_u16_to_f64(
88927
                    wuffs_base__peek_u16be__no_bounds_check(token_ptr + 1));
88928
                break;
88929
              case 5:
88930
                f = wuffs_base__ieee_754_bit_representation__from_u32_to_f64(
88931
                    wuffs_base__peek_u32be__no_bounds_check(token_ptr + 1));
88932
                break;
88933
              case 9:
88934
                f = wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
88935
                    wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
88936
                break;
88937
              default:
88938
                goto fail;
88939
            }
88940
            ret_error_message = callbacks.AppendF64(f);
88941
            goto parsed_a_value;
88942
          }
88943
          goto fail;
88944
        }
88945
88946
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED: {
88947
          if (token.continued()) {
88948
            extension_category = WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_SIGNED;
88949
            extension_detail =
88950
                static_cast<uint64_t>(token.value_base_detail__sign_extended());
88951
            continue;
88952
          }
88953
          ret_error_message =
88954
              callbacks.AppendI64(token.value_base_detail__sign_extended());
88955
          goto parsed_a_value;
88956
        }
88957
88958
        case WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED: {
88959
          if (token.continued()) {
88960
            extension_category =
88961
                WUFFS_BASE__TOKEN__VBC__INLINE_INTEGER_UNSIGNED;
88962
            extension_detail = vbd;
88963
            continue;
88964
          }
88965
          ret_error_message = callbacks.AppendU64(vbd);
88966
          goto parsed_a_value;
88967
        }
88968
      }
88969
88970
      if (token.value_major() == WUFFS_CBOR__TOKEN_VALUE_MAJOR) {
88971
        uint64_t value_minor = token.value_minor();
88972
        if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__MINUS_1_MINUS_X) {
88973
          if (token_len == 9) {
88974
            ret_error_message = callbacks.AppendMinus1MinusX(
88975
                wuffs_base__peek_u64be__no_bounds_check(token_ptr + 1));
88976
            goto parsed_a_value;
88977
          }
88978
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__SIMPLE_VALUE) {
88979
          ret_error_message =
88980
              callbacks.AppendCborSimpleValue(static_cast<uint8_t>(
88981
                  value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK));
88982
          goto parsed_a_value;
88983
        } else if (value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__TAG) {
88984
          if (token.continued()) {
88985
            extension_category = EXT_CAT__CBOR_TAG;
88986
            extension_detail =
88987
                value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK;
88988
            continue;
88989
          }
88990
          ret_error_message = callbacks.AppendCborTag(
88991
              value_minor & WUFFS_CBOR__TOKEN_VALUE_MINOR__DETAIL_MASK);
88992
          if (!ret_error_message.empty()) {
88993
            goto done;
88994
          }
88995
          continue;
88996
        }
88997
      }
88998
88999
    fail:
89000
      ret_error_message =
89001
          "wuffs_aux::DecodeCbor: internal error: unexpected token";
89002
      goto done;
89003
89004
    parsed_a_value:
89005
      if (!ret_error_message.empty() || (depth == 0)) {
89006
        goto done;
89007
      }
89008
    }
89009
  } while (false);
89010
89011
done:
89012
  DecodeCborResult result(
89013
      std::move(ret_error_message),
89014
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
89015
  callbacks.Done(result, input, *io_buf);
89016
  return result;
89017
}
89018
89019
}  // namespace wuffs_aux
89020
89021
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
89022
        // defined(WUFFS_CONFIG__MODULE__AUX__CBOR)
89023
89024
// ---------------- Auxiliary - Image
89025
89026
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
89027
89028
#include <utility>
89029
89030
namespace wuffs_aux {
89031
89032
DecodeImageResult::DecodeImageResult(MemOwner&& pixbuf_mem_owner0,
89033
                                     wuffs_base__pixel_buffer pixbuf0,
89034
                                     std::string&& error_message0)
89035
    : pixbuf_mem_owner(std::move(pixbuf_mem_owner0)),
89036
      pixbuf(pixbuf0),
89037
      error_message(std::move(error_message0)) {}
89038
89039
DecodeImageResult::DecodeImageResult(std::string&& error_message0)
89040
    : pixbuf_mem_owner(nullptr, &free),
89041
      pixbuf(wuffs_base__null_pixel_buffer()),
89042
      error_message(std::move(error_message0)) {}
89043
89044
DecodeImageCallbacks::~DecodeImageCallbacks() {}
89045
89046
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
89047
    MemOwner&& mem_owner0,
89048
    wuffs_base__pixel_buffer pixbuf0)
89049
    : mem_owner(std::move(mem_owner0)), pixbuf(pixbuf0), error_message("") {}
89050
89051
DecodeImageCallbacks::AllocPixbufResult::AllocPixbufResult(
89052
    std::string&& error_message0)
89053
    : mem_owner(nullptr, &free),
89054
      pixbuf(wuffs_base__null_pixel_buffer()),
89055
      error_message(std::move(error_message0)) {}
89056
89057
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
89058
    MemOwner&& mem_owner0,
89059
    wuffs_base__slice_u8 workbuf0)
89060
    : mem_owner(std::move(mem_owner0)), workbuf(workbuf0), error_message("") {}
89061
89062
DecodeImageCallbacks::AllocWorkbufResult::AllocWorkbufResult(
89063
    std::string&& error_message0)
89064
    : mem_owner(nullptr, &free),
89065
      workbuf(wuffs_base__empty_slice_u8()),
89066
      error_message(std::move(error_message0)) {}
89067
89068
wuffs_base__image_decoder::unique_ptr  //
89069
DecodeImageCallbacks::SelectDecoder(uint32_t fourcc,
89070
                                    wuffs_base__slice_u8 prefix_data,
89071
                                    bool prefix_closed) {
89072
  switch (fourcc) {
89073
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
89074
    case WUFFS_BASE__FOURCC__BMP:
89075
      return wuffs_bmp__decoder::alloc_as__wuffs_base__image_decoder();
89076
#endif
89077
89078
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
89079
    case WUFFS_BASE__FOURCC__ETC2:
89080
      return wuffs_etc2__decoder::alloc_as__wuffs_base__image_decoder();
89081
#endif
89082
89083
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
89084
    case WUFFS_BASE__FOURCC__GIF:
89085
      return wuffs_gif__decoder::alloc_as__wuffs_base__image_decoder();
89086
#endif
89087
89088
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
89089
    case WUFFS_BASE__FOURCC__HNSM:
89090
      return wuffs_handsum__decoder::alloc_as__wuffs_base__image_decoder();
89091
#endif
89092
89093
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
89094
    case WUFFS_BASE__FOURCC__JPEG:
89095
      return wuffs_jpeg__decoder::alloc_as__wuffs_base__image_decoder();
89096
#endif
89097
89098
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
89099
    case WUFFS_BASE__FOURCC__NIE:
89100
      return wuffs_nie__decoder::alloc_as__wuffs_base__image_decoder();
89101
#endif
89102
89103
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
89104
    case WUFFS_BASE__FOURCC__NPBM:
89105
      return wuffs_netpbm__decoder::alloc_as__wuffs_base__image_decoder();
89106
#endif
89107
89108
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
89109
    case WUFFS_BASE__FOURCC__PNG: {
89110
      auto dec = wuffs_png__decoder::alloc_as__wuffs_base__image_decoder();
89111
      // Favor faster decodes over rejecting invalid checksums.
89112
      dec->set_quirk(WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, 1);
89113
      return dec;
89114
    }
89115
#endif
89116
89117
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
89118
    case WUFFS_BASE__FOURCC__QOI:
89119
      return wuffs_qoi__decoder::alloc_as__wuffs_base__image_decoder();
89120
#endif
89121
89122
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
89123
    case WUFFS_BASE__FOURCC__TGA:
89124
      return wuffs_targa__decoder::alloc_as__wuffs_base__image_decoder();
89125
#endif
89126
89127
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
89128
    case WUFFS_BASE__FOURCC__TH:
89129
      return wuffs_thumbhash__decoder::alloc_as__wuffs_base__image_decoder();
89130
#endif
89131
89132
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
89133
    case WUFFS_BASE__FOURCC__WBMP:
89134
      return wuffs_wbmp__decoder::alloc_as__wuffs_base__image_decoder();
89135
#endif
89136
89137
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
89138
    case WUFFS_BASE__FOURCC__WEBP:
89139
      return wuffs_webp__decoder::alloc_as__wuffs_base__image_decoder();
89140
#endif
89141
  }
89142
89143
  return wuffs_base__image_decoder::unique_ptr(nullptr);
89144
}
89145
89146
std::string  //
89147
DecodeImageCallbacks::HandleMetadata(const wuffs_base__more_information& minfo,
89148
                                     wuffs_base__slice_u8 raw) {
89149
  return "";
89150
}
89151
89152
wuffs_base__pixel_format  //
89153
DecodeImageCallbacks::SelectPixfmt(
89154
    const wuffs_base__image_config& image_config) {
89155
  return wuffs_base__make_pixel_format(WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL);
89156
}
89157
89158
DecodeImageCallbacks::AllocPixbufResult  //
89159
DecodeImageCallbacks::AllocPixbuf(const wuffs_base__image_config& image_config,
89160
                                  bool allow_uninitialized_memory) {
89161
  uint32_t w = image_config.pixcfg.width();
89162
  uint32_t h = image_config.pixcfg.height();
89163
  if ((w == 0) || (h == 0)) {
89164
    return AllocPixbufResult("");
89165
  }
89166
  uint64_t len = image_config.pixcfg.pixbuf_len();
89167
  if ((len == 0) || (SIZE_MAX < len)) {
89168
    return AllocPixbufResult(DecodeImage_UnsupportedPixelConfiguration);
89169
  }
89170
  void* ptr =
89171
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
89172
  if (!ptr) {
89173
    return AllocPixbufResult(DecodeImage_OutOfMemory);
89174
  }
89175
  wuffs_base__pixel_buffer pixbuf;
89176
  wuffs_base__status status = pixbuf.set_from_slice(
89177
      &image_config.pixcfg,
89178
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
89179
  if (!status.is_ok()) {
89180
    free(ptr);
89181
    return AllocPixbufResult(status.message());
89182
  }
89183
  return AllocPixbufResult(MemOwner(ptr, &free), pixbuf);
89184
}
89185
89186
DecodeImageCallbacks::AllocWorkbufResult  //
89187
DecodeImageCallbacks::AllocWorkbuf(wuffs_base__range_ii_u64 len_range,
89188
                                   bool allow_uninitialized_memory) {
89189
  uint64_t len = len_range.max_incl;
89190
  if (len == 0) {
89191
    return AllocWorkbufResult("");
89192
  } else if (SIZE_MAX < len) {
89193
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
89194
  }
89195
  void* ptr =
89196
      allow_uninitialized_memory ? malloc((size_t)len) : calloc(1, (size_t)len);
89197
  if (!ptr) {
89198
    return AllocWorkbufResult(DecodeImage_OutOfMemory);
89199
  }
89200
  return AllocWorkbufResult(
89201
      MemOwner(ptr, &free),
89202
      wuffs_base__make_slice_u8((uint8_t*)ptr, (size_t)len));
89203
}
89204
89205
void  //
89206
DecodeImageCallbacks::Done(
89207
    DecodeImageResult& result,
89208
    sync_io::Input& input,
89209
    IOBuffer& buffer,
89210
    wuffs_base__image_decoder::unique_ptr image_decoder) {}
89211
89212
const char DecodeImage_BufferIsTooShort[] =  //
89213
    "wuffs_aux::DecodeImage: buffer is too short";
89214
const char DecodeImage_MaxInclDimensionExceeded[] =  //
89215
    "wuffs_aux::DecodeImage: max_incl_dimension exceeded";
89216
const char DecodeImage_MaxInclMetadataLengthExceeded[] =  //
89217
    "wuffs_aux::DecodeImage: max_incl_metadata_length exceeded";
89218
const char DecodeImage_OutOfMemory[] =  //
89219
    "wuffs_aux::DecodeImage: out of memory";
89220
const char DecodeImage_UnexpectedEndOfFile[] =  //
89221
    "wuffs_aux::DecodeImage: unexpected end of file";
89222
const char DecodeImage_UnsupportedImageFormat[] =  //
89223
    "wuffs_aux::DecodeImage: unsupported image format";
89224
const char DecodeImage_UnsupportedMetadata[] =  //
89225
    "wuffs_aux::DecodeImage: unsupported metadata";
89226
const char DecodeImage_UnsupportedPixelBlend[] =  //
89227
    "wuffs_aux::DecodeImage: unsupported pixel blend";
89228
const char DecodeImage_UnsupportedPixelConfiguration[] =  //
89229
    "wuffs_aux::DecodeImage: unsupported pixel configuration";
89230
const char DecodeImage_UnsupportedPixelFormat[] =  //
89231
    "wuffs_aux::DecodeImage: unsupported pixel format";
89232
89233
DecodeImageArgQuirks::DecodeImageArgQuirks(const QuirkKeyValuePair* ptr0,
89234
                                           const size_t len0)
89235
    : ptr(ptr0), len(len0) {}
89236
89237
DecodeImageArgQuirks  //
89238
DecodeImageArgQuirks::DefaultValue() {
89239
  return DecodeImageArgQuirks(nullptr, 0);
89240
}
89241
89242
DecodeImageArgFlags::DecodeImageArgFlags(uint64_t repr0) : repr(repr0) {}
89243
89244
DecodeImageArgFlags  //
89245
DecodeImageArgFlags::DefaultValue() {
89246
  return DecodeImageArgFlags(0);
89247
}
89248
89249
DecodeImageArgPixelBlend::DecodeImageArgPixelBlend(
89250
    wuffs_base__pixel_blend repr0)
89251
    : repr(repr0) {}
89252
89253
DecodeImageArgPixelBlend  //
89254
DecodeImageArgPixelBlend::DefaultValue() {
89255
  return DecodeImageArgPixelBlend(WUFFS_BASE__PIXEL_BLEND__SRC);
89256
}
89257
89258
DecodeImageArgBackgroundColor::DecodeImageArgBackgroundColor(
89259
    wuffs_base__color_u32_argb_premul repr0)
89260
    : repr(repr0) {}
89261
89262
DecodeImageArgBackgroundColor  //
89263
DecodeImageArgBackgroundColor::DefaultValue() {
89264
  return DecodeImageArgBackgroundColor(1);
89265
}
89266
89267
DecodeImageArgMaxInclDimension::DecodeImageArgMaxInclDimension(uint32_t repr0)
89268
    : repr(repr0) {}
89269
89270
DecodeImageArgMaxInclDimension  //
89271
DecodeImageArgMaxInclDimension::DefaultValue() {
89272
  return DecodeImageArgMaxInclDimension(1048575);
89273
}
89274
89275
DecodeImageArgMaxInclMetadataLength::DecodeImageArgMaxInclMetadataLength(
89276
    uint64_t repr0)
89277
    : repr(repr0) {}
89278
89279
DecodeImageArgMaxInclMetadataLength  //
89280
DecodeImageArgMaxInclMetadataLength::DefaultValue() {
89281
  return DecodeImageArgMaxInclMetadataLength(16777215);
89282
}
89283
89284
// --------
89285
89286
namespace {
89287
89288
const private_impl::ErrorMessages DecodeImageErrorMessages = {
89289
    DecodeImage_MaxInclMetadataLengthExceeded,  //
89290
    DecodeImage_OutOfMemory,                    //
89291
    DecodeImage_UnexpectedEndOfFile,            //
89292
    DecodeImage_UnsupportedMetadata,            //
89293
    DecodeImage_UnsupportedImageFormat,         //
89294
};
89295
89296
std::string  //
89297
DecodeImageAdvanceIOBufferTo(sync_io::Input& input,
89298
                             wuffs_base__io_buffer& io_buf,
89299
                             uint64_t absolute_position) {
89300
  return private_impl::AdvanceIOBufferTo(DecodeImageErrorMessages, input,
89301
                                         io_buf, absolute_position);
89302
}
89303
89304
wuffs_base__status  //
89305
DIHM0(void* self,
89306
      wuffs_base__io_buffer* a_dst,
89307
      wuffs_base__more_information* a_minfo,
89308
      wuffs_base__io_buffer* a_src) {
89309
  return wuffs_base__image_decoder__tell_me_more(
89310
      static_cast<wuffs_base__image_decoder*>(self), a_dst, a_minfo, a_src);
89311
}
89312
89313
std::string  //
89314
DIHM1(void* self,
89315
      const wuffs_base__more_information* minfo,
89316
      wuffs_base__slice_u8 raw) {
89317
  return static_cast<DecodeImageCallbacks*>(self)->HandleMetadata(*minfo, raw);
89318
}
89319
89320
std::string  //
89321
DecodeImageHandleMetadata(wuffs_base__image_decoder::unique_ptr& image_decoder,
89322
                          DecodeImageCallbacks& callbacks,
89323
                          sync_io::Input& input,
89324
                          wuffs_base__io_buffer& io_buf,
89325
                          sync_io::DynIOBuffer& raw_metadata_buf) {
89326
  return private_impl::HandleMetadata(DecodeImageErrorMessages, input, io_buf,
89327
                                      raw_metadata_buf, DIHM0,
89328
                                      static_cast<void*>(image_decoder.get()),
89329
                                      DIHM1, static_cast<void*>(&callbacks));
89330
}
89331
89332
DecodeImageResult  //
89333
DecodeImage0(wuffs_base__image_decoder::unique_ptr& image_decoder,
89334
             DecodeImageCallbacks& callbacks,
89335
             sync_io::Input& input,
89336
             wuffs_base__io_buffer& io_buf,
89337
             const QuirkKeyValuePair* quirks_ptr,
89338
             const size_t quirks_len,
89339
             uint64_t flags,
89340
             wuffs_base__pixel_blend pixel_blend,
89341
             wuffs_base__color_u32_argb_premul background_color,
89342
             uint32_t max_incl_dimension,
89343
             uint64_t max_incl_metadata_length) {
89344
  // Check args.
89345
  switch (pixel_blend) {
89346
    case WUFFS_BASE__PIXEL_BLEND__SRC:
89347
    case WUFFS_BASE__PIXEL_BLEND__SRC_OVER:
89348
      break;
89349
    default:
89350
      return DecodeImageResult(DecodeImage_UnsupportedPixelBlend);
89351
  }
89352
89353
  wuffs_base__image_config image_config = wuffs_base__null_image_config();
89354
  sync_io::DynIOBuffer raw_metadata_buf(max_incl_metadata_length);
89355
  uint64_t start_pos = io_buf.reader_position();
89356
  bool interested_in_metadata_after_the_frame = false;
89357
  bool redirected = false;
89358
  int32_t fourcc = 0;
89359
redirect:
89360
  do {
89361
    // Determine the image format.
89362
    if (!redirected) {
89363
      while (true) {
89364
        fourcc = wuffs_base__magic_number_guess_fourcc(io_buf.reader_slice(),
89365
                                                       io_buf.meta.closed);
89366
        if (fourcc > 0) {
89367
          break;
89368
        } else if ((fourcc == 0) && (io_buf.reader_length() >= 64)) {
89369
          // Having (fourcc == 0) means that Wuffs' built in MIME sniffer
89370
          // didn't recognize the image format. Nonetheless, custom callbacks
89371
          // may still be able to do their own MIME sniffing, for exotic image
89372
          // types. We try to give them at least 64 bytes of prefix data when
89373
          // one-shot-calling callbacks.SelectDecoder. There is no mechanism
89374
          // for the callbacks to request a longer prefix.
89375
          break;
89376
        } else if (io_buf.meta.closed || (io_buf.writer_length() == 0)) {
89377
          fourcc = 0;
89378
          break;
89379
        }
89380
        std::string error_message = input.CopyIn(&io_buf);
89381
        if (!error_message.empty()) {
89382
          return DecodeImageResult(std::move(error_message));
89383
        }
89384
      }
89385
    } else {
89386
      wuffs_base__io_buffer empty = wuffs_base__empty_io_buffer();
89387
      wuffs_base__more_information minfo = wuffs_base__empty_more_information();
89388
      wuffs_base__status tmm_status =
89389
          image_decoder->tell_me_more(&empty, &minfo, &io_buf);
89390
      if (tmm_status.repr != nullptr) {
89391
        return DecodeImageResult(tmm_status.message());
89392
      }
89393
      if (minfo.flavor != WUFFS_BASE__MORE_INFORMATION__FLAVOR__IO_REDIRECT) {
89394
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
89395
      }
89396
      uint64_t pos = minfo.io_redirect__range().min_incl;
89397
      if (pos <= start_pos) {
89398
        // Redirects must go forward.
89399
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
89400
      }
89401
      std::string error_message =
89402
          DecodeImageAdvanceIOBufferTo(input, io_buf, pos);
89403
      if (!error_message.empty()) {
89404
        return DecodeImageResult(std::move(error_message));
89405
      }
89406
      fourcc = (int32_t)(minfo.io_redirect__fourcc());
89407
      if (fourcc == 0) {
89408
        return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
89409
      }
89410
      image_decoder.reset();
89411
    }
89412
89413
    // Select the image decoder.
89414
    image_decoder = callbacks.SelectDecoder(
89415
        (uint32_t)fourcc, io_buf.reader_slice(), io_buf.meta.closed);
89416
    if (!image_decoder) {
89417
      return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
89418
    }
89419
89420
    // Apply quirks.
89421
    for (size_t i = 0; i < quirks_len; i++) {
89422
      image_decoder->set_quirk(quirks_ptr[i].first, quirks_ptr[i].second);
89423
    }
89424
89425
    // Apply flags.
89426
    if (flags != 0) {
89427
      if (flags & DecodeImageArgFlags::REPORT_METADATA_CHRM) {
89428
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__CHRM, true);
89429
      }
89430
      if (flags & DecodeImageArgFlags::REPORT_METADATA_EXIF) {
89431
        interested_in_metadata_after_the_frame = true;
89432
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__EXIF, true);
89433
      }
89434
      if (flags & DecodeImageArgFlags::REPORT_METADATA_GAMA) {
89435
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__GAMA, true);
89436
      }
89437
      if (flags & DecodeImageArgFlags::REPORT_METADATA_ICCP) {
89438
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__ICCP, true);
89439
      }
89440
      if (flags & DecodeImageArgFlags::REPORT_METADATA_KVP) {
89441
        interested_in_metadata_after_the_frame = true;
89442
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__KVP, true);
89443
      }
89444
      if (flags & DecodeImageArgFlags::REPORT_METADATA_SRGB) {
89445
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__SRGB, true);
89446
      }
89447
      if (flags & DecodeImageArgFlags::REPORT_METADATA_XMP) {
89448
        interested_in_metadata_after_the_frame = true;
89449
        image_decoder->set_report_metadata(WUFFS_BASE__FOURCC__XMP, true);
89450
      }
89451
    }
89452
89453
    // Decode the image config.
89454
    while (true) {
89455
      wuffs_base__status id_dic_status =
89456
          image_decoder->decode_image_config(&image_config, &io_buf);
89457
      if (id_dic_status.repr == nullptr) {
89458
        break;
89459
      } else if (id_dic_status.repr == wuffs_base__note__i_o_redirect) {
89460
        if (redirected) {
89461
          return DecodeImageResult(DecodeImage_UnsupportedImageFormat);
89462
        }
89463
        redirected = true;
89464
        goto redirect;
89465
      } else if (id_dic_status.repr == wuffs_base__note__metadata_reported) {
89466
        std::string error_message = DecodeImageHandleMetadata(
89467
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
89468
        if (!error_message.empty()) {
89469
          return DecodeImageResult(std::move(error_message));
89470
        }
89471
      } else if (id_dic_status.repr != wuffs_base__suspension__short_read) {
89472
        return DecodeImageResult(id_dic_status.message());
89473
      } else if (io_buf.meta.closed) {
89474
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
89475
      } else {
89476
        std::string error_message = input.CopyIn(&io_buf);
89477
        if (!error_message.empty()) {
89478
          return DecodeImageResult(std::move(error_message));
89479
        }
89480
      }
89481
    }
89482
  } while (false);
89483
  if (!interested_in_metadata_after_the_frame) {
89484
    raw_metadata_buf.drop();
89485
  }
89486
89487
  // Select the pixel format.
89488
  uint32_t w = image_config.pixcfg.width();
89489
  uint32_t h = image_config.pixcfg.height();
89490
  if ((w > max_incl_dimension) || (h > max_incl_dimension)) {
89491
    return DecodeImageResult(DecodeImage_MaxInclDimensionExceeded);
89492
  }
89493
  wuffs_base__pixel_format pixel_format = callbacks.SelectPixfmt(image_config);
89494
  if (pixel_format.repr != image_config.pixcfg.pixel_format().repr) {
89495
    switch (pixel_format.repr) {
89496
      case WUFFS_BASE__PIXEL_FORMAT__Y:
89497
      case WUFFS_BASE__PIXEL_FORMAT__BGR_565:
89498
      case WUFFS_BASE__PIXEL_FORMAT__BGR:
89499
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL:
89500
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL_4X16LE:
89501
      case WUFFS_BASE__PIXEL_FORMAT__BGRA_PREMUL:
89502
      case WUFFS_BASE__PIXEL_FORMAT__RGB:
89503
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL:
89504
      case WUFFS_BASE__PIXEL_FORMAT__RGBA_PREMUL:
89505
        break;
89506
      default:
89507
        return DecodeImageResult(DecodeImage_UnsupportedPixelFormat);
89508
    }
89509
    image_config.pixcfg.set(pixel_format.repr,
89510
                            WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
89511
  }
89512
89513
  // Allocate the pixel buffer.
89514
  bool valid_background_color =
89515
      wuffs_base__color_u32_argb_premul__is_valid(background_color);
89516
  DecodeImageCallbacks::AllocPixbufResult alloc_pixbuf_result =
89517
      callbacks.AllocPixbuf(image_config, valid_background_color);
89518
  if (!alloc_pixbuf_result.error_message.empty()) {
89519
    return DecodeImageResult(std::move(alloc_pixbuf_result.error_message));
89520
  }
89521
  wuffs_base__pixel_buffer pixel_buffer = alloc_pixbuf_result.pixbuf;
89522
  if (valid_background_color) {
89523
    wuffs_base__status pb_scufr_status = pixel_buffer.set_color_u32_fill_rect(
89524
        pixel_buffer.pixcfg.bounds(), background_color);
89525
    if (pb_scufr_status.repr != nullptr) {
89526
      return DecodeImageResult(pb_scufr_status.message());
89527
    }
89528
  }
89529
89530
  // Allocate the work buffer. Wuffs' decoders conventionally assume that this
89531
  // can be uninitialized memory.
89532
  wuffs_base__range_ii_u64 workbuf_len = image_decoder->workbuf_len();
89533
  DecodeImageCallbacks::AllocWorkbufResult alloc_workbuf_result =
89534
      callbacks.AllocWorkbuf(workbuf_len, true);
89535
  if (!alloc_workbuf_result.error_message.empty()) {
89536
    return DecodeImageResult(std::move(alloc_workbuf_result.error_message));
89537
  } else if (alloc_workbuf_result.workbuf.len < workbuf_len.min_incl) {
89538
    return DecodeImageResult(DecodeImage_BufferIsTooShort);
89539
  }
89540
89541
  // Decode the frame config.
89542
  wuffs_base__frame_config frame_config = wuffs_base__null_frame_config();
89543
  while (true) {
89544
    wuffs_base__status id_dfc_status =
89545
        image_decoder->decode_frame_config(&frame_config, &io_buf);
89546
    if (id_dfc_status.repr == nullptr) {
89547
      break;
89548
    } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
89549
      std::string error_message = DecodeImageHandleMetadata(
89550
          image_decoder, callbacks, input, io_buf, raw_metadata_buf);
89551
      if (!error_message.empty()) {
89552
        return DecodeImageResult(std::move(error_message));
89553
      }
89554
    } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
89555
      return DecodeImageResult(id_dfc_status.message());
89556
    } else if (io_buf.meta.closed) {
89557
      return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
89558
    } else {
89559
      std::string error_message = input.CopyIn(&io_buf);
89560
      if (!error_message.empty()) {
89561
        return DecodeImageResult(std::move(error_message));
89562
      }
89563
    }
89564
  }
89565
89566
  // Decode the frame (the pixels).
89567
  //
89568
  // From here on, always returns the pixel_buffer. If we get this far, we can
89569
  // still display a partial image, even if we encounter an error.
89570
  std::string message("");
89571
  if ((pixel_blend == WUFFS_BASE__PIXEL_BLEND__SRC_OVER) &&
89572
      frame_config.overwrite_instead_of_blend()) {
89573
    pixel_blend = WUFFS_BASE__PIXEL_BLEND__SRC;
89574
  }
89575
  while (true) {
89576
    wuffs_base__status id_df_status =
89577
        image_decoder->decode_frame(&pixel_buffer, &io_buf, pixel_blend,
89578
                                    alloc_workbuf_result.workbuf, nullptr);
89579
    if (id_df_status.repr == nullptr) {
89580
      break;
89581
    } else if (id_df_status.repr != wuffs_base__suspension__short_read) {
89582
      message = id_df_status.message();
89583
      break;
89584
    } else if (io_buf.meta.closed) {
89585
      message = DecodeImage_UnexpectedEndOfFile;
89586
      break;
89587
    } else {
89588
      std::string error_message = input.CopyIn(&io_buf);
89589
      if (!error_message.empty()) {
89590
        message = std::move(error_message);
89591
        break;
89592
      }
89593
    }
89594
  }
89595
89596
  // Decode any metadata after the frame.
89597
  if (interested_in_metadata_after_the_frame) {
89598
    while (true) {
89599
      wuffs_base__status id_dfc_status =
89600
          image_decoder->decode_frame_config(NULL, &io_buf);
89601
      if (id_dfc_status.repr == wuffs_base__note__end_of_data) {
89602
        break;
89603
      } else if (id_dfc_status.repr == nullptr) {
89604
        continue;
89605
      } else if (id_dfc_status.repr == wuffs_base__note__metadata_reported) {
89606
        std::string error_message = DecodeImageHandleMetadata(
89607
            image_decoder, callbacks, input, io_buf, raw_metadata_buf);
89608
        if (!error_message.empty()) {
89609
          return DecodeImageResult(std::move(error_message));
89610
        }
89611
      } else if (id_dfc_status.repr != wuffs_base__suspension__short_read) {
89612
        return DecodeImageResult(id_dfc_status.message());
89613
      } else if (io_buf.meta.closed) {
89614
        return DecodeImageResult(DecodeImage_UnexpectedEndOfFile);
89615
      } else {
89616
        std::string error_message = input.CopyIn(&io_buf);
89617
        if (!error_message.empty()) {
89618
          return DecodeImageResult(std::move(error_message));
89619
        }
89620
      }
89621
    }
89622
  }
89623
89624
  return DecodeImageResult(std::move(alloc_pixbuf_result.mem_owner),
89625
                           pixel_buffer, std::move(message));
89626
}
89627
89628
}  // namespace
89629
89630
DecodeImageResult  //
89631
DecodeImage(DecodeImageCallbacks& callbacks,
89632
            sync_io::Input& input,
89633
            DecodeImageArgQuirks quirks,
89634
            DecodeImageArgFlags flags,
89635
            DecodeImageArgPixelBlend pixel_blend,
89636
            DecodeImageArgBackgroundColor background_color,
89637
            DecodeImageArgMaxInclDimension max_incl_dimension,
89638
            DecodeImageArgMaxInclMetadataLength max_incl_metadata_length) {
89639
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
89640
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
89641
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
89642
  if (!io_buf) {
89643
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[32768]);
89644
    fallback_io_buf =
89645
        wuffs_base__ptr_u8__writer(fallback_io_array.get(), 32768);
89646
    io_buf = &fallback_io_buf;
89647
  }
89648
89649
  wuffs_base__image_decoder::unique_ptr image_decoder(nullptr);
89650
  DecodeImageResult result = DecodeImage0(
89651
      image_decoder, callbacks, input, *io_buf, quirks.ptr, quirks.len,
89652
      flags.repr, pixel_blend.repr, background_color.repr,
89653
      max_incl_dimension.repr, max_incl_metadata_length.repr);
89654
  callbacks.Done(result, input, *io_buf, std::move(image_decoder));
89655
  return result;
89656
}
89657
89658
}  // namespace wuffs_aux
89659
89660
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
89661
        // defined(WUFFS_CONFIG__MODULE__AUX__IMAGE)
89662
89663
// ---------------- Auxiliary - JSON
89664
89665
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__AUX__JSON)
89666
89667
#include <utility>
89668
89669
namespace wuffs_aux {
89670
89671
DecodeJsonResult::DecodeJsonResult(std::string&& error_message0,
89672
                                   uint64_t cursor_position0)
89673
    : error_message(std::move(error_message0)),
89674
      cursor_position(cursor_position0) {}
89675
89676
DecodeJsonCallbacks::~DecodeJsonCallbacks() {}
89677
89678
void  //
89679
DecodeJsonCallbacks::Done(DecodeJsonResult& result,
89680
                          sync_io::Input& input,
89681
                          IOBuffer& buffer) {}
89682
89683
const char DecodeJson_BadJsonPointer[] =  //
89684
    "wuffs_aux::DecodeJson: bad JSON Pointer";
89685
const char DecodeJson_NoMatch[] =  //
89686
    "wuffs_aux::DecodeJson: no match";
89687
89688
DecodeJsonArgQuirks::DecodeJsonArgQuirks(const QuirkKeyValuePair* ptr0,
89689
                                         const size_t len0)
89690
    : ptr(ptr0), len(len0) {}
89691
89692
DecodeJsonArgQuirks  //
89693
DecodeJsonArgQuirks::DefaultValue() {
89694
  return DecodeJsonArgQuirks(nullptr, 0);
89695
}
89696
89697
DecodeJsonArgJsonPointer::DecodeJsonArgJsonPointer(std::string repr0)
89698
    : repr(repr0) {}
89699
89700
DecodeJsonArgJsonPointer  //
89701
DecodeJsonArgJsonPointer::DefaultValue() {
89702
  return DecodeJsonArgJsonPointer(std::string());
89703
}
89704
89705
// --------
89706
89707
#define WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN                          \
89708
  while (tok_buf.meta.ri >= tok_buf.meta.wi) {                              \
89709
    if (tok_status.repr == nullptr) {                                       \
89710
      goto done;                                                            \
89711
    } else if (tok_status.repr == wuffs_base__suspension__short_write) {    \
89712
      tok_buf.compact();                                                    \
89713
    } else if (tok_status.repr == wuffs_base__suspension__short_read) {     \
89714
      if (!io_error_message.empty()) {                                      \
89715
        ret_error_message = std::move(io_error_message);                    \
89716
        goto done;                                                          \
89717
      } else if (cursor_index != io_buf->meta.ri) {                         \
89718
        ret_error_message =                                                 \
89719
            "wuffs_aux::DecodeJson: internal error: bad cursor_index";      \
89720
        goto done;                                                          \
89721
      } else if (io_buf->meta.closed) {                                     \
89722
        ret_error_message =                                                 \
89723
            "wuffs_aux::DecodeJson: internal error: io_buf is closed";      \
89724
        goto done;                                                          \
89725
      }                                                                     \
89726
      io_buf->compact();                                                    \
89727
      if (io_buf->meta.wi >= io_buf->data.len) {                            \
89728
        ret_error_message =                                                 \
89729
            "wuffs_aux::DecodeJson: internal error: io_buf is full";        \
89730
        goto done;                                                          \
89731
      }                                                                     \
89732
      cursor_index = io_buf->meta.ri;                                       \
89733
      io_error_message = input.CopyIn(io_buf);                              \
89734
    } else {                                                                \
89735
      ret_error_message = tok_status.message();                             \
89736
      goto done;                                                            \
89737
    }                                                                       \
89738
    tok_status =                                                            \
89739
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8()); \
89740
    if ((tok_buf.meta.ri > tok_buf.meta.wi) ||                              \
89741
        (tok_buf.meta.wi > tok_buf.data.len) ||                             \
89742
        (io_buf->meta.ri > io_buf->meta.wi) ||                              \
89743
        (io_buf->meta.wi > io_buf->data.len)) {                             \
89744
      ret_error_message =                                                   \
89745
          "wuffs_aux::DecodeJson: internal error: bad buffer indexes";      \
89746
      goto done;                                                            \
89747
    }                                                                       \
89748
  }                                                                         \
89749
  wuffs_base__token token = tok_buf.data.ptr[tok_buf.meta.ri++];            \
89750
  uint64_t token_len = token.length();                                      \
89751
  if ((io_buf->meta.ri < cursor_index) ||                                   \
89752
      ((io_buf->meta.ri - cursor_index) < token_len)) {                     \
89753
    ret_error_message =                                                     \
89754
        "wuffs_aux::DecodeJson: internal error: bad token indexes";         \
89755
    goto done;                                                              \
89756
  }                                                                         \
89757
  uint8_t* token_ptr = io_buf->data.ptr + cursor_index;                     \
89758
  (void)(token_ptr);                                                        \
89759
  cursor_index += static_cast<size_t>(token_len)
89760
89761
// --------
89762
89763
namespace {
89764
89765
// DecodeJson_SplitJsonPointer returns ("bar", 8) for ("/foo/bar/b~1z/qux", 5,
89766
// etc). It returns a 0 size_t when s has invalid JSON Pointer syntax or i is
89767
// out of bounds.
89768
//
89769
// The string returned is unescaped. If calling it again, this time with i=8,
89770
// the "b~1z" substring would be returned as "b/z".
89771
std::pair<std::string, size_t>  //
89772
DecodeJson_SplitJsonPointer(std::string& s,
89773
                            size_t i,
89774
                            bool allow_tilde_n_tilde_r_tilde_t) {
89775
  std::string fragment;
89776
  if (i > s.size()) {
89777
    return std::make_pair(std::string(), 0);
89778
  }
89779
  while (i < s.size()) {
89780
    char c = s[i];
89781
    if (c == '/') {
89782
      break;
89783
    } else if (c != '~') {
89784
      fragment.push_back(c);
89785
      i++;
89786
      continue;
89787
    }
89788
    i++;
89789
    if (i >= s.size()) {
89790
      return std::make_pair(std::string(), 0);
89791
    }
89792
    c = s[i];
89793
    if (c == '0') {
89794
      fragment.push_back('~');
89795
      i++;
89796
      continue;
89797
    } else if (c == '1') {
89798
      fragment.push_back('/');
89799
      i++;
89800
      continue;
89801
    } else if (allow_tilde_n_tilde_r_tilde_t) {
89802
      if (c == 'n') {
89803
        fragment.push_back('\n');
89804
        i++;
89805
        continue;
89806
      } else if (c == 'r') {
89807
        fragment.push_back('\r');
89808
        i++;
89809
        continue;
89810
      } else if (c == 't') {
89811
        fragment.push_back('\t');
89812
        i++;
89813
        continue;
89814
      }
89815
    }
89816
    return std::make_pair(std::string(), 0);
89817
  }
89818
  return std::make_pair(std::move(fragment), i);
89819
}
89820
89821
// --------
89822
89823
std::string  //
89824
DecodeJson_WalkJsonPointerFragment(wuffs_base__token_buffer& tok_buf,
89825
                                   wuffs_base__status& tok_status,
89826
                                   wuffs_json__decoder::unique_ptr& dec,
89827
                                   wuffs_base__io_buffer* io_buf,
89828
                                   std::string& io_error_message,
89829
                                   size_t& cursor_index,
89830
                                   sync_io::Input& input,
89831
                                   std::string& json_pointer_fragment) {
89832
  std::string ret_error_message;
89833
  while (true) {
89834
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
89835
89836
    int64_t vbc = token.value_base_category();
89837
    uint64_t vbd = token.value_base_detail();
89838
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
89839
      continue;
89840
    } else if ((vbc != WUFFS_BASE__TOKEN__VBC__STRUCTURE) ||
89841
               !(vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH)) {
89842
      return DecodeJson_NoMatch;
89843
    } else if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST) {
89844
      goto do_list;
89845
    }
89846
    goto do_dict;
89847
  }
89848
89849
do_dict:
89850
  // Alternate between these two things:
89851
  //  1. Decode the next dict key (a string). If it matches the fragment, we're
89852
  //    done (success). If we've reached the dict's end (VBD__STRUCTURE__POP)
89853
  //    so that there was no next dict key, we're done (failure).
89854
  //  2. Otherwise, skip the next dict value.
89855
  while (true) {
89856
    for (std::string str; true;) {
89857
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
89858
89859
      int64_t vbc = token.value_base_category();
89860
      uint64_t vbd = token.value_base_detail();
89861
      switch (vbc) {
89862
        case WUFFS_BASE__TOKEN__VBC__FILLER:
89863
          continue;
89864
89865
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE:
89866
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
89867
            goto fail;
89868
          }
89869
          return DecodeJson_NoMatch;
89870
89871
        case WUFFS_BASE__TOKEN__VBC__STRING: {
89872
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
89873
            // No-op.
89874
          } else if (vbd &
89875
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
89876
            const char* ptr =  // Convert from (uint8_t*).
89877
                static_cast<const char*>(static_cast<void*>(token_ptr));
89878
            str.append(ptr, static_cast<size_t>(token_len));
89879
          } else {
89880
            goto fail;
89881
          }
89882
          break;
89883
        }
89884
89885
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
89886
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
89887
          size_t n = wuffs_base__utf_8__encode(
89888
              wuffs_base__make_slice_u8(
89889
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
89890
              static_cast<uint32_t>(vbd));
89891
          const char* ptr =  // Convert from (uint8_t*).
89892
              static_cast<const char*>(static_cast<void*>(&u[0]));
89893
          str.append(ptr, n);
89894
          break;
89895
        }
89896
89897
        default:
89898
          goto fail;
89899
      }
89900
89901
      if (token.continued()) {
89902
        continue;
89903
      }
89904
      if (str == json_pointer_fragment) {
89905
        return "";
89906
      }
89907
      goto skip_the_next_dict_value;
89908
    }
89909
89910
  skip_the_next_dict_value:
89911
    for (uint32_t skip_depth = 0; true;) {
89912
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
89913
89914
      int64_t vbc = token.value_base_category();
89915
      uint64_t vbd = token.value_base_detail();
89916
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
89917
        continue;
89918
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
89919
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
89920
          skip_depth++;
89921
          continue;
89922
        }
89923
        skip_depth--;
89924
      }
89925
89926
      if (skip_depth == 0) {
89927
        break;
89928
      }
89929
    }  // skip_the_next_dict_value
89930
  }    // do_dict
89931
89932
do_list:
89933
  do {
89934
    wuffs_base__result_u64 result_u64 = wuffs_base__parse_number_u64(
89935
        wuffs_base__make_slice_u8(
89936
            static_cast<uint8_t*>(static_cast<void*>(
89937
                const_cast<char*>(json_pointer_fragment.data()))),
89938
            json_pointer_fragment.size()),
89939
        WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
89940
    if (!result_u64.status.is_ok()) {
89941
      return DecodeJson_NoMatch;
89942
    }
89943
    uint64_t remaining = result_u64.value;
89944
    if (remaining == 0) {
89945
      goto check_that_a_value_follows;
89946
    }
89947
    for (uint32_t skip_depth = 0; true;) {
89948
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
89949
89950
      int64_t vbc = token.value_base_category();
89951
      uint64_t vbd = token.value_base_detail();
89952
      if (token.continued() || (vbc == WUFFS_BASE__TOKEN__VBC__FILLER)) {
89953
        continue;
89954
      } else if (vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) {
89955
        if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
89956
          skip_depth++;
89957
          continue;
89958
        }
89959
        if (skip_depth == 0) {
89960
          return DecodeJson_NoMatch;
89961
        }
89962
        skip_depth--;
89963
      }
89964
89965
      if (skip_depth > 0) {
89966
        continue;
89967
      }
89968
      remaining--;
89969
      if (remaining == 0) {
89970
        goto check_that_a_value_follows;
89971
      }
89972
    }
89973
  } while (false);  // do_list
89974
89975
check_that_a_value_follows:
89976
  while (true) {
89977
    WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
89978
89979
    int64_t vbc = token.value_base_category();
89980
    uint64_t vbd = token.value_base_detail();
89981
    if (vbc == WUFFS_BASE__TOKEN__VBC__FILLER) {
89982
      continue;
89983
    }
89984
89985
    // Undo the last part of WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN, so
89986
    // that we're only peeking at the next token.
89987
    tok_buf.meta.ri--;
89988
    cursor_index -= static_cast<size_t>(token_len);
89989
89990
    if ((vbc == WUFFS_BASE__TOKEN__VBC__STRUCTURE) &&
89991
        (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP)) {
89992
      return DecodeJson_NoMatch;
89993
    }
89994
    return "";
89995
  }  // check_that_a_value_follows
89996
89997
fail:
89998
  return "wuffs_aux::DecodeJson: internal error: unexpected token";
89999
done:
90000
  return ret_error_message;
90001
}
90002
90003
}  // namespace
90004
90005
// --------
90006
90007
DecodeJsonResult  //
90008
DecodeJson(DecodeJsonCallbacks& callbacks,
90009
           sync_io::Input& input,
90010
           DecodeJsonArgQuirks quirks,
90011
           DecodeJsonArgJsonPointer json_pointer) {
90012
  // Prepare the wuffs_base__io_buffer and the resultant error_message.
90013
  wuffs_base__io_buffer* io_buf = input.BringsItsOwnIOBuffer();
90014
  wuffs_base__io_buffer fallback_io_buf = wuffs_base__empty_io_buffer();
90015
  std::unique_ptr<uint8_t[]> fallback_io_array(nullptr);
90016
  if (!io_buf) {
90017
    fallback_io_array = std::unique_ptr<uint8_t[]>(new uint8_t[4096]);
90018
    fallback_io_buf = wuffs_base__ptr_u8__writer(fallback_io_array.get(), 4096);
90019
    io_buf = &fallback_io_buf;
90020
  }
90021
  // cursor_index is discussed at
90022
  // https://nigeltao.github.io/blog/2020/jsonptr.html#the-cursor-index
90023
  size_t cursor_index = 0;
90024
  std::string ret_error_message;
90025
  std::string io_error_message;
90026
90027
  do {
90028
    // Prepare the low-level JSON decoder.
90029
    wuffs_json__decoder::unique_ptr dec = wuffs_json__decoder::alloc();
90030
    if (!dec) {
90031
      ret_error_message = "wuffs_aux::DecodeJson: out of memory";
90032
      goto done;
90033
    } else if (WUFFS_JSON__DECODER_WORKBUF_LEN_MAX_INCL_WORST_CASE != 0) {
90034
      ret_error_message =
90035
          "wuffs_aux::DecodeJson: internal error: bad WORKBUF_LEN";
90036
      goto done;
90037
    }
90038
    bool allow_tilde_n_tilde_r_tilde_t = false;
90039
    for (size_t i = 0; i < quirks.len; i++) {
90040
      dec->set_quirk(quirks.ptr[i].first, quirks.ptr[i].second);
90041
      if (quirks.ptr[i].first ==
90042
          WUFFS_JSON__QUIRK_JSON_POINTER_ALLOW_TILDE_N_TILDE_R_TILDE_T) {
90043
        allow_tilde_n_tilde_r_tilde_t = (quirks.ptr[i].second != 0);
90044
      }
90045
    }
90046
90047
    // Prepare the wuffs_base__tok_buffer. 256 tokens is 2KiB.
90048
    wuffs_base__token tok_array[256];
90049
    wuffs_base__token_buffer tok_buf =
90050
        wuffs_base__slice_token__writer(wuffs_base__make_slice_token(
90051
            &tok_array[0], (sizeof(tok_array) / sizeof(tok_array[0]))));
90052
    wuffs_base__status tok_status =
90053
        dec->decode_tokens(&tok_buf, io_buf, wuffs_base__empty_slice_u8());
90054
90055
    // Prepare other state.
90056
    int32_t depth = 0;
90057
    std::string str;
90058
90059
    // Walk the (optional) JSON Pointer.
90060
    for (size_t i = 0; i < json_pointer.repr.size();) {
90061
      if (json_pointer.repr[i] != '/') {
90062
        ret_error_message = DecodeJson_BadJsonPointer;
90063
        goto done;
90064
      }
90065
      std::pair<std::string, size_t> split = DecodeJson_SplitJsonPointer(
90066
          json_pointer.repr, i + 1, allow_tilde_n_tilde_r_tilde_t);
90067
      i = split.second;
90068
      if (i == 0) {
90069
        ret_error_message = DecodeJson_BadJsonPointer;
90070
        goto done;
90071
      }
90072
      ret_error_message = DecodeJson_WalkJsonPointerFragment(
90073
          tok_buf, tok_status, dec, io_buf, io_error_message, cursor_index,
90074
          input, split.first);
90075
      if (!ret_error_message.empty()) {
90076
        goto done;
90077
      }
90078
    }
90079
90080
    // Loop, doing these two things:
90081
    //  1. Get the next token.
90082
    //  2. Process that token.
90083
    while (true) {
90084
      WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN;
90085
90086
      int64_t vbc = token.value_base_category();
90087
      uint64_t vbd = token.value_base_detail();
90088
      switch (vbc) {
90089
        case WUFFS_BASE__TOKEN__VBC__FILLER:
90090
          continue;
90091
90092
        case WUFFS_BASE__TOKEN__VBC__STRUCTURE: {
90093
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH) {
90094
            ret_error_message = callbacks.Push(static_cast<uint32_t>(vbd));
90095
            if (!ret_error_message.empty()) {
90096
              goto done;
90097
            }
90098
            depth++;
90099
            if (depth > (int32_t)WUFFS_JSON__DECODER_DEPTH_MAX_INCL) {
90100
              ret_error_message =
90101
                  "wuffs_aux::DecodeJson: internal error: bad depth";
90102
              goto done;
90103
            }
90104
            continue;
90105
          }
90106
          ret_error_message = callbacks.Pop(static_cast<uint32_t>(vbd));
90107
          depth--;
90108
          if (depth < 0) {
90109
            ret_error_message =
90110
                "wuffs_aux::DecodeJson: internal error: bad depth";
90111
            goto done;
90112
          }
90113
          goto parsed_a_value;
90114
        }
90115
90116
        case WUFFS_BASE__TOKEN__VBC__STRING: {
90117
          if (vbd & WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP) {
90118
            // No-op.
90119
          } else if (vbd &
90120
                     WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY) {
90121
            const char* ptr =  // Convert from (uint8_t*).
90122
                static_cast<const char*>(static_cast<void*>(token_ptr));
90123
            str.append(ptr, static_cast<size_t>(token_len));
90124
          } else {
90125
            goto fail;
90126
          }
90127
          if (token.continued()) {
90128
            continue;
90129
          }
90130
          ret_error_message = callbacks.AppendTextString(std::move(str));
90131
          str.clear();
90132
          goto parsed_a_value;
90133
        }
90134
90135
        case WUFFS_BASE__TOKEN__VBC__UNICODE_CODE_POINT: {
90136
          uint8_t u[WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL];
90137
          size_t n = wuffs_base__utf_8__encode(
90138
              wuffs_base__make_slice_u8(
90139
                  &u[0], WUFFS_BASE__UTF_8__BYTE_LENGTH__MAX_INCL),
90140
              static_cast<uint32_t>(vbd));
90141
          const char* ptr =  // Convert from (uint8_t*).
90142
              static_cast<const char*>(static_cast<void*>(&u[0]));
90143
          str.append(ptr, n);
90144
          if (token.continued()) {
90145
            continue;
90146
          }
90147
          goto fail;
90148
        }
90149
90150
        case WUFFS_BASE__TOKEN__VBC__LITERAL: {
90151
          ret_error_message =
90152
              (vbd & WUFFS_BASE__TOKEN__VBD__LITERAL__NULL)
90153
                  ? callbacks.AppendNull()
90154
                  : callbacks.AppendBool(vbd &
90155
                                         WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE);
90156
          goto parsed_a_value;
90157
        }
90158
90159
        case WUFFS_BASE__TOKEN__VBC__NUMBER: {
90160
          if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__FORMAT_TEXT) {
90161
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_INTEGER_SIGNED) {
90162
              wuffs_base__result_i64 r = wuffs_base__parse_number_i64(
90163
                  wuffs_base__make_slice_u8(token_ptr,
90164
                                            static_cast<size_t>(token_len)),
90165
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
90166
              if (r.status.is_ok()) {
90167
                ret_error_message = callbacks.AppendI64(r.value);
90168
                goto parsed_a_value;
90169
              }
90170
            }
90171
            if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_FLOATING_POINT) {
90172
              wuffs_base__result_f64 r = wuffs_base__parse_number_f64(
90173
                  wuffs_base__make_slice_u8(token_ptr,
90174
                                            static_cast<size_t>(token_len)),
90175
                  WUFFS_BASE__PARSE_NUMBER_XXX__DEFAULT_OPTIONS);
90176
              if (r.status.is_ok()) {
90177
                ret_error_message = callbacks.AppendF64(r.value);
90178
                goto parsed_a_value;
90179
              }
90180
            }
90181
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_INF) {
90182
            ret_error_message = callbacks.AppendF64(
90183
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
90184
                    0xFFF0000000000000ul));
90185
            goto parsed_a_value;
90186
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_INF) {
90187
            ret_error_message = callbacks.AppendF64(
90188
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
90189
                    0x7FF0000000000000ul));
90190
            goto parsed_a_value;
90191
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_NEG_NAN) {
90192
            ret_error_message = callbacks.AppendF64(
90193
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
90194
                    0xFFFFFFFFFFFFFFFFul));
90195
            goto parsed_a_value;
90196
          } else if (vbd & WUFFS_BASE__TOKEN__VBD__NUMBER__CONTENT_POS_NAN) {
90197
            ret_error_message = callbacks.AppendF64(
90198
                wuffs_base__ieee_754_bit_representation__from_u64_to_f64(
90199
                    0x7FFFFFFFFFFFFFFFul));
90200
            goto parsed_a_value;
90201
          }
90202
          goto fail;
90203
        }
90204
      }
90205
90206
    fail:
90207
      ret_error_message =
90208
          "wuffs_aux::DecodeJson: internal error: unexpected token";
90209
      goto done;
90210
90211
    parsed_a_value:
90212
      // If an error was encountered, we are done. Otherwise, (depth == 0)
90213
      // after parsing a value is equivalent to having decoded the entire JSON
90214
      // value (for an empty json_pointer query) or having decoded the
90215
      // pointed-to JSON value (for a non-empty json_pointer query). In the
90216
      // latter case, we are also done.
90217
      //
90218
      // However, if quirks like WUFFS_JSON__QUIRK_ALLOW_TRAILING_FILLER or
90219
      // WUFFS_JSON__QUIRK_EXPECT_TRAILING_NEW_LINE_OR_EOF are passed, decoding
90220
      // the entire JSON value should also consume any trailing filler, in case
90221
      // the DecodeJson caller wants to subsequently check that the input is
90222
      // completely exhausted (and otherwise raise "valid JSON followed by
90223
      // further (unexpected) data"). We aren't done yet. Instead, keep the
90224
      // loop running until WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN's
90225
      // decode_tokens returns an ok status.
90226
      if (!ret_error_message.empty() ||
90227
          ((depth == 0) && !json_pointer.repr.empty())) {
90228
        goto done;
90229
      }
90230
    }
90231
  } while (false);
90232
90233
done:
90234
  DecodeJsonResult result(
90235
      std::move(ret_error_message),
90236
      wuffs_base__u64__sat_add(io_buf->meta.pos, cursor_index));
90237
  callbacks.Done(result, input, *io_buf);
90238
  return result;
90239
}
90240
90241
#undef WUFFS_AUX__DECODE_JSON__GET_THE_NEXT_TOKEN
90242
90243
}  // namespace wuffs_aux
90244
90245
#endif  // !defined(WUFFS_CONFIG__MODULES) ||
90246
        // defined(WUFFS_CONFIG__MODULE__AUX__JSON)
90247
90248
#endif  // defined(__cplusplus) && defined(WUFFS_BASE__HAVE_UNIQUE_PTR)
90249
90250
90251
// ---------------- Wuffs' reimplementation of the STB API.
90252
//
90253
// This is a drop-in replacement of that third-party library.
90254
//
90255
// Disabled by default, unless you #define the
90256
// WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB macro beforehand.
90257
//
90258
// For API docs, see https://github.com/nothings/stb
90259
90260
#if defined(WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
90261
90262
#include <limits.h>
90263
#include <stdlib.h>
90264
90265
#ifdef __cplusplus
90266
extern "C" {
90267
#endif
90268
90269
// --------
90270
90271
#if defined(__GNUC__)
90272
__thread const char*  //
90273
    wuffs_drop_in__stb__g_failure_reason = NULL;
90274
#elif defined(_MSC_VER)
90275
__declspec(thread) const char*  //
90276
    wuffs_drop_in__stb__g_failure_reason = NULL;
90277
#else
90278
const char*  //
90279
    wuffs_drop_in__stb__g_failure_reason = NULL;
90280
#endif
90281
90282
// --------
90283
90284
static void                         //
90285
wuffs_drop_in__stb__read(           //
90286
    wuffs_base__io_buffer* srcbuf,  //
90287
    stbi_io_callbacks const* clbk,  //
90288
    void* user) {
90289
  uint8_t* ptr = wuffs_base__io_buffer__writer_pointer(srcbuf);
90290
  size_t len = wuffs_base__io_buffer__writer_length(srcbuf);
90291
  if (len > INT_MAX) {
90292
    len = INT_MAX;
90293
  }
90294
  int n = clbk->read(user, (char*)ptr, (int)len);
90295
  if (n > 0) {
90296
    srcbuf->meta.wi += (size_t)n;
90297
  } else {
90298
    srcbuf->meta.closed = clbk->eof(user);
90299
  }
90300
}
90301
90302
static wuffs_base__image_decoder*   //
90303
wuffs_drop_in__stb__make_decoder(   //
90304
    wuffs_base__io_buffer* srcbuf,  //
90305
    stbi_io_callbacks const* clbk,  //
90306
    void* user) {
90307
  while (1) {
90308
    int32_t fourcc = wuffs_base__magic_number_guess_fourcc(
90309
        wuffs_base__io_buffer__reader_slice(srcbuf), srcbuf->meta.closed);
90310
    if (fourcc < 0) {
90311
      if (srcbuf->meta.closed || !clbk) {
90312
        break;
90313
      }
90314
      wuffs_drop_in__stb__read(srcbuf, clbk, user);
90315
      continue;
90316
    }
90317
90318
    switch (fourcc) {
90319
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__BMP)
90320
      case WUFFS_BASE__FOURCC__BMP:
90321
        return wuffs_bmp__decoder__alloc_as__wuffs_base__image_decoder();
90322
#endif
90323
90324
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__ETC2)
90325
      case WUFFS_BASE__FOURCC__ETC2:
90326
        return wuffs_etc2__decoder__alloc_as__wuffs_base__image_decoder();
90327
#endif
90328
90329
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__GIF)
90330
      case WUFFS_BASE__FOURCC__GIF:
90331
        return wuffs_gif__decoder__alloc_as__wuffs_base__image_decoder();
90332
#endif
90333
90334
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__HANDSUM)
90335
      case WUFFS_BASE__FOURCC__HNSM:
90336
        return wuffs_handsum__decoder__alloc_as__wuffs_base__image_decoder();
90337
#endif
90338
90339
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__JPEG)
90340
      case WUFFS_BASE__FOURCC__JPEG:
90341
        return wuffs_jpeg__decoder__alloc_as__wuffs_base__image_decoder();
90342
#endif
90343
90344
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NIE)
90345
      case WUFFS_BASE__FOURCC__NIE:
90346
        return wuffs_nie__decoder__alloc_as__wuffs_base__image_decoder();
90347
#endif
90348
90349
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__NETPBM)
90350
      case WUFFS_BASE__FOURCC__NPBM:
90351
        return wuffs_netpbm__decoder__alloc_as__wuffs_base__image_decoder();
90352
#endif
90353
90354
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__PNG)
90355
      case WUFFS_BASE__FOURCC__PNG:
90356
        return wuffs_png__decoder__alloc_as__wuffs_base__image_decoder();
90357
#endif
90358
90359
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__QOI)
90360
      case WUFFS_BASE__FOURCC__QOI:
90361
        return wuffs_qoi__decoder__alloc_as__wuffs_base__image_decoder();
90362
#endif
90363
90364
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__TARGA)
90365
      case WUFFS_BASE__FOURCC__TGA:
90366
        return wuffs_targa__decoder__alloc_as__wuffs_base__image_decoder();
90367
#endif
90368
90369
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__THUMBHASH)
90370
      case WUFFS_BASE__FOURCC__TH:
90371
        return wuffs_thumbhash__decoder__alloc_as__wuffs_base__image_decoder();
90372
#endif
90373
90374
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WBMP)
90375
      case WUFFS_BASE__FOURCC__WBMP:
90376
        return wuffs_wbmp__decoder__alloc_as__wuffs_base__image_decoder();
90377
#endif
90378
90379
#if !defined(WUFFS_CONFIG__MODULES) || defined(WUFFS_CONFIG__MODULE__WEBP)
90380
      case WUFFS_BASE__FOURCC__WEBP:
90381
        return wuffs_webp__decoder__alloc_as__wuffs_base__image_decoder();
90382
#endif
90383
    }
90384
90385
    wuffs_drop_in__stb__g_failure_reason = "unknown image type";
90386
    break;
90387
  }
90388
  return NULL;
90389
}
90390
90391
// --------
90392
90393
static void*                         //
90394
wuffs_drop_in__stb__load1(           //
90395
    wuffs_base__io_buffer* srcbuf,   //
90396
    stbi_io_callbacks const* clbk,   //
90397
    void* user,                      //
90398
    wuffs_base__image_decoder* dec,  //
90399
    wuffs_base__image_config* ic,    //
90400
    uint32_t dst_pixfmt,             //
90401
    int desired_channels,            //
90402
    int info_only) {
90403
  // Favor faster decodes over rejecting invalid checksums.
90404
  wuffs_base__image_decoder__set_quirk(dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM,
90405
                                       1);
90406
90407
  while (1) {
90408
    wuffs_base__status status =
90409
        wuffs_base__image_decoder__decode_image_config(dec, ic, srcbuf);
90410
    if (status.repr == NULL) {
90411
      break;
90412
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
90413
      wuffs_drop_in__stb__g_failure_reason = status.repr;
90414
      return NULL;
90415
    }
90416
90417
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
90418
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
90419
      return NULL;
90420
    }
90421
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
90422
  }
90423
90424
  uint32_t w = wuffs_base__pixel_config__width(&ic->pixcfg);
90425
  uint32_t h = wuffs_base__pixel_config__height(&ic->pixcfg);
90426
  if ((w > 0xFFFFFF) || (h > 0xFFFFFF)) {
90427
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
90428
    return NULL;
90429
  } else if (info_only) {
90430
    return NULL;
90431
  }
90432
90433
  uint64_t pixbuf_len = (uint64_t)w * (uint64_t)h * (uint64_t)desired_channels;
90434
  uint64_t workbuf_len = wuffs_base__image_decoder__workbuf_len(dec).max_incl;
90435
#if SIZE_MAX < 0xFFFFFFFFFFFFFFFFull
90436
  if ((pixbuf_len > ((uint64_t)SIZE_MAX)) ||
90437
      (workbuf_len > ((uint64_t)SIZE_MAX))) {
90438
    wuffs_drop_in__stb__g_failure_reason = "image is too large";
90439
    return NULL;
90440
  }
90441
#endif
90442
  void* pixbuf_ptr = malloc((size_t)pixbuf_len);
90443
  if (!pixbuf_ptr) {
90444
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90445
    return NULL;
90446
  }
90447
  void* workbuf_ptr = malloc((size_t)workbuf_len);
90448
  if (!workbuf_ptr) {
90449
    free(pixbuf_ptr);
90450
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90451
    return NULL;
90452
  }
90453
  wuffs_base__slice_u8 workbuf =
90454
      wuffs_base__make_slice_u8(workbuf_ptr, (size_t)workbuf_len);
90455
90456
  wuffs_base__pixel_config pc = ((wuffs_base__pixel_config){});
90457
  wuffs_base__pixel_config__set(&pc, dst_pixfmt,
90458
                                WUFFS_BASE__PIXEL_SUBSAMPLING__NONE, w, h);
90459
90460
  wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
90461
  {
90462
    wuffs_base__status status = wuffs_base__pixel_buffer__set_from_slice(
90463
        &pb, &pc, wuffs_base__make_slice_u8(pixbuf_ptr, (size_t)pixbuf_len));
90464
    if (status.repr) {
90465
      free(workbuf_ptr);
90466
      free(pixbuf_ptr);
90467
      wuffs_drop_in__stb__g_failure_reason = status.repr;
90468
      return NULL;
90469
    }
90470
  }
90471
90472
  while (1) {
90473
    wuffs_base__status status = wuffs_base__image_decoder__decode_frame(
90474
        dec, &pb, srcbuf, WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL);
90475
    if (status.repr == NULL) {
90476
      break;
90477
    } else if ((status.repr != wuffs_base__suspension__short_read) || !clbk) {
90478
      free(workbuf_ptr);
90479
      free(pixbuf_ptr);
90480
      wuffs_drop_in__stb__g_failure_reason = status.repr;
90481
      return NULL;
90482
    }
90483
90484
    if (wuffs_base__io_buffer__compact(srcbuf) <= 0) {
90485
      free(workbuf_ptr);
90486
      free(pixbuf_ptr);
90487
      wuffs_drop_in__stb__g_failure_reason = "I/O buffer is too small";
90488
      return NULL;
90489
    }
90490
    wuffs_drop_in__stb__read(srcbuf, clbk, user);
90491
  }
90492
90493
  free(workbuf_ptr);
90494
  return pixbuf_ptr;
90495
}
90496
90497
static void*                        //
90498
wuffs_drop_in__stb__load0(          //
90499
    wuffs_base__io_buffer* srcbuf,  //
90500
    stbi_io_callbacks const* clbk,  //
90501
    void* user,                     //
90502
    int* x,                         //
90503
    int* y,                         //
90504
    int* channels_in_file,          //
90505
    int desired_channels,           //
90506
    int info_only) {
90507
  uint32_t dst_pixfmt = 0;
90508
  switch (desired_channels) {
90509
    case 1:
90510
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__Y;
90511
      break;
90512
    case 3:
90513
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGB;
90514
      break;
90515
    case 4:
90516
      dst_pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
90517
      break;
90518
    default:
90519
      wuffs_drop_in__stb__g_failure_reason = "unsupported format conversion";
90520
      return NULL;
90521
  }
90522
90523
  wuffs_base__image_decoder* dec =
90524
      wuffs_drop_in__stb__make_decoder(srcbuf, clbk, user);
90525
  if (!dec) {
90526
    if (wuffs_drop_in__stb__g_failure_reason == NULL) {
90527
      wuffs_drop_in__stb__g_failure_reason = "couldn't allocate image decoder";
90528
    }
90529
    return NULL;
90530
  }
90531
90532
  wuffs_base__image_config ic = ((wuffs_base__image_config){});
90533
  stbi_uc* ret = wuffs_drop_in__stb__load1(
90534
      srcbuf, clbk, user, dec, &ic, dst_pixfmt, desired_channels, info_only);
90535
  free(dec);
90536
90537
  if (!info_only && !ret) {
90538
    return NULL;
90539
  }
90540
90541
  if (x) {
90542
    *x = (int)wuffs_base__pixel_config__width(&ic.pixcfg);
90543
  }
90544
  if (y) {
90545
    *y = (int)wuffs_base__pixel_config__height(&ic.pixcfg);
90546
  }
90547
  if (channels_in_file) {
90548
    wuffs_base__pixel_format src_pixfmt =
90549
        wuffs_base__pixel_config__pixel_format(&ic.pixcfg);
90550
    uint32_t n_color = wuffs_base__pixel_format__coloration(&src_pixfmt);
90551
    uint32_t n_alpha = wuffs_base__pixel_format__transparency(&src_pixfmt) !=
90552
                       WUFFS_BASE__PIXEL_ALPHA_TRANSPARENCY__OPAQUE;
90553
    *channels_in_file = (int)(n_color + n_alpha);
90554
  }
90555
90556
  return ret;
90557
}
90558
90559
// --------
90560
90561
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
90562
stbi_info_from_memory(                //
90563
    stbi_uc const* buffer,            //
90564
    int len,                          //
90565
    int* x,                           //
90566
    int* y,                           //
90567
    int* comp) {
90568
  wuffs_drop_in__stb__g_failure_reason = NULL;
90569
  if (len < 0) {
90570
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
90571
    return 0;
90572
  } else if (len == 0) {
90573
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
90574
    return 0;
90575
  }
90576
  wuffs_base__io_buffer srcbuf =
90577
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
90578
  wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, comp, 1, 1);
90579
  return wuffs_drop_in__stb__g_failure_reason == NULL;
90580
}
90581
90582
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
90583
stbi_load_from_memory(                     //
90584
    stbi_uc const* buffer,                 //
90585
    int len,                               //
90586
    int* x,                                //
90587
    int* y,                                //
90588
    int* channels_in_file,                 //
90589
    int desired_channels) {
90590
  wuffs_drop_in__stb__g_failure_reason = NULL;
90591
  if (len < 0) {
90592
    wuffs_drop_in__stb__g_failure_reason = "negative buffer length";
90593
    return NULL;
90594
  } else if (len == 0) {
90595
    wuffs_drop_in__stb__g_failure_reason = "empty buffer";
90596
    return NULL;
90597
  }
90598
  wuffs_base__io_buffer srcbuf =
90599
      wuffs_base__ptr_u8__reader((uint8_t*)(stbi_uc*)buffer, (size_t)len, true);
90600
  return wuffs_drop_in__stb__load0(&srcbuf, NULL, NULL, x, y, channels_in_file,
90601
                                   desired_channels, 0);
90602
}
90603
90604
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
90605
stbi_info_from_callbacks(             //
90606
    stbi_io_callbacks const* clbk,    //
90607
    void* user,                       //
90608
    int* x,                           //
90609
    int* y,                           //
90610
    int* comp) {
90611
  wuffs_drop_in__stb__g_failure_reason = NULL;
90612
  void* iobuf_ptr = malloc(65536u);
90613
  if (!iobuf_ptr) {
90614
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90615
    return 0;
90616
  }
90617
  wuffs_base__io_buffer srcbuf =
90618
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
90619
  wuffs_drop_in__stb__load0(&srcbuf, clbk, user, x, y, comp, 1, 1);
90620
  free(iobuf_ptr);
90621
  return wuffs_drop_in__stb__g_failure_reason == NULL;
90622
}
90623
90624
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
90625
stbi_load_from_callbacks(                  //
90626
    stbi_io_callbacks const* clbk,         //
90627
    void* user,                            //
90628
    int* x,                                //
90629
    int* y,                                //
90630
    int* channels_in_file,                 //
90631
    int desired_channels) {
90632
  wuffs_drop_in__stb__g_failure_reason = NULL;
90633
  void* iobuf_ptr = malloc(65536u);
90634
  if (!iobuf_ptr) {
90635
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90636
    return NULL;
90637
  }
90638
  wuffs_base__io_buffer srcbuf =
90639
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
90640
  stbi_uc* ret = wuffs_drop_in__stb__load0(
90641
      &srcbuf, clbk, user, x, y, channels_in_file, desired_channels, 0);
90642
  free(iobuf_ptr);
90643
  return ret;
90644
}
90645
90646
WUFFS_DROP_IN__STB__MAYBE_STATIC void  //
90647
stbi_image_free(                       //
90648
    void* retval_from_stbi_load) {
90649
  wuffs_drop_in__stb__g_failure_reason = NULL;
90650
  free(retval_from_stbi_load);
90651
}
90652
90653
WUFFS_DROP_IN__STB__MAYBE_STATIC const char*  //
90654
stbi_failure_reason(void) {
90655
  return wuffs_drop_in__stb__g_failure_reason
90656
             ? wuffs_drop_in__stb__g_failure_reason
90657
             : "ok";
90658
}
90659
90660
// --------
90661
90662
#if !defined(STBI_NO_STDIO)
90663
90664
#include <stdio.h>
90665
90666
// TODO: retry after EINTR?
90667
90668
static int                                 //
90669
wuffs_drop_in__stb__file_callbacks__read(  //
90670
    void* user,                            //
90671
    char* data,                            //
90672
    int size) {
90673
  return (int)fread(data, 1u, (size_t)size, (FILE*)user);
90674
}
90675
90676
static void                                //
90677
wuffs_drop_in__stb__file_callbacks__skip(  //
90678
    void* user,                            //
90679
    int n) {
90680
  fseek((FILE*)user, (long)n, SEEK_CUR);
90681
}
90682
90683
static int                                //
90684
wuffs_drop_in__stb__file_callbacks__eof(  //
90685
    void* user) {
90686
  return feof((FILE*)user);
90687
}
90688
90689
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
90690
stbi_info(                            //
90691
    char const* filename,             //
90692
    int* x,                           //
90693
    int* y,                           //
90694
    int* comp) {
90695
  wuffs_drop_in__stb__g_failure_reason = NULL;
90696
  FILE* f = fopen(filename, "rb");
90697
  if (!f) {
90698
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
90699
    return 0;
90700
  }
90701
  int ret = stbi_info_from_file(f, x, y, comp);
90702
  fclose(f);
90703
  return ret;
90704
}
90705
90706
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
90707
stbi_load(                                 //
90708
    char const* filename,                  //
90709
    int* x,                                //
90710
    int* y,                                //
90711
    int* channels_in_file,                 //
90712
    int desired_channels) {
90713
  wuffs_drop_in__stb__g_failure_reason = NULL;
90714
  FILE* f = fopen(filename, "rb");
90715
  if (!f) {
90716
    wuffs_drop_in__stb__g_failure_reason = "could not open file";
90717
    return NULL;
90718
  }
90719
  stbi_uc* ret =
90720
      stbi_load_from_file(f, x, y, channels_in_file, desired_channels);
90721
  fclose(f);
90722
  return ret;
90723
}
90724
90725
WUFFS_DROP_IN__STB__MAYBE_STATIC int  //
90726
stbi_info_from_file(                  //
90727
    FILE* f,                          //
90728
    int* x,                           //
90729
    int* y,                           //
90730
    int* comp) {
90731
  wuffs_drop_in__stb__g_failure_reason = NULL;
90732
  void* iobuf_ptr = malloc(65536u);
90733
  if (!iobuf_ptr) {
90734
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90735
    return 0;
90736
  }
90737
  wuffs_base__io_buffer srcbuf =
90738
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
90739
  stbi_io_callbacks clbk;
90740
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
90741
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
90742
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
90743
  wuffs_drop_in__stb__load0(&srcbuf, &clbk, f, x, y, comp, 1, 1);
90744
  free(iobuf_ptr);
90745
  return wuffs_drop_in__stb__g_failure_reason == NULL;
90746
}
90747
90748
WUFFS_DROP_IN__STB__MAYBE_STATIC stbi_uc*  //
90749
stbi_load_from_file(                       //
90750
    FILE* f,                               //
90751
    int* x,                                //
90752
    int* y,                                //
90753
    int* channels_in_file,                 //
90754
    int desired_channels) {
90755
  wuffs_drop_in__stb__g_failure_reason = NULL;
90756
  void* iobuf_ptr = malloc(65536u);
90757
  if (!iobuf_ptr) {
90758
    wuffs_drop_in__stb__g_failure_reason = "out of memory";
90759
    return NULL;
90760
  }
90761
  wuffs_base__io_buffer srcbuf =
90762
      wuffs_base__ptr_u8__writer((uint8_t*)iobuf_ptr, 65536u);
90763
  stbi_io_callbacks clbk;
90764
  clbk.read = &wuffs_drop_in__stb__file_callbacks__read;
90765
  clbk.skip = &wuffs_drop_in__stb__file_callbacks__skip;
90766
  clbk.eof = &wuffs_drop_in__stb__file_callbacks__eof;
90767
  stbi_uc* ret = wuffs_drop_in__stb__load0(
90768
      &srcbuf, &clbk, f, x, y, channels_in_file, desired_channels, 0);
90769
  free(iobuf_ptr);
90770
  return ret;
90771
}
90772
90773
#endif  // !defined(STBI_NO_STDIO)
90774
90775
// --------
90776
90777
#ifdef __cplusplus
90778
}  // extern "C"
90779
#endif
90780
90781
#endif  // defined (WUFFS_CONFIG__ENABLE_DROP_IN_REPLACEMENT__STB)
90782
#endif  // WUFFS_IMPLEMENTATION
90783
90784
#if defined(__GNUC__)
90785
#pragma GCC diagnostic pop
90786
#elif defined(__clang__)
90787
#pragma clang diagnostic pop
90788
#endif
90789
90790
#endif  // WUFFS_INCLUDE_GUARD